]> git.cworth.org Git - apitrace/blobdiff - retrace/glretrace_cgl.cpp
trace: Unwrap all args before serializing them.
[apitrace] / retrace / glretrace_cgl.cpp
index 1cdbcd4f51a07280517134fe479969812bef7cad..f0d0e2d7d5b29ff4ee0232d479fab8b408374de9 100644 (file)
@@ -125,9 +125,70 @@ getContext(unsigned long long ctx) {
 
 
 static void retrace_CGLChoosePixelFormat(trace::Call &call) {
-    trace::Value *attribs = &call.arg(0);
-
-    int profile = glretrace::parseAttrib(attribs, kCGLPFAOpenGLProfile, kCGLOGLPVersion_Legacy);
+    int profile = kCGLOGLPVersion_Legacy;
+
+    const trace::Array * attribs = dynamic_cast<const trace::Array *>(&call.arg(0));
+    if (attribs) {
+        size_t i = 0;
+        while (i < attribs->values.size()) {
+            int param = attribs->values[i++]->toSInt();
+            if (param == 0) {
+                break;
+            }
+
+            switch (param) {
+            case kCGLPFAAllRenderers:
+            case kCGLPFADoubleBuffer:
+            case kCGLPFAStereo:
+            case kCGLPFAAuxBuffers:
+            case kCGLPFAMinimumPolicy:
+            case kCGLPFAMaximumPolicy:
+            case kCGLPFAOffScreen:
+            case kCGLPFAFullScreen:
+            case kCGLPFAAuxDepthStencil:
+            case kCGLPFAColorFloat:
+            case kCGLPFAMultisample:
+            case kCGLPFASupersample:
+            case kCGLPFASampleAlpha:
+            case kCGLPFASingleRenderer:
+            case kCGLPFANoRecovery:
+            case kCGLPFAAccelerated:
+            case kCGLPFAClosestPolicy:
+            case kCGLPFARobust:
+            case kCGLPFABackingStore:
+            case kCGLPFAMPSafe:
+            case kCGLPFAWindow:
+            case kCGLPFAMultiScreen:
+            case kCGLPFACompliant:
+            case kCGLPFAPBuffer:
+            case kCGLPFARemotePBuffer:
+            case kCGLPFAAllowOfflineRenderers:
+            case kCGLPFAAcceleratedCompute:
+                break;
+
+            case kCGLPFAColorSize:
+            case kCGLPFAAlphaSize:
+            case kCGLPFADepthSize:
+            case kCGLPFAStencilSize:
+            case kCGLPFAAccumSize:
+            case kCGLPFASampleBuffers:
+            case kCGLPFASamples:
+            case kCGLPFARendererID:
+            case kCGLPFADisplayMask:
+            case kCGLPFAVirtualScreenCount:
+                ++i;
+                break;
+
+            case kCGLPFAOpenGLProfile:
+                profile = attribs->values[i++]->toSInt();
+                break;
+
+            default:
+                retrace::warning(call) << "unexpected attribute " << param << "\n";
+                break;
+            }
+        }
+    }
 
     if (profile == kCGLOGLPVersion_3_2_Core) {
         // TODO: Do this on a per visual basis
@@ -174,14 +235,22 @@ static void retrace_CGLSetCurrentContext(trace::Call &call) {
 
 
 static void retrace_CGLFlushDrawable(trace::Call &call) {
-    if (currentDrawable && currentContext) {
-        if (retrace::doubleBuffer) {
-            currentDrawable->swapBuffers();
+    unsigned long long ctx = call.arg(0).toUIntPtr();
+    Context *context = getContext(ctx);
+
+    if (context) {
+        if (context->drawable) {
+            if (retrace::doubleBuffer) {
+                context->drawable->swapBuffers();
+            } else {
+                glFlush();
+            }
+            frame_complete(call);
         } else {
-            glFlush();
+            if (retrace::debug) {
+                retrace::warning(call) << "context has no drawable\n";
+            }
         }
-
-        frame_complete(call);
     }
 }
 
@@ -226,7 +295,7 @@ static void retrace_CGLTexImageIOSurface2D(trace::Call &call) {
 
     GLvoid * pixels = NULL;
 
-    if (glretrace::currentContext != context) {
+    if (glretrace::getCurrentContext() != context) {
         if (retrace::debug) {
             retrace::warning(call) << "current context mismatch\n";
         }
@@ -242,17 +311,23 @@ static void retrace_CGLTexImageIOSurface2D(trace::Call &call) {
 
 const retrace::Entry glretrace::cgl_callbacks[] = {
     {"CGLChoosePixelFormat", &retrace_CGLChoosePixelFormat},
-    {"CGLDestroyPixelFormat", &retrace::ignore},
     {"CGLCreateContext", &retrace_CGLCreateContext},
     {"CGLDestroyContext", &retrace_CGLDestroyContext},
-    {"CGLSetCurrentContext", &retrace_CGLSetCurrentContext},
-    {"CGLGetCurrentContext", &retrace::ignore},
-    {"CGLEnable", &retrace::ignore},
+    {"CGLDestroyPixelFormat", &retrace::ignore},
     {"CGLDisable", &retrace::ignore},
-    {"CGLSetParameter", &retrace::ignore},
-    {"CGLGetParameter", &retrace::ignore},
+    {"CGLEnable", &retrace::ignore},
+    {"CGLErrorString", &retrace::ignore},
     {"CGLFlushDrawable", &retrace_CGLFlushDrawable},
+    {"CGLGetCurrentContext", &retrace::ignore},
+    {"CGLGetOption", &retrace::ignore},
+    {"CGLGetParameter", &retrace::ignore},
+    {"CGLGetVersion", &retrace::ignore},
+    {"CGLGetVirtualScreen", &retrace::ignore},
+    {"CGLIsEnabled", &retrace::ignore},
+    {"CGLSetCurrentContext", &retrace_CGLSetCurrentContext},
+    {"CGLSetParameter", &retrace::ignore},
     {"CGLTexImageIOSurface2D", &retrace_CGLTexImageIOSurface2D},
+    {"CGLUpdateContext", &retrace::ignore},
     {NULL, NULL},
 };