From 60139d6c4850e1cf731021e57c89ea5552f60e6b Mon Sep 17 00:00:00 2001 From: James Benton Date: Thu, 9 Aug 2012 14:23:44 +0100 Subject: [PATCH] Create glretrace specific context. This allows us to store per context variables whilst retracing. Altered the various glretrace window system implementations to use this new context. Updated the "activeProgram" tracking for profiling to use this. --- retrace/glretrace.hpp | 28 +++++++++++++++++++++------- retrace/glretrace.py | 4 +++- retrace/glretrace_cgl.cpp | 10 +++++----- retrace/glretrace_egl.cpp | 10 +++++----- retrace/glretrace_glx.cpp | 22 +++++++++++----------- retrace/glretrace_main.cpp | 19 +------------------ retrace/glretrace_wgl.cpp | 16 ++++++++-------- retrace/glretrace_ws.cpp | 19 ++++++++++--------- 8 files changed, 64 insertions(+), 64 deletions(-) diff --git a/retrace/glretrace.hpp b/retrace/glretrace.hpp index 322f06c..76f47db 100644 --- a/retrace/glretrace.hpp +++ b/retrace/glretrace.hpp @@ -32,13 +32,28 @@ namespace glretrace { +struct Context { + Context(glws::Context* context) + : wsContext(context), + activeProgram(0) + { + } + + ~Context() + { + delete wsContext; + } + + glws::Context* wsContext; + GLuint activeProgram; +}; extern bool insideList; extern bool insideGlBeginEnd; extern glws::Drawable *currentDrawable; -extern glws::Context *currentContext; +extern Context *currentContext; glws::Drawable * createDrawable(glws::Profile profile); @@ -46,14 +61,14 @@ createDrawable(glws::Profile profile); glws::Drawable * createDrawable(void); -glws::Context * -createContext(glws::Context *shareContext, glws::Profile profile); +Context * +createContext(Context *shareContext, glws::Profile profile); -glws::Context * -createContext(glws::Context *shareContext = 0); +Context * +createContext(Context *shareContext = 0); bool -makeCurrent(trace::Call &call, glws::Drawable *drawable, glws::Context *context); +makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context); void @@ -74,7 +89,6 @@ void flushQueries(); void beginProfile(trace::Call &call); void endProfile(trace::Call &call); -void setActiveProgram(GLuint program); } /* namespace glretrace */ diff --git a/retrace/glretrace.py b/retrace/glretrace.py index be30616..879f3e4 100644 --- a/retrace/glretrace.py +++ b/retrace/glretrace.py @@ -299,7 +299,9 @@ class GlRetracer(Retracer): ) if function.name in ('glUseProgram', 'glUseProgramObjectARB'): - print r' glretrace::setActiveProgram((call.arg(0)).toUInt());' + print r' if (glretrace::currentContext) {' + print r' glretrace::currentContext->activeProgram = call.arg(0).toUInt();' + print r' }' # Only profile if not inside a list as the queries get inserted into list if function.name == 'glNewList': diff --git a/retrace/glretrace_cgl.cpp b/retrace/glretrace_cgl.cpp index 0c91ba2..76b62fb 100644 --- a/retrace/glretrace_cgl.cpp +++ b/retrace/glretrace_cgl.cpp @@ -35,10 +35,10 @@ using namespace glretrace; typedef std::map DrawableMap; -typedef std::map ContextMap; +typedef std::map ContextMap; static DrawableMap drawable_map; static ContextMap context_map; -static glws::Context *sharedContext = NULL; +static Context *sharedContext = NULL; static glws::Drawable * @@ -60,7 +60,7 @@ getDrawable(unsigned long drawable_id) { } -static glws::Context * +static Context * getContext(unsigned long long ctx) { if (ctx == 0) { return NULL; @@ -69,7 +69,7 @@ getContext(unsigned long long ctx) { ContextMap::const_iterator it; it = context_map.find(ctx); if (it == context_map.end()) { - glws::Context *context; + Context *context; context_map[ctx] = context = glretrace::createContext(sharedContext); if (!sharedContext) { sharedContext = context; @@ -85,7 +85,7 @@ 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); + Context *new_context = getContext(ctx); glretrace::makeCurrent(call, new_drawable, new_context); } diff --git a/retrace/glretrace_egl.cpp b/retrace/glretrace_egl.cpp index 43e8169..3f83f55 100644 --- a/retrace/glretrace_egl.cpp +++ b/retrace/glretrace_egl.cpp @@ -46,7 +46,7 @@ using namespace glretrace; typedef std::map DrawableMap; -typedef std::map ContextMap; +typedef std::map ContextMap; typedef std::map ProfileMap; static DrawableMap drawable_map; static ContextMap context_map; @@ -77,7 +77,7 @@ getDrawable(unsigned long long surface_ptr) { return (it != drawable_map.end()) ? it->second : NULL; } -static glws::Context * +static Context * getContext(unsigned long long context_ptr) { if (context_ptr == 0) { return NULL; @@ -142,7 +142,7 @@ static void retrace_eglBindAPI(trace::Call &call) { static void retrace_eglCreateContext(trace::Call &call) { unsigned long long orig_context = call.ret->toUIntPtr(); unsigned long long orig_config = call.arg(1).toUIntPtr(); - glws::Context *share_context = getContext(call.arg(2).toUIntPtr()); + Context *share_context = getContext(call.arg(2).toUIntPtr()); trace::Array *attrib_array = dynamic_cast(&call.arg(3)); glws::Profile profile; @@ -168,7 +168,7 @@ static void retrace_eglCreateContext(trace::Call &call) { } - glws::Context *context = glretrace::createContext(share_context, profile); + Context *context = glretrace::createContext(share_context, profile); if (!context) { const char *name; switch (profile) { @@ -209,7 +209,7 @@ static void retrace_eglDestroyContext(trace::Call &call) { static void retrace_eglMakeCurrent(trace::Call &call) { glws::Drawable *new_drawable = getDrawable(call.arg(1).toUIntPtr()); - glws::Context *new_context = getContext(call.arg(3).toUIntPtr()); + Context *new_context = getContext(call.arg(3).toUIntPtr()); glretrace::makeCurrent(call, new_drawable, new_context); } diff --git a/retrace/glretrace_glx.cpp b/retrace/glretrace_glx.cpp index 9d1b5e5..bc63063 100644 --- a/retrace/glretrace_glx.cpp +++ b/retrace/glretrace_glx.cpp @@ -33,7 +33,7 @@ using namespace glretrace; typedef std::map DrawableMap; -typedef std::map ContextMap; +typedef std::map ContextMap; static DrawableMap drawable_map; static ContextMap context_map; @@ -53,7 +53,7 @@ getDrawable(unsigned long drawable_id) { return it->second; } -static glws::Context * +static Context * getContext(unsigned long long context_ptr) { if (context_ptr == 0) { return NULL; @@ -70,30 +70,30 @@ getContext(unsigned long long context_ptr) { static void retrace_glXCreateContext(trace::Call &call) { unsigned long long orig_context = call.ret->toUIntPtr(); - glws::Context *share_context = getContext(call.arg(2).toUIntPtr()); + Context *share_context = getContext(call.arg(2).toUIntPtr()); - glws::Context *context = glretrace::createContext(share_context); + Context *context = glretrace::createContext(share_context); context_map[orig_context] = context; } static void retrace_glXCreateContextAttribsARB(trace::Call &call) { unsigned long long orig_context = call.ret->toUIntPtr(); - glws::Context *share_context = getContext(call.arg(2).toUIntPtr()); + Context *share_context = getContext(call.arg(2).toUIntPtr()); - glws::Context *context = glretrace::createContext(share_context); + Context *context = glretrace::createContext(share_context); context_map[orig_context] = context; } static void retrace_glXMakeCurrent(trace::Call &call) { glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt()); - glws::Context *new_context = getContext(call.arg(2).toUIntPtr()); + Context *new_context = getContext(call.arg(2).toUIntPtr()); glretrace::makeCurrent(call, new_drawable, new_context); } static void retrace_glXDestroyContext(trace::Call &call) { - glws::Context *context = getContext(call.arg(1).toUIntPtr()); + Context *context = getContext(call.arg(1).toUIntPtr()); if (!context) { return; @@ -113,15 +113,15 @@ static void retrace_glXSwapBuffers(trace::Call &call) { static void retrace_glXCreateNewContext(trace::Call &call) { unsigned long long orig_context = call.ret->toUIntPtr(); - glws::Context *share_context = getContext(call.arg(3).toUIntPtr()); + Context *share_context = getContext(call.arg(3).toUIntPtr()); - glws::Context *context = glretrace::createContext(share_context); + Context *context = glretrace::createContext(share_context); context_map[orig_context] = context; } static void retrace_glXMakeContextCurrent(trace::Call &call) { glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt()); - glws::Context *new_context = getContext(call.arg(3).toUIntPtr()); + Context *new_context = getContext(call.arg(3).toUIntPtr()); glretrace::makeCurrent(call, new_drawable, new_context); } diff --git a/retrace/glretrace_main.cpp b/retrace/glretrace_main.cpp index cbfc67f..ca7f9b7 100644 --- a/retrace/glretrace_main.cpp +++ b/retrace/glretrace_main.cpp @@ -54,7 +54,6 @@ static bool supportsOcclusion = true; static bool firstFrame = true; static std::list callQueries; -static std::map activePrograms; void @@ -160,22 +159,6 @@ flushQueries() { callQueries.clear(); } -void setActiveProgram(GLuint program) -{ - activePrograms[glretrace::currentContext] = program; -} - -static GLuint -getActiveProgram() -{ - std::map::iterator it; - it = activePrograms.find(glretrace::currentContext); - if (it == activePrograms.end()) - return 0; - - return it->second; -} - void beginProfile(trace::Call &call) { if (firstFrame) { @@ -213,7 +196,7 @@ beginProfile(trace::Call &call) { CallQuery query; query.call = call.no; query.sig = call.sig; - query.program = getActiveProgram(); + query.program = glretrace::currentContext ? glretrace::currentContext->activeProgram : 0; glGenQueries(3, query.ids); diff --git a/retrace/glretrace_wgl.cpp b/retrace/glretrace_wgl.cpp index c3e1096..52fdcf4 100644 --- a/retrace/glretrace_wgl.cpp +++ b/retrace/glretrace_wgl.cpp @@ -33,7 +33,7 @@ using namespace glretrace; typedef std::map DrawableMap; -typedef std::map ContextMap; +typedef std::map ContextMap; static DrawableMap drawable_map; static DrawableMap pbuffer_map; static ContextMap context_map; @@ -56,7 +56,7 @@ getDrawable(unsigned long long hdc) { static void retrace_wglCreateContext(trace::Call &call) { unsigned long long orig_context = call.ret->toUIntPtr(); - glws::Context *context = glretrace::createContext(); + Context *context = glretrace::createContext(); context_map[orig_context] = context; } @@ -65,7 +65,7 @@ static void retrace_wglDeleteContext(trace::Call &call) { static void retrace_wglMakeCurrent(trace::Call &call) { glws::Drawable *new_drawable = getDrawable(call.arg(0).toUIntPtr()); - glws::Context *new_context = context_map[call.arg(1).toUIntPtr()]; + Context *new_context = context_map[call.arg(1).toUIntPtr()]; glretrace::makeCurrent(call, new_drawable, new_context); } @@ -95,10 +95,10 @@ static void retrace_wglShareLists(trace::Call &call) { unsigned long long hglrc1 = call.arg(0).toUIntPtr(); unsigned long long hglrc2 = call.arg(1).toUIntPtr(); - glws::Context *share_context = context_map[hglrc1]; - glws::Context *old_context = context_map[hglrc2]; + Context *share_context = context_map[hglrc1]; + Context *old_context = context_map[hglrc2]; - glws::Context *new_context = glretrace::createContext(share_context); + Context *new_context = glretrace::createContext(share_context); if (new_context) { if (currentContext == old_context) { glretrace::makeCurrent(call, currentDrawable, new_context); @@ -201,13 +201,13 @@ static void retrace_wglSetPbufferAttribARB(trace::Call &call) { static void retrace_wglCreateContextAttribsARB(trace::Call &call) { unsigned long long orig_context = call.ret->toUIntPtr(); - glws::Context *share_context = NULL; + Context *share_context = NULL; if (call.arg(1).toPointer()) { share_context = context_map[call.arg(1).toUIntPtr()]; } - glws::Context *context = glretrace::createContext(share_context); + Context *context = glretrace::createContext(share_context); context_map[orig_context] = context; } diff --git a/retrace/glretrace_ws.cpp b/retrace/glretrace_ws.cpp index fcaa212..ffba524 100644 --- a/retrace/glretrace_ws.cpp +++ b/retrace/glretrace_ws.cpp @@ -41,7 +41,7 @@ namespace glretrace { glws::Drawable *currentDrawable = NULL; -glws::Context *currentContext = NULL; +Context *currentContext = NULL; static glws::Visual * @@ -88,27 +88,28 @@ createDrawable(void) { } -glws::Context * -createContext(glws::Context *shareContext, glws::Profile profile) { - glws::Context *ctx = glws::createContext(getVisual(profile), shareContext, profile, retrace::debug); +Context * +createContext(Context *shareContext, glws::Profile profile) { + glws::Context *shareWsContext = shareContext ? shareContext->wsContext : NULL; + glws::Context *ctx = glws::createContext(getVisual(profile), shareWsContext, profile, retrace::debug); if (!ctx) { std::cerr << "error: failed to create OpenGL context\n"; exit(1); return NULL; } - return ctx; + return new Context(ctx); } -glws::Context * -createContext(glws::Context *shareContext) { +Context * +createContext(Context *shareContext) { return createContext(shareContext, getDefaultProfile()); } bool -makeCurrent(trace::Call &call, glws::Drawable *drawable, glws::Context *context) +makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) { if (drawable == currentDrawable && context == currentContext) { return true; @@ -123,7 +124,7 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, glws::Context *context) flushQueries(); - bool success = glws::makeCurrent(drawable, context); + bool success = glws::makeCurrent(drawable, context ? context->wsContext : NULL); if (!success) { std::cerr << "error: failed to make current OpenGL context and drawable\n"; -- 2.43.0