From: Francisco Casas fcasas@codeweavers.com
This would allow us to test compilation of SM1 shaders even if we don't have an available backend that can run them. --- tests/shader_runner.c | 69 +++++++++++++++++++++++++++++++++---------- tests/shader_runner.h | 3 +- 2 files changed, 55 insertions(+), 17 deletions(-)
diff --git a/tests/shader_runner.c b/tests/shader_runner.c index 3f4586489..6090ddcda 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -511,6 +511,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) if (ret < 3) fatal_error("Malformed dispatch arguments '%s'.\n", line);
+ assert(runner->ops->dispatch); runner->last_render_failed = !runner->ops->dispatch(runner, x, y, z); } else if (match_string(line, "draw quad", &line)) @@ -543,6 +544,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) params.height = RENDER_TARGET_HEIGHT; params.level_count = 1;
+ assert(runner->ops->create_resource); set_resource(runner, runner->ops->create_resource(runner, ¶ms)); }
@@ -562,11 +564,13 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) params.data = malloc(sizeof(quad)); memcpy(params.data, quad, sizeof(quad)); params.data_size = sizeof(quad); + assert(runner->ops->create_resource); set_resource(runner, runner->ops->create_resource(runner, ¶ms));
if (!runner->vs_source) runner->vs_source = strdup(vs_source);
+ assert(runner->ops->draw); runner->last_render_failed = !runner->ops->draw(runner, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, 3); } else if (match_string(line, "draw", &line)) @@ -588,6 +592,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) params.height = RENDER_TARGET_HEIGHT; params.level_count = 1;
+ assert(runner->ops->create_resource); set_resource(runner, runner->ops->create_resource(runner, ¶ms)); }
@@ -602,6 +607,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) if (line == rest) fatal_error("Malformed vertex count '%s'.\n", line);
+ assert(runner->ops->draw); runner->last_render_failed = !runner->ops->draw(runner, topology, vertex_count); } else if (match_string(line, "probe", &line)) @@ -650,6 +656,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) resource = get_resource(runner, RESOURCE_TYPE_RENDER_TARGET, 0); }
+ assert(runner->ops->get_resource_readback); rb = runner->ops->get_resource_readback(runner, resource);
if (match_string(line, "all", &line)) @@ -698,6 +705,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) fatal_error("Malformed probe arguments '%s'.\n", line); }
+ assert(runner->ops->release_readback); runner->ops->release_readback(runner, rb); } else if (match_string(line, "uniform", &line)) @@ -944,8 +952,8 @@ static void compile_shader(struct shader_runner *runner, IDxcCompiler3 *dxc_comp
static const char *const shader_models[] = { - [SHADER_MODEL_2_0] = "4_0", - [SHADER_MODEL_3_0] = "4_0", + [SHADER_MODEL_2_0] = "2_0", + [SHADER_MODEL_3_0] = "3_0", [SHADER_MODEL_4_0] = "4_0", [SHADER_MODEL_4_1] = "4_1", [SHADER_MODEL_5_0] = "5_0", @@ -1032,7 +1040,8 @@ static enum parse_state read_shader_directive(struct shader_runner *runner, enum }
static void run_shader_tests_range(struct shader_runner *runner, const struct shader_runner_ops *ops, - void *dxc_compiler, enum shader_model minimum_shader_model, enum shader_model maximum_shader_model) + void *dxc_compiler, enum shader_model minimum_shader_model, enum shader_model maximum_shader_model, + bool check_syntax) { size_t shader_source_size = 0, shader_source_len = 0; struct resource_params current_resource; @@ -1057,8 +1066,11 @@ static void run_shader_tests_range(struct shader_runner *runner, const struct sh runner->maximum_shader_model = maximum_shader_model; runner->selected_shader_model = minimum_shader_model;
- assert(runner->ops->check_requirements); - skip_tests = !runner->ops->check_requirements(runner, &runner->selected_shader_model); + if (runner->ops) + { + assert(runner->ops->check_requirements); + skip_tests = !runner->ops->check_requirements(runner, &runner->selected_shader_model); + }
for (;;) { @@ -1079,7 +1091,7 @@ static void run_shader_tests_range(struct shader_runner *runner, const struct sh
case STATE_REQUIRE: if (runner->maximum_shader_model < runner->minimum_shader_model - || !runner->ops->check_requirements(runner, &runner->selected_shader_model)) + || (runner->ops && !runner->ops->check_requirements(runner, &runner->selected_shader_model))) { skip_tests = true; } @@ -1091,14 +1103,15 @@ static void run_shader_tests_range(struct shader_runner *runner, const struct sh * textures with data type other than float). */ if (!skip_tests) { - set_resource(runner, runner->ops->create_resource(runner, ¤t_resource)); + if (runner->ops) + set_resource(runner, runner->ops->create_resource(runner, ¤t_resource)); } free(current_resource.data); break;
case STATE_SHADER_COMPUTE: case STATE_SHADER_COMPUTE_TODO: - if (!skip_tests) + if (check_syntax && !skip_tests) { todo_if (state == STATE_SHADER_COMPUTE_TODO) compile_shader(runner, dxc_compiler, shader_source, shader_source_len, SHADER_TYPE_CS, @@ -1113,7 +1126,7 @@ static void run_shader_tests_range(struct shader_runner *runner, const struct sh
case STATE_SHADER_PIXEL: case STATE_SHADER_PIXEL_TODO: - if (!skip_tests) + if (check_syntax && !skip_tests) { todo_if (state == STATE_SHADER_PIXEL_TODO) compile_shader(runner, dxc_compiler, shader_source, shader_source_len, SHADER_TYPE_PS, @@ -1128,7 +1141,7 @@ static void run_shader_tests_range(struct shader_runner *runner, const struct sh
case STATE_SHADER_VERTEX: case STATE_SHADER_VERTEX_TODO: - if (!skip_tests) + if (check_syntax && !skip_tests) { todo_if (state == STATE_SHADER_VERTEX_TODO) compile_shader(runner, dxc_compiler, shader_source, shader_source_len, SHADER_TYPE_VS, @@ -1386,7 +1399,10 @@ static void run_shader_tests_range(struct shader_runner *runner, const struct sh /* Compilation which fails with dxcompiler is not 'todo', therefore the tests are * not 'todo' either. They cannot run, so skip them entirely. */ if (!skip_tests && SUCCEEDED(expect_hr)) - parse_test_directive(runner, line); + { + if (!check_syntax) + parse_test_directive(runner, line); + } break; } } @@ -1399,6 +1415,7 @@ static void run_shader_tests_range(struct shader_runner *runner, const struct sh free(runner->ps_source); for (i = 0; i < runner->resource_count; ++i) { + assert(runner->ops); if (runner->resources[i]) runner->ops->destroy_resource(runner, runner->resources[i]); } @@ -1406,11 +1423,12 @@ static void run_shader_tests_range(struct shader_runner *runner, const struct sh fclose(f); }
-void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, void *dxc_compiler) +void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, + void *dxc_compiler) { - run_shader_tests_range(runner, ops, dxc_compiler, SHADER_MODEL_2_0, SHADER_MODEL_3_0); - run_shader_tests_range(runner, ops, dxc_compiler, SHADER_MODEL_4_0, SHADER_MODEL_5_1); - run_shader_tests_range(runner, ops, dxc_compiler, SHADER_MODEL_6_0, SHADER_MODEL_6_0); + run_shader_tests_range(runner, ops, dxc_compiler, SHADER_MODEL_2_0, SHADER_MODEL_3_0, false); + run_shader_tests_range(runner, ops, dxc_compiler, SHADER_MODEL_4_0, SHADER_MODEL_5_1, false); + run_shader_tests_range(runner, ops, dxc_compiler, SHADER_MODEL_6_0, SHADER_MODEL_6_0, false); }
#ifdef _WIN32 @@ -1502,6 +1520,7 @@ static IDxcCompiler3 *dxcompiler_create(void)
START_TEST(shader_runner) { + struct shader_runner runner; #ifndef VKD3D_CROSSTEST IDxcCompiler3 *dxc_compiler; #endif @@ -1511,6 +1530,10 @@ START_TEST(shader_runner) #if defined(VKD3D_CROSSTEST) trace("Running tests from a Windows cross build\n");
+ trace("Compiling shaders with d3dcompiler_47.dll\n"); + runner = (struct shader_runner){}; + run_shader_tests_range(&runner, NULL, NULL, SHADER_MODEL_4_0, SHADER_MODEL_5_1, true); + trace("Compiling shaders with d3dcompiler_47.dll and executing with d3d9.dll\n"); run_shader_tests_d3d9();
@@ -1528,6 +1551,10 @@ START_TEST(shader_runner) #elif defined(_WIN32) trace("Running tests from a Windows non-cross build\n");
+ trace("Compiling shaders with vkd3d-shader.\n"); + runner = (struct shader_runner){}; + run_shader_tests_range(&runner, NULL, NULL, SHADER_MODEL_4_0, SHADER_MODEL_5_1, true); + trace("Compiling shaders with vkd3d-shader and executing with d3d9.dll\n"); run_shader_tests_d3d9();
@@ -1539,6 +1566,10 @@ START_TEST(shader_runner)
if ((dxc_compiler = dxcompiler_create())) { + trace("Compiling shaders with dxcompiler\n"); + runner = (struct shader_runner){}; + run_shader_tests_range(&runner, NULL, dxc_compiler, SHADER_MODEL_6_0, SHADER_MODEL_6_0, true); + trace("Compiling shaders with dxcompiler and executing with vkd3d\n"); run_shader_tests_d3d12(dxc_compiler, SHADER_MODEL_6_0, SHADER_MODEL_6_0); IDxcCompiler3_Release(dxc_compiler); @@ -1550,6 +1581,10 @@ START_TEST(shader_runner) #else trace("Running tests from a Unix build\n");
+ trace("Compiling shaders with vkd3d-shader\n"); + runner = (struct shader_runner){}; + run_shader_tests_range(&runner, NULL, NULL, SHADER_MODEL_4_0, SHADER_MODEL_5_1, true); + trace("Compiling shaders with vkd3d-shader and executing with Vulkan\n"); run_shader_tests_vulkan();
@@ -1558,6 +1593,10 @@ START_TEST(shader_runner)
if ((dxc_compiler = dxcompiler_create())) { + trace("Compiling shaders with dxcompiler\n"); + runner = (struct shader_runner){}; + run_shader_tests_range(&runner, NULL, dxc_compiler, SHADER_MODEL_6_0, SHADER_MODEL_6_0, true); + trace("Compiling shaders with dxcompiler and executing with vkd3d\n"); run_shader_tests_d3d12(dxc_compiler, SHADER_MODEL_6_0, SHADER_MODEL_6_0); IDxcCompiler3_Release(dxc_compiler); diff --git a/tests/shader_runner.h b/tests/shader_runner.h index fe1e24cca..1314733ba 100644 --- a/tests/shader_runner.h +++ b/tests/shader_runner.h @@ -165,8 +165,7 @@ void init_resource(struct resource *resource, const struct resource_params *para HRESULT dxc_compiler_compile_shader(void *dxc_compiler, enum shader_type type, unsigned int compile_options, const char *hlsl, ID3D10Blob **blob_out, ID3D10Blob **errors_out);
-void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, - void *dxc_compiler); +void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, void *dxc_compiler);
#ifdef _WIN32 void run_shader_tests_d3d9(void);