]> git.cworth.org Git - apitrace/blobdiff - retrace/glws.cpp
common: Add more comments.
[apitrace] / retrace / glws.cpp
index 4e07ede9d227a856e0bffe091300906638771604..f89f980c5f8094928f0a5d8db391d78db792508b 100644 (file)
@@ -24,6 +24,9 @@
  **************************************************************************/
 
 
+#include <assert.h>
+
+#include "glproc.hpp"
 #include "glws.hpp"
 
 
@@ -33,26 +36,68 @@ namespace glws {
 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<const char *>(glGetStringi(GL_EXTENSIONS, i));
+                if (extension) {
+                    extensions.insert(extension);
+                }
+            }
+        } else {
+            // Use glGetString
+            const char *begin = reinterpret_cast<const char *>(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();
 }