mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
tests/hlsl: Add float64 wave op tests.
This commit is contained in:
parent
9d4bcc951d
commit
f0f8bb3f36
Notes:
Henri Verbeet
2024-12-09 16:17:26 +01:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/820
@ -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 (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 (2) rgba (0.5, 0.25, 1.0, 0.75)
|
||||||
probe uav 1 (3) 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<float2> u0;
|
||||||
|
RWBuffer<uint4> 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<float2> u0;
|
||||||
|
RWBuffer<double2> 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<float2> u0;
|
||||||
|
RWBuffer<double2> 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<float2> u0;
|
||||||
|
RWBuffer<double2> 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<float2> u0;
|
||||||
|
RWBuffer<double2> 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<float2> u0;
|
||||||
|
RWBuffer<double2> 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<float2> u0;
|
||||||
|
RWBuffer<double2> 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<float2> u0;
|
||||||
|
RWBuffer<double2> 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<float2> u0;
|
||||||
|
RWBuffer<double2> 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<float2> u0;
|
||||||
|
RWBuffer<double2> 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)
|
||||||
|
@ -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)
|
todo_if(runner->is_todo) bug_if(runner->is_bug)
|
||||||
check_readback_data_uint64(rb, &box, expect, 0);
|
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))
|
else if (match_string(line, "rd", &line))
|
||||||
{
|
{
|
||||||
double expect;
|
double expect;
|
||||||
|
@ -1013,6 +1013,7 @@ static void d3d12_runner_init_caps(struct d3d12_shader_runner *runner,
|
|||||||
DXGI_FORMAT_R16G16B16A16_FLOAT,
|
DXGI_FORMAT_R16G16B16A16_FLOAT,
|
||||||
DXGI_FORMAT_R16G16B16A16_UINT,
|
DXGI_FORMAT_R16G16B16A16_UINT,
|
||||||
DXGI_FORMAT_R16G16B16A16_SINT,
|
DXGI_FORMAT_R16G16B16A16_SINT,
|
||||||
|
DXGI_FORMAT_R32G32_FLOAT,
|
||||||
DXGI_FORMAT_R8G8B8A8_UNORM,
|
DXGI_FORMAT_R8G8B8A8_UNORM,
|
||||||
DXGI_FORMAT_R8G8B8A8_UINT,
|
DXGI_FORMAT_R8G8B8A8_UINT,
|
||||||
DXGI_FORMAT_R8G8B8A8_SINT,
|
DXGI_FORMAT_R8G8B8A8_SINT,
|
||||||
|
@ -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);
|
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)
|
static inline void set_rect(RECT *rect, int left, int top, int right, int bottom)
|
||||||
{
|
{
|
||||||
rect->left = left;
|
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));
|
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)
|
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));
|
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);
|
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) \
|
#define check_readback_data_ivec4(a, b, c) \
|
||||||
check_readback_data_uvec4_(__FILE__, __LINE__, a, b, (const struct uvec4 *)(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)
|
#define check_readback_data_uvec4(a, b, c) check_readback_data_uvec4_(__FILE__, __LINE__, a, b, c)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user