]> git.cworth.org Git - apitrace/blobdiff - glretrace_glx.cpp
Handle vertex attriv locations correctly.
[apitrace] / glretrace_glx.cpp
index 540d7cb753b256f95b50fbc0150f2034b6435399..7edcfa0ffeeefc3d4caa1cd70cb4a638d892cf58 100644 (file)
@@ -57,8 +57,14 @@ static void retrace_glXChooseVisual(Trace::Call &call) {
 }
 
 static void retrace_glXCreateContext(Trace::Call &call) {
-    void * orig_context = call.ret->blob();
-    glws::Context *context = ws->createContext(glretrace::visual);
+    void * orig_context = call.ret->toPointer();
+    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,13 +72,19 @@ static void retrace_glXDestroyContext(Trace::Call &call) {
 }
 
 static void retrace_glXMakeCurrent(Trace::Call &call) {
-    glFlush();
-    if (!double_buffer) {
-        frame_complete(call.no);
+    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;
     }
 
-    glws::Drawable *new_drawable = getDrawable(static_cast<unsigned long>(call.arg(1)));
-    glws::Context *new_context = context_map[call.arg(2).blob()];
+    if (drawable && context) {
+        glFlush();
+        if (!double_buffer) {
+            frame_complete(call.no);
+        }
+    }
 
     bool result = ws->makeCurrent(new_drawable, new_context);
 
@@ -167,9 +179,41 @@ static void retrace_glXQueryDrawable(Trace::Call &call) {
 }
 
 static void retrace_glXCreateNewContext(Trace::Call &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) {
+            frame_complete(call.no);
+        }
+    }
+
+    bool result = ws->makeCurrent(new_drawable, new_context);
+
+    if (new_drawable && new_context && result) {
+        drawable = new_drawable;
+        context = new_context;
+    } else {
+        drawable = NULL;
+        context = NULL;
+    }
 }
 
 static void retrace_glXGetCurrentReadDrawable(Trace::Call &call) {