diff options
author | Alejandro Piñeiro <apinheiro@igalia.com> | 2018-07-19 13:55:58 +0200 |
---|---|---|
committer | Alejandro Piñeiro <apinheiro@igalia.com> | 2018-08-21 11:34:45 +0200 |
commit | 606e40b2659ad7fc4ae8e08d1fb5725b7eb86693 (patch) | |
tree | 2aaffa298e819e7426b924211ef25e115ca181b3 | |
parent | 9e30fb9e9ae15abbb6f516941ffcecafbe7ff4fd (diff) |
util: Add utilities to handle shader_test files
This method would allow to use source files in the common shader_test
format by tests that are not the shader_runner.
This is useful if we want to implement a custom test based on the info
at shader_test, but without adding that custom support to
shader_runner. And it is specially useful for custom tests that we
want to test on GLSL and SPIR-V.
It is worth to note that although the method loads "shader_test"
files, for those custom tests make more sense to call them
"shader_source" files, as for those, the file would work as just the
source.
v2: fix memory leak (Antia Puentes)
Acked-by: Timothy Arceri <tarceri@itsqueeze.com>
-rw-r--r-- | tests/util/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/util/piglit-shader-test.c | 156 | ||||
-rw-r--r-- | tests/util/piglit-shader-test.h | 43 |
3 files changed, 200 insertions, 0 deletions
diff --git a/tests/util/CMakeLists.txt b/tests/util/CMakeLists.txt index e083761d1..a5f080156 100644 --- a/tests/util/CMakeLists.txt +++ b/tests/util/CMakeLists.txt @@ -59,6 +59,7 @@ set(UTIL_GL_SOURCES piglit-framework-gl.c piglit-framework-gl/piglit_gl_framework.c piglit-shader.c + piglit-shader-test.c piglit_ktx.c rgb9e5.c r11g11b10f.c diff --git a/tests/util/piglit-shader-test.c b/tests/util/piglit-shader-test.c new file mode 100644 index 000000000..6aeb5a521 --- /dev/null +++ b/tests/util/piglit-shader-test.c @@ -0,0 +1,156 @@ +/* + * Copyright © 2018 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "piglit-shader-test.h" + +#include <ctype.h> + +/* FIXME: C&P from parse_utils, that is local to shader_runner. At + * this point it is not worth to move all parse_utils to a common + * library. Perhaps in the future if we start to use all the utils + */ +bool +parse_whitespace(const char *s, const char **rest) +{ + const char *end = s; + for (; *end && *end != '\n' && isspace(*end); end++); + + if (rest) + *rest = end; + + return end != s; +} + +/* FIXME: C&P from parse_utils, that is local to shader_runner. At + * this point it is not worth to move all parse_utils to a common + * library. Perhaps in the future if we start to use all the utils + */ +bool +parse_str(const char *s, const char *lit, const char **rest) +{ + const char *t; + parse_whitespace(s, &t); + const bool ret = strncmp(t, lit, strlen(lit)) == 0; + + if (rest) + *rest = (ret ? t + strlen(lit) : s); + + return ret; +} + +static void +group_name_for_stage(GLenum shader_type, + bool spirv, + char *group_name) +{ + char *stage_name; + + switch(shader_type) { + case GL_VERTEX_SHADER: + stage_name = "vertex"; + break; + case GL_FRAGMENT_SHADER: + stage_name = "fragment"; + break; + case GL_TESS_CONTROL_SHADER: + stage_name = "tessellation control"; + break; + case GL_TESS_EVALUATION_SHADER: + stage_name = "tessellation evaluation"; + break; + case GL_GEOMETRY_SHADER: + stage_name = "geometry"; + break; + case GL_COMPUTE_SHADER: + stage_name = "compute"; + break; + default: stage_name = "error"; + } + + if (!spirv) + sprintf(group_name, "[%s shader]", stage_name); + else + sprintf(group_name, "[%s shader spirv]", stage_name); +} + +bool +piglit_load_source_from_shader_test(const char *filename, + GLenum shader_type, + bool spirv, + char **output_source, + unsigned *output_source_size) +{ + char group_name[4096]; + char *source = NULL; + unsigned text_size; + char *line = NULL; + char *first_line = NULL; + + group_name_for_stage(shader_type, spirv, group_name); + + char *text = piglit_load_text_file(filename, &text_size); + line = text; + + if (line == NULL) { + fprintf(stderr, "Could not read file \"%s\"\n", filename); + return false; + } + + while (line[0] != '\0') { + if (line[0] == '[' && first_line != NULL) { + break; + } + + if (line[0] == '[' && first_line == NULL) { + if (parse_str(line, group_name, NULL)) { + first_line = strchrnul(line, '\n'); + if (first_line[0] != '\0') + first_line++; + } + } + + line = strchrnul(line, '\n'); + if (line[0] != '\0') + line++; + } + + if (first_line == NULL) { + fprintf(stderr, "Could not find groupname \"%s\" on file \"%s\"\n", + group_name, filename); + return false; + } + + text_size = line - first_line + 1; + source = malloc(sizeof(char*) * text_size); + snprintf(source, line - first_line + 1, "%s", first_line); + + if (output_source) + *output_source = source; + + if (output_source_size) + *output_source_size = text_size; + + free(text); + + return true; +} diff --git a/tests/util/piglit-shader-test.h b/tests/util/piglit-shader-test.h new file mode 100644 index 000000000..d9f6991cb --- /dev/null +++ b/tests/util/piglit-shader-test.h @@ -0,0 +1,43 @@ +/* + * Copyright © 2018 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __PIGLIT_SHADER_TEST_H__ +#define __PIGLIT_SHADER_TEST_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <piglit-util-gl.h> + +bool piglit_load_source_from_shader_test(const char *filename, + GLenum shader_type, + bool spirv, + char **output_source, + unsigned *output_source_size); + +#ifdef __cplusplus +} /* end extern "C" */ +#endif + +#endif /* __PIGLIT_SHADER_TEST_H__ */ |