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
