static __DRIdriver *Drivers = NULL;
+/** If non-zero, prefer an "egl_foo_dri.so" driver over "foo_dri.so" */
+static int PreferEGL = 0;
+
+
+/**
+ * This may be called by libEGL.so to tell libGL to prefer "egl_" drivers
+ * over regular DRI drivers".
+ */
+void __glXPreferEGL(int state)
+{
+ PreferEGL = state;
+}
+
+
/*
* printf wrappers
*/
}
+/**
+ * Try to dlopen() a driver.
+ * \param libDir the directory to search
+ * \param driverName the name of the driver (such as "r300").
+ * \param tls if true, try to find TLS version of driver
+ * \param preferEGL if true, try to find EGL-specific driver
+ * \return handle from dlopen(), will be NULL if fails.
+ */
+static void *
+try_open(const char *libDir, const char *driverName,
+ GLboolean tls, GLboolean preferEGL)
+{
+ const char *tlsDir = tls ? "/tls/" : "";
+ const char *eglPrefix = preferEGL ? "egl_" : "";
+ char fullPathName[200];
+ void *handle = NULL;
+
+ snprintf(fullPathName, 200, "%s%s/%s%s_dri.so",
+ libDir, tlsDir, eglPrefix, driverName);
+ InfoMessageF("OpenDriver: trying %s\n", fullPathName);
+ handle = dlopen(fullPathName, RTLD_NOW | RTLD_GLOBAL);
+
+ return handle;
+}
+
+
+
/**
* Versioned name of the expected \c __driCreateNewScreen function.
*
libPaths = DEFAULT_DRIVER_DIR;
for ( i = 0 ; ExtractDir(i, libPaths, 1000, libDir) != 0 ; i++ ) {
- char realDriverName[200];
void *handle = NULL;
-
- /* If TLS support is enabled, try to open the TLS version of the driver
- * binary first. If that fails, try the non-TLS version.
- */
+ if (PreferEGL)
+ handle = try_open(libDir, driverName, GL_FALSE, GL_TRUE);
#ifdef GLX_USE_TLS
- snprintf(realDriverName, 200, "%s/tls/%s_dri.so", libDir, driverName);
- InfoMessageF("OpenDriver: trying %s\n", realDriverName);
- handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
+ if (!handle)
+ handle = try_open(libDir, driverName, GL_TRUE, GL_FALSE);
#endif
-
- if ( handle == NULL ) {
- snprintf(realDriverName, 200, "%s/%s_dri.so", libDir, driverName);
- InfoMessageF("OpenDriver: trying %s\n", realDriverName);
- handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
- }
+ if (!handle)
+ handle = try_open(libDir, driverName, GL_FALSE, GL_FALSE);
if ( handle != NULL ) {
/* allocate __DRIdriver struct */
break;
}
else {
- ErrorMessageF("dlopen %s failed (%s)\n", realDriverName, dlerror());
+ ErrorMessageF("Unable to find/open driver for %s (%s)\n",
+ driverName, dlerror());
}
}
else
Drivers = driver->next;
- Xfree(driver->name);
+ Xfree((void *) driver->name);
Xfree(driver);
break;
}