]> git.cworth.org Git - apitrace/blobdiff - retrace/glretrace_ws.cpp
glretrace: Put currentContext on TLS.
[apitrace] / retrace / glretrace_ws.cpp
index aeaadb77be0af415295df5ca39bfa1ef563d2c41..66ef10534cdc00d2dad79309ac9dd4688387d2d7 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <string.h>
 
+#include "os_thread.hpp"
 #include "retrace.hpp"
 #include "glproc.hpp"
 #include "glstate.hpp"
@@ -40,7 +41,6 @@
 namespace glretrace {
 
 
-Context *currentContext = NULL;
 
 
 static glws::Visual *
@@ -107,9 +107,14 @@ createContext(Context *shareContext) {
 }
 
 
+typedef Context * CurrentData;
+static os::thread_specific_ptr<CurrentData> currentData;
+
+
 bool
 makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context)
 {
+    Context *currentContext = getCurrentContext();
     glws::Drawable *currentDrawable = currentContext ? currentContext->drawable : NULL;
 
     if (drawable == currentDrawable && context == currentContext) {
@@ -137,22 +142,38 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context)
         currentContext->drawable = NULL;
     }
 
+    CurrentData *currentDataPtr = currentData.get();
+    if (!currentDataPtr) {
+        currentDataPtr = new CurrentData;
+        currentData.reset(currentDataPtr);
+    }
+
     if (drawable && context) {
-        currentContext = context;
-        currentContext->drawable = drawable;
+        context->drawable = drawable;
+        *currentData = context;
         
         if (!context->used) {
             initContext();
             context->used = true;
         }
     } else {
-        currentContext = NULL;
+        *currentData = NULL;
     }
 
     return true;
 }
 
 
+Context *
+getCurrentContext(void) {
+    CurrentData *currentDataPtr = currentData.get();
+    if (!currentDataPtr) {
+        return NULL;
+    }
+    return *currentDataPtr;
+}
+
+
 
 
 /**
@@ -163,6 +184,7 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context)
  */
 void
 updateDrawable(int width, int height) {
+    Context *currentContext = getCurrentContext();
     if (!currentContext) {
         return;
     }