summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/util/piglit-util-gl-common.c52
-rw-r--r--tests/util/piglit-util.c15
-rw-r--r--tests/util/piglit-util.h12
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 03d74201c..8bf9c9480 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 891ae22aa..411d69c7f 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 10f395a90..30ab78c6e 100644
--- a/tests/util/piglit-util.h
+++ b/tests/util/piglit-util.h
@@ -119,6 +119,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);