egl: Rework the synchronization primitives.

This adds error checking to the synchronization primitives.  And
eglWaitGL is now implemented by eglWaitClient.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
This commit is contained in:
Chia-I Wu 2009-09-28 14:12:39 +08:00 committed by Brian Paul
parent 57da499d7b
commit 6c21c8862b
5 changed files with 48 additions and 31 deletions

View file

@ -558,32 +558,66 @@ eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, NativePixmapType target)
EGLBoolean EGLAPIENTRY
eglWaitGL(void)
eglWaitClient(void)
{
_EGLDisplay *disp = _eglGetCurrentDisplay();
_EGLContext *ctx = _eglGetCurrentContext();
_EGLDisplay *disp;
_EGLDriver *drv;
if (!disp)
if (!ctx)
return EGL_TRUE;
/* let bad current context imply bad current surface */
if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
return _eglError(EGL_BAD_CURRENT_SURFACE, __FUNCTION__);
/* a current display is always initialized */
/* a valid current context implies an initialized current display */
disp = ctx->Display;
drv = disp->Driver;
assert(drv);
return drv->API.WaitGL(drv, disp);
return drv->API.WaitClient(drv, disp, ctx);
}
EGLBoolean EGLAPIENTRY
eglWaitGL(void)
{
#ifdef EGL_VERSION_1_2
_EGLThreadInfo *t = _eglGetCurrentThread();
EGLint api_index = t->CurrentAPIIndex;
EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API);
EGLBoolean ret;
if (api_index != es_index && _eglIsCurrentThreadDummy())
return _eglError(EGL_BAD_ALLOC, "eglWaitGL");
t->CurrentAPIIndex = es_index;
ret = eglWaitClient();
t->CurrentAPIIndex = api_index;
return ret;
#else
return eglWaitClient();
#endif
}
EGLBoolean EGLAPIENTRY
eglWaitNative(EGLint engine)
{
_EGLDisplay *disp = _eglGetCurrentDisplay();
_EGLContext *ctx = _eglGetCurrentContext();
_EGLDisplay *disp;
_EGLDriver *drv;
if (!disp)
if (!ctx)
return EGL_TRUE;
/* let bad current context imply bad current surface */
if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
return _eglError(EGL_BAD_CURRENT_SURFACE, __FUNCTION__);
/* a current display is always initialized */
/* a valid current context implies an initialized current display */
disp = ctx->Display;
drv = disp->Driver;
assert(drv);
return drv->API.WaitNative(drv, disp, engine);
}
@ -958,20 +992,4 @@ eglReleaseThread(void)
}
EGLBoolean
eglWaitClient(void)
{
_EGLDisplay *disp = _eglGetCurrentDisplay();
_EGLDriver *drv;
if (!disp)
return EGL_TRUE;
/* a current display is always initialized */
drv = disp->Driver;
return drv->API.WaitClient(drv, disp);
}
#endif /* EGL_VERSION_1_2 */

View file

@ -41,7 +41,7 @@ typedef EGLBoolean (*CopyBuffers_t)(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurfa
/* misc funcs */
typedef const char *(*QueryString_t)(_EGLDriver *drv, _EGLDisplay *dpy, EGLint name);
typedef EGLBoolean (*WaitGL_t)(_EGLDriver *drv, _EGLDisplay *dpy);
typedef EGLBoolean (*WaitClient_t)(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx);
typedef EGLBoolean (*WaitNative_t)(_EGLDriver *drv, _EGLDisplay *dpy, EGLint engine);
typedef _EGLProc (*GetProcAddress_t)(const char *procname);
@ -65,7 +65,6 @@ typedef const char * (*QueryModeStringMESA_t)(_EGLDriver *drv, _EGLDisplay *dpy,
#ifdef EGL_VERSION_1_2
typedef EGLBoolean (*WaitClient_t)(_EGLDriver *drv, _EGLDisplay *dpy);
typedef _EGLSurface *(*CreatePbufferFromClientBuffer_t)(_EGLDriver *drv, _EGLDisplay *dpy, EGLenum buftype, EGLClientBuffer buffer, _EGLConfig *config, const EGLint *attrib_list);
#endif /* EGL_VERSION_1_2 */
@ -101,7 +100,7 @@ struct _egl_api
CopyBuffers_t CopyBuffers;
QueryString_t QueryString;
WaitGL_t WaitGL;
WaitClient_t WaitClient;
WaitNative_t WaitNative;
GetProcAddress_t GetProcAddress;
@ -120,7 +119,6 @@ struct _egl_api
QueryModeStringMESA_t QueryModeStringMESA;
#ifdef EGL_VERSION_1_2
WaitClient_t WaitClient;
CreatePbufferFromClientBuffer_t CreatePbufferFromClientBuffer;
#endif
};

View file

@ -408,7 +408,7 @@ _eglInitDriverFallbacks(_EGLDriver *drv)
drv->API.CopyBuffers = _eglCopyBuffers;
drv->API.QueryString = _eglQueryString;
drv->API.WaitGL = _eglWaitGL;
drv->API.WaitClient = _eglWaitClient;
drv->API.WaitNative = _eglWaitNative;
#ifdef EGL_MESA_screen_surface

View file

@ -108,11 +108,12 @@ _eglQueryString(_EGLDriver *drv, _EGLDisplay *dpy, EGLint name)
EGLBoolean
_eglWaitGL(_EGLDriver *drv, _EGLDisplay *dpy)
_eglWaitClient(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx)
{
/* just a placeholder */
(void) drv;
(void) dpy;
(void) ctx;
return EGL_TRUE;
}

View file

@ -37,7 +37,7 @@ _eglQueryString(_EGLDriver *drv, _EGLDisplay *dpy, EGLint name);
extern EGLBoolean
_eglWaitGL(_EGLDriver *drv, _EGLDisplay *dpy);
_eglWaitClient(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx);
extern EGLBoolean