From: José Fonseca Date: Thu, 5 May 2011 20:12:54 +0000 (+0100) Subject: Basic multi context & puffer support for WGL. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=62617d17c67049ae23f99601049770fd63a1322e;p=apitrace Basic multi context & puffer support for WGL. --- diff --git a/glretrace_glx.cpp b/glretrace_glx.cpp index 540d7cb..5f2645d 100644 --- a/glretrace_glx.cpp +++ b/glretrace_glx.cpp @@ -66,9 +66,11 @@ static void retrace_glXDestroyContext(Trace::Call &call) { } static void retrace_glXMakeCurrent(Trace::Call &call) { - glFlush(); - if (!double_buffer) { - frame_complete(call.no); + if (drawable && context) { + glFlush(); + if (!double_buffer) { + frame_complete(call.no); + } } glws::Drawable *new_drawable = getDrawable(static_cast(call.arg(1))); diff --git a/glretrace_wgl.cpp b/glretrace_wgl.cpp index 13445d7..fd76dbb 100644 --- a/glretrace_wgl.cpp +++ b/glretrace_wgl.cpp @@ -32,16 +32,56 @@ using namespace glretrace; +typedef std::map DrawableMap; +typedef std::map ContextMap; +static DrawableMap drawable_map; +static DrawableMap pbuffer_map; +static ContextMap context_map; + + +static glws::Drawable * +getDrawable(void * hdc) { + if (hdc == NULL) { + return NULL; + } + + DrawableMap::const_iterator it; + it = drawable_map.find(hdc); + if (it == drawable_map.end()) { + return (drawable_map[hdc] = ws->createDrawable(visual)); + } + + return it->second; +} + static void retrace_wglCreateContext(Trace::Call &call) { + void * orig_context = call.ret->blob(); + glws::Context *context = ws->createContext(glretrace::visual); + context_map[orig_context] = context; } static void retrace_wglDeleteContext(Trace::Call &call) { } static void retrace_wglMakeCurrent(Trace::Call &call) { - glFlush(); - if (!double_buffer) { - frame_complete(call.no); + if (drawable && context) { + glFlush(); + if (!double_buffer) { + frame_complete(call.no); + } + } + + glws::Drawable *new_drawable = getDrawable(call.arg(0).blob()); + glws::Context *new_context = context_map[call.arg(1).blob()]; + + bool result = ws->makeCurrent(new_drawable, new_context); + + if (new_drawable && new_context && result) { + drawable = new_drawable; + context = new_context; + } else { + drawable = NULL; + context = NULL; } } @@ -118,6 +158,23 @@ static void retrace_wglMakeContextCurrentARB(Trace::Call &call) { } static void retrace_wglCreatePbufferARB(Trace::Call &call) { + unsigned iWidth = call.arg(2); + unsigned iHeight = call.arg(3); + + void * orig_pbuffer = call.ret->blob(); + glws::Drawable *drawable = ws->createDrawable(glretrace::visual); + + drawable->resize(iWidth, iHeight); + + pbuffer_map[orig_pbuffer] = drawable; +} + +static void retrace_wglGetPbufferDCARB(Trace::Call &call) { + glws::Drawable *pbuffer = pbuffer_map[call.arg(0).blob()]; + + void * orig_hdc = call.ret->blob(); + + drawable_map[orig_hdc] = pbuffer; } static void retrace_wglReleasePbufferDCARB(Trace::Call &call) { @@ -633,6 +690,7 @@ void glretrace::retrace_call_wgl(Trace::Call &call) { case 'b': if (name[8] == 'u' && name[9] == 'f' && name[10] == 'f' && name[11] == 'e' && name[12] == 'r' && name[13] == 'D' && name[14] == 'C' && name[15] == 'A' && name[16] == 'R' && name[17] == 'B' && name[18] == '\0') { // wglGetPbufferDCARB + retrace_wglGetPbufferDCARB(call); return; } break; diff --git a/wglapi.py b/wglapi.py index cfaa1ca..1f1a78c 100644 --- a/wglapi.py +++ b/wglapi.py @@ -188,10 +188,10 @@ wglapi.add_functions([ # WGL_ARB_pbuffer StdFunction(HPBUFFERARB, "wglCreatePbufferARB", [(HDC, "hDC"), (Int, "iPixelFormat"), (Int, "iWidth"), (Int, "iHeight"), (Const(Array(WGLenum, "__AttribList_size(piAttribList)")), "piAttribList")]), - StdFunction(HDC, "wglGetPbufferDCARB", [(HPBUFFERARB, "hPbuffer")], sideeffects=False), + StdFunction(HDC, "wglGetPbufferDCARB", [(HPBUFFERARB, "hPbuffer")]), StdFunction(Int, "wglReleasePbufferDCARB", [(HPBUFFERARB, "hPbuffer"), (HDC, "hDC")]), StdFunction(BOOL, "wglDestroyPbufferARB", [(HPBUFFERARB, "hPbuffer")]), - StdFunction(BOOL, "wglQueryPbufferARB", [(HPBUFFERARB, "hPbuffer"), (WGLenum, "iAttribute"), Out(Pointer(Int), "piValue")]), + StdFunction(BOOL, "wglQueryPbufferARB", [(HPBUFFERARB, "hPbuffer"), (WGLenum, "iAttribute"), Out(Pointer(Int), "piValue")], sideeffects=False), # WGL_ARB_render_texture StdFunction(BOOL, "wglBindTexImageARB", [(HPBUFFERARB, "hPbuffer"), (Int, "iBuffer")]),