X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glretrace_wgl.cpp;h=a3ca05b8f0c2c6c1962ecae1befaf68d592b2df4;hb=124cd34846abf59579fe7cbd819a3a719a07a29f;hp=fd76dbb8b0683c2883e03fdaa1a5ab815f60b350;hpb=62617d17c67049ae23f99601049770fd63a1322e;p=apitrace diff --git a/glretrace_wgl.cpp b/glretrace_wgl.cpp index fd76dbb..a3ca05b 100644 --- a/glretrace_wgl.cpp +++ b/glretrace_wgl.cpp @@ -32,16 +32,16 @@ using namespace glretrace; -typedef std::map DrawableMap; -typedef std::map ContextMap; +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) { +getDrawable(unsigned long long hdc) { + if (hdc == 0) { return NULL; } @@ -55,7 +55,7 @@ getDrawable(void * hdc) { } static void retrace_wglCreateContext(Trace::Call &call) { - void * orig_context = call.ret->blob(); + unsigned long long orig_context = call.ret->toUIntPtr(); glws::Context *context = ws->createContext(glretrace::visual); context_map[orig_context] = context; } @@ -71,8 +71,8 @@ static void retrace_wglMakeCurrent(Trace::Call &call) { } } - glws::Drawable *new_drawable = getDrawable(call.arg(0).blob()); - glws::Context *new_context = context_map[call.arg(1).blob()]; + glws::Drawable *new_drawable = getDrawable(call.arg(0).toUIntPtr()); + glws::Context *new_context = context_map[call.arg(1).toUIntPtr()]; bool result = ws->makeCurrent(new_drawable, new_context); @@ -107,9 +107,22 @@ static void retrace_wglSwapBuffers(Trace::Call &call) { } 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]; + + glws::Context *new_context = + ws->createContext(old_context->visual, share_context); + if (new_context) { + delete old_context; + context_map[hglrc2] = new_context; + } } static void retrace_wglCreateLayerContext(Trace::Call &call) { + retrace_wglCreateContext(call); } static void retrace_wglDescribeLayerPlane(Trace::Call &call) { @@ -122,6 +135,7 @@ static void retrace_wglRealizeLayerPalette(Trace::Call &call) { } static void retrace_wglSwapLayerBuffers(Trace::Call &call) { + retrace_wglSwapBuffers(call); } static void retrace_wglUseFontBitmapsA(Trace::Call &call) { @@ -158,10 +172,10 @@ static void retrace_wglMakeContextCurrentARB(Trace::Call &call) { } static void retrace_wglCreatePbufferARB(Trace::Call &call) { - unsigned iWidth = call.arg(2); - unsigned iHeight = call.arg(3); + int iWidth = call.arg(2).toUInt(); + int iHeight = call.arg(3).toUInt(); - void * orig_pbuffer = call.ret->blob(); + unsigned long long orig_pbuffer = call.ret->toUIntPtr(); glws::Drawable *drawable = ws->createDrawable(glretrace::visual); drawable->resize(iWidth, iHeight); @@ -170,9 +184,9 @@ static void retrace_wglCreatePbufferARB(Trace::Call &call) { } static void retrace_wglGetPbufferDCARB(Trace::Call &call) { - glws::Drawable *pbuffer = pbuffer_map[call.arg(0).blob()]; + glws::Drawable *pbuffer = pbuffer_map[call.arg(0).toUIntPtr()]; - void * orig_hdc = call.ret->blob(); + unsigned long long orig_hdc = call.ret->toUIntPtr(); drawable_map[orig_hdc] = pbuffer; } @@ -196,6 +210,15 @@ 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; + + if (call.arg(1).toPointer()) { + share_context = context_map[call.arg(1).toUIntPtr()]; + } + + glws::Context *context = ws->createContext(glretrace::visual, share_context); + context_map[orig_context] = context; } static void retrace_wglMakeContextCurrentEXT(Trace::Call &call) { @@ -220,7 +243,7 @@ static void retrace_wglGetProcAddress(Trace::Call &call) { } void glretrace::retrace_call_wgl(Trace::Call &call) { - const char *name = call.name().c_str(); + const char *name = call.name(); switch (name[0]) { case 'g':