From: José Fonseca Date: Thu, 25 Aug 2011 12:26:43 +0000 (+0100) Subject: Advertise GREMEDY extensions through glStringi too. X-Git-Tag: 2.0_alpha^2~717 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a08d27569fa627fde3b20763624104dd83b06c99;p=tools%2Fapitrace.git Advertise GREMEDY extensions through glStringi too. The preferred method to get extensions on newer GL versions. --- 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/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):