]> git.cworth.org Git - apitrace/commitdiff
Rudimentary CGL retracing.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Sun, 15 May 2011 12:52:28 +0000 (13:52 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sun, 15 May 2011 12:52:28 +0000 (13:52 +0100)
CMakeLists.txt
glretrace.hpp
glretrace_cgl.cpp [new file with mode: 0644]
glretrace_main.cpp
trace_model.hpp

index 5cd5781d88fa11e1a1485f5ff104e14ac2cd90e8..d41e89de19169e8ddbcd21c9a01671346404e9dc 100755 (executable)
@@ -318,6 +318,7 @@ include_directories (
 
 add_executable (glretrace
     glretrace_gl.cpp
+    glretrace_cgl.cpp
     glretrace_glx.cpp
     glretrace_wgl.cpp
     glretrace_main.cpp
index 2593040c6ae096abbf872e35ff34c711bb8923ec..dcac8f0da70beee3a4b567d3b184bf821e7bfa06 100644 (file)
@@ -56,6 +56,7 @@ extern unsigned dump_state;
 void
 checkGlError(Trace::Call &call);
 
+void retrace_call_cgl(Trace::Call &call);
 void retrace_call_glx(Trace::Call &call);
 void retrace_call_wgl(Trace::Call &call);
 
diff --git a/glretrace_cgl.cpp b/glretrace_cgl.cpp
new file mode 100644 (file)
index 0000000..892dc0d
--- /dev/null
@@ -0,0 +1,120 @@
+/**************************************************************************
+ *
+ * Copyright 2011 Jose Fonseca
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ **************************************************************************/
+
+
+#include <string.h>
+
+#include "glproc.hpp"
+#include "retrace.hpp"
+#include "glretrace.hpp"
+
+
+using namespace glretrace;
+
+
+typedef std::map<unsigned long long, glws::Drawable *> DrawableMap;
+typedef std::map<unsigned long long, glws::Context *> ContextMap;
+static DrawableMap drawable_map;
+static ContextMap context_map;
+
+
+static glws::Drawable *
+getDrawable(unsigned long drawable_id) {
+    if (drawable_id == 0) {
+        return NULL;
+    }
+
+    DrawableMap::const_iterator it;
+    it = drawable_map.find(drawable_id);
+    if (it == drawable_map.end()) {
+        return (drawable_map[drawable_id] = ws->createDrawable(visual));
+    }
+
+    return it->second;
+}
+
+
+static glws::Context *
+getContext(unsigned long long ctx) {
+    if (ctx == 0) {
+        return NULL;
+    }
+
+    ContextMap::const_iterator it;
+    it = context_map.find(ctx);
+    if (it == context_map.end()) {
+        return (context_map[ctx] = ws->createContext(visual));
+    }
+
+    return it->second;
+}
+
+static void retrace_CGLSetCurrentContext(Trace::Call &call) {
+    unsigned long long ctx = call.arg(0).toUIntPtr();
+
+    /*
+     * XXX: Frame termination is mostly a guess, because we don't trace enough
+     * of the CGL API to know that.
+     */
+    if (drawable && context) {
+        if (double_buffer) {
+            drawable->swapBuffers();
+        } else {
+            glFlush();
+        }
+
+        frame_complete(call.no);
+    }
+
+    glws::Drawable *new_drawable = getDrawable(ctx);
+    glws::Context *new_context = getContext(ctx);
+
+    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;
+    }
+}
+
+
+void glretrace::retrace_call_cgl(Trace::Call &call) {
+    const char *name = call.name().c_str();
+
+    if (strcmp(name, "CGLSetCurrentContext") == 0) {
+       retrace_CGLSetCurrentContext(call);
+       return;
+    }
+
+    if (strcmp(name, "CGLGetCurrentContext") == 0) {
+       return;
+    }
+
+    retrace::retrace_unknown(call);
+}
+
index a9ef1579b14d5fbec9288b971e494bca13f1dc92..b9a11b1ddea9b1132b05e76a566c7fcf74a711b3 100644 (file)
@@ -187,7 +187,10 @@ static void display(void) {
             std::cout.flush();
         }
 
-        if (name[0] == 'w' && name[1] == 'g' && name[2] == 'l') {
+        if (name[0] == 'C' && name[1] == 'G' && name[2] == 'L') {
+            glretrace::retrace_call_cgl(*call);
+        }
+        else if (name[0] == 'w' && name[1] == 'g' && name[2] == 'l') {
             glretrace::retrace_call_wgl(*call);
         }
         else if (name[0] == 'g' && name[1] == 'l' && name[2] == 'X') {
index 5e0a09d55319d61c1c22df530d2b0330a157afb5..e7a2249c7c979833fbd8e7519ef3f18a5a9c22c0 100644 (file)
@@ -31,7 +31,7 @@
 #define _TRACE_MODEL_HPP_
 
 
-#include <cassert>
+#include <assert.h>
 
 #include <string>
 #include <map>
@@ -316,6 +316,7 @@ public:
     }
 
     inline Value & arg(unsigned index) {
+        assert(index < args.size());
         return *(args[index]);
     }
 };