From 958d980c85810ed01ad45f8c2af924368dde20f4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 19 Oct 2012 15:39:49 +0100 Subject: [PATCH] Determine core32 from the traces. --- retrace/glretrace.hpp | 5 ++++ retrace/glretrace_cgl.cpp | 58 ++++++++++++++++++++++++++++++++++++++- retrace/glretrace_glx.cpp | 26 ++---------------- retrace/glretrace_ws.cpp | 22 +++++++++++++++ 4 files changed, 87 insertions(+), 24 deletions(-) diff --git a/retrace/glretrace.hpp b/retrace/glretrace.hpp index 7729ec5..f058d8d 100644 --- a/retrace/glretrace.hpp +++ b/retrace/glretrace.hpp @@ -63,6 +63,11 @@ extern bool insideGlBeginEnd; extern glws::Drawable *currentDrawable; extern Context *currentContext; + +int +parseAttrib(const trace::Value *attribs, int param, int default_); + + glws::Drawable * createDrawable(glws::Profile profile); diff --git a/retrace/glretrace_cgl.cpp b/retrace/glretrace_cgl.cpp index 8ae0e3e..1cdbcd4 100644 --- a/retrace/glretrace_cgl.cpp +++ b/retrace/glretrace_cgl.cpp @@ -31,6 +31,49 @@ #include "glretrace.hpp" +#define kCGLPFAAllRenderers 1 +#define kCGLPFADoubleBuffer 5 +#define kCGLPFAStereo 6 +#define kCGLPFAAuxBuffers 7 +#define kCGLPFAColorSize 8 +#define kCGLPFAAlphaSize 11 +#define kCGLPFADepthSize 12 +#define kCGLPFAStencilSize 13 +#define kCGLPFAAccumSize 14 +#define kCGLPFAMinimumPolicy 51 +#define kCGLPFAMaximumPolicy 52 +#define kCGLPFAOffScreen 53 +#define kCGLPFAFullScreen 54 +#define kCGLPFASampleBuffers 55 +#define kCGLPFASamples 56 +#define kCGLPFAAuxDepthStencil 57 +#define kCGLPFAColorFloat 58 +#define kCGLPFAMultisample 59 +#define kCGLPFASupersample 60 +#define kCGLPFASampleAlpha 61 +#define kCGLPFARendererID 70 +#define kCGLPFASingleRenderer 71 +#define kCGLPFANoRecovery 72 +#define kCGLPFAAccelerated 73 +#define kCGLPFAClosestPolicy 74 +#define kCGLPFARobust 75 +#define kCGLPFABackingStore 76 +#define kCGLPFAMPSafe 78 +#define kCGLPFAWindow 80 +#define kCGLPFAMultiScreen 81 +#define kCGLPFACompliant 83 +#define kCGLPFADisplayMask 84 +#define kCGLPFAPBuffer 90 +#define kCGLPFARemotePBuffer 91 +#define kCGLPFAAllowOfflineRenderers 96 +#define kCGLPFAAcceleratedCompute 97 +#define kCGLPFAOpenGLProfile 99 +#define kCGLPFAVirtualScreenCount 128 + +#define kCGLOGLPVersion_Legacy 0x1000 +#define kCGLOGLPVersion_3_2_Core 0x3200 + + using namespace glretrace; @@ -80,6 +123,19 @@ getContext(unsigned long long ctx) { return it->second; } + +static void retrace_CGLChoosePixelFormat(trace::Call &call) { + trace::Value *attribs = &call.arg(0); + + int profile = glretrace::parseAttrib(attribs, kCGLPFAOpenGLProfile, kCGLOGLPVersion_Legacy); + + if (profile == kCGLOGLPVersion_3_2_Core) { + // TODO: Do this on a per visual basis + retrace::coreProfile = true; + } +} + + static void retrace_CGLCreateContext(trace::Call &call) { unsigned long long share = call.arg(1).toUIntPtr(); Context *sharedContext = getContext(share); @@ -185,7 +241,7 @@ static void retrace_CGLTexImageIOSurface2D(trace::Call &call) { const retrace::Entry glretrace::cgl_callbacks[] = { - {"CGLChoosePixelFormat", &retrace::ignore}, + {"CGLChoosePixelFormat", &retrace_CGLChoosePixelFormat}, {"CGLDestroyPixelFormat", &retrace::ignore}, {"CGLCreateContext", &retrace_CGLCreateContext}, {"CGLDestroyContext", &retrace_CGLDestroyContext}, diff --git a/retrace/glretrace_glx.cpp b/retrace/glretrace_glx.cpp index 6ff17d8..918940f 100644 --- a/retrace/glretrace_glx.cpp +++ b/retrace/glretrace_glx.cpp @@ -129,29 +129,9 @@ static void retrace_glXCreateNewContext(trace::Call &call) { } static void retrace_glXCreatePbuffer(trace::Call &call) { - int width = 0; - int height = 0; - - const trace::Array *attrib_list = dynamic_cast(&call.arg(2)); - if (attrib_list) { - for (size_t i = 0; i + 1 < attrib_list->values.size(); i += 2) { - int param = attrib_list->values[i]->toSInt(); - if (param == 0) { - break; - } - - int value = attrib_list->values[i + 1]->toSInt(); - - switch (param) { - case GLX_PBUFFER_WIDTH: - width = value; - break; - case GLX_PBUFFER_HEIGHT: - height = value; - break; - } - } - } + const trace::Value *attrib_list = dynamic_cast(&call.arg(2)); + int width = glretrace::parseAttrib(attrib_list, GLX_PBUFFER_WIDTH, 0); + int height = glretrace::parseAttrib(attrib_list, GLX_PBUFFER_HEIGHT, 0); unsigned long long orig_drawable = call.ret->toUInt(); diff --git a/retrace/glretrace_ws.cpp b/retrace/glretrace_ws.cpp index ccc7023..97762ed 100644 --- a/retrace/glretrace_ws.cpp +++ b/retrace/glretrace_ws.cpp @@ -188,4 +188,26 @@ updateDrawable(int width, int height) { } +int +parseAttrib(const trace::Value *attribs, int param, int default_ = 0) { + const trace::Array *attribs_ = dynamic_cast(attribs); + + if (attribs_) { + for (size_t i = 0; i + 1 < attribs_->values.size(); i += 2) { + int param_i = attribs_->values[i]->toSInt(); + if (param_i == 0) { + break; + } + + if (param_i == param) { + int value = attribs_->values[i + 1]->toSInt(); + return value; + } + } + } + + return default_; +} + + } /* namespace glretrace */ -- 2.43.0