summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Piñeiro <apinheiro@igalia.com>2018-07-19 13:55:58 +0200
committerAlejandro Piñeiro <apinheiro@igalia.com>2018-08-21 11:34:45 +0200
commit606e40b2659ad7fc4ae8e08d1fb5725b7eb86693 (patch)
tree2aaffa298e819e7426b924211ef25e115ca181b3
parent9e30fb9e9ae15abbb6f516941ffcecafbe7ff4fd (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.txt1
-rw-r--r--tests/util/piglit-shader-test.c156
-rw-r--r--tests/util/piglit-shader-test.h43
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__ */