Change EGLModule to have an EGLDriver per supported platform and cache based on EGLModule-platform pair rather than just EGLModule. --- src/egl/main/egldisplay.c | 3 +-- src/egl/main/egldriver.c | 55 +++++++++++++++++++++++++++-------------------- 2 files changed, 33 insertions(+), 25 deletions(-)
diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c index 985e781..482a956 100644 --- a/src/egl/main/egldisplay.c +++ b/src/egl/main/egldisplay.c @@ -60,7 +60,6 @@ #include <sys/stat.h> #endif - /** * Map --with-egl-platforms names to platform types. */ @@ -188,7 +187,7 @@ _eglNativePlatformDetectNativeDisplay(EGLNativeDisplayType nativeDisplay) _EGLPlatformType _eglGetNativePlatform(EGLNativeDisplayType nativeDisplay) { - static _EGLPlatformType native_platform = _EGL_INVALID_PLATFORM; + _EGLPlatformType native_platform = _EGL_INVALID_PLATFORM; char *detection_method = NULL; if (native_platform == _EGL_INVALID_PLATFORM) { diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c index ffdd146..e4c9859 100644 --- a/src/egl/main/egldriver.c +++ b/src/egl/main/egldriver.c @@ -57,7 +57,7 @@ typedef struct _egl_module { char *Path; _EGLMain_t BuiltIn; void *Handle; - _EGLDriver *Driver; + _EGLDriver *Driver[_EGL_NUM_PLATFORMS]; } _EGLModule; static _EGL_DECLARE_MUTEX(_eglModuleMutex); @@ -134,7 +134,6 @@ library_suffix(void) #endif - /** * Open the named driver and find its bootstrap function: _eglMain(). */ @@ -147,8 +146,12 @@ _eglOpenLibrary(const char *driverPath, lib_handle *handle) assert(driverPath); - _eglLog(_EGL_DEBUG, "dlopen(%s)", driverPath); - lib = open_library(driverPath); + if (*handle) { + lib = *handle; + } else { + _eglLog(_EGL_DEBUG, "dlopen(%s)", driverPath); + lib = open_library(driverPath); + } #if defined(_EGL_OS_WINDOWS) /* XXX untested */ @@ -194,13 +197,13 @@ _eglOpenLibrary(const char *driverPath, lib_handle *handle) * Load a module and create the driver object. */ static EGLBoolean -_eglLoadModule(_EGLModule *mod) +_eglLoadModule(_EGLModule *mod, _EGLPlatformType plat) { _EGLMain_t mainFunc; - lib_handle lib; + lib_handle lib = (lib_handle) mod->Handle; _EGLDriver *drv; - if (mod->Driver) + if (mod->Driver[plat]) return EGL_TRUE; if (mod->BuiltIn) { @@ -226,7 +229,7 @@ _eglLoadModule(_EGLModule *mod) } mod->Handle = (void *) lib; - mod->Driver = drv; + mod->Driver[plat] = drv; return EGL_TRUE; } @@ -240,8 +243,10 @@ _eglUnloadModule(_EGLModule *mod) { #if defined(_EGL_OS_UNIX) /* destroy the driver */ - if (mod->Driver && mod->Driver->Unload) - mod->Driver->Unload(mod->Driver); + for (int plat = 0; plat < _EGL_NUM_PLATFORMS; ++plat) { + if (mod->Driver[plat] && mod->Driver[plat]->Unload) + mod->Driver[plat]->Unload(mod->Driver[plat]); + } /* * XXX At this point (atexit), the module might be the last reference to @@ -255,7 +260,9 @@ _eglUnloadModule(_EGLModule *mod) /* XXX Windows unloads DLLs before atexit */ #endif - mod->Driver = NULL; + for (int plat = 0; plat < _EGL_NUM_PLATFORMS; ++plat) { + mod->Driver[plat] = NULL; + } mod->Handle = NULL; } @@ -599,17 +606,17 @@ _eglMatchAndInitialize(_EGLDisplay *dpy) while (i < _eglModules->Size) { _EGLModule *mod = (_EGLModule *) _eglModules->Elements[i]; - if (!_eglLoadModule(mod)) { + if (!_eglLoadModule(mod, dpy->Platform)) { /* remove invalid modules */ _eglEraseArray(_eglModules, i, _eglFreeModule); continue; } - if (mod->Driver->API.Initialize(mod->Driver, dpy)) { - drv = mod->Driver; + drv = mod->Driver[dpy->Platform]; + if (drv->API.Initialize(drv, dpy)) break; - } else { + drv = NULL; i++; } } @@ -661,7 +668,6 @@ __eglMustCastToProperFunctionPointerType _eglGetDriverProc(const char *procname) { EGLint i; - _EGLProc proc = NULL; if (!_eglModules) { /* load the driver for the default display */ @@ -673,15 +679,18 @@ _eglGetDriverProc(const char *procname) for (i = 0; i < _eglModules->Size; i++) { _EGLModule *mod = (_EGLModule *) _eglModules->Elements[i]; - - if (!mod->Driver) - break; - proc = mod->Driver->API.GetProcAddress(mod->Driver, procname); - if (proc) - break; + _EGLProc proc; + + for (_EGLPlatformType plat = 0; plat < _EGL_NUM_PLATFORMS; ++plat) { + if (!mod->Driver[plat]) + continue; + proc = mod->Driver[plat]->API.GetProcAddress(mod->Driver[plat], procname); + if (proc) + return proc; + } } - return proc; + return NULL; } -- 1.8.3.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev