From 04f42b803c60b593359322b80af4003361ccd097 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 19 Oct 2012 18:42:41 +0100 Subject: [PATCH] glretrace: Put currentContext on TLS. Inspired on Imre's similar change. --- retrace/glretrace.hpp | 3 ++- retrace/glretrace.py | 10 ++++++---- retrace/glretrace_cgl.cpp | 2 +- retrace/glretrace_egl.cpp | 1 + retrace/glretrace_main.cpp | 14 +++++++++++--- retrace/glretrace_wgl.cpp | 8 ++++++-- retrace/glretrace_ws.cpp | 30 ++++++++++++++++++++++++++---- specs/gltypes.py | 2 +- 8 files changed, 54 insertions(+), 16 deletions(-) diff --git a/retrace/glretrace.hpp b/retrace/glretrace.hpp index 87ced60..90c4c81 100644 --- a/retrace/glretrace.hpp +++ b/retrace/glretrace.hpp @@ -65,7 +65,8 @@ extern bool insideList; extern bool insideGlBeginEnd; -extern Context *currentContext; +Context * +getCurrentContext(void); int diff --git a/retrace/glretrace.py b/retrace/glretrace.py index f2cc372..32d6a63 100644 --- a/retrace/glretrace.py +++ b/retrace/glretrace.py @@ -250,7 +250,7 @@ class GlRetracer(Retracer): print ' glretrace::insideGlBeginEnd = false;' if function.name.startswith('gl') and not function.name.startswith('glX'): - print r' if (retrace::debug && !glretrace::currentContext) {' + print r' if (retrace::debug && !glretrace::getCurrentContext()) {' print r' retrace::warning(call) << "no current context\n";' print r' }' @@ -299,8 +299,9 @@ class GlRetracer(Retracer): ) if function.name in ('glUseProgram', 'glUseProgramObjectARB'): - print r' if (glretrace::currentContext) {' - print r' glretrace::currentContext->activeProgram = call.arg(0).toUInt();' + print r' glretrace::Context *currentContext = glretrace::getCurrentContext();' + print r' if (currentContext) {' + print r' currentContext->activeProgram = call.arg(0).toUInt();' print r' }' # Only profile if not inside a list as the queries get inserted into list @@ -479,7 +480,8 @@ class GlRetracer(Retracer): print ' GLint program = -1;' print ' if (glretrace::insideList) {' print ' // glUseProgram & glUseProgramObjectARB are display-list-able' - print ' program = _program_map[glretrace::currentContext->activeProgram];' + print r' glretrace::Context *currentContext = glretrace::getCurrentContext();' + print ' program = _program_map[currentContext->activeProgram];' print ' } else {' print ' GLint pipeline = 0;' print ' if (_pipelineHasBeenBound) {' diff --git a/retrace/glretrace_cgl.cpp b/retrace/glretrace_cgl.cpp index d66fbb5..613ee81 100644 --- a/retrace/glretrace_cgl.cpp +++ b/retrace/glretrace_cgl.cpp @@ -290,7 +290,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"; } diff --git a/retrace/glretrace_egl.cpp b/retrace/glretrace_egl.cpp index 7568815..79b1621 100644 --- a/retrace/glretrace_egl.cpp +++ b/retrace/glretrace_egl.cpp @@ -127,6 +127,7 @@ static void retrace_eglDestroySurface(trace::Call &call) { it = drawable_map.find(orig_surface); if (it != drawable_map.end()) { + glretrace::Context *currentContext = glretrace::getCurrentContext(); if (!currentContext || it->second != currentContext->drawable) { // TODO: reference count delete it->second; diff --git a/retrace/glretrace_main.cpp b/retrace/glretrace_main.cpp index f29ad01..bd5378a 100755 --- a/retrace/glretrace_main.cpp +++ b/retrace/glretrace_main.cpp @@ -174,12 +174,14 @@ flushQueries() { void beginProfile(trace::Call &call, bool isDraw) { + glretrace::Context *currentContext = glretrace::getCurrentContext(); + /* Create call query */ CallQuery query; query.isDraw = isDraw; query.call = call.no; query.sig = call.sig; - query.program = glretrace::currentContext ? glretrace::currentContext->activeProgram : 0; + query.program = currentContext ? currentContext->activeProgram : 0; /* GPU profiling only for draw calls */ if (isDraw) { @@ -230,6 +232,8 @@ endProfile(trace::Call &call, bool isDraw) { void initContext() { + glretrace::Context *currentContext = glretrace::getCurrentContext(); + /* Ensure we have adequate extension support */ assert(currentContext); supportsTimestamp = currentContext->hasExtension("GL_ARB_timer_query"); @@ -261,6 +265,7 @@ initContext() { /* Setup debug message call back */ if (retrace::debug && supportsDebugOutput) { + glretrace::Context *currentContext = glretrace::getCurrentContext(); glDebugMessageCallbackARB(&debugOutputCallback, currentContext); if (DEBUG_OUTPUT_SYNCHRONOUS) { @@ -309,6 +314,7 @@ frame_complete(trace::Call &call) { retrace::frameComplete(call); + glretrace::Context *currentContext = glretrace::getCurrentContext(); if (!currentContext) { return; } @@ -403,7 +409,7 @@ retrace::addCallbacks(retrace::Retracer &retracer) image::Image * retrace::getSnapshot(void) { - if (!glretrace::currentContext) { + if (!glretrace::getCurrentContext()) { return NULL; } @@ -414,8 +420,10 @@ retrace::getSnapshot(void) { bool retrace::dumpState(std::ostream &os) { + glretrace::Context *currentContext = glretrace::getCurrentContext(); + if (glretrace::insideGlBeginEnd || - !glretrace::currentContext) { + !currentContext) { return false; } diff --git a/retrace/glretrace_wgl.cpp b/retrace/glretrace_wgl.cpp index 639f419..9db4bd0 100644 --- a/retrace/glretrace_wgl.cpp +++ b/retrace/glretrace_wgl.cpp @@ -100,8 +100,11 @@ static void retrace_wglSwapBuffers(trace::Call &call) { if (retrace::doubleBuffer) { if (drawable) { drawable->swapBuffers(); - } else if (currentContext) { - currentContext->drawable->swapBuffers(); + } else { + glretrace::Context *currentContext = glretrace::getCurrentContext(); + if (currentContext) { + currentContext->drawable->swapBuffers(); + } } } else { glFlush(); @@ -117,6 +120,7 @@ static void retrace_wglShareLists(trace::Call &call) { Context *new_context = glretrace::createContext(share_context); if (new_context) { + glretrace::Context *currentContext = glretrace::getCurrentContext(); if (currentContext == old_context) { glretrace::makeCurrent(call, currentContext->drawable, new_context); } diff --git a/retrace/glretrace_ws.cpp b/retrace/glretrace_ws.cpp index aeaadb7..66ef105 100644 --- a/retrace/glretrace_ws.cpp +++ b/retrace/glretrace_ws.cpp @@ -31,6 +31,7 @@ #include +#include "os_thread.hpp" #include "retrace.hpp" #include "glproc.hpp" #include "glstate.hpp" @@ -40,7 +41,6 @@ namespace glretrace { -Context *currentContext = NULL; static glws::Visual * @@ -107,9 +107,14 @@ createContext(Context *shareContext) { } +typedef Context * CurrentData; +static os::thread_specific_ptr currentData; + + bool makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) { + Context *currentContext = getCurrentContext(); glws::Drawable *currentDrawable = currentContext ? currentContext->drawable : NULL; if (drawable == currentDrawable && context == currentContext) { @@ -137,22 +142,38 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) currentContext->drawable = NULL; } + CurrentData *currentDataPtr = currentData.get(); + if (!currentDataPtr) { + currentDataPtr = new CurrentData; + currentData.reset(currentDataPtr); + } + if (drawable && context) { - currentContext = context; - currentContext->drawable = drawable; + context->drawable = drawable; + *currentData = context; if (!context->used) { initContext(); context->used = true; } } else { - currentContext = NULL; + *currentData = NULL; } return true; } +Context * +getCurrentContext(void) { + CurrentData *currentDataPtr = currentData.get(); + if (!currentDataPtr) { + return NULL; + } + return *currentDataPtr; +} + + /** @@ -163,6 +184,7 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) */ void updateDrawable(int width, int height) { + Context *currentContext = getCurrentContext(); if (!currentContext) { return; } diff --git a/specs/gltypes.py b/specs/gltypes.py index 4324ac7..23af327 100644 --- a/specs/gltypes.py +++ b/specs/gltypes.py @@ -100,7 +100,7 @@ GLshader = Handle("shader", GLuint) GLlocation = Handle("location", GLint, key=('program', GLhandleARB)) GLlocationARB = Handle("location", GLint, key=('programObj', GLhandleARB)) -contextKey = ('reinterpret_cast(glretrace::currentContext)', UIntPtr) +contextKey = ('reinterpret_cast(glretrace::getCurrentContext())', UIntPtr) GLprogramARB = Handle("programARB", GLuint) GLframebuffer = Handle("framebuffer", GLuint) -- 2.43.0