From: Varad Gautam <varad.gau...@collabora.com>

EGL_EXT_image_dma_buf_import_modifiers allows querying the formats
and modifiers supported by the platform. expose these to the compositor.

Signed-off-by: Varad Gautam <varad.gau...@collabora.com>
---
 libweston/compositor.h     |  7 ++++
 libweston/gl-renderer.c    | 84 +++++++++++++++++++++++++++++++++++++++++++++-
 libweston/weston-egl-ext.h |  7 ++++
 3 files changed, 97 insertions(+), 1 deletion(-)

diff --git a/libweston/compositor.h b/libweston/compositor.h
index e00d285..a2848fb 100644
--- a/libweston/compositor.h
+++ b/libweston/compositor.h
@@ -675,6 +675,13 @@ struct weston_renderer {
        /** See weston_compositor_import_dmabuf() */
        bool (*import_dmabuf)(struct weston_compositor *ec,
                              struct linux_dmabuf_buffer *buffer);
+
+       bool (*query_dmabuf_formats)(struct weston_compositor *ec,
+                               int **formats, int *num_formats);
+
+       bool (*query_dmabuf_modifiers)(struct weston_compositor *ec,
+                               int format, uint64_t **modifiers,
+                               int *num_modifiers);
 };
 
 enum weston_capability {
diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c
index 2f46373..444b07a 100644
--- a/libweston/gl-renderer.c
+++ b/libweston/gl-renderer.c
@@ -226,6 +226,10 @@ struct gl_renderer {
        struct wl_signal destroy_signal;
 
        struct wl_listener output_destroy_listener;
+
+       int has_dmabuf_import_modifiers;
+       PFNEGLQUERYDMABUFFORMATSEXTPROC query_dmabuf_formats;
+       PFNEGLQUERYDMABUFMODIFIERSEXTPROC query_dmabuf_modifiers;
 };
 
 static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL;
@@ -1847,6 +1851,69 @@ import_dmabuf(struct gl_renderer *gr,
 }
 
 static bool
+gl_renderer_query_dmabuf_formats(struct weston_compositor *wc,
+                               int **formats, int *num_formats)
+{
+       struct gl_renderer *gr = get_renderer(wc);
+       EGLint num;
+
+       assert(gr->has_dmabuf_import);
+
+       if (!gr->query_dmabuf_formats(gr->egl_display, 0, NULL, &num)) {
+               *num_formats = 0;
+               return false;
+       }
+
+       *formats = calloc(1, num * sizeof(int));
+       if (*formats == NULL) {
+               *num_formats = 0;
+               return false;
+       }
+       if (!gr->query_dmabuf_formats(gr->egl_display, num, *formats,
+                       (EGLint*) &num)) {
+               *num_formats = 0;
+               free(*formats);
+               return false;
+       }
+
+       *num_formats = num;
+       return true;
+}
+
+static bool
+gl_renderer_query_dmabuf_modifiers(struct weston_compositor *wc, int format,
+                                       uint64_t **modifiers,
+                                       int *num_modifiers)
+{
+       struct gl_renderer *gr = get_renderer(wc);
+       int num;
+
+       assert(gr->has_dmabuf_import);
+
+       if (!gr->has_dmabuf_import_modifiers ||
+               !gr->query_dmabuf_modifiers(gr->egl_display, format, 0, NULL,
+                                           NULL, &num)) {
+               *num_modifiers = 0;
+               return false;
+       }
+
+       *modifiers = calloc(1, num * sizeof(uint64_t));
+       if (*modifiers == NULL) {
+               *num_modifiers = 0;
+               return false;
+       }
+       if (!gr->query_dmabuf_modifiers(gr->egl_display, format,
+                               num, *modifiers, NULL, &num)) {
+               *num_modifiers = 0;
+               free(*modifiers);
+               return false;
+       }
+
+       *num_modifiers = num;
+       return true;
+}
+
+static bool
 gl_renderer_import_dmabuf(struct weston_compositor *ec,
                          struct linux_dmabuf_buffer *dmabuf)
 {
@@ -2818,6 +2885,9 @@ gl_renderer_setup_egl_extensions(struct weston_compositor 
*ec)
 
        gr->create_image = (void *) eglGetProcAddress("eglCreateImageKHR");
        gr->destroy_image = (void *) eglGetProcAddress("eglDestroyImageKHR");
+       gr->query_dmabuf_formats =
+               (void *) eglGetProcAddress("eglQueryDmaBufFormatsEXT");
+
        gr->bind_display =
                (void *) eglGetProcAddress("eglBindWaylandDisplayWL");
        gr->unbind_display =
@@ -2863,6 +2933,13 @@ gl_renderer_setup_egl_extensions(struct 
weston_compositor *ec)
        if (weston_check_egl_extension(extensions, 
"EGL_EXT_image_dma_buf_import"))
                gr->has_dmabuf_import = 1;
 
+       if (weston_check_egl_extension(extensions,
+                               "EGL_EXT_image_dma_buf_import_modifiers")) {
+               gr->query_dmabuf_modifiers =
+                       (void *) 
eglGetProcAddress("eglQueryDmaBufModifiersEXT");
+               gr->has_dmabuf_import_modifiers = 1;
+       }
+
        if (weston_check_egl_extension(extensions, "GL_EXT_texture_rg"))
                gr->has_gl_texture_rg = 1;
 
@@ -3101,8 +3178,13 @@ gl_renderer_display_create(struct weston_compositor *ec, 
EGLenum platform,
                goto fail_with_error;
 
        wl_list_init(&gr->dmabuf_images);
-       if (gr->has_dmabuf_import)
+       if (gr->has_dmabuf_import) {
                gr->base.import_dmabuf = gl_renderer_import_dmabuf;
+               gr->base.query_dmabuf_formats =
+                       gl_renderer_query_dmabuf_formats;
+               gr->base.query_dmabuf_modifiers =
+                       gl_renderer_query_dmabuf_modifiers;
+       }
 
        if (gr->has_surfaceless_context) {
                weston_log("EGL_KHR_surfaceless_context available\n");
diff --git a/libweston/weston-egl-ext.h b/libweston/weston-egl-ext.h
index f3e6dce..c7a3430 100644
--- a/libweston/weston-egl-ext.h
+++ b/libweston/weston-egl-ext.h
@@ -125,6 +125,13 @@ typedef struct wl_buffer * (EGLAPIENTRYP 
PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL) (
 #define EGL_DMA_BUF_PLANE2_PITCH_EXT                           0x327A
 #endif
 
+/* Define tokens from EGL_EXT_image_dma_buf_import_modifiers */
+#ifndef EGL_EXT_image_dma_buf_import_modifiers
+#define EGL_EXT_image_dma_buf_import_modifiers 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFFORMATSEXTPROC) (EGLDisplay 
dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFMODIFIERSEXTPROC) 
(EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, 
EGLBoolean *external_only, EGLint *num_modifiers);
+#endif
+
 #ifndef EGL_EXT_swap_buffers_with_damage
 #define EGL_EXT_swap_buffers_with_damage 1
 typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) 
(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
-- 
2.6.2

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to