e - comp - wl - fix garbage pixles on rpi4 - properly do fmts/mods

we didnt properly do formats/modifiers. this meant that qwhen
something like the rpi4 started using interesting ones we ended up
with garbage pixels. this fixes that - uses new evas gl feature so
will need efl git master and eventiually efl 1.26 (already do anyway)

@fix
This commit is contained in:
Carsten Haitzler 2021-03-26 20:33:58 +00:00
parent 2ee80c2335
commit c50eec9d81
2 changed files with 102 additions and 6 deletions

View File

@ -2954,6 +2954,30 @@ _e_comp_wl_gl_shutdown(void)
evas_gl_config_free(e_comp_wl->wl.glcfg);
}
Eina_Bool
e_comp_wl_query_dmabuf_formats(int max_formats, int *formats, int *num_formats)
{
*num_formats = 0;
#if EVAS_GL_API_VERSION >= 7
if (!e_comp_wl->wl.glapi->evasglQueryDmaBufFormats) return EINA_FALSE;
return e_comp_wl->wl.glapi->evasglQueryDmaBufFormats(e_comp_wl->wl.gl, max_formats, formats, num_formats);
#else
return EINA_FALSE;
#endif
}
Eina_Bool
e_comp_wl_query_dmabuf_modifiers(int format, int max_modifiers, uint64_t *modifiers, Eina_Bool *external_only, int *num_modifiers)
{
*num_modifiers = 0;
#if EVAS_GL_API_VERSION >= 7
if (!e_comp_wl->wl.glapi->evasglQueryDmaBufModifiers) return EINA_FALSE;
return e_comp_wl->wl.glapi->evasglQueryDmaBufModifiers(e_comp_wl->wl.gl, format, max_modifiers, modifiers, external_only, num_modifiers);
#else
return EINA_FALSE;
#endif
}
static void
_e_comp_wl_gl_init(void)
{

View File

@ -1200,19 +1200,91 @@ e_pixmap_dmabuf_test(struct linux_dmabuf_buffer *dmabuf)
return EINA_TRUE;
}
E_API Eina_Bool
e_pixmap_dmabuf_formats_query(int **formats EINA_UNUSED, int *num_formats)
{
*num_formats = 0;
/*
if (weston_check_egl_extension(extensions,
"EGL_EXT_image_dma_buf_import_modifiers")) {
gr->query_dmabuf_formats =
(void *) eglGetProcAddress("eglQueryDmaBufFormatsEXT");
gr->query_dmabuf_modifiers =
(void *) eglGetProcAddress("eglQueryDmaBufModifiersEXT");
assert(gr->query_dmabuf_formats);
assert(gr->query_dmabuf_modifiers);
gr->has_dmabuf_import_modifiers = true;
}
*/
extern Eina_Bool e_comp_wl_query_dmabuf_formats(int max_formats, int *formats, int *num_formats);
extern Eina_Bool e_comp_wl_query_dmabuf_modifiers(int format, int max_modifiers, uint64_t *modifiers, Eina_Bool *external_only, int *num_modifiers);
E_API Eina_Bool
e_pixmap_dmabuf_formats_query(int **formats, int *num_formats)
{
static const int fallback_formats[] =
{
DRM_FORMAT_ARGB8888,
DRM_FORMAT_XRGB8888,
// support later ...
// DRM_FORMAT_YUYV,
// DRM_FORMAT_NV12,
// DRM_FORMAT_YUV420,
// DRM_FORMAT_YUV444,
// DRM_FORMAT_XYUV8888,
};
Eina_Bool fallback = EINA_FALSE;
int num = 0;
if (!e_comp_wl_query_dmabuf_formats(0, NULL, &num))
{
num = 2;
fallback = EINA_TRUE;
}
*formats = calloc(num, sizeof(int));
if (!(*formats))
{
*num_formats = 0;
return EINA_FALSE;
}
if (fallback)
{
memcpy(*formats, fallback_formats, num * sizeof(int));
*num_formats = num;
return EINA_TRUE;
}
if (!e_comp_wl_query_dmabuf_formats(num, *formats, &num))
{
*num_formats = 0;
free(*formats);
return EINA_FALSE;
}
*num_formats = num;
return EINA_TRUE;
}
E_API Eina_Bool
e_pixmap_dmabuf_modifiers_query(int format EINA_UNUSED, uint64_t **modifiers EINA_UNUSED, int *num_modifiers)
e_pixmap_dmabuf_modifiers_query(int format, uint64_t **modifiers, int *num_modifiers)
{
*num_modifiers = 0;
int num;
if (!e_comp_wl_query_dmabuf_modifiers(format, 0, NULL, NULL, &num) ||
(num == 0))
{
*num_modifiers = 0;
return EINA_FALSE;
}
*modifiers = calloc(num, sizeof(uint64_t));
if (!(*modifiers))
{
*num_modifiers = 0;
return EINA_FALSE;
}
if (!e_comp_wl_query_dmabuf_modifiers
(format, num, *modifiers, NULL, &num))
{
*num_modifiers = 0;
free(*modifiers);
return EINA_FALSE;
}
*num_modifiers = num;
return EINA_TRUE;
}