Some initial per-thread support.

Rename eglShowSurfaceMESA to eglShowScreenSurfaceMESA.
This commit is contained in:
Brian Paul 2005-12-10 17:54:00 +00:00
parent b04dd5c587
commit 4882279633
8 changed files with 53 additions and 22 deletions

View file

@ -300,8 +300,9 @@ eglGetCurrentSurface(EGLint readdraw)
EGLint APIENTRY
eglGetError(void)
{
EGLint e = _eglGlobal.LastError;
_eglGlobal.LastError = EGL_SUCCESS;
_EGLThreadInfo *t = _eglGetCurrentThread();
EGLint e = t->LastError;
t->LastError = EGL_SUCCESS;
return e;
}
@ -351,7 +352,7 @@ void (* APIENTRY eglGetProcAddress(const char *procname))()
{ "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
{ "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
{ "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
{ "eglShowSurfaceMESA", (_EGLProc) eglShowSurfaceMESA },
{ "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
{ "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
{ "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
{ "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
@ -444,10 +445,10 @@ eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config, const EGLint *attri
EGLBoolean
eglShowSurfaceMESA(EGLDisplay dpy, EGLint screen, EGLSurface surface, EGLModeMESA mode)
eglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen, EGLSurface surface, EGLModeMESA mode)
{
_EGLDriver *drv = _eglLookupDriver(dpy);
return drv->API.ShowSurfaceMESA(drv, dpy, screen, surface, mode);
return drv->API.ShowScreenSurfaceMESA(drv, dpy, screen, surface, mode);
}

View file

@ -47,7 +47,7 @@ typedef EGLBoolean (*GetModeAttribMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLMo
typedef EGLBoolean (*CopyContextMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLContext source, EGLContext dest, EGLint mask);
typedef EGLBoolean (*GetScreensMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA *screens, EGLint max_screens, EGLint *num_screens);
typedef EGLSurface (*CreateScreenSurfaceMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
typedef EGLBoolean (*ShowSurfaceMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLSurface surface, EGLModeMESA mode);
typedef EGLBoolean (*ShowScreenSurfaceMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLSurface surface, EGLModeMESA mode);
typedef EGLBoolean (*ScreenPositionMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y);
typedef EGLBoolean (*QueryScreenMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLint attribute, EGLint *value);
typedef EGLBoolean (*QueryScreenSurfaceMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLSurface *surface);
@ -95,7 +95,7 @@ struct _egl_api
CopyContextMESA_t CopyContextMESA;
GetScreensMESA_t GetScreensMESA;
CreateScreenSurfaceMESA_t CreateScreenSurfaceMESA;
ShowSurfaceMESA_t ShowSurfaceMESA;
ShowScreenSurfaceMESA_t ShowScreenSurfaceMESA;
ScreenPositionMESA_t ScreenPositionMESA;
QueryScreenMESA_t QueryScreenMESA;
QueryScreenSurfaceMESA_t QueryScreenSurfaceMESA;

View file

@ -87,8 +87,8 @@ _eglLookupContext(EGLContext ctx)
_EGLContext *
_eglGetCurrentContext(void)
{
/* XXX this should be per-thread someday */
return _eglGlobal.CurrentContext;
_EGLThreadInfo *t = _eglGetCurrentThread();
return t->CurrentContext;
}
@ -176,6 +176,7 @@ EGLBoolean
_eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface d,
EGLSurface r, EGLContext context)
{
_EGLThreadInfo *t = _eglGetCurrentThread();
_EGLContext *ctx = _eglLookupContext(context);
_EGLSurface *draw = _eglLookupSurface(d);
_EGLSurface *read = _eglLookupSurface(r);
@ -250,7 +251,7 @@ _eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface d,
read->IsBound = EGL_TRUE;
}
_eglGlobal.CurrentContext = ctx;
t->CurrentContext = ctx;
return EGL_TRUE;
}

View file

@ -187,7 +187,7 @@ _eglInitDriverFallbacks(_EGLDriver *drv)
drv->API.GetModeAttribMESA = _eglGetModeAttribMESA;
drv->API.GetScreensMESA = _eglGetScreensMESA;
drv->API.CreateScreenSurfaceMESA = _eglCreateScreenSurfaceMESA;
drv->API.ShowSurfaceMESA = _eglShowSurfaceMESA;
drv->API.ShowScreenSurfaceMESA = _eglShowScreenSurfaceMESA;
drv->API.ScreenPositionMESA = _eglScreenPositionMESA;
drv->API.QueryScreenMESA = _eglQueryScreenMESA;
drv->API.QueryScreenSurfaceMESA = _eglQueryScreenSurfaceMESA;

View file

@ -2,7 +2,7 @@
#include "eglglobals.h"
struct _egl_global _eglGlobal = { EGL_FALSE };
struct _egl_global _eglGlobal = { .Initialized = EGL_FALSE };
/**
@ -17,9 +17,10 @@ _eglInitGlobals(void)
_eglGlobal.Contexts = _eglNewHashTable();
_eglGlobal.Surfaces = _eglNewHashTable();
_eglGlobal.FreeScreenHandle = 1;
_eglGlobal.CurrentContext = EGL_NO_CONTEXT;
_eglGlobal.LastError = EGL_SUCCESS;
_eglGlobal.Initialized = EGL_TRUE;
/* XXX temporary */
_eglGlobal.ThreadInfo.CurrentContext = EGL_NO_CONTEXT;
_eglGlobal.ThreadInfo.LastError = EGL_SUCCESS;
}
}
@ -37,6 +38,18 @@ _eglDestroyGlobals(void)
}
/**
* Return pointer to calling thread's _EGLThreadInfo object.
* Create a new one if needed.
* Should never return NULL.
*/
_EGLThreadInfo *
_eglGetCurrentThread(void)
{
/* XXX temporary */
return &_eglGlobal.ThreadInfo;
}
/**
* Record EGL error code.
@ -44,10 +57,11 @@ _eglDestroyGlobals(void)
void
_eglError(EGLint errCode, const char *msg)
{
_EGLThreadInfo *t = _eglGetCurrentThread();
const char *s;
if (_eglGlobal.LastError == EGL_SUCCESS) {
_eglGlobal.LastError = errCode;
if (t->LastError == EGL_SUCCESS) {
t->LastError = errCode;
switch (errCode) {
case EGL_BAD_ACCESS:

View file

@ -5,6 +5,19 @@
#include "eglhash.h"
/**
* Per-thread info
*/
struct _egl_thread_info
{
EGLint LastError;
_EGLContext *CurrentContext;
};
/**
* Global library data
*/
struct _egl_global
{
EGLBoolean Initialized;
@ -15,10 +28,8 @@ struct _egl_global
EGLScreenMESA FreeScreenHandle;
EGLint LastError;
/* XXX this should be per-thread someday */
_EGLContext *CurrentContext;
/* XXX temporary */
_EGLThreadInfo ThreadInfo;
};
@ -33,6 +44,10 @@ extern void
_eglDestroyGlobals(void);
extern _EGLThreadInfo *
_eglGetCurrentThread(void);
extern void
_eglError(EGLint errCode, const char *msg);

View file

@ -1,7 +1,5 @@
/**
* Surface-related functions.
*
* See the eglcontext.c file for comments that also apply here.
*/

View file

@ -23,6 +23,8 @@ typedef struct _egl_screen _EGLScreen;
typedef struct _egl_surface _EGLSurface;
typedef struct _egl_thread_info _EGLThreadInfo;
typedef void (*_EGLProc)();