]> git.cworth.org Git - apitrace/blobdiff - retrace/glretrace_ws.cpp
glretrace: Put currentContext on TLS.
[apitrace] / retrace / glretrace_ws.cpp
index ccc70233a73a5b7427148732205f39cff7e51bad..66ef10534cdc00d2dad79309ac9dd4688387d2d7 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <string.h>
 
+#include "os_thread.hpp"
 #include "retrace.hpp"
 #include "glproc.hpp"
 #include "glstate.hpp"
@@ -40,8 +41,6 @@
 namespace glretrace {
 
 
-glws::Drawable *currentDrawable = NULL;
-Context *currentContext = NULL;
 
 
 static glws::Visual *
@@ -108,14 +107,21 @@ 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) {
         return true;
     }
 
-    if (currentDrawable && currentContext) {
+    if (currentContext) {
         glFlush();
         if (!retrace::doubleBuffer) {
             frame_complete(call);
@@ -132,23 +138,42 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context)
         return false;
     }
 
+    if (currentContext) {
+        currentContext->drawable = NULL;
+    }
+
+    CurrentData *currentDataPtr = currentData.get();
+    if (!currentDataPtr) {
+        currentDataPtr = new CurrentData;
+        currentData.reset(currentDataPtr);
+    }
+
     if (drawable && context) {
-        currentDrawable = drawable;
-        currentContext = context;
+        context->drawable = drawable;
+        *currentData = context;
         
         if (!context->used) {
             initContext();
             context->used = true;
         }
     } else {
-        currentDrawable = NULL;
-        currentContext = NULL;
+        *currentData = NULL;
     }
 
     return true;
 }
 
 
+Context *
+getCurrentContext(void) {
+    CurrentData *currentDataPtr = currentData.get();
+    if (!currentDataPtr) {
+        return NULL;
+    }
+    return *currentDataPtr;
+}
+
+
 
 
 /**
@@ -159,10 +184,14 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context)
  */
 void
 updateDrawable(int width, int height) {
-    if (!currentDrawable) {
+    Context *currentContext = getCurrentContext();
+    if (!currentContext) {
         return;
     }
 
+    glws::Drawable *currentDrawable = currentContext->drawable;
+    assert(currentDrawable);
+
     if (currentDrawable->visible &&
         width  <= currentDrawable->width &&
         height <= currentDrawable->height) {
@@ -188,4 +217,26 @@ updateDrawable(int width, int height) {
 }
 
 
+int
+parseAttrib(const trace::Value *attribs, int param, int default_ = 0) {
+    const trace::Array *attribs_ = dynamic_cast<const trace::Array *>(attribs);
+
+    if (attribs_) {
+        for (size_t i = 0; i + 1 < attribs_->values.size(); i += 2) {
+            int param_i = attribs_->values[i]->toSInt();
+            if (param_i == 0) {
+                break;
+            }
+
+            if (param_i == param) {
+                int value = attribs_->values[i + 1]->toSInt();
+                return value;
+            }
+        }
+    }
+
+    return default_;
+}
+
+
 } /* namespace glretrace */