Browse Source

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.
tags/7.8-rc1
Chia-I Wu 15 years ago
parent
commit
cf22fd5e5b
3 changed files with 35 additions and 20 deletions
  1. 0
    1
      src/egl/main/egldisplay.h
  2. 19
    16
      src/egl/main/egldriver.c
  3. 16
    3
      src/egl/main/egldriver.h

+ 0
- 1
src/egl/main/egldisplay.h View File

@@ -26,7 +26,6 @@ struct _egl_display

EGLNativeDisplayType NativeDisplay;

const char *DriverName;
_EGLDriver *Driver;
void *DriverData; /* private to driver */


+ 19
- 16
src/egl/main/egldriver.c View File

@@ -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;
}



+ 16
- 3
src/egl/main/egldriver.h View File

@@ -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 */

Loading…
Cancel
Save