##########################################################################
#
+# Copyright 2011 Jose Fonseca
# Copyright 2008-2010 VMware, Inc.
# All Rights Reserved.
#
"""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
class GlxTracer(GlTracer):
- def get_function_address(self, function):
- return '__%s' % (function.name,)
+ def isFunctionPublic(self, function):
+ # The symbols visible in libGL.so can vary, so expose them all
+ return True
+
+ def wrapRet(self, function, instance):
+ GlTracer.wrapRet(self, function, instance)
- def wrap_ret(self, function, instance):
if function.name in ("glXGetProcAddress", "glXGetProcAddressARB"):
print ' %s = __unwrap_proc_addr(procName, %s);' % (instance, instance)
print '#endif'
print '#include <dlfcn.h>'
print
- print '#include "trace_write.hpp"'
+ print '#include "trace_writer_local.hpp"'
+ print
+ print '// To validate our prototypes'
+ print '#define GL_GLEXT_PROTOTYPES'
+ print '#define GLX_GLXEXT_PROTOTYPES'
print
print '#include "glproc.hpp"'
print '#include "glsize.hpp"'
print
api = API()
- api.add_api(glxapi)
- api.add_api(glapi)
+ api.addApi(glxapi)
+ api.addApi(glapi)
tracer = GlxTracer()
tracer.trace_api(api)
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::log("apitrace: warning: unknown function \\"%s\\"\\n", (const char *)procName);'
print ' return procPtr;'
print '}'
print
print r'''
-static void *libgl_handle = NULL;
-
-
/*
* Invoke the true dlopen() function.
*/
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;
}
}
* we need to intercept the dlopen() call here, and redirect to our wrapper
* shared object.
*/
-extern "C" void *
-dlopen(const char *filename, int flag)
+extern "C" PUBLIC
+void * dlopen(const char *filename, int flag)
{
void *handle;
handle = __dlopen(filename, flag);
- if (filename && handle) {
+ const char * libgl_filename = getenv("TRACE_LIBGL");
+
+ 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
if (strcmp(filename, "libGL.so") == 0 ||
strcmp(filename, "libGL.so.1") == 0) {
+
// Use the true libGL.so handle instead of RTLD_NEXT from now on
- libgl_handle = 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::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");
}
}
}
}
-/*
- * Lookup a libGL symbol
- */
-static void * __dlsym(const char *symbol)
-{
- void *result;
-
- if (!libgl_handle) {
- /*
- * Try to use whatever libGL.so the library is linked against.
- */
- result = dlsym(RTLD_NEXT, symbol);
- if (result) {
- libgl_handle = RTLD_NEXT;
- return result;
- }
-
- /*
- * The app doesn't directly link against libGL.so, nor does it directly
- * dlopen it. So we have to load it ourselves.
- */
- libgl_handle = __dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL);
- if (!libgl_handle) {
- OS::DebugMessage("error: couldn't find libGL.so\n");
- return NULL;
- }
- }
-
- return dlsym(libgl_handle, symbol);
-}
-
'''