X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Fglxtrace.py;h=9c0f87dbcb443fba7fd520317368877062550c33;hb=4b3c99d04556d642a25b032eca65338ed99bcac7;hp=e4d05180e15b4dd06d4ffe2f11dbf77fe0d80a29;hpb=1b6c87507810fe2d72c81fc109110c1ca25ce94f;p=apitrace diff --git a/wrappers/glxtrace.py b/wrappers/glxtrace.py index e4d0518..9c0f87d 100644 --- a/wrappers/glxtrace.py +++ b/wrappers/glxtrace.py @@ -29,7 +29,7 @@ from gltrace import GlTracer -from specs.stdapi import API +from specs.stdapi import Module, API from specs.glapi import glapi from specs.glxapi import glxapi @@ -45,6 +45,41 @@ class GlxTracer(GlTracer): "glXGetProcAddressARB", ] + createContextFunctionNames = [ + 'glXCreateContext', + 'glXCreateContextAttribsARB', + 'glXCreateContextWithConfigSGIX', + 'glXCreateNewContext', + ] + + destroyContextFunctionNames = [ + 'glXDestroyContext', + ] + + makeCurrentFunctionNames = [ + 'glXMakeCurrent', + 'glXMakeContextCurrent', + 'glXMakeCurrentReadSGI', + ] + + def traceFunctionImplBody(self, function): + if function.name in self.destroyContextFunctionNames: + print ' gltrace::releaseContext((uintptr_t)ctx);' + + GlTracer.traceFunctionImplBody(self, function) + + if function.name in self.createContextFunctionNames: + print ' if (_result != NULL)' + print ' gltrace::createContext((uintptr_t)_result);' + + if function.name in self.makeCurrentFunctionNames: + print ' if (_result) {' + print ' if (ctx != NULL)' + print ' gltrace::setContext((uintptr_t)ctx);' + print ' else' + print ' gltrace::clearContext();' + print ' }' + if __name__ == '__main__': print @@ -66,9 +101,11 @@ if __name__ == '__main__': print '#include "glsize.hpp"' print + module = Module() + module.mergeModule(glxapi) + module.mergeModule(glapi) api = API() - api.addApi(glxapi) - api.addApi(glapi) + api.addModule(module) tracer = GlxTracer() tracer.traceApi(api) @@ -78,13 +115,13 @@ if __name__ == '__main__': /* * Invoke the true dlopen() function. */ -static void *__dlopen(const char *filename, int flag) +static void *_dlopen(const char *filename, int flag) { - typedef void * (*PFNDLOPEN)(const char *, int); - static PFNDLOPEN dlopen_ptr = NULL; + typedef void * (*PFN_DLOPEN)(const char *, int); + static PFN_DLOPEN dlopen_ptr = NULL; if (!dlopen_ptr) { - dlopen_ptr = (PFNDLOPEN)dlsym(RTLD_NEXT, "dlopen"); + dlopen_ptr = (PFN_DLOPEN)dlsym(RTLD_NEXT, "dlopen"); if (!dlopen_ptr) { os::log("apitrace: error: dlsym(RTLD_NEXT, \"dlopen\") failed\n"); return NULL; @@ -106,7 +143,7 @@ void * dlopen(const char *filename, int flag) { void *handle; - handle = __dlopen(filename, flag); + handle = _dlopen(filename, flag); const char * libgl_filename = getenv("TRACE_LIBGL"); @@ -120,14 +157,14 @@ void * dlopen(const char *filename, int flag) strcmp(filename, "libGL.so.1") == 0) { // Use the true libGL.so handle instead of RTLD_NEXT from now on - __libGlHandle = handle; + _libGlHandle = handle; // Get the file path for our shared object, and use it instead static int dummy = 0xdeedbeef; Dl_info info; if (dladdr(&dummy, &info)) { os::log("apitrace: redirecting dlopen(\"%s\", 0x%x)\n", filename, flag); - handle = __dlopen(info.dli_fname, flag); + handle = _dlopen(info.dli_fname, flag); } else { os::log("apitrace: warning: dladdr() failed\n"); }