vkd3d/tests/hlsl/wave-ops-uint.shader_test
2024-10-28 16:20:27 +01:00

327 lines
5.1 KiB
Plaintext

[require]
shader model >= 6.0
wave-ops
format r32-uint uav-load
[uav 0]
format r32-uint
size (buffer, 4)
8 15 8 10
[uav 1]
format r32-uint
size (buffer, 8)
0 0 0 0 0 0 0 0
[compute shader]
RWBuffer<uint> u1 : register(u1);
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
u1[id] = WaveIsFirstLane();
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (1)
probe uav 1 (1) rui (0)
probe uav 1 (2) rui (0)
probe uav 1 (3) rui (0)
[compute shader]
RWBuffer<uint> u1 : register(u1);
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
if (!id)
{
u1[0] = 0;
return;
}
u1[id] = WaveIsFirstLane();
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (0)
probe uav 1 (1) rui (1)
probe uav 1 (2) rui (0)
probe uav 1 (3) rui (0)
[compute shader]
RWBuffer<uint> u1 : register(u1);
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
u1[id] = WaveGetLaneIndex();
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (0)
probe uav 1 (1) rui (1)
probe uav 1 (2) rui (2)
probe uav 1 (3) rui (3)
[compute shader]
RWBuffer<uint> u1 : register(u1);
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
// Between 4 and 128, and includes inactive and/or helper lanes.
uint count = WaveGetLaneCount();
u1[id] = count >= 4 && count <= 128;
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (1)
probe uav 1 (1) rui (1)
probe uav 1 (2) rui (1)
probe uav 1 (3) rui (1)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
uint i = (id & 1) ? -u0[id] : u0[id];
u1[id] = WaveActiveMin(i);
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (8)
probe uav 1 (1) rui (8)
probe uav 1 (2) rui (8)
probe uav 1 (3) rui (8)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
bool b = u0[id] == 8;
u1[id] = WaveActiveBallot(b).x;
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (5)
probe uav 1 (1) rui (5)
probe uav 1 (2) rui (5)
probe uav 1 (3) rui (5)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
uint i = u0[id] + u0[id ^ 1];
u1[id] = WaveReadLaneFirst(i);
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (23)
probe uav 1 (1) rui (23)
probe uav 1 (2) rui (23)
probe uav 1 (3) rui (23)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
uint i = u0[id] + u0[id ^ 1];
u1[id] = WaveReadLaneAt(i, 3);
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (18)
probe uav 1 (1) rui (18)
probe uav 1 (2) rui (18)
probe uav 1 (3) rui (18)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
uint i = u0[id] + u0[id ^ 1];
// Non-uniform lane index
u1[id] = WaveReadLaneAt(i, (id + 2) & 3);
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (18)
probe uav 1 (1) rui (18)
probe uav 1 (2) rui (23)
probe uav 1 (3) rui (23)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
bool b = u0[id] == 8;
u1[id] = WaveActiveCountBits(b);
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (2)
probe uav 1 (1) rui (2)
probe uav 1 (2) rui (2)
probe uav 1 (3) rui (2)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
bool b = u0[id] == 8;
u1[id] = WavePrefixCountBits(b);
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (0)
probe uav 1 (1) rui (1)
probe uav 1 (2) rui (1)
probe uav 1 (3) rui (2)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
u1[id] = WaveActiveSum(u0[id]);
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (41)
probe uav 1 (1) rui (41)
probe uav 1 (2) rui (41)
probe uav 1 (3) rui (41)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
u1[id] = WaveActiveBitAnd(u0[id]);
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (8)
probe uav 1 (1) rui (8)
probe uav 1 (2) rui (8)
probe uav 1 (3) rui (8)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
u1[id] = WaveActiveBitOr(u0[id]);
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (15)
probe uav 1 (1) rui (15)
probe uav 1 (2) rui (15)
probe uav 1 (3) rui (15)
[compute shader]
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
u1[id] = WaveActiveBitXor(u0[id]);
}
[test]
dispatch 4 1 1
probe uav 1 (0) rui (5)
probe uav 1 (1) rui (5)
probe uav 1 (2) rui (5)
probe uav 1 (3) rui (5)
[compute shader]
uniform uint2 u;
RWBuffer<uint> u0;
RWBuffer<uint> u1;
[numthreads(4, 1, 1)]
void main(uint id : SV_GroupIndex)
{
uint table[] = {u.x, u.y};
uint i;
// Value depends on control flow.
if (id & 1)
i = table[id / 2u];
else
i = u0[id / 2u];
u1[id] = WaveActiveSum(i);
}
[test]
uniform 0 uint4 1 5 0 0
dispatch 4 1 1
probe uav 1 (0) rui (29)
probe uav 1 (1) rui (29)
probe uav 1 (2) rui (29)
probe uav 1 (3) rui (29)