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 a31b252..f898ba5 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 dad653a..f11080b 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 b760ebc..07b63e9 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 2b9034d..fd7e007 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 a1b10c7..a17968e 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 1a6f12d..44b4626 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 82f47f1..4606168 100644 (file)
@@ -1,7 +1,5 @@
 /**
  * Surface-related functions.
- *
- * See the eglcontext.c file for comments that also apply here.
  */
 
 
index d963ba5..fa8cb49 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)();