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
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);
}
}
GLvoid * pixels = NULL;
- if (glretrace::currentContext != context) {
+ if (glretrace::getCurrentContext() != context) {
if (retrace::debug) {
retrace::warning(call) << "current context mismatch\n";
}
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},
};