summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/egl/main/eglapi.c14
-rw-r--r--src/egl/main/eglconfig.c1
-rw-r--r--src/egl/main/egldefines.h1
-rw-r--r--src/egl/main/egldriver.c48
-rw-r--r--src/egl/main/egldriver.h4
-rw-r--r--src/egl/main/eglglobals.c3
6 files changed, 45 insertions, 26 deletions
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index 647be652207..f57dda88833 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -272,13 +272,15 @@ eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
if (!drv) {
_eglPreloadDrivers();
drv = _eglMatchDriver(disp);
- if (!drv)
- RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
+ /* Initialize the particular display now */
+ if (drv && !drv->API.Initialize(drv, disp, &major_int, &minor_int))
+ RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
}
-
- /* Initialize the particular display now */
- if (!drv->API.Initialize(drv, disp, &major_int, &minor_int))
- RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
+ if (!drv)
+ /* Load and initialize the first default driver that works */
+ drv = _eglLoadDefaultDriver(disp, &major_int, &minor_int);
+ if (!drv)
+ RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
disp->APImajor = major_int;
disp->APIminor = minor_int;
diff --git a/src/egl/main/eglconfig.c b/src/egl/main/eglconfig.c
index 21d13cba904..47513a4edb2 100644
--- a/src/egl/main/eglconfig.c
+++ b/src/egl/main/eglconfig.c
@@ -13,7 +13,6 @@
#define MIN2(A, B) (((A) < (B)) ? (A) : (B))
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
/**
diff --git a/src/egl/main/egldefines.h b/src/egl/main/egldefines.h
index 8fc2301b795..4ecd4c1420c 100644
--- a/src/egl/main/egldefines.h
+++ b/src/egl/main/egldefines.h
@@ -40,6 +40,7 @@
#define _EGL_VENDOR_STRING "Mesa Project"
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#endif /* EGLDEFINES_INCLUDED */
diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c
index 2913ce2ece9..566554d51dc 100644
--- a/src/egl/main/egldriver.c
+++ b/src/egl/main/egldriver.c
@@ -36,7 +36,9 @@
/* XXX Need to decide how to do dynamic name lookup on Windows */
-static const char DefaultDriverName[] = "TBD";
+static const char DefaultDriverNames[] = {
+ "TBD",
+};
typedef HMODULE lib_handle;
@@ -63,7 +65,10 @@ library_suffix(void)
#elif defined(_EGL_PLATFORM_POSIX)
-static const char DefaultDriverName[] = "egl_glx";
+static const char *DefaultDriverNames[] = {
+ "egl_dri2",
+ "egl_glx"
+};
typedef void * lib_handle;
@@ -488,17 +493,6 @@ _eglPreloadDisplayDrivers(void)
/**
- * Preload the default driver.
- */
-static EGLBoolean
-_eglPreloadDefaultDriver(void)
-{
- return (_eglPreloadForEach(_eglGetSearchPath(),
- _eglLoaderFile, (void *) DefaultDriverName) > 0);
-}
-
-
-/**
* Preload drivers.
*
* This function loads the driver modules and creates the corresponding
@@ -519,15 +513,13 @@ _eglPreloadDrivers(void)
}
loaded = (_eglPreloadUserDriver() ||
- _eglPreloadDisplayDrivers() ||
- _eglPreloadDefaultDriver());
+ _eglPreloadDisplayDrivers());
_eglUnlockMutex(_eglGlobal.Mutex);
return loaded;
}
-
/**
* Unload preloaded drivers.
*/
@@ -558,6 +550,30 @@ _eglUnloadDrivers(void)
_eglGlobal.NumDrivers = 0;
}
+_EGLDriver *
+_eglLoadDefaultDriver(EGLDisplay dpy, EGLint *major, EGLint *minor)
+{
+ _EGLDriver *drv = NULL;
+ int i;
+
+ _eglLockMutex(_eglGlobal.Mutex);
+
+ for (i = 0; i < ARRAY_SIZE(DefaultDriverNames); i++) {
+ _eglPreloadForEach(_eglGetSearchPath(),
+ _eglLoaderFile, (void *) DefaultDriverNames[i]);
+ if (_eglGlobal.NumDrivers == 0)
+ continue;
+ drv = _eglGlobal.Drivers[0];
+ if (drv->API.Initialize(drv, dpy, major, minor))
+ break;
+ _eglUnloadDrivers();
+ }
+
+ _eglUnlockMutex(_eglGlobal.Mutex);
+
+ return drv;
+}
+
/**
* Plug all the available fallback routines into the given driver's
diff --git a/src/egl/main/egldriver.h b/src/egl/main/egldriver.h
index 28b79562f80..8b34c43b924 100644
--- a/src/egl/main/egldriver.h
+++ b/src/egl/main/egldriver.h
@@ -84,6 +84,10 @@ extern void
_eglUnloadDrivers(void);
+extern _EGLDriver *
+_eglLoadDefaultDriver(EGLDisplay dpy, EGLint *major, EGLint *minor);
+
+
PUBLIC void
_eglInitDriverFallbacks(_EGLDriver *drv);
diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c
index 5182b18e226..e63819e08a2 100644
--- a/src/egl/main/eglglobals.c
+++ b/src/egl/main/eglglobals.c
@@ -6,9 +6,6 @@
#include "eglmutex.h"
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
-
-
static _EGL_DECLARE_MUTEX(_eglGlobalMutex);
struct _egl_global _eglGlobal =
{