From: José Fonseca Date: Fri, 19 Oct 2012 16:34:30 +0000 (+0100) Subject: Kill currentDrawable. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=5ed4ca62e0b1236ff45e608d6b531a2181c6afbb;hp=46ff42d9aaddfd35cd655f546d9b41fe84588011;p=apitrace Kill currentDrawable. Use currentContext->drawable instead. --- diff --git a/retrace/glretrace.hpp b/retrace/glretrace.hpp index f058d8d..87ced60 100644 --- a/retrace/glretrace.hpp +++ b/retrace/glretrace.hpp @@ -35,6 +35,7 @@ namespace glretrace { struct Context { Context(glws::Context* context) : wsContext(context), + drawable(0), activeProgram(0), used(false) { @@ -46,6 +47,10 @@ struct Context { } glws::Context* wsContext; + + // Bound drawable + glws::Drawable *drawable; + GLuint activeProgram; bool used; @@ -60,7 +65,6 @@ extern bool insideList; extern bool insideGlBeginEnd; -extern glws::Drawable *currentDrawable; extern Context *currentContext; diff --git a/retrace/glretrace_cgl.cpp b/retrace/glretrace_cgl.cpp index 1197015..d66fbb5 100644 --- a/retrace/glretrace_cgl.cpp +++ b/retrace/glretrace_cgl.cpp @@ -235,9 +235,12 @@ static void retrace_CGLSetCurrentContext(trace::Call &call) { static void retrace_CGLFlushDrawable(trace::Call &call) { - if (currentDrawable && currentContext) { + unsigned long long ctx = call.arg(0).toUIntPtr(); + Context *context = getContext(ctx); + + if (context) { if (retrace::doubleBuffer) { - currentDrawable->swapBuffers(); + context->drawable->swapBuffers(); } else { glFlush(); } diff --git a/retrace/glretrace_egl.cpp b/retrace/glretrace_egl.cpp index 3f83f55..7568815 100644 --- a/retrace/glretrace_egl.cpp +++ b/retrace/glretrace_egl.cpp @@ -127,7 +127,7 @@ static void retrace_eglDestroySurface(trace::Call &call) { it = drawable_map.find(orig_surface); if (it != drawable_map.end()) { - if (it->second != currentDrawable) { + if (!currentContext || it->second != currentContext->drawable) { // TODO: reference count delete it->second; } @@ -216,10 +216,14 @@ static void retrace_eglMakeCurrent(trace::Call &call) { static void retrace_eglSwapBuffers(trace::Call &call) { + glws::Drawable *drawable = getDrawable(call.arg(1).toUIntPtr()); + frame_complete(call); - if (retrace::doubleBuffer && currentDrawable) { - currentDrawable->swapBuffers(); + if (retrace::doubleBuffer) { + if (drawable) { + drawable->swapBuffers(); + } } else { glFlush(); } diff --git a/retrace/glretrace_glx.cpp b/retrace/glretrace_glx.cpp index 918940f..cea892f 100644 --- a/retrace/glretrace_glx.cpp +++ b/retrace/glretrace_glx.cpp @@ -112,9 +112,13 @@ static void retrace_glXDestroyContext(trace::Call &call) { } static void retrace_glXSwapBuffers(trace::Call &call) { + glws::Drawable *drawable = getDrawable(call.arg(1).toUInt()); + frame_complete(call); if (retrace::doubleBuffer) { - currentDrawable->swapBuffers(); + if (drawable) { + drawable->swapBuffers(); + } } else { glFlush(); } diff --git a/retrace/glretrace_main.cpp b/retrace/glretrace_main.cpp index 4471121..f29ad01 100755 --- a/retrace/glretrace_main.cpp +++ b/retrace/glretrace_main.cpp @@ -309,11 +309,11 @@ frame_complete(trace::Call &call) { retrace::frameComplete(call); - if (!currentDrawable) { + if (!currentContext) { return; } - if (retrace::debug && !currentDrawable->visible) { + if (retrace::debug && !currentContext->drawable->visible) { retrace::warning(call) << "could not infer drawable size (glViewport never called)\n"; } } @@ -403,7 +403,7 @@ retrace::addCallbacks(retrace::Retracer &retracer) image::Image * retrace::getSnapshot(void) { - if (!glretrace::currentDrawable) { + if (!glretrace::currentContext) { return NULL; } @@ -415,7 +415,6 @@ bool retrace::dumpState(std::ostream &os) { if (glretrace::insideGlBeginEnd || - !glretrace::currentDrawable || !glretrace::currentContext) { return false; } diff --git a/retrace/glretrace_wgl.cpp b/retrace/glretrace_wgl.cpp index bf2f38a..639f419 100644 --- a/retrace/glretrace_wgl.cpp +++ b/retrace/glretrace_wgl.cpp @@ -94,9 +94,15 @@ static void retrace_wglSetPixelFormat(trace::Call &call) { } static void retrace_wglSwapBuffers(trace::Call &call) { + glws::Drawable *drawable = getDrawable(call.arg(0).toUIntPtr()); + frame_complete(call); if (retrace::doubleBuffer) { - currentDrawable->swapBuffers(); + if (drawable) { + drawable->swapBuffers(); + } else if (currentContext) { + currentContext->drawable->swapBuffers(); + } } else { glFlush(); } @@ -112,7 +118,7 @@ static void retrace_wglShareLists(trace::Call &call) { Context *new_context = glretrace::createContext(share_context); if (new_context) { if (currentContext == old_context) { - glretrace::makeCurrent(call, currentDrawable, new_context); + glretrace::makeCurrent(call, currentContext->drawable, new_context); } context_map[hglrc2] = new_context; diff --git a/retrace/glretrace_ws.cpp b/retrace/glretrace_ws.cpp index 97762ed..aeaadb7 100644 --- a/retrace/glretrace_ws.cpp +++ b/retrace/glretrace_ws.cpp @@ -40,7 +40,6 @@ namespace glretrace { -glws::Drawable *currentDrawable = NULL; Context *currentContext = NULL; @@ -111,11 +110,13 @@ createContext(Context *shareContext) { bool makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) { + glws::Drawable *currentDrawable = currentContext ? currentContext->drawable : NULL; + if (drawable == currentDrawable && context == currentContext) { return true; } - if (currentDrawable && currentContext) { + if (currentContext) { glFlush(); if (!retrace::doubleBuffer) { frame_complete(call); @@ -132,16 +133,19 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) return false; } + if (currentContext) { + currentContext->drawable = NULL; + } + if (drawable && context) { - currentDrawable = drawable; currentContext = context; + currentContext->drawable = drawable; if (!context->used) { initContext(); context->used = true; } } else { - currentDrawable = NULL; currentContext = NULL; } @@ -159,10 +163,13 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) */ void updateDrawable(int width, int height) { - if (!currentDrawable) { + if (!currentContext) { return; } + glws::Drawable *currentDrawable = currentContext->drawable; + assert(currentDrawable); + if (currentDrawable->visible && width <= currentDrawable->width && height <= currentDrawable->height) {