diff options
author | Chia-I Wu <[email protected]> | 2010-01-19 18:39:59 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2010-01-20 17:44:11 +0800 |
commit | cf22fd5e5b13ccdb02ba0368ea722ede3bbc6de0 (patch) | |
tree | a0d8b791cd341b3108616c31014ef883922d12da | |
parent | 925f8113beba03e956351cee6780b1c7ab76add8 (diff) |
egl: Improve driver matching.
Make drv->Probe return a score so that the matching can be done by
finding the driver with the highest score.
-rw-r--r-- | src/egl/main/egldisplay.h | 1 | ||||
-rw-r--r-- | src/egl/main/egldriver.c | 35 | ||||
-rw-r--r-- | src/egl/main/egldriver.h | 19 |
3 files changed, 35 insertions, 20 deletions
diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index ddd98069859..a69813196f8 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -26,7 +26,6 @@ struct _egl_display EGLNativeDisplayType NativeDisplay; - const char *DriverName; _EGLDriver *Driver; void *DriverData; /* private to driver */ diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c index dd363a18f46..ef1c366b302 100644 --- a/src/egl/main/egldriver.c +++ b/src/egl/main/egldriver.c @@ -218,32 +218,35 @@ _eglLoadDriver(const char *path, const char *args) /** * Match a display to a preloaded driver. + * + * The matching is done by finding the driver with the highest score. */ static _EGLDriver * _eglMatchDriver(_EGLDisplay *dpy) { - _EGLDriver *defaultDriver = NULL; - EGLint i; + _EGLDriver *best_drv = NULL; + EGLint best_score = -1, i; for (i = 0; i < _eglGlobal.NumDrivers; i++) { _EGLDriver *drv = _eglGlobal.Drivers[i]; - - /* display specifies a driver */ - if (dpy->DriverName) { - if (strcmp(dpy->DriverName, drv->Name) == 0) - return drv; - } - else if (drv->Probe) { - if (drv->Probe(drv, dpy)) - return drv; - } - else { - if (!defaultDriver) - defaultDriver = drv; + EGLint score; + + score = (drv->Probe) ? drv->Probe(drv, dpy) : 0; + if (score > best_score) { + if (best_drv) { + _eglLog(_EGL_DEBUG, "driver %s has higher score than %s", + drv->Name, best_drv->Name); + } + + best_drv = drv; + best_score = score; + /* perfect match */ + if (score >= 100) + break; } } - return defaultDriver; + return best_drv; } diff --git a/src/egl/main/egldriver.h b/src/egl/main/egldriver.h index eca96fce61d..808b1c3fb70 100644 --- a/src/egl/main/egldriver.h +++ b/src/egl/main/egldriver.h @@ -16,9 +16,22 @@ struct _egl_driver const char *Args; /**< args to load this driver */ const char *Name; /**< name of this driver */ - /**< probe a display to see if it is supported */ - EGLBoolean (*Probe)(_EGLDriver *drv, _EGLDisplay *dpy); - /**< called before dlclose to release 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(). + */ void (*Unload)(_EGLDriver *drv); _EGLAPI API; /**< EGL API dispatch table */ |