From f0f8bb3f3663c0c05efe4480f43c9731e9d63d44 Mon Sep 17 00:00:00 2001 From: Conor McCarthy Date: Tue, 3 Dec 2024 11:56:01 +1000 Subject: [PATCH] tests/hlsl: Add float64 wave op tests. --- tests/hlsl/wave-ops-float.shader_test | 236 ++++++++++++++++++++++++++ tests/shader_runner.c | 11 ++ tests/shader_runner_d3d12.c | 1 + tests/utils.h | 41 +++++ 4 files changed, 289 insertions(+) diff --git a/tests/hlsl/wave-ops-float.shader_test b/tests/hlsl/wave-ops-float.shader_test index e6dcf050..9241517e 100644 --- a/tests/hlsl/wave-ops-float.shader_test +++ b/tests/hlsl/wave-ops-float.shader_test @@ -461,3 +461,239 @@ probe rtv 0 (1, 1) rgba (1.0, 0.0, 0.0, 1.0) probe uav 1 (1) rgba (0.5, 0.25, 1.0, 0.75) probe uav 1 (2) rgba (0.5, 0.25, 1.0, 0.75) probe uav 1 (3) rgba (0.5, 0.25, 1.0, 0.75) + + +[require] +shader model >= 6.0 +wave-ops +float64 +format r32g32-float uav-load +format r32g32b32a32-uint uav-load + +[uav 0] +format r32g32-float +size (buffer, 4) + +3.5 1.0 +3.5 1.0 +3.5 1.5 +3.5 1.0 + +[uav 1] +format r32g32b32a32-uint +size (buffer, 16) + +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 + +[compute shader] +RWBuffer u0; +RWBuffer u1; + + [numthreads(4, 1, 1)] +void main(uint id : SV_GroupIndex) +{ + double2 d = u0[id]; + bool2 b = WaveActiveAllEqual(d); + u1[id] = uint4(b.x, b.y, 0, 0); +} + +[test] +dispatch 4 1 1 +probe uav 1 (0) rgbaui(1, 0, 0, 0) +probe uav 1 (1) rgbaui(1, 0, 0, 0) +probe uav 1 (2) rgbaui(1, 0, 0, 0) +probe uav 1 (3) rgbaui(1, 0, 0, 0) + + +[compute shader] +RWBuffer u0; +RWBuffer u1; + + [numthreads(4, 1, 1)] +void main(uint id : SV_GroupIndex) +{ + double2 d = u0[id] + u0[id ^ 1]; + u1[id] = WaveReadLaneFirst(d); + u1[4 + id] = WaveReadLaneAt(d, 3); +} + +[test] +dispatch 4 1 1 +probe uav 1 (0) rgd(7.0, 2.0) +probe uav 1 (1) rgd(7.0, 2.0) +probe uav 1 (2) rgd(7.0, 2.0) +probe uav 1 (3) rgd(7.0, 2.0) +probe uav 1 (4) rgd(7.0, 2.5) +probe uav 1 (5) rgd(7.0, 2.5) +probe uav 1 (6) rgd(7.0, 2.5) +probe uav 1 (7) rgd(7.0, 2.5) + + +[compute shader] +RWBuffer u0; +RWBuffer u1; + + [numthreads(4, 1, 1)] +void main(uint id : SV_GroupIndex) +{ + double2 d = u0[id]; + u1[id] = WaveActiveSum(d); +} + +[test] +dispatch 4 1 1 +probe uav 1 (0) rgd(14.0, 4.5) +probe uav 1 (1) rgd(14.0, 4.5) +probe uav 1 (2) rgd(14.0, 4.5) +probe uav 1 (3) rgd(14.0, 4.5) + + +[compute shader] +RWBuffer u0; +RWBuffer u1; + + [numthreads(4, 1, 1)] +void main(uint id : SV_GroupIndex) +{ + double2 d = u0[id]; + u1[id] = WaveActiveProduct(d); +} + +[test] +dispatch 4 1 1 +probe uav 1 (0) rgd(150.0625, 1.5) +probe uav 1 (1) rgd(150.0625, 1.5) +probe uav 1 (2) rgd(150.0625, 1.5) +probe uav 1 (3) rgd(150.0625, 1.5) + + +[compute shader] +RWBuffer u0; +RWBuffer u1; + + [numthreads(4, 1, 1)] +void main(uint id : SV_GroupIndex) +{ + double2 d = u0[id]; + u1[id] = WaveActiveMin(d); +} + +[test] +dispatch 4 1 1 +probe uav 1 (0) rgd(3.5, 1.0) +probe uav 1 (1) rgd(3.5, 1.0) +probe uav 1 (2) rgd(3.5, 1.0) +probe uav 1 (3) rgd(3.5, 1.0) + + +[compute shader] +RWBuffer u0; +RWBuffer u1; + + [numthreads(4, 1, 1)] +void main(uint id : SV_GroupIndex) +{ + double2 d = u0[id]; + u1[id] = WaveActiveMax(d); +} + +[test] +dispatch 4 1 1 +probe uav 1 (0) rgd(3.5, 1.5) +probe uav 1 (1) rgd(3.5, 1.5) +probe uav 1 (2) rgd(3.5, 1.5) +probe uav 1 (3) rgd(3.5, 1.5) + + +[compute shader] +RWBuffer u0; +RWBuffer u1; + + [numthreads(4, 1, 1)] +void main(uint id : SV_GroupIndex) +{ + double2 d = u0[id]; + u1[id] = WavePrefixSum(d); +} + +[test] +dispatch 4 1 1 +probe uav 1 (0) rgd(0.0, 0.0) +probe uav 1 (1) rgd(3.5, 1.0) +probe uav 1 (2) rgd(7.0, 2.0) +probe uav 1 (3) rgd(10.5, 3.5) + + +[compute shader] +RWBuffer u0; +RWBuffer u1; + + [numthreads(4, 1, 1)] +void main(uint id : SV_GroupIndex) +{ + double2 d = u0[id]; + u1[id] = WavePrefixProduct(d); +} + +[test] +dispatch 4 1 1 +probe uav 1 (0) rgd(1.0, 1.0) +probe uav 1 (1) rgd(3.5, 1.0) +probe uav 1 (2) rgd(12.25, 1.0) +probe uav 1 (3) rgd(42.875, 1.5) + + +[uav 0] +format r32g32b32a32-float +size (buffer, 4) + +0.25 0.50 0.75 1.00 +0.50 0.25 1.00 0.75 +0.75 1.00 0.50 0.25 +1.00 0.75 0.25 0.50 + +[compute shader] +RWBuffer u0; +RWBuffer u1; + + [numthreads(4, 1, 1)] +void main(uint id : SV_GroupIndex) +{ + uint i = WaveGetLaneIndex() % 4; + double2 d = u0[i]; + u1[i] = QuadReadAcrossX(d); +} + +[test] +dispatch 4 1 1 +probe uav 1 (0) rgd(0.5, 0.25) +probe uav 1 (1) rgd(0.25, 0.5) +probe uav 1 (2) rgd(1.0, 0.75) +probe uav 1 (3) rgd(0.75, 1.0) + + +[compute shader] +RWBuffer u0; +RWBuffer u1; + + [numthreads(4, 1, 1)] +void main(uint id : SV_GroupIndex) +{ + uint i = WaveGetLaneIndex() % 4; + double2 d = u0[i]; + u1[i] = QuadReadLaneAt(d, 2); +} + +[test] +dispatch 4 1 1 +probe uav 1 (0) rgd(0.75, 1.0) +probe uav 1 (1) rgd(0.75, 1.0) +probe uav 1 (2) rgd(0.75, 1.0) +probe uav 1 (3) rgd(0.75, 1.0) diff --git a/tests/shader_runner.c b/tests/shader_runner.c index 4894d996..763bfce1 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -1259,6 +1259,17 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) todo_if(runner->is_todo) bug_if(runner->is_bug) check_readback_data_uint64(rb, &box, expect, 0); } + else if (match_string(line, "rgd", &line)) + { + struct dvec2 v; + + ret = sscanf(line, "( %lf , %lf ) %u", &v.x, &v.y, &ulps); + if (ret < 2) + fatal_error("Malformed probe arguments '%s'.\n", line); + if (ret < 3) + ulps = 0; + todo_if(runner->is_todo) check_readback_data_dvec2(rb, &rect, &v, ulps); + } else if (match_string(line, "rd", &line)) { double expect; diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 6a2300e2..89c16627 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -1013,6 +1013,7 @@ static void d3d12_runner_init_caps(struct d3d12_shader_runner *runner, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_SINT, + DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_SINT, diff --git a/tests/utils.h b/tests/utils.h index 3fbfda72..753dc6eb 100644 --- a/tests/utils.h +++ b/tests/utils.h @@ -222,6 +222,12 @@ static inline bool compare_vec4(const struct vec4 *v1, const struct vec4 *v2, un return compare_vec(v1, v2, ulps, 4); } +static inline bool compare_dvec2(const struct dvec2 *v1, const struct dvec2 *v2, unsigned int ulps) +{ + return compare_double(v1->x, v2->x, ulps) + && compare_double(v1->y, v2->y, ulps); +} + static inline void set_rect(RECT *rect, int left, int top, int right, int bottom) { rect->left = left; @@ -262,6 +268,11 @@ static const struct vec4 *get_readback_vec4(const struct resource_readback *rb, return get_readback_data(rb, x, y, 0, sizeof(struct vec4)); } +static const struct dvec2 *get_readback_dvec2(const struct resource_readback *rb, unsigned int x, unsigned int y) +{ + return get_readback_data(rb, x, y, 0, sizeof(struct dvec2)); +} + static const struct uvec4 *get_readback_uvec4(const struct resource_readback *rb, unsigned int x, unsigned int y) { return get_readback_data(rb, x, y, 0, sizeof(struct uvec4)); @@ -419,6 +430,36 @@ static inline void check_readback_data_vec_(const char *file, unsigned int line, got.x, got.y, got.z, got.w, expected->x, expected->y, expected->z, expected->w, x, y); } +#define check_readback_data_dvec2(a, b, c, d) check_readback_data_dvec2_(__FILE__, __LINE__, a, b, c, d) +static inline void check_readback_data_dvec2_(const char *file, unsigned int line, const struct resource_readback *rb, + const RECT *rect, const struct dvec2 *expected, unsigned int max_diff) +{ + RECT r = {0, 0, rb->width, rb->height}; + unsigned int x = 0, y = 0; + struct dvec2 got = {0}; + bool all_match = true; + + if (rect) + r = *rect; + + for (y = r.top; y < r.bottom; ++y) + { + for (x = r.left; x < r.right; ++x) + { + got = *get_readback_dvec2(rb, x, y); + if (!compare_dvec2(&got, expected, max_diff)) + { + all_match = false; + break; + } + } + if (!all_match) + break; + } + ok_(file, line)(all_match, "Got {%.15e, %.15e}, expected {%.15e, %.15e} at (%u, %u).\n", + got.x, got.y, expected->x, expected->y, x, y); +} + #define check_readback_data_ivec4(a, b, c) \ check_readback_data_uvec4_(__FILE__, __LINE__, a, b, (const struct uvec4 *)(c)) #define check_readback_data_uvec4(a, b, c) check_readback_data_uvec4_(__FILE__, __LINE__, a, b, c)