From: Francisco Casas fcasas@codeweavers.com
Since we will keep doing one run through the test file for each call to run_shader_tests(), we will rely on intersecting the range of models that each runner is allowed to run with the range of models given in the test by the [require] directives.
To simplify this, the minimum_test_model and maximum_test_model fields are renamed to minimum_test_model|maximum_test_model and will only keep track of the limits set by the [require] directive, and the won't be changed by the runners.
For runners that we are interested in running on more than one mode range, specifically shader_runner_d3d12 and shader_runner_vulkan, we declare different fields to keep track of the range that will be focused on a given call.
These fields were named minimum_runner_model and maximum_runner_model and were declared in their respective specializations of the shader_runner struct. They are used to properly implement the respective *_check_requirements() functions.
Simpler runners like shader_runner_d3d9 and shader_runner_d3d11 that we will run only once, do not require these fields and all the logic can be implemented in the *_check_requirements() functions without additional fields. --- tests/shader_runner.c | 29 ++++++++++++----------------- tests/shader_runner.h | 7 +++---- tests/shader_runner_d3d11.c | 8 ++++---- tests/shader_runner_d3d12.c | 14 ++++++++++---- tests/shader_runner_d3d9.c | 6 +++--- tests/shader_runner_vulkan.c | 15 +++++++++++---- 6 files changed, 43 insertions(+), 36 deletions(-)
diff --git a/tests/shader_runner.c b/tests/shader_runner.c index 745f17b3a..2494e2873 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -157,11 +157,11 @@ static void parse_require_directive(struct shader_runner *runner, const char *li { if (!i) fatal_error("Shader model < '%s' is invalid.\n", line); - runner->maximum_shader_model = min(runner->maximum_shader_model, i - 1); + runner->maximum_test_model = min(runner->maximum_test_model, i - 1); } else { - runner->minimum_shader_model = max(runner->minimum_shader_model, i); + runner->minimum_test_model = max(runner->minimum_test_model, i); } return; } @@ -1078,8 +1078,7 @@ static enum parse_state read_shader_directive(struct shader_runner *runner, enum return state; }
-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) +void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, void *dxc_compiler) { size_t shader_source_size = 0, shader_source_len = 0; struct resource_params current_resource; @@ -1088,8 +1087,8 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o unsigned int i, line_number = 0; char *shader_source = NULL; HRESULT expect_hr = S_OK; - bool skip_tests = false; char line_buffer[256]; + bool skip_tests; FILE *f;
if (!test_options.filename) @@ -1099,10 +1098,10 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o fatal_error("Unable to open '%s' for reading: %s\n", test_options.filename, strerror(errno));
memset(runner, 0, sizeof(*runner)); + runner->ops = ops; - runner->minimum_shader_model = minimum_shader_model; - runner->maximum_shader_model = maximum_shader_model; - runner->selected_shader_model = minimum_shader_model; + runner->minimum_test_model = SHADER_MODEL_2_0; + runner->maximum_test_model = SHADER_MODEL_6_0;
assert(runner->ops->check_requirements); skip_tests = !runner->ops->check_requirements(runner, &runner->selected_shader_model); @@ -1125,11 +1124,8 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o break;
case STATE_REQUIRE: - if (runner->maximum_shader_model < runner->minimum_shader_model - || !runner->ops->check_requirements(runner, &runner->selected_shader_model)) - { - skip_tests = true; - } + assert(runner->minimum_test_model <= runner->maximum_test_model); + skip_tests = !runner->ops->check_requirements(runner, &runner->selected_shader_model); break;
case STATE_RESOURCE: @@ -1282,11 +1278,10 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o else if (!strcmp(line, "[require]\n")) { state = STATE_REQUIRE; - runner->minimum_shader_model = minimum_shader_model; - runner->maximum_shader_model = maximum_shader_model; - runner->selected_shader_model = minimum_shader_model; + runner->minimum_test_model = SHADER_MODEL_2_0; + runner->maximum_test_model = SHADER_MODEL_6_0; + skip_tests = !runner->ops->check_requirements(runner, &runner->selected_shader_model); runner->compile_options = 0; - skip_tests = false; } else if (match_directive_substring(line, "[pixel shader", &line)) { diff --git a/tests/shader_runner.h b/tests/shader_runner.h index 89a01abff..925385ac2 100644 --- a/tests/shader_runner.h +++ b/tests/shader_runner.h @@ -120,8 +120,8 @@ struct shader_runner char *ps_source; char *cs_source; char *fx_source; - enum shader_model minimum_shader_model; - enum shader_model maximum_shader_model; + enum shader_model minimum_test_model; + enum shader_model maximum_test_model; enum shader_model selected_shader_model;
bool last_render_failed; @@ -167,8 +167,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, - enum shader_model minimum_shader_model, enum shader_model maximum_shader_model); +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); diff --git a/tests/shader_runner_d3d11.c b/tests/shader_runner_d3d11.c index df704da8c..8c2075790 100644 --- a/tests/shader_runner_d3d11.c +++ b/tests/shader_runner_d3d11.c @@ -102,12 +102,12 @@ static bool d3d11_runner_check_requirements(struct shader_runner *r, enum shader { struct d3d11_shader_runner *runner = d3d11_shader_runner(r);
- if (runner->r.maximum_shader_model < SHADER_MODEL_4_0) + if (runner->r.maximum_test_model < SHADER_MODEL_4_0) return false; - if (runner->r.minimum_shader_model >= SHADER_MODEL_6_0) + if (runner->r.minimum_test_model >= SHADER_MODEL_6_0) return false;
- *model = max(SHADER_MODEL_4_0, runner->r.minimum_shader_model); + *model = max(SHADER_MODEL_4_0, runner->r.minimum_test_model);
return true; } @@ -760,7 +760,7 @@ void run_shader_tests_d3d11(void) init_adapter_info(); if (init_test_context(&runner)) { - run_shader_tests(&runner.r, &d3d11_runner_ops, NULL, SHADER_MODEL_2_0, SHADER_MODEL_5_1); + run_shader_tests(&runner.r, &d3d11_runner_ops, NULL); destroy_test_context(&runner); } } diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index fec1427b0..50af62c69 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -45,6 +45,9 @@ struct d3d12_shader_runner
struct test_context test_context;
+ enum shader_model minimum_runner_model; + enum shader_model maximum_runner_model; + ID3D12DescriptorHeap *heap, *rtv_heap;
ID3D12CommandQueue *compute_queue; @@ -98,13 +101,13 @@ static bool d3d12_runner_check_requirements(struct shader_runner *r, enum shader { struct d3d12_shader_runner *runner = d3d12_shader_runner(r);
- if (runner->r.maximum_shader_model < SHADER_MODEL_4_0) + if (runner->r.maximum_test_model < runner->minimum_runner_model) return false;
- if (runner->r.minimum_shader_model >= SHADER_MODEL_6_0 && !runner->dxc_compiler) + if (runner->r.minimum_test_model > runner->maximum_runner_model) return false;
- *model = max(SHADER_MODEL_4_0, runner->r.minimum_shader_model); + *model = max(runner->r.minimum_test_model, runner->minimum_runner_model);
return true; } @@ -616,7 +619,10 @@ void run_shader_tests_d3d12(void *dxc_compiler, enum shader_model minimum_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); + runner.minimum_runner_model = max(minimum_shader_model, SHADER_MODEL_4_0); + runner.maximum_runner_model = min(maximum_shader_model, SHADER_MODEL_6_0 - !dxc_compiler); + + run_shader_tests(&runner.r, &d3d12_runner_ops, dxc_compiler);
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 fbd7d6b5b..745c20228 100644 --- a/tests/shader_runner_d3d9.c +++ b/tests/shader_runner_d3d9.c @@ -187,10 +187,10 @@ static bool d3d9_runner_check_requirements(struct shader_runner *r, enum shader_ { struct d3d9_shader_runner *runner = d3d9_shader_runner(r);
- if (runner->r.minimum_shader_model >= SHADER_MODEL_4_0) + if (runner->r.minimum_test_model >= SHADER_MODEL_4_0) return false;
- *model = runner->r.minimum_shader_model; + *model = runner->r.minimum_test_model;
return true; } @@ -543,7 +543,7 @@ void run_shader_tests_d3d9(void)
init_adapter_info(); init_test_context(&runner); - run_shader_tests(&runner.r, &d3d9_runner_ops, NULL, SHADER_MODEL_2_0, SHADER_MODEL_3_0); + run_shader_tests(&runner.r, &d3d9_runner_ops, NULL); destroy_test_context(&runner); } FreeLibrary(d3d9_module); diff --git a/tests/shader_runner_vulkan.c b/tests/shader_runner_vulkan.c index 131e394b0..483092686 100644 --- a/tests/shader_runner_vulkan.c +++ b/tests/shader_runner_vulkan.c @@ -56,6 +56,9 @@ struct vulkan_shader_runner { struct shader_runner r;
+ enum shader_model minimum_runner_model; + enum shader_model maximum_runner_model; + VkInstance instance; VkPhysicalDevice phys_device; VkDevice device; @@ -87,12 +90,13 @@ static bool vulkan_runner_check_requirements(struct shader_runner *r, enum shade { struct vulkan_shader_runner *runner = vulkan_shader_runner(r);
- if (runner->r.maximum_shader_model < SHADER_MODEL_4_0) + if (runner->r.maximum_test_model < runner->minimum_runner_model) return false; - if (runner->r.minimum_shader_model >= SHADER_MODEL_6_0) + + if (runner->r.minimum_test_model > runner->maximum_runner_model) return false;
- *model = max(SHADER_MODEL_4_0, runner->r.minimum_shader_model); + *model = max(runner->r.minimum_test_model, runner->minimum_runner_model);
return true; } @@ -1397,7 +1401,10 @@ void run_shader_tests_vulkan(void) if (!init_vulkan_runner(&runner)) return;
- run_shader_tests(&runner.r, &vulkan_runner_ops, NULL, SHADER_MODEL_2_0, SHADER_MODEL_5_1); + runner.minimum_runner_model = SHADER_MODEL_4_0; + runner.maximum_runner_model = SHADER_MODEL_5_1; + + run_shader_tests(&runner.r, &vulkan_runner_ops, NULL);
cleanup_vulkan_runner(&runner); }