X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=glcaps.cpp;h=2f16b63c172febde9021a7ad1f7e3b26f41d981c;hb=e64ba4980c20ba52f6b3a88bc817623052e6d0a8;hp=51a59545754047aecb15b12fb5035637736844f0;hpb=1b3d3752685cd15531c45e190c8ed55d31271127;p=apitrace diff --git a/glcaps.cpp b/glcaps.cpp index 51a5954..2f16b63 100644 --- a/glcaps.cpp +++ b/glcaps.cpp @@ -24,12 +24,22 @@ **************************************************************************/ +/* + * 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 +#include "glproc.hpp" #include "gltrace.hpp" @@ -43,18 +53,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) { + size_t i; + ExtensionsMap::const_iterator it = extensionsMap.find(extensions); if (it != extensionsMap.end()) { return it->second; @@ -62,7 +75,18 @@ 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; + } + + // We use malloc memory instead of a std::string because we need to ensure + // that extensions strings will not move in memory as the extensionsMap is + // updated. + size_t new_extensions_len = extensions_len + 1 + extra_extensions_len + 1; + char *new_extensions = (char *)malloc(new_extensions_len); if (!new_extensions) { return extensions; } @@ -76,7 +100,15 @@ 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'; + assert(extensions_len <= new_extensions_len); extensionsMap[extensions] = new_extensions; @@ -84,5 +116,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 ((GLuint)num_extensions <= index && index < (GLuint)num_extensions + NUM_EXTRA_EXTENSIONS) { + return (const GLubyte *)extra_extensions[index - (GLuint)num_extensions]; + } + } + break; + default: + break; + } + + return __glGetStringi(name, index); +} + + } /* namespace gltrace */