X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glcaps.cpp;h=f6f70f32c03236c9a6b6a699b8ee6fa48b659e15;hb=2672a7dbb0e0acd666abfd2498bb19aeca41fe09;hp=2a6993e77be1230f61d821f9bbcde304d390847f;hpb=07348d58030f889a4ec11bfcef9a32628e55afa4;p=apitrace diff --git a/glcaps.cpp b/glcaps.cpp index 2a6993e..f6f70f3 100644 --- a/glcaps.cpp +++ b/glcaps.cpp @@ -32,6 +32,7 @@ */ +#include #include #include @@ -52,11 +53,55 @@ static ExtensionsMap extensionsMap; // Additional extensions to be advertised -static const char *extra_extensions[] = { +static const char * +extraExtension_stringsFull[] = { "GL_GREMEDY_string_marker", "GL_GREMEDY_frame_terminator", }; -#define NUM_EXTRA_EXTENSIONS (sizeof(extra_extensions)/sizeof(extra_extensions[0])) + +static const char * +extraExtension_stringsES[] = { + "GL_EXT_debug_marker", +}; + +// Description of additional extensions we want to advertise +struct ExtensionsDesc +{ + unsigned numStrings; + const char **strings; +}; + +#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) + +const struct ExtensionsDesc +extraExtensionsFull = { + ARRAY_SIZE(extraExtension_stringsFull), + extraExtension_stringsFull +}; + +const struct ExtensionsDesc +extraExtensionsES = { + ARRAY_SIZE(extraExtension_stringsES), + extraExtension_stringsES +}; + + +const struct ExtensionsDesc * +getExtraExtensions(void) +{ + Context *ctx = getContext(); + + switch (ctx->profile) { + case PROFILE_COMPAT: + return &extraExtensionsFull; + case PROFILE_ES1: + case PROFILE_ES2: + return &extraExtensionsES; + default: + assert(0); + return &extraExtensionsFull; + } +} /** @@ -65,48 +110,54 @@ static const char *extra_extensions[] = { static const char * overrideExtensionsString(const char *extensions) { - int i; + const ExtensionsDesc *desc = getExtraExtensions(); + size_t i; ExtensionsMap::const_iterator it = extensionsMap.find(extensions); if (it != extensionsMap.end()) { return it->second; } - size_t extensions_len = strlen(extensions); + size_t extensionsLen = strlen(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; + size_t extraExtensionsLen = 0; + for (i = 0; i < desc->numStrings; ++i) { + const char * extraExtension = desc->strings[i]; + size_t extraExtensionLen = strlen(extraExtension); + extraExtensionsLen += extraExtensionLen + 1; } - char *new_extensions = (char *)malloc(extensions_len + 1 + extra_extensions_len); - if (!new_extensions) { + // 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 newExtensionsLen = extensionsLen + 1 + extraExtensionsLen + 1; + char *newExtensions = (char *)malloc(newExtensionsLen); + if (!newExtensions) { return extensions; } - if (extensions_len) { - memcpy(new_extensions, extensions, extensions_len); + if (extensionsLen) { + memcpy(newExtensions, extensions, extensionsLen); // Add space separator if necessary - if (new_extensions[extensions_len - 1] != ' ') { - new_extensions[extensions_len++] = ' '; + if (newExtensions[extensionsLen - 1] != ' ') { + newExtensions[extensionsLen++] = ' '; } } - 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++] = ' '; + for (i = 0; i < desc->numStrings; ++i) { + const char * extraExtension = desc->strings[i]; + size_t extraExtensionLen = strlen(extraExtension); + memcpy(newExtensions + extensionsLen, extraExtension, extraExtensionLen); + extensionsLen += extraExtensionLen; + newExtensions[extensionsLen++] = ' '; } - new_extensions[extensions_len] = '\0'; + newExtensions[extensionsLen++] = '\0'; + assert(extensionsLen <= newExtensionsLen); - extensionsMap[extensions] = new_extensions; + extensionsMap[extensions] = newExtensions; - return new_extensions; + return newExtensions; } @@ -137,7 +188,10 @@ __glGetIntegerv_override(GLenum pname, GLint *params) if (params) { switch (pname) { case GL_NUM_EXTENSIONS: - *params += NUM_EXTRA_EXTENSIONS; + { + const ExtensionsDesc *desc = getExtraExtensions(); + *params += desc->numStrings; + } break; default: break; @@ -152,10 +206,11 @@ __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]; + const ExtensionsDesc *desc = getExtraExtensions(); + GLint numExtensions = 0; + __glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); + if ((GLuint)numExtensions <= index && index < (GLuint)numExtensions + desc->numStrings) { + return (const GLubyte *)desc->strings[index - (GLuint)numExtensions]; } } break;