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 | 65 ++++++++++++++++++++++++++++++------ tests/shader_runner.h | 2 +- tests/shader_runner_d3d11.c | 2 +- tests/shader_runner_d3d12.c | 2 +- tests/shader_runner_d3d9.c | 2 +- tests/shader_runner_vulkan.c | 2 +- 6 files changed, 60 insertions(+), 15 deletions(-)
diff --git a/tests/shader_runner.c b/tests/shader_runner.c index f4121a54b..2a5a9ec71 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -1032,9 +1032,11 @@ static enum parse_state read_shader_directive(struct shader_runner *runner, enum }
/* Ask the backend to run the shader_test file so that each test is executed with the lowest profile - * it can support within the range of shader models specified, if any. */ + * it can support within the range of shader models specified, if any. + * If check_syntax is true, then the shaders are compiled on the [shader] directives using the + * available compiler. If ops is NULL, execution tests are skipped. */ void run_shader_tests(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) + 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; @@ -1058,8 +1060,16 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o runner->minimum_shader_model = minimum_shader_model; runner->maximum_shader_model = maximum_shader_model;
- assert(runner->ops->check_requirements); - skip_tests = !runner->ops->check_requirements(runner, &runner->selected_shader_model); + if (runner->ops) + { + skip_tests = !runner->ops->check_requirements(runner, &runner->selected_shader_model); + } + else + { + /* TODO: Make runner->selected_shader_model = runner->minimum_shader_model so that + * check_syntax is allowed to compile SM1 profiles. */ + runner->selected_shader_model = max(SHADER_MODEL_4_0, runner->minimum_shader_model); + }
for (;;) { @@ -1079,11 +1089,18 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o break;
case STATE_REQUIRE: + assert(!runner->ops || runner->ops->check_requirements); 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; } + if (!runner->ops) + { + /* TODO: Make runner->selected_shader_model = runner->minimum_shader_model so that + * check_syntax is allowed to compile SM1 profiles. */ + runner->selected_shader_model = max(SHADER_MODEL_4_0, runner->minimum_shader_model); + } break;
case STATE_RESOURCE: @@ -1092,14 +1109,15 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o * 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, @@ -1114,7 +1132,7 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o
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, @@ -1129,7 +1147,7 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o
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, @@ -1387,7 +1405,10 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o /* 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 (runner->ops) + parse_test_directive(runner, line); + } break; } } @@ -1400,6 +1421,7 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o 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]); } @@ -1407,6 +1429,14 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o fclose(f); }
+static void run_shader_compilation_tests(enum shader_model minimum_shader_model, + enum shader_model maximum_shader_model, void *dxc_compiler) +{ + struct shader_runner runner = {}; + + return run_shader_tests(&runner, NULL, dxc_compiler, minimum_shader_model, maximum_shader_model, true); +} + #ifdef _WIN32 static void print_dll_version(const char *file_name) { @@ -1505,6 +1535,9 @@ 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"); + run_shader_compilation_tests(SHADER_MODEL_2_0, SHADER_MODEL_6_0, NULL); + trace("Compiling shaders with d3dcompiler_47.dll and executing with d3d9.dll\n"); run_shader_tests_d3d9(SHADER_MODEL_2_0, SHADER_MODEL_6_0);
@@ -1522,6 +1555,9 @@ START_TEST(shader_runner) #elif defined(_WIN32) trace("Running tests from a Windows non-cross build\n");
+ trace("Compiling shaders with vkd3d-shader\n"); + run_shader_compilation_tests(SHADER_MODEL_2_0, SHADER_MODEL_6_0, NULL); + trace("Compiling shaders with vkd3d-shader and executing with d3d9.dll\n"); run_shader_tests_d3d9(SHADER_MODEL_2_0, SHADER_MODEL_6_0);
@@ -1533,6 +1569,9 @@ START_TEST(shader_runner)
if ((dxc_compiler = dxcompiler_create())) { + trace("Compiling shaders with dxcompiler\n"); + run_shader_compilation_tests(SHADER_MODEL_6_0, SHADER_MODEL_6_0, dxc_compiler); + trace("Compiling shaders with dxcompiler and executing with vkd3d\n"); run_shader_tests_d3d12(SHADER_MODEL_6_0, SHADER_MODEL_6_0, dxc_compiler); IDxcCompiler3_Release(dxc_compiler); @@ -1544,6 +1583,9 @@ START_TEST(shader_runner) #else trace("Running tests from a Unix build\n");
+ trace("Compiling shaders with vkd3d-shader\n"); + run_shader_compilation_tests(SHADER_MODEL_2_0, SHADER_MODEL_6_0, NULL); + trace("Compiling shaders with vkd3d-shader and executing with Vulkan\n"); run_shader_tests_vulkan(SHADER_MODEL_2_0, SHADER_MODEL_6_0);
@@ -1552,6 +1594,9 @@ START_TEST(shader_runner)
if ((dxc_compiler = dxcompiler_create())) { + trace("Compiling shaders with dxcompiler\n"); + run_shader_compilation_tests(SHADER_MODEL_6_0, SHADER_MODEL_6_0, dxc_compiler); + trace("Compiling shaders with dxcompiler and executing with vkd3d\n"); run_shader_tests_d3d12(SHADER_MODEL_6_0, SHADER_MODEL_6_0, dxc_compiler); IDxcCompiler3_Release(dxc_compiler); diff --git a/tests/shader_runner.h b/tests/shader_runner.h index b91e23d08..9763b3661 100644 --- a/tests/shader_runner.h +++ b/tests/shader_runner.h @@ -166,7 +166,7 @@ HRESULT dxc_compiler_compile_shader(void *dxc_compiler, enum shader_type type, u 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, - enum shader_model minimum_shader_model, enum shader_model maximum_shader_model); + enum shader_model minimum_shader_model, enum shader_model maximum_shader_model, bool check_syntax);
#ifdef _WIN32 void run_shader_tests_d3d9(enum shader_model minimum_shader_model, enum shader_model maximum_shader_model); diff --git a/tests/shader_runner_d3d11.c b/tests/shader_runner_d3d11.c index 978dd471e..ab7eb94fa 100644 --- a/tests/shader_runner_d3d11.c +++ b/tests/shader_runner_d3d11.c @@ -760,7 +760,7 @@ void run_shader_tests_d3d11(enum shader_model minimum_shader_model, enum shader_ init_adapter_info(); if (init_test_context(&runner)) { - run_shader_tests(&runner.r, &d3d11_runner_ops, NULL, minimum_shader_model, maximum_shader_model); + run_shader_tests(&runner.r, &d3d11_runner_ops, NULL, minimum_shader_model, maximum_shader_model, false); destroy_test_context(&runner); } } diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 98e3e7c0f..8f15f1bf8 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -622,7 +622,7 @@ void run_shader_tests_d3d12(enum shader_model minimum_shader_model, enum shader_ runner.compute_allocator, NULL, &IID_ID3D12GraphicsCommandList, (void **)&runner.compute_list); ok(hr == S_OK, "Failed to create command list, hr %#x.\n", hr);
- run_shader_tests(&runner.r, &d3d12_runner_ops, dxc_compiler, minimum_shader_model, maximum_shader_model); + run_shader_tests(&runner.r, &d3d12_runner_ops, dxc_compiler, minimum_shader_model, maximum_shader_model, false);
ID3D12GraphicsCommandList_Release(runner.compute_list); ID3D12CommandAllocator_Release(runner.compute_allocator); diff --git a/tests/shader_runner_d3d9.c b/tests/shader_runner_d3d9.c index b05d178b2..3c81f70d5 100644 --- a/tests/shader_runner_d3d9.c +++ b/tests/shader_runner_d3d9.c @@ -543,7 +543,7 @@ void run_shader_tests_d3d9(enum shader_model minimum_shader_model, enum shader_m
init_adapter_info(); init_test_context(&runner); - run_shader_tests(&runner.r, &d3d9_runner_ops, NULL, minimum_shader_model, maximum_shader_model); + run_shader_tests(&runner.r, &d3d9_runner_ops, NULL, minimum_shader_model, maximum_shader_model, false); destroy_test_context(&runner); } FreeLibrary(d3d9_module); diff --git a/tests/shader_runner_vulkan.c b/tests/shader_runner_vulkan.c index 418f3e3bd..1c333e82d 100644 --- a/tests/shader_runner_vulkan.c +++ b/tests/shader_runner_vulkan.c @@ -1397,7 +1397,7 @@ void run_shader_tests_vulkan(enum shader_model minimum_shader_model, enum shader if (!init_vulkan_runner(&runner)) return;
- run_shader_tests(&runner.r, &vulkan_runner_ops, NULL, minimum_shader_model, maximum_shader_model); + run_shader_tests(&runner.r, &vulkan_runner_ops, NULL, minimum_shader_model, maximum_shader_model, false);
cleanup_vulkan_runner(&runner); }