diff options
-rw-r--r-- | tests/util/piglit-util-gl-common.c | 52 | ||||
-rw-r--r-- | tests/util/piglit-util.c | 15 | ||||
-rw-r--r-- | 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 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); |