]> git.cworth.org Git - apitrace/blobdiff - glretrace_cgl.cpp
Separate wrappers/ and scripts/ under <prefix>/lib/apitrace
[apitrace] / glretrace_cgl.cpp
index 892dc0d1c67e0ffd2d3fb96bfc048a55834195d5..2feebc3303bc6aeacbe025f5ba12a9c5aa394f9e 100644 (file)
@@ -38,6 +38,7 @@ 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::Context *sharedContext = NULL;
 
 
 static glws::Drawable *
@@ -46,10 +47,13 @@ getDrawable(unsigned long drawable_id) {
         return NULL;
     }
 
+    /* XXX: Support multiple drawables. */
+    drawable_id = 1;
+
     DrawableMap::const_iterator it;
     it = drawable_map.find(drawable_id);
     if (it == drawable_map.end()) {
-        return (drawable_map[drawable_id] = ws->createDrawable(visual));
+        return (drawable_map[drawable_id] = glws::createDrawable(visual));
     }
 
     return it->second;
@@ -65,33 +69,25 @@ getContext(unsigned long long ctx) {
     ContextMap::const_iterator it;
     it = context_map.find(ctx);
     if (it == context_map.end()) {
-        return (context_map[ctx] = ws->createContext(visual));
+        glws::Context *context;
+        context_map[ctx] = context = glws::createContext(visual, sharedContext);
+        if (!sharedContext) {
+            sharedContext = context;
+        }
+        return context;
     }
 
     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);
-    }
+static void retrace_CGLSetCurrentContext(trace::Call &call) {
+    unsigned long long ctx = call.arg(0).toUIntPtr();
 
     glws::Drawable *new_drawable = getDrawable(ctx);
     glws::Context *new_context = getContext(ctx);
 
-    bool result = ws->makeCurrent(new_drawable, new_context);
+    bool result = glws::makeCurrent(new_drawable, new_context);
 
     if (new_drawable && new_context && result) {
         drawable = new_drawable;
@@ -103,18 +99,27 @@ static void retrace_CGLSetCurrentContext(Trace::Call &call) {
 }
 
 
-void glretrace::retrace_call_cgl(Trace::Call &call) {
-    const char *name = call.name().c_str();
+static void retrace_CGLFlushDrawable(trace::Call &call) {
+    if (drawable && context) {
+        if (double_buffer) {
+            drawable->swapBuffers();
+        } else {
+            glFlush();
+        }
 
-    if (strcmp(name, "CGLSetCurrentContext") == 0) {
-       retrace_CGLSetCurrentContext(call);
-       return;
+        frame_complete(call);
     }
+}
 
-    if (strcmp(name, "CGLGetCurrentContext") == 0) {
-       return;
-    }
 
-    retrace::retrace_unknown(call);
-}
+const retrace::Entry glretrace::cgl_callbacks[] = {
+    {"CGLSetCurrentContext", &retrace_CGLSetCurrentContext},
+    {"CGLGetCurrentContext", &retrace::ignore},
+    {"CGLEnable", &retrace::ignore},
+    {"CGLDisable", &retrace::ignore},
+    {"CGLSetParameter", &retrace::ignore},
+    {"CGLGetParameter", &retrace::ignore},
+    {"CGLFlushDrawable", &retrace_CGLFlushDrawable},
+    {NULL, NULL},
+};