X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fglretrace_cgl.cpp;h=a0755953b3a52059e35f9d4e0ff9447cba878305;hb=45080ce539648a3fc073375cd9212b031a611f10;hp=1cdbcd4f51a07280517134fe479969812bef7cad;hpb=958d980c85810ed01ad45f8c2af924368dde20f4;p=apitrace diff --git a/retrace/glretrace_cgl.cpp b/retrace/glretrace_cgl.cpp index 1cdbcd4..a075595 100644 --- a/retrace/glretrace_cgl.cpp +++ b/retrace/glretrace_cgl.cpp @@ -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(&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"; } @@ -252,6 +321,7 @@ const retrace::Entry glretrace::cgl_callbacks[] = { {"CGLSetParameter", &retrace::ignore}, {"CGLGetParameter", &retrace::ignore}, {"CGLFlushDrawable", &retrace_CGLFlushDrawable}, + {"CGLUpdateContext", &retrace::ignore}, {"CGLTexImageIOSurface2D", &retrace_CGLTexImageIOSurface2D}, {NULL, NULL}, };