]> git.cworth.org Git - apitrace/blobdiff - glretrace_wgl.cpp
Avoid pointless data structure copying.
[apitrace] / glretrace_wgl.cpp
index fd76dbb8b0683c2883e03fdaa1a5ab815f60b350..a3ca05b8f0c2c6c1962ecae1befaf68d592b2df4 100644 (file)
 using namespace glretrace;
 
 
-typedef std::map<void *, glws::Drawable *> DrawableMap;
-typedef std::map<void *, glws::Context *> ContextMap;
+typedef std::map<unsigned long long, glws::Drawable *> DrawableMap;
+typedef std::map<unsigned long long, glws::Context *> 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':