summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2016-10-06 10:59:22 -0600
committerJose Fonseca <jfonseca@vmware.com>2017-03-27 15:11:07 +0100
commitde04a06854212d0baa3410825c5f021e39139138 (patch)
treef15c337b9430d47cbb7448e40c08fe8fc315eb45
parent57cb4c3d0a8009b0c1e7c0658cd5158884cd0c07 (diff)
retrace: add wglMakeContextCurrentARB() support
-rw-r--r--retrace/glretrace.hpp5
-rw-r--r--retrace/glretrace_glx.cpp3
-rw-r--r--retrace/glretrace_wgl.cpp19
-rw-r--r--retrace/glretrace_ws.cpp18
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;