Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- tests/d3d12_test_utils.h | 19 +++++++++++++------ tests/shader_runner.c | 32 +++++++++++++++++++++++--------- tests/shader_runner.h | 3 ++- tests/shader_runner_d3d11.c | 20 ++++++++++++++------ tests/shader_runner_d3d12.c | 4 ++-- tests/shader_runner_d3d9.c | 20 ++++++++++++++------ tests/shader_runner_vulkan.c | 20 ++++++++++++++------ tests/utils.h | 9 +++++++++ 8 files changed, 91 insertions(+), 36 deletions(-)
diff --git a/tests/d3d12_test_utils.h b/tests/d3d12_test_utils.h index bb298082..9fdc4bb3 100644 --- a/tests/d3d12_test_utils.h +++ b/tests/d3d12_test_utils.h @@ -569,9 +569,9 @@ static void check_readback_data_uint_(unsigned int line, struct resource_readbac ok_(line)(all_match, "Got 0x%08x, expected 0x%08x at (%u, %u, %u).\n", got, expected, x, y, z); }
-#define check_readback_data_vec4(a, b, c, d) check_readback_data_vec4_(__LINE__, a, b, c, d) +#define check_readback_data_vec4(a, b, c, d, e) check_readback_data_vec4_(__LINE__, a, b, c, d, e) static void check_readback_data_vec4_(unsigned int line, struct resource_readback *rb, - const RECT *rect, const struct vec4 *expected, unsigned int max_diff) + const RECT *rect, const struct vec4 *expected, unsigned int max_diff, unsigned int comp_count) { RECT r = {0, 0, rb->width, rb->height}; unsigned int x = 0, y = 0; @@ -586,7 +586,7 @@ static void check_readback_data_vec4_(unsigned int line, struct resource_readbac for (x = r.left; x < r.right; ++x) { got = *get_readback_vec4(rb, x, y); - if (!compare_vec4(&got, expected, max_diff)) + if (!compare_vec4_count(&got, expected, max_diff, comp_count)) { all_match = false; break; @@ -595,8 +595,15 @@ static void check_readback_data_vec4_(unsigned int line, struct resource_readbac if (!all_match) break; } - ok_(line)(all_match, "Got {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e} at (%u, %u).\n", - got.x, got.y, got.z, got.w, expected->x, expected->y, expected->z, expected->w, x, y); + if (comp_count == 4) + { + ok_(line)(all_match, "Got {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e} at (%u, %u).\n", + got.x, got.y, got.z, got.w, expected->x, expected->y, expected->z, expected->w, x, y); + } + else + { + ok_(line)(all_match, "Got %.8e, expected %.8e at (%u, %u).\n", got.x, expected->x, x, y); + } }
#define check_sub_resource_uint(a, b, c, d, e, f) check_sub_resource_uint_(__LINE__, a, b, c, d, e, f) @@ -619,7 +626,7 @@ static inline void check_sub_resource_vec4_(unsigned int line, ID3D12Resource *t struct resource_readback rb;
get_texture_readback_with_command_list(texture, sub_resource_idx, &rb, queue, command_list); - check_readback_data_vec4_(line, &rb, NULL, expected, max_diff); + check_readback_data_vec4_(line, &rb, NULL, expected, max_diff, 4); release_resource_readback(&rb); }
diff --git a/tests/shader_runner.c b/tests/shader_runner.c index a820810a..f8fd6e3e 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -411,7 +411,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) } else if (match_string(line, "probe", &line)) { - unsigned int left, top, right, bottom, ulps; + unsigned int left, top, right, bottom, ulps, comp_count; struct vec4 v; int ret, len; RECT rect; @@ -434,16 +434,30 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) line += len; }
- if (!match_string(line, "rgba", &line)) - fatal_error("Malformed probe arguments '%s'.\n", line); - - ret = sscanf(line, "( %f , %f , %f , %f ) %u", &v.x, &v.y, &v.z, &v.w, &ulps); - if (ret < 4) + if (match_string(line, "rgba", &line)) + { + comp_count = 4; + ret = sscanf(line, "( %f , %f , %f , %f ) %u", &v.x, &v.y, &v.z, &v.w, &ulps); + if (ret < 4) + fatal_error("Malformed probe arguments '%s'.\n", line); + if (ret < 5) + ulps = 0; + } + else if (match_string(line, "r", &line)) + { + comp_count = 1; + ret = sscanf(line, "%f %u", &v.x, &ulps); + if (ret < 1) + fatal_error("Malformed probe arguments '%s'.\n", line); + if (ret < 2) + ulps = 0; + } + else + { fatal_error("Malformed probe arguments '%s'.\n", line); - if (ret < 5) - ulps = 0; + }
- runner->ops->probe_vec4(runner, &rect, &v, ulps); + runner->ops->probe_vec4(runner, &rect, &v, ulps, comp_count); } else if (match_string(line, "uniform", &line)) { diff --git a/tests/shader_runner.h b/tests/shader_runner.h index 9685eaa3..a85b84e2 100644 --- a/tests/shader_runner.h +++ b/tests/shader_runner.h @@ -123,7 +123,8 @@ struct shader_runner_ops struct resource *(*create_resource)(struct shader_runner *runner, const struct resource_params *params); void (*destroy_resource)(struct shader_runner *runner, struct resource *resource); bool (*draw)(struct shader_runner *runner, D3D_PRIMITIVE_TOPOLOGY primitive_topology, unsigned int vertex_count); - void (*probe_vec4)(struct shader_runner *runner, const RECT *rect, const struct vec4 *v, unsigned int ulps); + void (*probe_vec4)(struct shader_runner *runner, const RECT *rect, const struct vec4 *v, + unsigned int ulps, unsigned int comp_count); };
void fatal_error(const char *format, ...) VKD3D_NORETURN VKD3D_PRINTF_FUNC(1, 2); diff --git a/tests/shader_runner_d3d11.c b/tests/shader_runner_d3d11.c index 9d1ed09b..5a67f501 100644 --- a/tests/shader_runner_d3d11.c +++ b/tests/shader_runner_d3d11.c @@ -576,7 +576,7 @@ static const struct vec4 *get_readback_vec4(struct resource_readback *rb, unsign }
static void check_readback_data_vec4(struct resource_readback *rb, - const RECT *rect, const struct vec4 *expected, unsigned int max_diff) + const RECT *rect, const struct vec4 *expected, unsigned int max_diff, unsigned int comp_count) { unsigned int x = 0, y = 0; struct vec4 got = {0}; @@ -587,7 +587,7 @@ static void check_readback_data_vec4(struct resource_readback *rb, for (x = rect->left; x < rect->right; ++x) { got = *get_readback_vec4(rb, x, y); - if (!compare_vec4(&got, expected, max_diff)) + if (!compare_vec4_count(&got, expected, max_diff, comp_count)) { all_match = false; break; @@ -596,17 +596,25 @@ static void check_readback_data_vec4(struct resource_readback *rb, if (!all_match) break; } - ok(all_match, "Got {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e} at (%u, %u).\n", - got.x, got.y, got.z, got.w, expected->x, expected->y, expected->z, expected->w, x, y); + if (comp_count == 4) + { + ok(all_match, "Got {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e} at (%u, %u).\n", + got.x, got.y, got.z, got.w, expected->x, expected->y, expected->z, expected->w, x, y); + } + else + { + ok(all_match, "Got %.8e, expected %.8e at (%u, %u).\n", got.x, expected->x, x, y); + } }
-static void d3d11_runner_probe_vec4(struct shader_runner *r, const RECT *rect, const struct vec4 *v, unsigned int ulps) +static void d3d11_runner_probe_vec4(struct shader_runner *r, const RECT *rect, const struct vec4 *v, + unsigned int ulps, unsigned int comp_count) { struct d3d11_shader_runner *runner = d3d11_shader_runner(r); struct resource_readback rb;
init_readback(runner, &rb); - check_readback_data_vec4(&rb, rect, v, ulps); + check_readback_data_vec4(&rb, rect, v, ulps, comp_count); release_readback(runner, &rb); }
diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 1fa2a461..1822029d 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -310,7 +310,7 @@ static bool d3d12_runner_draw(struct shader_runner *r, }
static void d3d12_runner_probe_vec4(struct shader_runner *r, - const RECT *rect, const struct vec4 *v, unsigned int ulps) + const RECT *rect, const struct vec4 *v, unsigned int ulps, unsigned int comp_count) { struct d3d12_shader_runner *runner = d3d12_shader_runner(r); struct test_context *test_context = &runner->test_context; @@ -320,7 +320,7 @@ static void d3d12_runner_probe_vec4(struct shader_runner *r, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE); get_texture_readback_with_command_list(test_context->render_target, 0, &rb, test_context->queue, test_context->list); - todo_if (runner->r.is_todo) check_readback_data_vec4(&rb, rect, v, ulps); + todo_if (runner->r.is_todo) check_readback_data_vec4(&rb, rect, v, ulps, comp_count); release_resource_readback(&rb); reset_command_list(test_context->list, test_context->allocator); transition_resource_state(test_context->list, test_context->render_target, diff --git a/tests/shader_runner_d3d9.c b/tests/shader_runner_d3d9.c index f2875d42..0b2f71ad 100644 --- a/tests/shader_runner_d3d9.c +++ b/tests/shader_runner_d3d9.c @@ -479,7 +479,7 @@ static const struct vec4 *get_readback_vec4(const struct resource_readback *rb, }
static void check_readback_data_vec4(struct resource_readback *rb, - const RECT *rect, const struct vec4 *expected, unsigned int max_diff) + const RECT *rect, const struct vec4 *expected, unsigned int max_diff, unsigned int comp_count) { unsigned int x = 0, y = 0; struct vec4 got = {0}; @@ -490,7 +490,7 @@ static void check_readback_data_vec4(struct resource_readback *rb, for (x = rect->left; x < rect->right; ++x) { got = *get_readback_vec4(rb, x, y); - if (!compare_vec4(&got, expected, max_diff)) + if (!compare_vec4_count(&got, expected, max_diff, comp_count)) { all_match = false; break; @@ -499,8 +499,15 @@ static void check_readback_data_vec4(struct resource_readback *rb, if (!all_match) break; } - ok(all_match, "Got {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e} at (%u, %u).\n", - got.x, got.y, got.z, got.w, expected->x, expected->y, expected->z, expected->w, x, y); + if (comp_count == 4) + { + ok(all_match, "Got {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e} at (%u, %u).\n", + got.x, got.y, got.z, got.w, expected->x, expected->y, expected->z, expected->w, x, y); + } + else + { + ok(all_match, "Got %.8e, expected %.8e at (%u, %u).\n", got.x, expected->x, x, y); + } }
static void release_readback(struct resource_readback *rb) @@ -509,13 +516,14 @@ static void release_readback(struct resource_readback *rb) IDirect3DSurface9_Release(rb->surface); }
-static void d3d9_runner_probe_vec4(struct shader_runner *r, const RECT *rect, const struct vec4 *v, unsigned int ulps) +static void d3d9_runner_probe_vec4(struct shader_runner *r, const RECT *rect, const struct vec4 *v, + unsigned int ulps, unsigned int comp_count) { struct d3d9_shader_runner *runner = d3d9_shader_runner(r); struct resource_readback rb;
init_readback(runner, &rb); - check_readback_data_vec4(&rb, rect, v, ulps); + check_readback_data_vec4(&rb, rect, v, ulps, comp_count); release_readback(&rb); }
diff --git a/tests/shader_runner_vulkan.c b/tests/shader_runner_vulkan.c index 5d4b65cf..8b461993 100644 --- a/tests/shader_runner_vulkan.c +++ b/tests/shader_runner_vulkan.c @@ -831,7 +831,7 @@ static const struct vec4 *get_readback_vec4(const uint8_t *data, unsigned int ro }
static void check_readback_data_vec4(const uint8_t *data, unsigned int row_pitch, - const RECT *rect, const struct vec4 *expected, unsigned int max_diff) + const RECT *rect, const struct vec4 *expected, unsigned int max_diff, unsigned int comp_count) { unsigned int x = 0, y = 0; struct vec4 got = {0}; @@ -842,7 +842,7 @@ static void check_readback_data_vec4(const uint8_t *data, unsigned int row_pitch for (x = rect->left; x < rect->right; ++x) { got = *get_readback_vec4(data, row_pitch, x, y); - if (!compare_vec4(&got, expected, max_diff)) + if (!compare_vec4_count(&got, expected, max_diff, comp_count)) { all_match = false; break; @@ -851,11 +851,19 @@ static void check_readback_data_vec4(const uint8_t *data, unsigned int row_pitch if (!all_match) break; } - ok(all_match, "Got {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e} at (%u, %u).\n", - got.x, got.y, got.z, got.w, expected->x, expected->y, expected->z, expected->w, x, y); + if (comp_count == 4) + { + ok(all_match, "Got {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e} at (%u, %u).\n", + got.x, got.y, got.z, got.w, expected->x, expected->y, expected->z, expected->w, x, y); + } + else + { + ok(all_match, "Got %.8e, expected %.8e at (%u, %u).\n", got.x, expected->x, x, y); + } }
-static void vulkan_runner_probe_vec4(struct shader_runner *r, const RECT *rect, const struct vec4 *v, unsigned int ulps) +static void vulkan_runner_probe_vec4(struct shader_runner *r, const RECT *rect, const struct vec4 *v, + unsigned int ulps, unsigned int comp_count) { struct vulkan_shader_runner *runner = vulkan_shader_runner(r); VkDevice device = runner->device; @@ -890,7 +898,7 @@ static void vulkan_runner_probe_vec4(struct shader_runner *r, const RECT *rect, end_command_buffer(runner);
VK_CALL(vkMapMemory(device, memory, 0, VK_WHOLE_SIZE, 0, &data)); - todo_if (runner->r.is_todo) check_readback_data_vec4(data, row_pitch, rect, v, ulps); + todo_if (runner->r.is_todo) check_readback_data_vec4(data, row_pitch, rect, v, ulps, comp_count); VK_CALL(vkUnmapMemory(device, memory));
VK_CALL(vkFreeMemory(device, memory, NULL)); diff --git a/tests/utils.h b/tests/utils.h index 563f0b0f..8adfd5cb 100644 --- a/tests/utils.h +++ b/tests/utils.h @@ -94,6 +94,15 @@ static inline bool compare_vec4(const struct vec4 *v1, const struct vec4 *v2, un && compare_float(v1->w, v2->w, ulps); }
+static inline bool compare_vec4_count(const struct vec4 *v1, const struct vec4 *v2, unsigned int ulps, + unsigned int comp_count) +{ + return (comp_count < 1 || compare_float(v1->x, v2->x, ulps)) + && (comp_count < 2 || compare_float(v1->y, v2->y, ulps)) + && (comp_count < 3 || compare_float(v1->z, v2->z, ulps)) + && (comp_count < 4 || compare_float(v1->w, v2->w, ulps)); +} + static inline void set_rect(RECT *rect, int left, int top, int right, int bottom) { rect->left = left;