glx: honor LIBGL_DRIVERS_PATH when loading DRI drivers

Allow switching to another driver build without a full installation.

Glamor already takes LIBGL_DRIVERS_PATH into account, so this change
makes sure that the same driver is used in both parts of the server.

Signed-off-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Ben Crocker <bcrocker@redhat.com>
Reviewed-by: Antoine Martin <antoine@nagafix.co.uk>
Tested-by: Ben Crocker <bcrocker@redhat.com>
This commit is contained in:
Nicolai Hähnle 2018-03-13 17:46:37 -04:00 committed by Adam Jackson
parent 75a869a4e7
commit 319af6f471

View File

@ -272,14 +272,44 @@ glxProbeDriver(const char *driverName,
char filename[PATH_MAX];
char *get_extensions_name;
const __DRIextension **extensions = NULL;
const char *path = NULL;
snprintf(filename, sizeof filename, "%s/%s_dri.so",
dri_driver_path, driverName);
/* Search in LIBGL_DRIVERS_PATH if we're not setuid. */
if (!PrivsElevated())
path = getenv("LIBGL_DRIVERS_PATH");
if (!path)
path = dri_driver_path;
do {
const char *next;
int path_len;
next = strchr(path, ':');
if (next) {
path_len = next - path;
next++;
} else {
path_len = strlen(path);
next = NULL;
}
snprintf(filename, sizeof filename, "%.*s/%s_dri.so", path_len, path,
driverName);
driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
if (driver != NULL)
break;
driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
if (driver == NULL) {
LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
filename, dlerror());
path = next;
} while (path);
if (driver == NULL) {
LogMessage(X_ERROR, "AIGLX error: unable to load driver %s\n",
driverName);
goto cleanup_failure;
}