X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fglretrace_wgl.cpp;h=abcf068a057056f88bdefbe1d8c002bd2e9e0459;hb=HEAD;hp=5ede7e130022c1541d013c34fa3c594dd7b2fcf4;hpb=06555614b7385c49964d27aaeec68dec6ff31744;p=apitrace diff --git a/retrace/glretrace_wgl.cpp b/retrace/glretrace_wgl.cpp index 5ede7e1..abcf068 100644 --- a/retrace/glretrace_wgl.cpp +++ b/retrace/glretrace_wgl.cpp @@ -33,7 +33,7 @@ using namespace glretrace; typedef std::map DrawableMap; -typedef std::map ContextMap; +typedef std::map ContextMap; static DrawableMap drawable_map; static DrawableMap pbuffer_map; static ContextMap context_map; @@ -48,7 +48,7 @@ getDrawable(unsigned long long hdc) { 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; @@ -56,33 +56,29 @@ getDrawable(unsigned long long hdc) { 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) { @@ -98,9 +94,18 @@ 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) { - drawable->swapBuffers(); + if (drawable) { + drawable->swapBuffers(); + } else { + glretrace::Context *currentContext = glretrace::getCurrentContext(); + if (currentContext) { + currentContext->drawable->swapBuffers(); + } + } } else { glFlush(); } @@ -110,14 +115,14 @@ static void retrace_wglShareLists(trace::Call &call) { 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; @@ -181,10 +186,7 @@ static void retrace_wglCreatePbufferARB(trace::Call &call) { 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; } @@ -217,13 +219,13 @@ static void retrace_wglSetPbufferAttribARB(trace::Call &call) { 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; }