[PATCH] glx: Add support for the new DRI loader entrypoint.

Eric Anholt eric at anholt.net
Fri Oct 11 17:22:48 PDT 2013

This is going to be exposed (and not the old entrypoint) for some DRI
drivers once the megadrivers series lands, and the plan is to
eventually transition all drivers to that.  Hopefully this is
unobtrusive enough to merge to stable X servers so that they can be
compatible with new Mesa versions.

The corresponding mesa series isn't landed yet, thus the #ifndef.
Plus it should make the patch trivially backportable, which is kind of
the only way that this patch matters since I expect it patch to have
been deleted from master by the time 1.15 rolls around.

Note that unlike the libGL side of things, I didn't extend things to
use createNewScreen2().  I'm relying on the __driDriverGetExtensions
called here setting a global symbol in the dri_util.c code so that the
common createNewScreen() can pull it out and use that as the reference
to the driver -- it's sleazy, but it means the patch is backportable
without needing a bunch of structs in dri_interface.h updated.

 glx/glxdricommon.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/glx/glxdricommon.c b/glx/glxdricommon.c
index b027f24..6bb7d1d 100644
--- a/glx/glxdricommon.c
+++ b/glx/glxdricommon.c
@@ -211,6 +211,14 @@ glxConvertConfigs(const __DRIcoreExtension * core,
 static const char dri_driver_path[] = DRI_DRIVER_PATH;
+/* Temporary define to allow building without a dri_interface.h from
+ * updated Mesa.  Some day when we don't core about Mesa that old any
+ * more this can be removed.
+ */
+#define __DRI_DRIVER_GET_EXTENSIONS "__driDriverGetExtensions"
 void *
 glxProbeDriver(const char *driverName,
                void **coreExt, const char *coreName, int coreVersion,
@@ -219,7 +227,8 @@ glxProbeDriver(const char *driverName,
     int i;
     void *driver;
     char filename[PATH_MAX];
-    const __DRIextension **extensions;
+    char *get_extensions_name;
+    const __DRIextension **extensions = NULL;
     snprintf(filename, sizeof filename, "%s/%s_dri.so",
              dri_driver_path, driverName);
@@ -231,7 +240,18 @@ glxProbeDriver(const char *driverName,
         goto cleanup_failure;
-    extensions = dlsym(driver, __DRI_DRIVER_EXTENSIONS);
+    if (asprintf(&get_extensions_name, "%s_%s",
+                 __DRI_DRIVER_GET_EXTENSIONS, driverName) != -1) {
+        const __DRIextension **(*get_extensions)(void);
+        get_extensions = dlsym(driver, get_extensions_name);
+        if (get_extensions)
+            extensions = get_extensions();
+        free(get_extensions_name);
+    }
+    if (!extensions)
+        extensions = dlsym(driver, __DRI_DRIVER_EXTENSIONS);
     if (extensions == NULL) {
         LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
                    driverName, dlerror());

More information about the xorg-devel mailing list