egl: Use a boolean to indicate whether a display is initialized.

The driver pointer of the display was used to decide whether a display
is initialized.  Use a boolean for that purpose allows accessing the
driver of an uninitialized display.
This commit is contained in:
Chia-I Wu
2010-01-27 23:55:58 +08:00
parent 8f81769148
commit a933259daa
2 changed files with 20 additions and 16 deletions

View File

@@ -94,19 +94,20 @@ EGLBoolean EGLAPIENTRY
eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
{
_EGLDisplay *disp = _eglLookupDisplay(dpy);
_EGLDriver *drv;
EGLint major_int, minor_int;
if (!disp)
return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
drv = disp->Driver;
if (!drv) {
_eglPreloadDrivers();
if (!disp->Initialized) {
_EGLDriver *drv = disp->Driver;
drv = _eglMatchDriver(disp);
if (!drv)
return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__);
if (!drv) {
_eglPreloadDrivers();
drv = _eglMatchDriver(disp);
if (!drv)
return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__);
}
/* Initialize the particular display now */
if (!drv->API.Initialize(drv, disp, &major_int, &minor_int))
@@ -121,6 +122,7 @@ eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
disp->ClientAPIsMask &= _EGL_API_ALL_BITS;
disp->Driver = drv;
disp->Initialized = EGL_TRUE;
} else {
major_int = disp->APImajor;
minor_int = disp->APIminor;
@@ -140,15 +142,16 @@ EGLBoolean EGLAPIENTRY
eglTerminate(EGLDisplay dpy)
{
_EGLDisplay *disp = _eglLookupDisplay(dpy);
_EGLDriver *drv;
if (!disp)
return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
drv = disp->Driver;
if (drv) {
if (disp->Initialized) {
_EGLDriver *drv = disp->Driver;
drv->API.Terminate(drv, disp);
disp->Driver = NULL;
/* do not reset disp->Driver */
disp->Initialized = EGL_FALSE;
}
return EGL_TRUE;
@@ -165,7 +168,7 @@ _eglCheckDisplay(_EGLDisplay *disp, const char *msg)
_eglError(EGL_BAD_DISPLAY, msg);
return NULL;
}
if (!disp->Driver) {
if (!disp->Initialized) {
_eglError(EGL_NOT_INITIALIZED, msg);
return NULL;
}
@@ -572,8 +575,8 @@ eglWaitClient(void)
/* a valid current context implies an initialized current display */
disp = ctx->Resource.Display;
assert(disp->Initialized);
drv = disp->Driver;
assert(drv);
return drv->API.WaitClient(drv, disp, ctx);
}
@@ -616,8 +619,8 @@ eglWaitNative(EGLint engine)
/* a valid current context implies an initialized current display */
disp = ctx->Resource.Display;
assert(disp->Initialized);
drv = disp->Driver;
assert(drv);
return drv->API.WaitNative(drv, disp, engine);
}
@@ -991,8 +994,8 @@ eglReleaseThread(void)
if (ctx) {
_EGLDisplay *disp = ctx->Resource.Display;
_EGLDriver *drv = disp->Driver;
/* what if drv is not avaialbe? */
if (drv)
/* what if display is not initialized? */
if (disp->Initialized)
(void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
}
}

View File

@@ -49,6 +49,7 @@ struct _egl_display
EGLNativeDisplayType NativeDisplay;
EGLBoolean Initialized; /**< True if the display is initialized */
_EGLDriver *Driver;
void *DriverData; /* private to driver */