typedef std::map<unsigned long long, glws::Drawable *> DrawableMap;
-typedef std::map<unsigned long long, glws::Context *> ContextMap;
+typedef std::map<unsigned long long, Context *> ContextMap;
static DrawableMap drawable_map;
static DrawableMap pbuffer_map;
static ContextMap context_map;
DrawableMap::const_iterator it;
it = drawable_map.find(hdc);
if (it == drawable_map.end()) {
- return (drawable_map[hdc] = glws::createDrawable(visual[glretrace::defaultProfile]));
+ return (drawable_map[hdc] = glretrace::createDrawable());
}
return it->second;
static void retrace_wglCreateContext(trace::Call &call) {
unsigned long long orig_context = call.ret->toUIntPtr();
- glws::Context *context = glws::createContext(glretrace::visual[glretrace::defaultProfile], NULL, glretrace::defaultProfile, retrace::debug);
+ Context *context = glretrace::createContext();
context_map[orig_context] = context;
}
static void retrace_wglDeleteContext(trace::Call &call) {
-}
+ unsigned long long hglrc = call.arg(0).toUIntPtr();
-static void retrace_wglMakeCurrent(trace::Call &call) {
- if (drawable && context) {
- glFlush();
- if (!retrace::doubleBuffer) {
- frame_complete(call);
- }
+ ContextMap::iterator it;
+ it = context_map.find(hglrc);
+ if (it == context_map.end()) {
+ return;
}
+
+ delete it->second;
- glws::Drawable *new_drawable = getDrawable(call.arg(0).toUIntPtr());
- glws::Context *new_context = context_map[call.arg(1).toUIntPtr()];
+ context_map.erase(it);
+}
- bool result = glws::makeCurrent(new_drawable, new_context);
+static void retrace_wglMakeCurrent(trace::Call &call) {
+ glws::Drawable *new_drawable = getDrawable(call.arg(0).toUIntPtr());
+ Context *new_context = context_map[call.arg(1).toUIntPtr()];
- if (new_drawable && new_context && result) {
- drawable = new_drawable;
- context = new_context;
- } else {
- drawable = NULL;
- context = NULL;
- }
+ glretrace::makeCurrent(call, new_drawable, new_context);
}
static void retrace_wglCopyContext(trace::Call &call) {
}
static void retrace_wglSwapBuffers(trace::Call &call) {
+ glws::Drawable *drawable = getDrawable(call.arg(0).toUIntPtr());
+
frame_complete(call);
if (retrace::doubleBuffer) {
- drawable->swapBuffers();
+ if (drawable) {
+ drawable->swapBuffers();
+ } else {
+ glretrace::Context *currentContext = glretrace::getCurrentContext();
+ if (currentContext) {
+ currentContext->drawable->swapBuffers();
+ }
+ }
} else {
glFlush();
}
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 =
- glws::createContext(old_context->visual, share_context, glretrace::defaultProfile, retrace::debug);
+ Context *new_context = glretrace::createContext(share_context);
if (new_context) {
- if (context == old_context) {
- glws::makeCurrent(drawable, new_context);
+ glretrace::Context *currentContext = glretrace::getCurrentContext();
+ if (currentContext == old_context) {
+ glretrace::makeCurrent(call, currentContext->drawable, new_context);
}
context_map[hglrc2] = new_context;
int iHeight = call.arg(3).toUInt();
unsigned long long orig_pbuffer = call.ret->toUIntPtr();
- glws::Drawable *drawable = glws::createDrawable(glretrace::visual[glretrace::defaultProfile]);
-
- drawable->resize(iWidth, iHeight);
- drawable->show();
+ glws::Drawable *drawable = glretrace::createPbuffer(iWidth, iHeight);
pbuffer_map[orig_pbuffer] = drawable;
}
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 = glws::createContext(glretrace::visual[glretrace::defaultProfile], share_context, glretrace::defaultProfile, retrace::debug);
+ Context *context = glretrace::createContext(share_context);
context_map[orig_context] = context;
}