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 |   52 +++++++++++++++++++++++++++++-------
 tests/util/piglit-util.c           |   15 +++++++++++
 tests/util/piglit-util.h           |   12 +++++++++
 3 files changed, 70 insertions(+), 9 deletions(-)

diff --git a/tests/util/piglit-util-gl-common.c 
b/tests/util/piglit-util-gl-common.c
index b319197..caa3cce 100644
--- a/tests/util/piglit-util-gl-common.c
+++ b/tests/util/piglit-util-gl-common.c
@@ -26,13 +26,13 @@
 
 
 /**
- * The GL extension string returned by glGetString(GL_EXTENSIONS).
+ * An array of pointers to extension strings.
  *
- * We cache this here because calling glGetString is prohibited
- * between glBegin and glEnd, and to avoid the inefficiency of
- * redundant glGetString queries.
+ * Each extension is pointed to by a separate entry in the array.
+ *
+ * The end of the array is indicated by a NULL pointer.
  */
-static const char *gl_extensions = NULL;
+static const char **gl_extensions = NULL;
 
 bool piglit_is_gles()
 {
@@ -62,13 +62,47 @@ 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)
+{
+       char **strings, *string_copy;
+       int i, length, max_words;
+
+       length = strlen(string);
+       max_words = length / 2;
+       strings = malloc ((sizeof(char*) * (max_words + 1)) +
+                         (sizeof(char) * (length + 1)));
+       assert (strings != NULL);
+
+       string_copy = (char*) &strings[max_words + 1];
+       strcpy(string_copy, string);
+
+       strings[0] = strtok(string_copy, " ");
+       for (i = 0; strings[i] != NULL; ++i)
+               strings[i + 1] = strtok(NULL, " ");
+
+       return (const char**) strings;
+}
+
+static const char** gl_extension_array_from_getstring()
+{
+       const char *gl_extensions_string;
+       gl_extensions_string = (const char *) glGetString(GL_EXTENSIONS);
+       return split_string(gl_extensions_string);
+}
+
+static void initialize_piglit_extension_support(void)
 {
-       if (gl_extensions == NULL) {
-               gl_extensions = (const char *) glGetString(GL_EXTENSIONS);
+       if (gl_extensions != NULL) {
+               return;
        }
 
-       return piglit_is_extension_in_string(gl_extensions, name);
+       gl_extensions = gl_extension_array_from_getstring();
+}
+
+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