]> git.cworth.org Git - apitrace/commitdiff
Basic multi GLX context support.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 5 May 2011 07:33:42 +0000 (08:33 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 5 May 2011 07:33:42 +0000 (08:33 +0100)
glretrace_glx.cpp

index 11465eaa29c2cd47e69ade2b7b400d072db04c23..540d7cb753b256f95b50fbc0150f2034b6435399 100644 (file)
 using namespace glretrace;
 
 
+typedef std::map<unsigned long, glws::Drawable *> DrawableMap;
+typedef std::map<void *, glws::Context *> ContextMap;
+static DrawableMap drawable_map;
+static ContextMap context_map;
+
+
+static glws::Drawable *
+getDrawable(unsigned long drawable_id) {
+    if (drawable_id == 0) {
+        return NULL;
+    }
+
+    DrawableMap::const_iterator it;
+    it = drawable_map.find(drawable_id);
+    if (it == drawable_map.end()) {
+        return (drawable_map[drawable_id] = ws->createDrawable(visual));
+    }
+
+    return it->second;
+}
+
 static void retrace_glXChooseVisual(Trace::Call &call) {
 }
 
 static void retrace_glXCreateContext(Trace::Call &call) {
+    void * orig_context = call.ret->blob();
+    glws::Context *context = ws->createContext(glretrace::visual);
+    context_map[orig_context] = context;
 }
 
 static void retrace_glXDestroyContext(Trace::Call &call) {
@@ -46,6 +70,19 @@ static void retrace_glXMakeCurrent(Trace::Call &call) {
     if (!double_buffer) {
         frame_complete(call.no);
     }
+
+    glws::Drawable *new_drawable = getDrawable(static_cast<unsigned long>(call.arg(1)));
+    glws::Context *new_context = context_map[call.arg(2).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;
+    }
 }
 
 static void retrace_glXCopyContext(Trace::Call &call) {