| From fcbd29debee422bcb147057a089fd1da5e699656 Mon Sep 17 00:00:00 2001 |
| From: Carlos Alberto Lopez Perez <clopez@igalia.com> |
| Date: Wed, 23 Mar 2016 03:47:58 +0100 |
| Subject: [PATCH xserver] Search for DRI drivers at LIBGL_DRIVERS_PATH |
| environment variable. |
| |
| * 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. |
| --- |
| 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 |
| |