X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fglws.cpp;h=f89f980c5f8094928f0a5d8db391d78db792508b;hb=646cb5061d6d7383fe8857facd3bd1a8723e5fc4;hp=c5c41ebdecb53cbb786361c158828f57ceb729f8;hpb=9d27a54b0381610c30964880a5fdd4c27bb6e732;p=apitrace diff --git a/retrace/glws.cpp b/retrace/glws.cpp index c5c41eb..f89f980 100644 --- a/retrace/glws.cpp +++ b/retrace/glws.cpp @@ -24,38 +24,80 @@ **************************************************************************/ +#include + +#include "glproc.hpp" #include "glws.hpp" namespace glws { -bool debug = true; - - bool checkExtension(const char *extName, const char *extString) { - const char *p = extString; - const char *q = extName; - char c; - do { - c = *p++; - if (c == '\0' || c == ' ') { - if (q && *q == '\0') { - return true; - } else { - q = extName; - } - } else { - if (q && *q == c) { - ++q; - } else { - q = 0; - } - } - } while (c); - return false; + assert(extName); + assert(extString); + + const char *p = extString; + const char *q = extName; + char c; + do { + c = *p++; + if (c == '\0' || c == ' ') { + if (q && *q == '\0') { + return true; + } else { + q = extName; + } + } else { + if (q && *q == c) { + ++q; + } else { + q = 0; + } + } + } while (c); + return false; +} + + +bool +Context::hasExtension(const char *string) { + if (extensions.empty()) { + if (profile == PROFILE_CORE) { + // Use glGetStringi + GLint num_extensions = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); + for (int i = 0; i < num_extensions; ++i) { + const char *extension = reinterpret_cast(glGetStringi(GL_EXTENSIONS, i)); + if (extension) { + extensions.insert(extension); + } + } + } else { + // Use glGetString + const char *begin = reinterpret_cast(glGetString(GL_EXTENSIONS)); + do { + const char *end = begin; + char c = *end; + while (c != '\0' && c != ' ') { + ++end; + c = *end; + } + if (end != begin) { + extensions.insert(std::string(begin, end)); + } + + if (c == '\0') { + break; + } + begin = end + 1; + } while(1); + } + } + + return extensions.find(string) != extensions.end(); }