From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- tests/shader_runner.c | 48 +++++++++++++++++++++++-------------- tests/shader_runner.h | 2 ++ tests/shader_runner_d3d11.c | 12 ++++++++++ tests/shader_runner_d3d12.c | 9 +++++++ 4 files changed, 53 insertions(+), 18 deletions(-)
diff --git a/tests/shader_runner.c b/tests/shader_runner.c index 507fbdaf..54736b89 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -106,30 +106,41 @@ static bool match_string(const char *line, const char *token, const char **const return true; }
-static void parse_require_directive(struct shader_runner *runner, const char *line) +static void parse_get_shader_model(const char *line, enum shader_model *model) { - if (match_string(line, "shader model >=", &line)) + static const char *const model_strings[] = { - static const char *const model_strings[] = - { - [SHADER_MODEL_2_0] = "2.0", - [SHADER_MODEL_4_0] = "4.0", - [SHADER_MODEL_4_1] = "4.1", - [SHADER_MODEL_5_0] = "5.0", - [SHADER_MODEL_5_1] = "5.1", - }; - unsigned int i; + [SHADER_MODEL_2_0] = "2.0", + [SHADER_MODEL_4_0] = "4.0", + [SHADER_MODEL_4_1] = "4.1", + [SHADER_MODEL_5_0] = "5.0", + [SHADER_MODEL_5_1] = "5.1", + }; + unsigned int i;
- for (i = 0; i < ARRAY_SIZE(model_strings); ++i) + for (i = 0; i < ARRAY_SIZE(model_strings); ++i) + { + if (match_string(line, model_strings[i], &line)) { - if (match_string(line, model_strings[i], &line)) - { - runner->minimum_shader_model = i; - return; - } + *model = i; + return; } + }
- fatal_error("Unknown shader model '%s'.\n", line); + fatal_error("Unknown shader model '%s'.\n", line); +} + +static void parse_require_directive(struct shader_runner *runner, const char *line) +{ + if (match_string(line, "shader model >=", &line)) + { + parse_get_shader_model(line, &runner->minimum_shader_model); + runner->maximum_shader_model = SHADER_MODEL_COUNT; + } + else if (match_string(line, "shader model ==", &line)) + { + parse_get_shader_model(line, &runner->minimum_shader_model); + runner->maximum_shader_model = runner->minimum_shader_model; } else { @@ -706,6 +717,7 @@ void run_shader_tests(struct shader_runner *runner, int argc, char **argv, const FILE *f;
runner->minimum_shader_model = SHADER_MODEL_2_0; + runner->maximum_shader_model = SHADER_MODEL_COUNT;
for (i = 1; i < argc; ++i) { diff --git a/tests/shader_runner.h b/tests/shader_runner.h index 82d7fa18..876a43ca 100644 --- a/tests/shader_runner.h +++ b/tests/shader_runner.h @@ -34,6 +34,7 @@ enum shader_model SHADER_MODEL_4_1, SHADER_MODEL_5_0, SHADER_MODEL_5_1, + SHADER_MODEL_COUNT, };
enum texture_data_type @@ -105,6 +106,7 @@ struct shader_runner char *ps_source; char *cs_source; enum shader_model minimum_shader_model; + enum shader_model maximum_shader_model;
bool last_render_failed;
diff --git a/tests/shader_runner_d3d11.c b/tests/shader_runner_d3d11.c index ba9e3179..aa541556 100644 --- a/tests/shader_runner_d3d11.c +++ b/tests/shader_runner_d3d11.c @@ -322,6 +322,17 @@ static void destroy_test_context(struct d3d11_shader_runner *runner) ok(!ref, "Device has %lu references left.\n", ref); }
+static bool d3d11_runner_check_requirements(struct shader_runner *r) +{ + if (r->minimum_shader_model > SHADER_MODEL_4_0) + return false; + + if (r->maximum_shader_model < SHADER_MODEL_4_0) + return false; + + return true; +} + static ID3D11Buffer *create_buffer(ID3D11Device *device, unsigned int bind_flags, unsigned int size, const void *data) { D3D11_SUBRESOURCE_DATA resource_data; @@ -680,6 +691,7 @@ static void d3d11_runner_release_readback(struct shader_runner *r, struct resour
static const struct shader_runner_ops d3d11_runner_ops = { + .check_requirements = d3d11_runner_check_requirements, .create_resource = d3d11_runner_create_resource, .destroy_resource = d3d11_runner_destroy_resource, .dispatch = d3d11_runner_dispatch, diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 3e661151..b932446a 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -83,6 +83,14 @@ static ID3D10Blob *compile_shader(const struct d3d12_shader_runner *runner, cons return blob; }
+static bool d3d12_runner_check_requirements(struct shader_runner *r) +{ + if (r->maximum_shader_model < SHADER_MODEL_5_0) + return false; + + return true; +} + #define MAX_RESOURCE_DESCRIPTORS (MAX_RESOURCES * 2)
static struct resource *d3d12_runner_create_resource(struct shader_runner *r, const struct resource_params *params) @@ -501,6 +509,7 @@ static void d3d12_runner_release_readback(struct shader_runner *r, struct resour
static const struct shader_runner_ops d3d12_runner_ops = { + .check_requirements = d3d12_runner_check_requirements, .create_resource = d3d12_runner_create_resource, .destroy_resource = d3d12_runner_destroy_resource, .dispatch = d3d12_runner_dispatch,