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
@@ -26,7 +26,6 @@ struct _egl_display | |||
EGLNativeDisplayType NativeDisplay; | |||
const char *DriverName; | |||
_EGLDriver *Driver; | |||
void *DriverData; /* private to driver */ | |||
@@ -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,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 */ |