diff options
author | Brian Paul <brianp@vmware.com> | 2016-10-06 10:59:22 -0600 |
---|---|---|
committer | Jose Fonseca <jfonseca@vmware.com> | 2017-03-27 15:11:07 +0100 |
commit | de04a06854212d0baa3410825c5f021e39139138 (patch) | |
tree | f15c337b9430d47cbb7448e40c08fe8fc315eb45 | |
parent | 57cb4c3d0a8009b0c1e7c0658cd5158884cd0c07 (diff) |
retrace: add wglMakeContextCurrentARB() support
-rw-r--r-- | retrace/glretrace.hpp | 5 | ||||
-rw-r--r-- | retrace/glretrace_glx.cpp | 3 | ||||
-rw-r--r-- | retrace/glretrace_wgl.cpp | 19 | ||||
-rw-r--r-- | retrace/glretrace_ws.cpp | 18 |
4 files changed, 41 insertions, 4 deletions
diff --git a/retrace/glretrace.hpp b/retrace/glretrace.hpp index 40bd0cf8..3882a063 100644 --- a/retrace/glretrace.hpp +++ b/retrace/glretrace.hpp @@ -67,6 +67,7 @@ public: // Bound drawable glws::Drawable *drawable = nullptr; + glws::Drawable *readable = nullptr; // Active program (unswizzled) for profiling GLuint currentUserProgram = 0; @@ -152,6 +153,10 @@ createContext(Context *shareContext = 0); bool makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context); +bool +makeCurrent(trace::Call &call, glws::Drawable *drawable, + glws::Drawable *readable, Context *context); + void checkGlError(trace::Call &call); diff --git a/retrace/glretrace_glx.cpp b/retrace/glretrace_glx.cpp index 4e84b5b6..6094266e 100644 --- a/retrace/glretrace_glx.cpp +++ b/retrace/glretrace_glx.cpp @@ -197,9 +197,10 @@ static void retrace_glXMakeContextCurrent(trace::Call &call) { } glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt()); + glws::Drawable *new_readable = getDrawable(call.arg(2).toUInt()); Context *new_context = getContext(call.arg(3).toUIntPtr()); - glretrace::makeCurrent(call, new_drawable, new_context); + glretrace::makeCurrent(call, new_drawable, new_readable, new_context); } const retrace::Entry glretrace::glx_callbacks[] = { diff --git a/retrace/glretrace_wgl.cpp b/retrace/glretrace_wgl.cpp index f7a014b9..0024ff8e 100644 --- a/retrace/glretrace_wgl.cpp +++ b/retrace/glretrace_wgl.cpp @@ -112,6 +112,24 @@ static void retrace_wglMakeCurrent(trace::Call &call) { glretrace::makeCurrent(call, new_drawable, new_context); } +static void retrace_wglMakeContextCurrentARB(trace::Call &call) { + bool ret = call.ret->toBool(); + + glws::Drawable *new_drawable = NULL; + glws::Drawable *new_readable = NULL; + Context *new_context = NULL; + if (ret) { + unsigned long long hglrc = call.arg(2).toUIntPtr(); + if (hglrc) { + new_drawable = getDrawable(call.arg(0).toUIntPtr()); + new_readable = getDrawable(call.arg(1).toUIntPtr()); + new_context = getContext(hglrc); + } + } + + glretrace::makeCurrent(call, new_drawable, new_readable, new_context); +} + static void retrace_wglSwapBuffers(trace::Call &call) { bool ret = call.ret->toBool(); if (!ret) { @@ -456,6 +474,7 @@ const retrace::Entry glretrace::wgl_callbacks[] = { {"wglGetPixelFormatAttribivEXT", &retrace::ignore}, {"wglGetProcAddress", &retrace::ignore}, {"wglGetSwapIntervalEXT", &retrace::ignore}, + {"wglMakeContextCurrentARB", &retrace_wglMakeContextCurrentARB}, {"wglMakeCurrent", &retrace_wglMakeCurrent}, {"wglQueryPbufferARB", &retrace::ignore}, {"wglReleasePbufferDCARB", &retrace::ignore}, diff --git a/retrace/glretrace_ws.cpp b/retrace/glretrace_ws.cpp index d14d8aec..d6d0a875 100644 --- a/retrace/glretrace_ws.cpp +++ b/retrace/glretrace_ws.cpp @@ -151,10 +151,21 @@ currentContextPtr; bool makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) { + return makeCurrent(call, drawable, drawable, context); +} + + +bool +makeCurrent(trace::Call &call, glws::Drawable *drawable, + glws::Drawable *readable, Context *context) +{ Context *currentContext = currentContextPtr; glws::Drawable *currentDrawable = currentContext ? currentContext->drawable : NULL; + glws::Drawable *currentReadable = currentContext ? currentContext->readable : NULL; - if (drawable == currentDrawable && context == currentContext) { + if (drawable == currentDrawable && + readable == currentReadable && + context == currentContext) { return true; } @@ -170,7 +181,7 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) beforeContextSwitch(); - bool success = glws::makeCurrent(drawable, context ? context->wsContext : NULL); + bool success = glws::makeCurrent(drawable, readable, context ? context->wsContext : NULL); if (!success) { std::cerr << "error: failed to make current OpenGL context and drawable\n"; @@ -189,7 +200,8 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) if (drawable && context) { context->drawable = drawable; - + context->readable = readable; + if (!context->used) { initContext(); context->used = true; |