X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glxtrace.py;h=3e91f00ed47e1bed2418a78deaa6e9f88abc8695;hb=b25c4b9fccc76976d633bc5b183a84553ab01998;hp=cdcef6629f6446404a7cc7a340375c717cf53799;hpb=5a76ccfa198db7732bf1a71edf4a2d0dab3bcc47;p=apitrace diff --git a/glxtrace.py b/glxtrace.py index cdcef66..3e91f00 100644 --- a/glxtrace.py +++ b/glxtrace.py @@ -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,6 +41,23 @@ class GlxTracer(GlTracer): # The symbols visible in libGL.so can vary, so expose them all return True + 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) @@ -66,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 @@ -83,11 +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: unknown function \\"%s\\"\\n", (const char *)procName);' + print ' os::log("apitrace: warning: unknown function \\"%s\\"\\n", (const char *)procName);' print ' return procPtr;' print '}' print @@ -111,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::log("apitrace: error: dlsym(RTLD_NEXT, \"dlopen\") failed\n"); return NULL; } } @@ -137,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::log("apitrace: warning: dlopen(\"%s\", 0x%x)\n", filename, flag); } // FIXME: handle absolute paths and other versions @@ -151,10 +169,10 @@ void * dlopen(const char *filename, int flag) static int dummy = 0xdeedbeef; Dl_info info; if (dladdr(&dummy, &info)) { - OS::DebugMessage("apitrace: redirecting dlopen(\"%s\", 0x%x)\n", filename, flag); + os::log("apitrace: redirecting dlopen(\"%s\", 0x%x)\n", filename, flag); handle = __dlopen(info.dli_fname, flag); } else { - OS::DebugMessage("warning: dladdr() failed\n"); + os::log("apitrace: warning: dladdr() failed\n"); } } } @@ -166,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; @@ -201,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::log("apitrace: error: couldn't find libGL.so\n"); return NULL; } }