]> git.cworth.org Git - apitrace/blobdiff - glxtrace.py
tracedump: Add tri-state --color option (auto, always, or never)
[apitrace] / glxtrace.py
index be7a8caec1ff650654ee2d5f449072bf2b3fb87c..70d9c1b9c818b839d59628e8f2aec89a19d5d04c 100644 (file)
@@ -28,9 +28,9 @@
 """GLX tracing generator."""
 
 
-from stdapi import API
-from glapi import glapi
-from glxapi import glxapi
+from specs.stdapi import API
+from specs.glapi import glapi
+from specs.glxapi import glxapi
 from gltrace import GlTracer
 from dispatch import function_pointer_type, function_pointer_value
 
@@ -41,8 +41,22 @@ class GlxTracer(GlTracer):
         # The symbols visible in libGL.so can vary, so expose them all
         return True
 
-    def get_function_address(self, function):
-        return '__%s' % (function.name,)
+    def trace_function_impl_body(self, function):
+        GlTracer.trace_function_impl_body(self, function)
+
+        # Take snapshots
+        if function.name == 'glXSwapBuffers':
+            print '    glsnapshot::snapshot(__call);'
+        if function.name in ('glFinish', 'glFlush'):
+            print '    GLint __draw_framebuffer = 0;'
+            print '    __glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &__draw_framebuffer);'
+            print '    if (__draw_framebuffer == 0) {'
+            print '        GLint __draw_buffer = GL_NONE;'
+            print '        __glGetIntegerv(GL_DRAW_BUFFER, &__draw_buffer);'
+            print '        if (__draw_buffer == GL_FRONT) {'
+            print '             glsnapshot::snapshot(__call);'
+            print '        }'
+            print '    }'
 
     def wrap_ret(self, function, instance):
         GlTracer.wrap_ret(self, function, instance)
@@ -61,7 +75,7 @@ if __name__ == '__main__':
     print '#endif'
     print '#include <dlfcn.h>'
     print
-    print '#include "trace_write.hpp"'
+    print '#include "trace_writer.hpp"'
     print
     print '// To validate our prototypes'
     print '#define GL_GLEXT_PROTOTYPES'
@@ -69,6 +83,7 @@ if __name__ == '__main__':
     print
     print '#include "glproc.hpp"'
     print '#include "glsize.hpp"'
+    print '#include "glsnapshot.hpp"'
     print
     print 'static __GLXextFuncPtr __unwrap_proc_addr(const GLubyte * procName, __GLXextFuncPtr procPtr);'
     print
@@ -86,10 +101,11 @@ if __name__ == '__main__':
     for f in api.functions:
         ptype = function_pointer_type(f)
         pvalue = function_pointer_value(f)
-        print '    if (!strcmp("%s", (const char *)procName)) {' % f.name
+        print '    if (strcmp("%s", (const char *)procName) == 0) {' % f.name
         print '        %s = (%s)procPtr;' % (pvalue, ptype)
         print '        return (__GLXextFuncPtr)&%s;' % (f.name,)
         print '    }'
+    print '    OS::DebugMessage("apitrace: warning: unknown function \\"%s\\"\\n", (const char *)procName);'
     print '    return procPtr;'
     print '}'
     print
@@ -113,7 +129,7 @@ static void *__dlopen(const char *filename, int flag)
     if (!dlopen_ptr) {
         dlopen_ptr = (PFNDLOPEN)dlsym(RTLD_NEXT, "dlopen");
         if (!dlopen_ptr) {
-            OS::DebugMessage("error: dlsym(RTLD_NEXT, \"dlopen\") failed\n");
+            OS::DebugMessage("apitrace: error: dlsym(RTLD_NEXT, \"dlopen\") failed\n");
             return NULL;
         }
     }
@@ -139,7 +155,7 @@ void * dlopen(const char *filename, int flag)
 
     if (filename && handle && !libgl_filename) {
         if (0) {
-            OS::DebugMessage("warning: dlopen(\"%s\", 0x%x)\n", filename, flag);
+            OS::DebugMessage("apitrace: warning: dlopen(\"%s\", 0x%x)\n", filename, flag);
         }
 
         // FIXME: handle absolute paths and other versions
@@ -156,7 +172,7 @@ void * dlopen(const char *filename, int flag)
                 OS::DebugMessage("apitrace: redirecting dlopen(\"%s\", 0x%x)\n", filename, flag);
                 handle = __dlopen(info.dli_fname, flag);
             } else {
-                OS::DebugMessage("warning: dladdr() failed\n");
+                OS::DebugMessage("apitrace: warning: dladdr() failed\n");
             }
         }
     }
@@ -168,7 +184,7 @@ void * dlopen(const char *filename, int flag)
 /*
  * Lookup a libGL symbol
  */
-static void * __dlsym(const char *symbol)
+void * __libgl_sym(const char *symbol)
 {
     void *result;
 
@@ -203,7 +219,7 @@ static void * __dlsym(const char *symbol)
 
         libgl_handle = __dlopen(libgl_filename, RTLD_GLOBAL | RTLD_LAZY);
         if (!libgl_handle) {
-            OS::DebugMessage("error: couldn't find libGL.so\n");
+            OS::DebugMessage("apitrace: error: couldn't find libGL.so\n");
             return NULL;
         }
     }