]> git.cworth.org Git - apitrace/blobdiff - retrace/glretrace_wgl.cpp
Use skiplist-based FastCallSet within trace::CallSet
[apitrace] / retrace / glretrace_wgl.cpp
index 5ede7e130022c1541d013c34fa3c594dd7b2fcf4..abcf068a057056f88bdefbe1d8c002bd2e9e0459 100644 (file)
@@ -33,7 +33,7 @@ using namespace glretrace;
 
 
 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;
@@ -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;
 }