]> git.cworth.org Git - apitrace/blobdiff - glretrace_glx.cpp
Handle vertex attriv locations correctly.
[apitrace] / glretrace_glx.cpp
index 74022e769305e6f6deb7235831f6f2619a411da2..7edcfa0ffeeefc3d4caa1cd70cb4a638d892cf58 100644 (file)
@@ -58,7 +58,13 @@ static void retrace_glXChooseVisual(Trace::Call &call) {
 
 static void retrace_glXCreateContext(Trace::Call &call) {
     void * orig_context = call.ret->toPointer();
-    glws::Context *context = ws->createContext(glretrace::visual);
+    glws::Context *share_context = NULL;
+
+    if (call.arg(2).toPointer()) {
+        share_context = context_map[call.arg(2).toPointer()];
+    }
+
+    glws::Context *context = ws->createContext(glretrace::visual, share_context);
     context_map[orig_context] = context;
 }
 
@@ -66,6 +72,13 @@ static void retrace_glXDestroyContext(Trace::Call &call) {
 }
 
 static void retrace_glXMakeCurrent(Trace::Call &call) {
+    glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt());
+    glws::Context *new_context = context_map[call.arg(2).toPointer()];
+
+    if (new_drawable == drawable && new_context == context) {
+        return;
+    }
+
     if (drawable && context) {
         glFlush();
         if (!double_buffer) {
@@ -73,9 +86,6 @@ static void retrace_glXMakeCurrent(Trace::Call &call) {
         }
     }
 
-    glws::Drawable *new_drawable = getDrawable(static_cast<unsigned long>(call.arg(1)));
-    glws::Context *new_context = context_map[call.arg(2).toPointer()];
-
     bool result = ws->makeCurrent(new_drawable, new_context);
 
     if (new_drawable && new_context && result) {
@@ -169,10 +179,25 @@ static void retrace_glXQueryDrawable(Trace::Call &call) {
 }
 
 static void retrace_glXCreateNewContext(Trace::Call &call) {
-    retrace_glXCreateContext(call);
+    void * orig_context = call.ret->toPointer();
+    glws::Context *share_context = NULL;
+
+    if (call.arg(3).toPointer()) {
+        share_context = context_map[call.arg(3).toPointer()];
+    }
+
+    glws::Context *context = ws->createContext(glretrace::visual, share_context);
+    context_map[orig_context] = context;
 }
 
 static void retrace_glXMakeContextCurrent(Trace::Call &call) {
+    glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt());
+    glws::Context *new_context = context_map[call.arg(3).toPointer()];
+
+    if (new_drawable == drawable && new_context == context) {
+        return;
+    }
+
     if (drawable && context) {
         glFlush();
         if (!double_buffer) {
@@ -180,9 +205,6 @@ static void retrace_glXMakeContextCurrent(Trace::Call &call) {
         }
     }
 
-    glws::Drawable *new_drawable = getDrawable(static_cast<unsigned long>(call.arg(1)));
-    glws::Context *new_context = context_map[call.arg(3).toPointer()];
-
     bool result = ws->makeCurrent(new_drawable, new_context);
 
     if (new_drawable && new_context && result) {