This better matches the interface of glGetStringi, which should be used
for GL >= 3.0.

Signed-off-by: Jordan Justen <[email protected]>
---
 tests/util/piglit-util-gl-common.c |   55 ++++++++++++++++++++++++++++++++----
 tests/util/piglit-util.c           |   15 ++++++++++
 tests/util/piglit-util.h           |   12 ++++++++
 3 files changed, 77 insertions(+), 5 deletions(-)

diff --git a/tests/util/piglit-util-gl-common.c 
b/tests/util/piglit-util-gl-common.c
index b319197..f30a2fe 100644
--- a/tests/util/piglit-util-gl-common.c
+++ b/tests/util/piglit-util-gl-common.c
@@ -32,7 +32,7 @@
  * between glBegin and glEnd, and to avoid the inefficiency of
  * redundant glGetString queries.
  */
-static const char *gl_extensions = NULL;
+static const char **gl_extensions = NULL;
 
 bool piglit_is_gles()
 {
@@ -62,13 +62,58 @@ int piglit_get_gl_version()
        return 10*major+minor;
 }
 
-bool piglit_is_extension_supported(const char *name)
+static const char** split_string(const char *string)
 {
-       if (gl_extensions == NULL) {
-               gl_extensions = (const char *) glGetString(GL_EXTENSIONS);
+       char *split;
+       char **strings;
+       int offset, length, words, max_words;
+       bool was_in_word, in_word;
+
+       length = strlen(string);
+       max_words = length / 2;
+       strings = malloc ((sizeof(char*) * (max_words + 1)) +
+                         (sizeof(char) * (length + 1)));
+       split = (char*) &strings[max_words + 1];
+       assert (strings != NULL);
+
+       for (words = 0, was_in_word = false, offset = 0;
+            offset < length;
+            offset++) {
+               char c = string[offset];
+               in_word = (c != 0) && !isspace(c);
+               if (!in_word) {
+                       split[offset] = 0;
+               } else {
+                       split[offset] = c;
+                       if (!was_in_word) {
+                               strings[words] = &split[offset];
+                               words++;
+                       }
+               }
+               was_in_word = in_word;
        }
 
-       return piglit_is_extension_in_string(gl_extensions, name);
+       strings[words] = NULL;
+
+       return (const char**) strings;
+}
+
+static void initialize_piglit_extension_support(void)
+{
+       const char *gl_extensions_string;
+
+       if (gl_extensions != NULL) {
+               return;
+       }
+
+       gl_extensions_string = (const char *) glGetString(GL_EXTENSIONS);
+       gl_extensions = split_string(gl_extensions_string);
+}
+
+bool piglit_is_extension_supported(const char *name)
+{
+       initialize_piglit_extension_support();
+       return piglit_is_extension_in_array(gl_extensions, name);
 }
 
 void piglit_require_gl_version(int required_version_times_10)
diff --git a/tests/util/piglit-util.c b/tests/util/piglit-util.c
index 891ae22..411d69c 100644
--- a/tests/util/piglit-util.c
+++ b/tests/util/piglit-util.c
@@ -101,6 +101,21 @@ int asprintf(char **strp, const char *fmt, ...)
 
 #endif /* _WIN32 */
 
+bool piglit_is_extension_in_array(const char **haystack, const char *needle)
+{
+       if (needle[0] == 0)
+               return false;
+
+       while (*haystack != NULL) {
+               if (strcmp(*haystack, needle) == 0) {
+                       return true;
+               }
+               haystack++;
+       }
+
+       return false;
+}
+
 bool piglit_is_extension_in_string(const char *haystack, const char *needle)
 {
        const unsigned needle_len = strlen(needle);
diff --git a/tests/util/piglit-util.h b/tests/util/piglit-util.h
index 269a590..a66cb03 100644
--- a/tests/util/piglit-util.h
+++ b/tests/util/piglit-util.h
@@ -114,6 +114,18 @@ enum piglit_result {
  */
 bool piglit_is_extension_in_string(const char *haystack, const char *needle);
 
+/**
+ * Determine if an extension is listed in an extension string array
+ *
+ * \param haystack   Array of all extensions to be searched
+ * \param needle     Extension whose presens is to be detected
+ *
+ * \precondition \c haystack is not null
+ *
+ * \sa piglit_is_extension_supported, piglit_is_glx_extension_supported
+ */
+bool piglit_is_extension_in_array(const char **haystack, const char *needle);
+
 int FindLine(const char *program, int position);
 void piglit_merge_result(enum piglit_result *all, enum piglit_result subtest);
 void piglit_report_result(enum piglit_result result);
-- 
1.7.9.5

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to