raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=c50eec9d81784c6374682e5d6173d43c8463ec44

commit c50eec9d81784c6374682e5d6173d43c8463ec44
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Fri Mar 26 20:33:58 2021 +0000

    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
---
 src/bin/e_comp_wl.c | 24 ++++++++++++++++
 src/bin/e_pixmap.c  | 82 +++++++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 101 insertions(+), 5 deletions(-)

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;
 }
 
+/*
+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)
 {
-   *num_formats = 0;
-
+   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;
 }
 

-- 


Reply via email to