[PATCH xserver] Search for DRI drivers at LIBGL_DRIVERS_PATH environment variable.

Carlos Alberto Lopez Perez clopez at igalia.com
Tue Apr 12 17:59:14 UTC 2016


  * The Mesa driver uses this environment variable to override the
    default compiled search path for DRI drivers.

  * This is useful for testing purposes when the user needs to
    override the system default one at runtime.

Signed-off-by: Carlos Alberto Lopez Perez <clopez at igalia.com>
---
 glx/glxdricommon.c | 40 ++++++++++++++++++++++++++++++----------
 1 file changed, 30 insertions(+), 10 deletions(-)

diff --git a/glx/glxdricommon.c b/glx/glxdricommon.c
index 62cce13..543f631 100644
--- a/glx/glxdricommon.c
+++ b/glx/glxdricommon.c
@@ -246,8 +246,6 @@ glxConvertConfigs(const __DRIcoreExtension * core,
     return head.next;
 }
 
-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 care about Mesa that old any
  * more this can be removed.
@@ -261,22 +259,44 @@ glxProbeDriver(const char *driverName,
                void **coreExt, const char *coreName, int coreVersion,
                void **renderExt, const char *renderName, int renderVersion)
 {
-    int i;
+    int i, len;
     void *driver;
     char filename[PATH_MAX];
     char *get_extensions_name;
     const __DRIextension **extensions = NULL;
+    const char *dri_driver_path, *p, *next;
 
-    snprintf(filename, sizeof filename, "%s/%s_dri.so",
-             dri_driver_path, driverName);
+    dri_driver_path = getenv("LIBGL_DRIVERS_PATH");
+
+    if (dri_driver_path == NULL)
+        dri_driver_path = DRI_DRIVER_PATH;
+
+    for (p = dri_driver_path; *p; p = next) {
+        next = strchr(p, ':');
+        if (next == NULL) {
+            len = strlen(p);
+            next = p + len;
+        }
+        else {
+            len = next - p;
+            next++;
+        }
+
+        snprintf(filename, sizeof filename, "%.*s/%s_dri.so",
+                len, p, driverName);
+
+        driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
+        if (driver == NULL)
+            LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
+                    filename, dlerror());
+        else
+            break;
 
-    driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
-    if (driver == NULL) {
-        LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
-                   filename, dlerror());
-        goto cleanup_failure;
     }
 
+    if (driver == NULL)
+        goto cleanup_failure;
+
     if (asprintf(&get_extensions_name, "%s_%s",
                  __DRI_DRIVER_GET_EXTENSIONS, driverName) != -1) {
         const __DRIextension **(*get_extensions)(void);
-- 
2.1.4



More information about the xorg-devel mailing list