]> git.cworth.org Git - apitrace/commitdiff
stash: Trace and replay of gnome-shell works texture-from-pixmap-proof-of-concept
authorCarl Worth <cworth@cworth.org>
Fri, 17 May 2013 19:50:21 +0000 (12:50 -0700)
committerCarl Worth <cworth@cworth.org>
Thu, 18 Jul 2013 22:23:02 +0000 (15:23 -0700)
Obviously, the patch series needs to be cleaned up quite a bit.

retrace/glretrace_glx.cpp
retrace/glws_glx.cpp
wrappers/glxtrace.py
wrappers/trace.py

index eb64b6bfb86d37d176901b50ef7031d95f033a87..f740a8c62a6937e2bd9e836f45424d199393c1ce 100644 (file)
@@ -28,6 +28,7 @@
 #include "retrace.hpp"
 #include "glretrace.hpp"
 
+#include <vector>
 
 #ifndef GLX_PBUFFER_HEIGHT
 #define GLX_PBUFFER_HEIGHT 0x8040
@@ -50,10 +51,12 @@ typedef std::map<unsigned long, glws::Drawable *> DrawableMap;
 typedef std::map<unsigned long long, Context *> ContextMap;
 typedef std::map<unsigned long, PixmapDesc *> PixmapDescMap;
 typedef std::map<GLXFBConfig, GLXFBConfig> ConfigMap;
+typedef std::map<GLXFBConfig, std::vector<int> > ConfigAttribListMap;
 static DrawableMap drawable_map;
 static ContextMap context_map;
 static PixmapDescMap pixmap_desc_map;
 static ConfigMap config_map;
+static ConfigAttribListMap config_attrib_list_map;
 
 static glws::Drawable *
 getDrawable(unsigned long drawable_id) {
@@ -219,9 +222,19 @@ static void retrace_glXCreatePixmap(trace::Call &call) {
         }
     }
 
-    printf("Looking for %p in FB-config map\n", orig_fbconfig);
     fbconfig = config_map[orig_fbconfig];
 
+    if (! fbconfig) {
+        std::vector<int> *attrib_list = &config_attrib_list_map[orig_fbconfig];
+        attrib_list->push_back(0);
+        fbconfig = glretrace::chooseConfig(attrib_list->data());
+        if (fbconfig) {
+            config_map[orig_fbconfig] = fbconfig;
+        } else {
+            fprintf(stderr, "Error: Failed to find suitable fbconfig\n");
+        }
+    }
+
     pixmap = glretrace::createPixmap(desc->width, desc->height, desc->depth);
 
     gl_pixmap = glretrace::createGLPixmap(fbconfig, pixmap, desc->width, desc->height, attrib_list);
@@ -291,11 +304,20 @@ static void retrace_glXChooseFBConfig(trace::Call &call) {
 
     config = glretrace::chooseConfig(attrib_list);
     for (size_t i = 0; i < orig_nelements; i++) {
-        printf("Mapping FB config %p to %p\n", orig_configs->values[i]->toPointer(), config);
         config_map[static_cast<GLXFBConfig>(orig_configs->values[i]->toPointer())] = config;
     }
 }
 
+static void retrace_glXGetFBConfigAttrib(trace::Call &call) {
+    GLXFBConfig config = static_cast<GLXFBConfig>(call.arg(1).toPointer());
+    int attribute = call.arg(2).toUInt();
+    int value = dynamic_cast<const trace::Array *>(&call.arg(3))->values[0]->toSInt();
+
+    std::vector<int> *attrib_list = &config_attrib_list_map[config];
+    attrib_list->push_back(attribute);
+    attrib_list->push_back(value);
+}
+
 const retrace::Entry glretrace::glx_callbacks[] = {
     //{"glXBindChannelToWindowSGIX", &retrace_glXBindChannelToWindowSGIX},
     //{"glXBindSwapBarrierNV", &retrace_glXBindSwapBarrierNV},
@@ -340,7 +362,7 @@ const retrace::Entry glretrace::glx_callbacks[] = {
     {"glXGetCurrentDrawable", &retrace::ignore},
     {"glXGetCurrentReadDrawable", &retrace::ignore},
     {"glXGetCurrentReadDrawableSGI", &retrace::ignore},
-    {"glXGetFBConfigAttrib", &retrace::ignore},
+    {"glXGetFBConfigAttrib", &retrace_glXGetFBConfigAttrib},
     {"glXGetFBConfigAttribSGIX", &retrace::ignore},
     {"glXGetFBConfigFromVisualSGIX", &retrace::ignore},
     {"glXGetFBConfigs", &retrace::ignore},
@@ -378,7 +400,7 @@ const retrace::Entry glretrace::glx_callbacks[] = {
     //{"glXReleaseBuffersMESA", &retrace_glXReleaseBuffersMESA},
     {"glXReleaseTexImageEXT", &retrace_glXReleaseTexImageEXT},
     //{"glXResetFrameCountNV", &retrace_glXResetFrameCountNV},
-    //{"glXSelectEvent", &retrace_glXSelectEvent},
+    {"glXSelectEvent", &retrace::ignore},
     //{"glXSelectEventSGIX", &retrace_glXSelectEventSGIX},
     //{"glXSet3DfxModeMESA", &retrace_glXSet3DfxModeMESA},
     //{"glXSwapBuffersMscOML", &retrace_glXSwapBuffersMscOML},
index ce742ac260001e815d7ed2f55ad9413c729f443f..b75945c8e8a8d3becbbf1239366356a9f3718dfb 100644 (file)
@@ -422,8 +422,6 @@ createPixmap(unsigned width, unsigned height, unsigned depth)
     pixmap = XCreatePixmap(display, DefaultRootWindow(display),
                            width, height, depth);
 
-    printf ("Replayed XCreatePixmap to create pixmap %ld\n", pixmap);
-
     return new GlxDrawable(pixmap, width, height);
 }
 
@@ -436,8 +434,6 @@ createGLPixmap(GLXFBConfig fbconfig, Drawable *_pixmap,
 
     gl_pixmap = glXCreatePixmap(display, fbconfig, pixmap->window, attrib_list);
 
-    printf ("And replayed glXCreatePixmap to create pixmap %ld\n", gl_pixmap);
-
     return new GlxDrawable(gl_pixmap, width, height);
 }
 
@@ -484,8 +480,6 @@ putImageData(glws::Drawable *drawable, char *data,
     GC gc;
     XImage image;
 
-    printf ("Calling XPutImage to pixmap %ld\n", glxDrawable->window);
-
     image.width = width;
     image.height = height;
     image.format = ZPixmap;
index 9c0f87dbcb443fba7fd520317368877062550c33..97de045f19520356979cb330196b17f6aeed0201 100644 (file)
@@ -100,6 +100,9 @@ if __name__ == '__main__':
     print '#include "glproc.hpp"'
     print '#include "glsize.hpp"'
     print
+    print 'static std::map<unsigned, unsigned> underlying_x_pixmaps;'
+    print 'void emit_fake_x_create_pixmap(Display *dpy, Drawable pixmap);'
+    print 'void emit_fake_put_image_data(Display *dpy, Drawable pixmap);'
 
     module = Module()
     module.mergeModule(glxapi)
index d9c2900936714e867f1db5c984a86d3d32104ae1..e48a703d796c2ceee3700ec97f38218ed2524a02 100644 (file)
@@ -488,6 +488,10 @@ class Tracer:
         print
 
     def traceFunctionImplBody(self, function):
+        if function.name == 'glXCreatePixmap':
+            print '    emit_fake_x_create_pixmap(dpy, pixmap);'
+        if function.name == 'glXBindTexImageEXT':
+            print '    emit_fake_put_image_data(display, underlying_x_pixmaps[drawable]);'
         if not function.internal:
             print '    unsigned _call = trace::localWriter.beginEnter(&_%s_sig);' % (function.name,)
             for arg in function.args:
@@ -498,6 +502,8 @@ class Tracer:
                     self.serializeArg(function, arg)
             print '    trace::localWriter.endEnter();'
         self.invokeFunction(function)
+        if function.name == 'glXCreatePixmap':
+            print '    underlying_x_pixmaps[_result] = pixmap;'
         if not function.internal:
             print '    trace::localWriter.beginLeave(_call);'
             print '    if (%s) {' % self.wasFunctionSuccessful(function)