forked from enlightenment/enlightenment
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:
parent
2ee80c2335
commit
c50eec9d81
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -1200,19 +1200,91 @@ e_pixmap_dmabuf_test(struct linux_dmabuf_buffer *dmabuf)
|
|||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
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 EINA_UNUSED, int *num_formats)
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue