egl: Make the transition to built-in drivers more smooth.
authorChia-I Wu <olv@lunarg.com>
Sat, 29 Jan 2011 20:52:31 +0000 (04:52 +0800)
committerChia-I Wu <olv@lunarg.com>
Sat, 29 Jan 2011 20:55:08 +0000 (04:55 +0800)
When the user sets EGL_DRIVER to egl_dri2 (or egl_glx), make sure the
built-in driver is used.  The user might leave the outdated egl_dri2.so
(or egl_glx.so) on the filesystem and we do not want to load it.

src/egl/main/egldriver.c

index e133c220f5ca8a6edd6ba953d97003f33ce4dcfe..b75e8b6a2cb32e145c85c337677c7ed59385965e 100644 (file)
@@ -437,6 +437,7 @@ _eglAddUserDriver(void)
 {
    const char *search_path = _eglGetSearchPath();
    char *env;
+   size_t name_len = 0;
 
    env = getenv("EGL_DRIVER");
 #if defined(_EGL_OS_UNIX)
@@ -448,21 +449,39 @@ _eglAddUserDriver(void)
          env = NULL;
       }
    }
+   else if (env) {
+      char *suffix = strchr(env, '.');
+      name_len = (suffix) ? suffix - env : strlen(env);
+   }
+#else
+   if (env)
+      name_len = strlen(env);
 #endif /* _EGL_OS_UNIX */
-   if (env) {
+
+   /*
+    * Try built-in drivers first if we know the driver name.  This makes sure
+    * we do not load the outdated external driver that is still on the
+    * filesystem.
+    */
+   if (name_len) {
       _EGLModule *mod;
       EGLint i;
 
-      /* env can be a path */
-      _eglPreloadForEach(search_path, _eglLoaderFile, (void *) env);
-      /* or the name of a built-in driver */
       for (i = 0; _eglBuiltInDrivers[i].name; i++) {
-         if (!strcmp(_eglBuiltInDrivers[i].name, env)) {
+         if (strlen(_eglBuiltInDrivers[i].name) == name_len &&
+             !strncmp(_eglBuiltInDrivers[i].name, env, name_len)) {
             mod = _eglAddModule(env);
             if (mod)
                mod->BuiltIn = _eglBuiltInDrivers[i].main;
+
+            return EGL_TRUE;
          }
       }
+   }
+
+   /* otherwise, treat env as a path */
+   if (env) {
+      _eglPreloadForEach(search_path, _eglLoaderFile, (void *) env);
 
       return EGL_TRUE;
    }