[PATCH] dri3: Fix dri3_open API change by adding new dri3_open_client

Keith Packard keithp at keithp.com
Tue Apr 8 11:51:42 PDT 2014


Xwayland will eventually need the current client in dri3_open. Simply
changing that API is not an option though as other drivers that
implement DRI3 will not have a matching function signature and will
crash when called.

Add a new dri3_open_client function pointer and bump
DRI3_SCREEN_INFO_VERSION so that drivers can be aware of the new
function which will be used in preference to the old function when
available.

Signed-off-by: Keith Packard <keithp at keithp.com>
---
 dri3/dri3.h         | 14 +++++++++++---
 dri3/dri3_screen.c  | 16 ++++++++++++++--
 glamor/glamor_egl.c | 12 ++++++------
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/dri3/dri3.h b/dri3/dri3.h
index 1c04cbd..edc7fa2 100644
--- a/dri3/dri3.h
+++ b/dri3/dri3.h
@@ -30,13 +30,17 @@
 #include <X11/extensions/dri3proto.h>
 #include <randrstr.h>
 
-#define DRI3_SCREEN_INFO_VERSION        0
+#define DRI3_SCREEN_INFO_VERSION        1
 
-typedef int (*dri3_open_proc)(ClientPtr client,
-                              ScreenPtr screen,
+typedef int (*dri3_open_proc)(ScreenPtr screen,
                               RRProviderPtr provider,
                               int *fd);
 
+typedef int (*dri3_open_client_proc)(ClientPtr client,
+                                     ScreenPtr screen,
+                                     RRProviderPtr provider,
+                                     int *fd);
+
 typedef PixmapPtr (*dri3_pixmap_from_fd_proc) (ScreenPtr screen,
                                                int fd,
                                                CARD16 width,
@@ -56,6 +60,10 @@ typedef struct dri3_screen_info {
     dri3_open_proc              open;
     dri3_pixmap_from_fd_proc    pixmap_from_fd;
     dri3_fd_from_pixmap_proc    fd_from_pixmap;
+
+    /* Version 1 */
+    dri3_open_client_proc       open_client;
+
 } dri3_screen_info_rec, *dri3_screen_info_ptr;
 
 extern _X_EXPORT Bool
diff --git a/dri3/dri3_screen.c b/dri3/dri3_screen.c
index bbf1d05..6c0c60c 100644
--- a/dri3/dri3_screen.c
+++ b/dri3/dri3_screen.c
@@ -30,6 +30,14 @@
 #include <misyncshm.h>
 #include <randrstr.h>
 
+static inline Bool has_open(dri3_screen_info_ptr info) {
+    if (info == NULL)
+        return FALSE;
+
+    return info->open != NULL ||
+        (info->version >= 1 && info->open_client != NULL);
+}
+
 int
 dri3_open(ClientPtr client, ScreenPtr screen, RRProviderPtr provider, int *fd)
 {
@@ -37,10 +45,14 @@ dri3_open(ClientPtr client, ScreenPtr screen, RRProviderPtr provider, int *fd)
     dri3_screen_info_ptr        info = ds->info;
     int                         rc;
 
-    if (!info || !info->open)
+    if (!has_open(info))
         return BadMatch;
 
-    rc = (*info->open) (client, screen, provider, fd);
+    if (info->version >= 1 && info->open_client != NULL)
+        rc = (*info->open_client) (client, screen, provider, fd);
+    else
+        rc = (*info->open) (screen, provider, fd);
+
     if (rc != Success)
         return rc;
 
diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index e2b6a92..6e70d32 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -608,10 +608,10 @@ glamor_egl_close_screen(ScreenPtr screen)
 }
 
 static int
-glamor_dri3_open(ClientPtr client,
-                 ScreenPtr screen,
-                 RRProviderPtr provider,
-                 int *fdp)
+glamor_dri3_open_client(ClientPtr client,
+                        ScreenPtr screen,
+                        RRProviderPtr provider,
+                        int *fdp)
 {
     ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
     struct glamor_egl_screen_private *glamor_egl =
@@ -658,8 +658,8 @@ glamor_dri3_open(ClientPtr client,
 }
 
 static dri3_screen_info_rec glamor_dri3_info = {
-    .version = 0,
-    .open = glamor_dri3_open,
+    .version = DRI3_SCREEN_INFO_VERSION,
+    .open_client = glamor_dri3_open_client,
     .pixmap_from_fd = glamor_pixmap_from_fd,
     .fd_from_pixmap = glamor_fd_from_pixmap,
 };
-- 
1.9.1



More information about the xorg-devel mailing list