make current GLX context per-thread
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 20 Sep 2006 14:39:47 +0000 (14:39 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 20 Sep 2006 14:39:47 +0000 (14:39 +0000)
src/mesa/drivers/x11/glxapi.c

index 4f3dca8f48472210eee5b47bb52f40e128a2bbdd..7945f1c5b0651020efabf9c18860401a84c71ec2 100644 (file)
@@ -124,9 +124,30 @@ get_dispatch(Display *dpy)
    
 
 
-/* Set by glXMakeCurrent() and glXMakeContextCurrent() only */
+/**
+ * GLX API current context.
+ */
+#if defined(GLX_USE_TLS)
+PUBLIC __thread void * CurrentContext
+    __attribute__((tls_model("initial-exec")));
+#elif defined(THREADS)
+static _glthread_TSD ContextTSD;         /**< Per-thread context pointer */
+#else
 static GLXContext CurrentContext = 0;
-#define __glXGetCurrentContext() CurrentContext;
+#endif
+
+
+static void
+SetCurrentContext(GLXContext c)
+{
+#if defined(GLX_USE_TLS)
+   CurrentContext = context;
+#elif defined(THREADS)
+   _glthread_SetTSD(&ContextTSD, c);
+#else
+   CurrentContext = c;
+#endif
+}
 
 
 /*
@@ -186,6 +207,8 @@ glXDestroyContext(Display *dpy, GLXContext ctx)
    GET_DISPATCH(dpy, t);
    if (!t)
       return;
+   if (glXGetCurrentContext() == ctx)
+      SetCurrentContext(NULL);
    (t->DestroyContext)(dpy, ctx);
 }
 
@@ -215,7 +238,13 @@ glXGetConfig(Display *dpy, XVisualInfo *visinfo, int attrib, int *value)
 GLXContext PUBLIC
 glXGetCurrentContext(void)
 {
+#if defined(GLX_USE_TLS)
    return CurrentContext;
+#elif defined(THREADS)
+   return _glthread_GetTSD(&ContextTSD);
+#else
+   return CurrentContext;
+#endif
 }
 
 
@@ -249,7 +278,7 @@ glXMakeCurrent(Display *dpy, GLXDrawable drawable, GLXContext ctx)
    }
    b = (*t->MakeCurrent)(dpy, drawable, ctx);
    if (b) {
-      CurrentContext = ctx;
+      SetCurrentContext(ctx);
    }
    return b;
 }
@@ -524,7 +553,7 @@ glXMakeContextCurrent(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXConte
       return False;
    b = (t->MakeContextCurrent)(dpy, draw, read, ctx);
    if (b) {
-      CurrentContext = ctx;
+      SetCurrentContext(ctx);
    }
    return b;
 }