Some initial per-thread support.
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 10 Dec 2005 17:54:00 +0000 (17:54 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 10 Dec 2005 17:54:00 +0000 (17:54 +0000)
Rename eglShowSurfaceMESA to eglShowScreenSurfaceMESA.

src/egl/main/eglapi.c
src/egl/main/eglapi.h
src/egl/main/eglcontext.c
src/egl/main/egldriver.c
src/egl/main/eglglobals.c
src/egl/main/eglglobals.h
src/egl/main/eglsurface.c
src/egl/main/egltypedefs.h

index a31b252311ce45a4f66a33a155e5eccd85518efe..f898ba59fbe07c05461492ef756491f6511986c6 100644 (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);
 }
 
 
index dad653af97e2c738de106dad99217e4ce6d63ebe..f11080be1c0e710bf76e4d1787aea7220c05d137 100644 (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;
index b760ebcb40a4a9c7da74f340a7971840a20a501d..07b63e9b1123fb21c1fe985eafa64bbad5474676 100644 (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;
 }
index 2b9034dbcfb386296e4615d534a5efd02915a8a2..fd7e00778e11ae4686c1c8f39fb9b8af9f83e858 100644 (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;
index a1b10c7a12f49393ea780fc8f829f697eb2028fa..a17968e7ff275f4350ee5df49a604c74b8302c83 100644 (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:
index 1a6f12d174ee65b36d7220391be5c2e4450382c9..44b4626c5831f25dc25ad5e90a42dcf02777e168 100644 (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);
 
index 82f47f116b60f2ddd0a3e13d3412a22b541b6ce3..4606168cf32872822f874f08a0efa46770c9338e 100644 (file)
@@ -1,7 +1,5 @@
 /**
  * Surface-related functions.
- *
- * See the eglcontext.c file for comments that also apply here.
  */
 
 
index d963ba50e50a8ce139ec84fde5795488aef2191e..fa8cb496f8d850dc621a39adad602c0e8d4d9ca3 100644 (file)
@@ -23,6 +23,8 @@ typedef struct _egl_screen _EGLScreen;
 
 typedef struct _egl_surface _EGLSurface;
 
+typedef struct _egl_thread_info _EGLThreadInfo;
+
 
 typedef void (*_EGLProc)();