diff options
author | Chia-I Wu <olv@lunarg.com> | 2011-01-13 00:27:45 +0800 |
---|---|---|
committer | Chia-I Wu <olv@lunarg.com> | 2011-01-13 18:10:38 +0800 |
commit | 655e4598927728a663f4cfcd6babdf7e5ad83f77 (patch) | |
tree | fa937088bf0e27f51311c86dfbc016c103331f00 /src/egl/main | |
parent | a4a38dcf61f141297a083ccac217200947d57b0d (diff) |
egl: Simplify driver matching.
Add initialization options that drv->API.Initialize should support.
Replace drv->Probe by TestOnly initialization option and simplify
_eglMatchDriver.
Diffstat (limited to 'src/egl/main')
-rw-r--r-- | src/egl/main/egldisplay.h | 5 | ||||
-rw-r--r-- | src/egl/main/egldriver.c | 121 | ||||
-rw-r--r-- | src/egl/main/egldriver.h | 12 |
3 files changed, 54 insertions, 84 deletions
diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index faeb290647..b42760befa 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -90,6 +90,11 @@ struct _egl_display _EGLDriver *Driver; /**< Matched driver of the display */ EGLBoolean Initialized; /**< True if the display is initialized */ + /* options that affect how the driver initializes the display */ + struct { + EGLBoolean TestOnly; /**< Driver should not set fields when true */ + } Options; + /* these fields are set by the driver during init */ void *DriverData; /**< Driver private data */ EGLint VersionMajor; /**< EGL major version */ diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c index 1ae030db44..7baa24fbf8 100644 --- a/src/egl/main/egldriver.c +++ b/src/egl/main/egldriver.c @@ -525,100 +525,75 @@ _eglAddDrivers(void) /** - * Match a display to a driver. The display is initialized unless use_probe is - * true. - * - * The matching is done by finding the first driver that can initialize the - * display, or when use_probe is true, the driver with highest score. + * A helper function for _eglMatchDriver. It finds the first driver that can + * initialize the display and return. */ -_EGLDriver * -_eglMatchDriver(_EGLDisplay *dpy, EGLBoolean use_probe) +static _EGLDriver * +_eglMatchAndInitialize(_EGLDisplay *dpy) { - _EGLModule *mod; - _EGLDriver *best_drv = NULL; - EGLint best_score = 0; - EGLint i; - - _eglLockMutex(&_eglModuleMutex); + _EGLDriver *drv = NULL; + EGLint i = 0; if (!_eglAddDrivers()) { - _eglUnlockMutex(&_eglModuleMutex); _eglLog(_EGL_WARNING, "failed to find any driver"); - return EGL_FALSE; + return NULL; } - /* match the loaded modules */ - for (i = 0; i < _eglModules->Size; i++) { - mod = (_EGLModule *) _eglModules->Elements[i]; - if (!mod->Driver) - break; + if (dpy->Driver) { + drv = dpy->Driver; + /* no re-matching? */ + if (!drv->API.Initialize(drv, dpy)) + drv = NULL; + return drv; + } - if (use_probe) { - EGLint score = (mod->Driver->Probe) ? - mod->Driver->Probe(mod->Driver, dpy) : 1; - if (score > best_score) { - best_drv = mod->Driver; - best_score = score; - } + while (i < _eglModules->Size) { + _EGLModule *mod = (_EGLModule *) _eglModules->Elements[i]; + + if (!_eglLoadModule(mod)) { + /* remove invalid modules */ + _eglEraseArray(_eglModules, i, _eglFreeModule); + continue; + } + + if (mod->Driver->API.Initialize(mod->Driver, dpy)) { + drv = mod->Driver; + break; } else { - if (mod->Driver->API.Initialize(mod->Driver, dpy)) { - best_drv = mod->Driver; - best_score = 100; - } + i++; } - /* perfect match */ - if (best_score >= 100) - break; } - /* load more modules */ - if (!best_drv) { - EGLint first_unloaded = i; + return drv; +} - while (i < _eglModules->Size) { - mod = (_EGLModule *) _eglModules->Elements[i]; - assert(!mod->Driver); - if (!_eglLoadModule(mod)) { - /* remove invalid modules */ - _eglEraseArray(_eglModules, i, _eglFreeModule); - continue; - } +/** + * Match a display to a driver. The display is initialized unless test_only is + * true. The matching is done by finding the first driver that can initialize + * the display. + */ +_EGLDriver * +_eglMatchDriver(_EGLDisplay *dpy, EGLBoolean test_only) +{ + _EGLDriver *best_drv; - if (use_probe) { - best_score = (mod->Driver->Probe) ? - mod->Driver->Probe(mod->Driver, dpy) : 1; - } - else { - if (mod->Driver->API.Initialize(mod->Driver, dpy)) - best_score = 100; - } + assert(!dpy->Initialized); - if (best_score > 0) { - best_drv = mod->Driver; - /* loaded modules come before unloaded ones */ - if (first_unloaded != i) { - void *tmp = _eglModules->Elements[i]; - _eglModules->Elements[i] = - _eglModules->Elements[first_unloaded]; - _eglModules->Elements[first_unloaded] = tmp; - } - break; - } - else { - _eglUnloadModule(mod); - i++; - } - } - } + _eglLockMutex(&_eglModuleMutex); + + /* set options */ + dpy->Options.TestOnly = test_only; + + best_drv = _eglMatchAndInitialize(dpy); _eglUnlockMutex(&_eglModuleMutex); if (best_drv) { - _eglLog(_EGL_DEBUG, "the best driver is %s (score %d)", - best_drv->Name, best_score); - if (!use_probe) { + _eglLog(_EGL_DEBUG, "the best driver is %s%s", + best_drv->Name, (test_only) ? " (test only) " : ""); + if (!test_only) { dpy->Driver = best_drv; dpy->Initialized = EGL_TRUE; } diff --git a/src/egl/main/egldriver.h b/src/egl/main/egldriver.h index d617757919..3cde102d12 100644 --- a/src/egl/main/egldriver.h +++ b/src/egl/main/egldriver.h @@ -44,16 +44,6 @@ struct _egl_driver const char *Name; /**< name of this driver */ /** - * Probe a display and return a score. - * - * Roughly, - * 50 means the driver supports the display; - * 90 means the driver can accelerate the display; - * 100 means a perfect match. - */ - EGLint (*Probe)(_EGLDriver *drv, _EGLDisplay *dpy); - - /** * Release the driver resource. * * It is called before dlclose(). @@ -81,7 +71,7 @@ _eglMain(const char *args); extern _EGLDriver * -_eglMatchDriver(_EGLDisplay *dpy, EGLBoolean probe_only); +_eglMatchDriver(_EGLDisplay *dpy, EGLBoolean test_only); extern __eglMustCastToProperFunctionPointerType |