Mesa (main): loader/dri3: add drawable type set by GLX and EGL

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Dec 7 05:14:55 UTC 2021


Module: Mesa
Branch: main
Commit: 13bf30583c79c52f47ca7a416c9199ca62f45aaa
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=13bf30583c79c52f47ca7a416c9199ca62f45aaa

Author: Qiang Yu <yuq825 at gmail.com>
Date:   Fri Nov 12 10:25:11 2021 +0800

loader/dri3: add drawable type set by GLX and EGL

Drawable type include more information which can be used
to distinguish pixmap and pbuffer which both treated as
pixmap before.

Reviewed-by: Adam Jackson <ajax at redhat.com>
Signed-off-by: Qiang Yu <yuq825 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13750>

---

 src/egl/drivers/dri2/platform_x11_dri3.c | 16 ++++++++++++++++
 src/glx/dri3_glx.c                       | 19 ++++++++++++++++++-
 src/loader/loader_dri3_helper.c          |  2 ++
 src/loader/loader_dri3_helper.h          |  9 +++++++++
 4 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c
index 81fb73a8cd1..87d384d6371 100644
--- a/src/egl/drivers/dri2/platform_x11_dri3.c
+++ b/src/egl/drivers/dri2/platform_x11_dri3.c
@@ -133,6 +133,21 @@ dri3_set_swap_interval(_EGLDisplay *disp, _EGLSurface *surf, EGLint interval)
    return EGL_TRUE;
 }
 
+static enum loader_dri3_drawable_type
+egl_to_loader_dri3_drawable_type(EGLint type)
+{
+   switch (type) {
+   case EGL_WINDOW_BIT:
+      return LOADER_DRI3_DRAWABLE_WINDOW;
+   case EGL_PIXMAP_BIT:
+      return LOADER_DRI3_DRAWABLE_PIXMAP;
+   case EGL_PBUFFER_BIT:
+      return LOADER_DRI3_DRAWABLE_PBUFFER;
+   default:
+      return LOADER_DRI3_DRAWABLE_UNKNOWN;
+   }
+}
+
 static _EGLSurface *
 dri3_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
                     void *native_surface, const EGLint *attrib_list)
@@ -172,6 +187,7 @@ dri3_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
    }
 
    if (loader_dri3_drawable_init(dri2_dpy->conn, drawable,
+                                 egl_to_loader_dri3_drawable_type(type),
                                  dri2_dpy->dri_screen,
                                  dri2_dpy->is_different_gpu,
                                  dri2_dpy->multibuffers_available,
diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
index 1c8a3b2a2e3..d74bd8938ed 100644
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -342,6 +342,21 @@ dri3_destroy_drawable(__GLXDRIdrawable *base)
    free(pdraw);
 }
 
+static enum loader_dri3_drawable_type
+glx_to_loader_dri3_drawable_type(int type)
+{
+   switch (type) {
+   case GLX_WINDOW_BIT:
+      return LOADER_DRI3_DRAWABLE_WINDOW;
+   case GLX_PIXMAP_BIT:
+      return LOADER_DRI3_DRAWABLE_PIXMAP;
+   case GLX_PBUFFER_BIT:
+      return LOADER_DRI3_DRAWABLE_PBUFFER;
+   default:
+      return LOADER_DRI3_DRAWABLE_UNKNOWN;
+   }
+}
+
 static __GLXDRIdrawable *
 dri3_create_drawable(struct glx_screen *base, XID xDrawable,
                      GLXDrawable drawable, int type,
@@ -376,7 +391,9 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable,
    (void) __glXInitialize(psc->base.dpy);
 
    if (loader_dri3_drawable_init(XGetXCBConnection(base->dpy),
-                                 xDrawable, psc->driScreen,
+                                 xDrawable,
+                                 glx_to_loader_dri3_drawable_type(type),
+                                 psc->driScreen,
                                  psc->is_different_gpu, has_multibuffer,
                                  psc->prefer_back_buffer_reuse,
                                  config->driConfig,
diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
index fb8abde944a..73e8165eb4f 100644
--- a/src/loader/loader_dri3_helper.c
+++ b/src/loader/loader_dri3_helper.c
@@ -384,6 +384,7 @@ loader_dri3_drawable_fini(struct loader_dri3_drawable *draw)
 int
 loader_dri3_drawable_init(xcb_connection_t *conn,
                           xcb_drawable_t drawable,
+                          enum loader_dri3_drawable_type type,
                           __DRIscreen *dri_screen,
                           bool is_different_gpu,
                           bool multiplanes_available,
@@ -403,6 +404,7 @@ loader_dri3_drawable_init(xcb_connection_t *conn,
    draw->ext = ext;
    draw->vtable = vtable;
    draw->drawable = drawable;
+   draw->type = type;
    draw->region = 0;
    draw->dri_screen = dri_screen;
    draw->is_different_gpu = is_different_gpu;
diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h
index 615212c331a..0d8f734e920 100644
--- a/src/loader/loader_dri3_helper.h
+++ b/src/loader/loader_dri3_helper.h
@@ -116,6 +116,13 @@ struct loader_dri3_vtable {
 
 #define LOADER_DRI3_NUM_BUFFERS (1 + LOADER_DRI3_MAX_BACK)
 
+enum loader_dri3_drawable_type {
+   LOADER_DRI3_DRAWABLE_UNKNOWN,
+   LOADER_DRI3_DRAWABLE_WINDOW,
+   LOADER_DRI3_DRAWABLE_PIXMAP,
+   LOADER_DRI3_DRAWABLE_PBUFFER,
+};
+
 struct loader_dri3_drawable {
    xcb_connection_t *conn;
    xcb_screen_t *screen;
@@ -129,6 +136,7 @@ struct loader_dri3_drawable {
    uint8_t have_back;
    uint8_t have_fake_front;
    uint8_t is_pixmap;
+   enum loader_dri3_drawable_type type;
 
    /* Information about the GPU owning the buffer */
    __DRIscreen *dri_screen;
@@ -202,6 +210,7 @@ loader_dri3_drawable_fini(struct loader_dri3_drawable *draw);
 int
 loader_dri3_drawable_init(xcb_connection_t *conn,
                           xcb_drawable_t drawable,
+                          enum loader_dri3_drawable_type type,
                           __DRIscreen *dri_screen,
                           bool is_different_gpu,
                           bool is_multiplanes_available,



More information about the mesa-commit mailing list