From: Zack Rusin Date: Thu, 25 Aug 2011 20:54:26 +0000 (-0400) Subject: Merge branch 'compression' X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=07348d58030f889a4ec11bfcef9a32628e55afa4;hp=af17c80a3ad1e77afd6bc19a0828a66b824ff8bb;p=apitrace Merge branch 'compression' --- diff --git a/TODO.markdown b/TODO.markdown index f0e0d8e..fb44766 100644 --- a/TODO.markdown +++ b/TODO.markdown @@ -29,9 +29,6 @@ Tracing * Add option to include call stack frames in the trace -* Call gzflush() only when there is a signal/exception, except of doing it on - every call. - Retracing --------- diff --git a/glcaps.cpp b/glcaps.cpp index 51a5954..2a6993e 100644 --- a/glcaps.cpp +++ b/glcaps.cpp @@ -24,12 +24,21 @@ **************************************************************************/ +/* + * Manipulation of GL extensions. + * + * So far we insert GREMEDY extensions, but in the future we could also clamp + * the GL extensions to core GL versions here. + */ + + #include #include #include #include +#include "glproc.hpp" #include "gltrace.hpp" @@ -43,18 +52,21 @@ static ExtensionsMap extensionsMap; // Additional extensions to be advertised -const char extra_extensions[] = - "GL_GREMEDY_string_marker " - "GL_GREMEDY_frame_terminator " -; +static const char *extra_extensions[] = { + "GL_GREMEDY_string_marker", + "GL_GREMEDY_frame_terminator", +}; +#define NUM_EXTRA_EXTENSIONS (sizeof(extra_extensions)/sizeof(extra_extensions[0])) /** * Translate the GL extensions string, adding new extensions. */ -const char * -translateExtensionsString(const char *extensions) +static const char * +overrideExtensionsString(const char *extensions) { + int i; + ExtensionsMap::const_iterator it = extensionsMap.find(extensions); if (it != extensionsMap.end()) { return it->second; @@ -62,7 +74,14 @@ translateExtensionsString(const char *extensions) size_t extensions_len = strlen(extensions); - char *new_extensions = (char *)malloc(extensions_len + 1 + sizeof extra_extensions); + size_t extra_extensions_len = 0; + for (i = 0; i < NUM_EXTRA_EXTENSIONS; ++i) { + const char * extra_extension = extra_extensions[i]; + size_t extra_extension_len = strlen(extra_extension); + extra_extensions_len += extra_extension_len + 1; + } + + char *new_extensions = (char *)malloc(extensions_len + 1 + extra_extensions_len); if (!new_extensions) { return extensions; } @@ -76,7 +95,14 @@ translateExtensionsString(const char *extensions) } } - memcpy(new_extensions + extensions_len, extra_extensions, sizeof extra_extensions); + for (i = 0; i < NUM_EXTRA_EXTENSIONS; ++i) { + const char * extra_extension = extra_extensions[i]; + size_t extra_extension_len = strlen(extra_extension); + memcpy(new_extensions + extensions_len, extra_extension, extra_extension_len); + extensions_len += extra_extension_len; + new_extensions[extensions_len++] = ' '; + } + new_extensions[extensions_len] = '\0'; extensionsMap[extensions] = new_extensions; @@ -84,5 +110,62 @@ translateExtensionsString(const char *extensions) } +const GLubyte * +__glGetString_override(GLenum name) +{ + const GLubyte *result = __glGetString(name); + + if (result) { + switch (name) { + case GL_EXTENSIONS: + result = (const GLubyte *)overrideExtensionsString((const char *)result); + break; + default: + break; + } + } + + return result; +} + + +void +__glGetIntegerv_override(GLenum pname, GLint *params) +{ + __glGetIntegerv(pname, params); + + if (params) { + switch (pname) { + case GL_NUM_EXTENSIONS: + *params += NUM_EXTRA_EXTENSIONS; + break; + default: + break; + } + } +} + + +const GLubyte * +__glGetStringi_override(GLenum name, GLuint index) +{ + switch (name) { + case GL_EXTENSIONS: + { + GLint num_extensions = 0; + __glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); + if (num_extensions <= index && index < num_extensions + NUM_EXTRA_EXTENSIONS) { + return (const GLubyte *)extra_extensions[index - num_extensions]; + } + } + break; + default: + break; + } + + return __glGetStringi(name, index); +} + + } /* namespace gltrace */ diff --git a/glproc.py b/glproc.py index 16b5d18..7c7beb9 100644 --- a/glproc.py +++ b/glproc.py @@ -421,6 +421,7 @@ class GlDispatcher(Dispatcher): print '# endif' print '#else /* !RETRACE */' print '# ifdef _WIN32' + print ' PROC __getPublicProcAddress(LPCSTR lpProcName);' print '# define __getPrivateProcAddress(name) __wglGetProcAddress(name)' print ' static inline PROC __stdcall __wglGetProcAddress(const char * lpszProc);' print '# else' diff --git a/gltrace.hpp b/gltrace.hpp index 5675c06..53c8039 100644 --- a/gltrace.hpp +++ b/gltrace.hpp @@ -33,14 +33,14 @@ namespace gltrace { -const char * -translateExtensionsString(const char *extensions); +const GLubyte * +__glGetString_override(GLenum name); +void +__glGetIntegerv_override(GLenum pname, GLint *params); -inline const GLubyte * -translateExtensionsString(const GLubyte *extensions) { - return (const GLubyte *)translateExtensionsString((const char *)extensions); -} +const GLubyte * +__glGetStringi_override(GLenum name, GLuint index); } /* namespace gltrace */ diff --git a/gltrace.py b/gltrace.py index 9224bbe..f935e29 100644 --- a/gltrace.py +++ b/gltrace.py @@ -520,6 +520,11 @@ class GlTracer(Tracer): print ' }' return + # Override GL extensions + if function.name in ('glGetString', 'glGetIntegerv', 'glGetStringi'): + Tracer.dispatch_function(self, function, prefix = 'gltrace::__', suffix = '_override') + return + Tracer.dispatch_function(self, function) def emit_memcpy(self, dest, src, length): @@ -547,16 +552,6 @@ class GlTracer(Tracer): def wrap_ret(self, function, instance): Tracer.wrap_ret(self, function, instance) - if function.name == 'glGetString': - print ' if (__result) {' - print ' switch (name) {' - print ' case GL_EXTENSIONS:' - print ' __result = gltrace::translateExtensionsString(__result);' - print ' break;' - print ' default:' - print ' break;' - print ' }' - print ' }' if function.name in ('glMapBuffer', 'glMapBufferARB'): print ' struct buffer_mapping *mapping = get_buffer_mapping(target);' diff --git a/trace.py b/trace.py index 7e40e46..626f2dd 100644 --- a/trace.py +++ b/trace.py @@ -324,9 +324,6 @@ class Tracer: print 'static const Trace::FunctionSig __%s_sig = {%u, "%s", %u, __%s_args};' % (function.name, int(function.id), function.name, len(function.args), function.name) print - def get_dispatch_function(self, function): - return '__' + function.name - def is_public_function(self, function): return True @@ -362,12 +359,12 @@ class Tracer: self.dump_ret(function, "__result") print ' Trace::localWriter.endLeave();' - def dispatch_function(self, function): + def dispatch_function(self, function, prefix='__', suffix=''): if function.type is stdapi.Void: result = '' else: result = '__result = ' - dispatch = self.get_dispatch_function(function) + dispatch = prefix + function.name + suffix print ' %s%s(%s);' % (result, dispatch, ', '.join([str(arg.name) for arg in function.args])) def dump_arg(self, function, arg): diff --git a/wgltrace.py b/wgltrace.py index d1b6ccf..17d1acc 100644 --- a/wgltrace.py +++ b/wgltrace.py @@ -72,7 +72,7 @@ if __name__ == '__main__': print ''' static HINSTANCE g_hDll = NULL; -static PROC +PROC __getPublicProcAddress(LPCSTR lpProcName) { if (!g_hDll) {