diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index 123cd5906..a606c150b 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -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) { diff --git a/src/bin/e_pixmap.c b/src/bin/e_pixmap.c index ac6af39b0..3d1e4e6d5 100644 --- a/src/bin/e_pixmap.c +++ b/src/bin/e_pixmap.c @@ -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; }