From: Neil Roberts <nrobe...@igalia.com> This adds a new new command line option "-spirv". If no SPIRV line is found in the require section and "-spirv" is passed to the command line, then it will try to load a replacement script by appending .spv to the name of the file.
In that way, now "SPIRV YES" meaning changes slightly, from "Use by default the SPIR-V on this shader test" to "We have a SPIR-V on this shader, by default use it without looking for a external replacement file". We also added a "SPIRV NO" line that points that the shader is not compatible with SPIR-V, so would be skipped even using -spirv. "-spirv" is the counter-part command line option to "-glsl". The new "-spirv" option is used to try to run tests on SPIR-V mode even if they doesn't have a SPIR-V included, while "-glsl" is for tests that even having SPIR-V included, we want them to run on GLSL mode. Obviously it is a mistake to use "-spirv" and "-glsl" at the same time. v2: update on the code and commit message due the addition of the "-glsl" command line option, plus command line options Signed-off-by: Neil Roberts <nrobe...@igalia.com> Signed-off-by: Alejandro Piñeiro <apinhe...@igalia.com> --- tests/shaders/shader_runner.c | 79 +++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c index c53980b20..927926a35 100644 --- a/tests/shaders/shader_runner.c +++ b/tests/shaders/shader_runner.c @@ -57,12 +57,17 @@ PIGLIT_GL_TEST_CONFIG_BEGIN config.window_visual = PIGLIT_GL_VISUAL_RGBA | PIGLIT_GL_VISUAL_DOUBLE; config.khr_no_error_support = PIGLIT_NO_ERRORS; - /* By default SPIR-V mode is false. It will not be enabled - * unless the script includes SPIRV YES or SPIRV ONLY lines at - * [require] section, so it will be handled later. - */ if (argc > 1) { - get_required_config(argv[1], spirv_replaces_glsl, &config); + bool spirv = spirv_replaces_glsl; + + for (int i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "-spirv")) { + spirv = true; + break; + } + } + + get_required_config(argv[1], spirv, &config); } else { config.supports_gl_compat_version = 10; } @@ -180,6 +185,7 @@ static bool glsl_in_use = false; static bool force_glsl = false; static bool spirv_in_use = false; static bool force_no_names = false; +static bool test_contains_spirv = false; static GLchar *prog_err_info = NULL; static GLuint vao = 0; static GLuint draw_fbo, read_fbo; @@ -1220,15 +1226,21 @@ process_requirement(const char *line) spirv_replaces_glsl = !force_glsl; if (parse_str(line, "ONLY", NULL)) { + spirv_replaces_glsl = true; + test_contains_spirv = true; + if (force_glsl) { printf("This shader is not compatible with GLSL\n"); return PIGLIT_SKIP; } } else if (parse_str(line, "YES", NULL)) { - /* Empty. Everything already set. Just parsing - * correct options - */ - } else { + test_contains_spirv = true; + } else if (parse_str(line, "NO", &line)) { + if (spirv_replaces_glsl) { + printf("This shader is not compatible with SPIR-V\n"); + return PIGLIT_SKIP; + } + } else { printf("Unknown SPIRV line in [require]\n"); return PIGLIT_FAIL; } @@ -1651,6 +1663,26 @@ process_specialization(enum states state, const char *line) return PIGLIT_FAIL; } +static char * +spirv_replacement_script(const char *script_name) +{ + int len = strlen(script_name); + char *buf = malloc(len + 5); + memcpy(buf, script_name, len); + strcpy(buf + len, ".spv"); + + if (piglit_is_file_older_than(buf, script_name)) { + printf("SPIR-V shader_test %s is older than " + "corresponding GLSL shader_test" + "or does not exist.\n", + buf); + free(buf); + return NULL; + } + + return buf; +} + static enum piglit_result process_elements(enum states state, const char *line) { @@ -1704,6 +1736,19 @@ process_test_script(const char *script_name) while (line[0] != '\0') { if (line[0] == '[') { + if (state == requirements && + spirv_replaces_glsl && + !test_contains_spirv) { + free(text); + char *replacement = + spirv_replacement_script(script_name); + if (replacement == NULL) + return PIGLIT_FAIL; + enum piglit_result res = + process_test_script(replacement); + free(replacement); + return res; + } result = leave_state(state, line, script_name); if (result != PIGLIT_PASS) return result; @@ -1873,6 +1918,7 @@ struct requirement_parse_results { bool found_glsl; bool found_size; bool found_depthbuffer; + bool found_spirv; struct component_version gl_version; struct component_version glsl_version; unsigned size[2]; @@ -1891,6 +1937,7 @@ parse_required_config(struct requirement_parse_results *results, results->found_glsl = false; results->found_size = false; results->found_depthbuffer = false; + results->found_spirv = false; if (line == NULL) { printf("could not read file \"%s\"\n", script_name); @@ -1940,9 +1987,14 @@ parse_required_config(struct requirement_parse_results *results, parse_uints(line, results->size, 2, NULL); } else if (parse_str(line, "depthbuffer", NULL)) { results->found_depthbuffer = true; + } else if (parse_str(line, "SPIRV", &line)) { + if (parse_str(line, "ONLY", NULL) || parse_str(line, "YES", NULL)) { + results->found_spirv = true; + } } } + line = strchrnul(line, '\n'); if (line[0] != '\0') line++; @@ -2000,7 +2052,7 @@ choose_required_gl_version(struct requirement_parse_results *parse_results, * the GL and GLSL version requirements. Use these to guide context creation. */ static void -get_required_config(const char *script_name, bool spirv, +get_required_config(const char *script_name, bool force_spirv, struct piglit_gl_test_config *config) { struct requirement_parse_results parse_results; @@ -2009,7 +2061,7 @@ get_required_config(const char *script_name, bool spirv, parse_required_config(&parse_results, script_name); choose_required_gl_version(&parse_results, &required_gl_version); - if (spirv) { + if (force_spirv || parse_results.found_spirv) { required_gl_version.es = false; required_gl_version.core = true; required_gl_version.num = MAX2(required_gl_version.num, 33); @@ -5876,8 +5928,8 @@ piglit_init(int argc, char **argv) report_subtests = piglit_strip_arg(&argc, argv, "-report-subtests"); force_glsl = piglit_strip_arg(&argc, argv, "-glsl"); - force_no_names = piglit_strip_arg(&argc, argv, "-force-no-names"); + spirv_replaces_glsl = piglit_strip_arg(&argc, argv, "-spirv"); if (force_glsl && spirv_replaces_glsl) { printf("Options -glsl and -spirv can't be used at the same time\n"); @@ -5888,7 +5940,8 @@ piglit_init(int argc, char **argv) force_no_names = true; if (argc < 2) { - printf("usage: shader_runner <test.shader_test> [-glsl] [-force-no-names]\n"); + printf("usage: shader_runner <test.shader_test> [-glsl] " + "[-force-no-names] [-spirv]\n"); exit(1); } -- 2.19.1 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit