vkd3d/tests/hlsl/switch.shader_test
Giovanni Mascellani 026624a266 tests: Work around a Metal bug in switch.shader_test.
The Metal bug was reported to Apple as FB15617433. Since we don't
care specifically about that bug, I'm just tweaking the test so that
it doesn't hit that bad path any more.
2024-11-06 22:15:09 +01:00

653 lines
11 KiB
Plaintext

[pixel shader todo(sm<4)]
uint4 v;
float4 main() : sv_target
{
switch (v.x)
{
case 0:
return 3.0;
case 1:
return 4.0;
default:
return 5.0;
}
}
[test]
if(sm<4) uniform 0 float4 3 0 0 0
if(sm>=4) uniform 0 uint4 3 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0)
if(sm<4) uniform 0 float4 1 0 0 0
if(sm>=4) uniform 0 uint4 1 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (4.0, 4.0, 4.0, 4.0)
if(sm<4) uniform 0 float4 0 0 0 0
if(sm>=4) uniform 0 uint4 0 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (3.0, 3.0, 3.0, 3.0)
% just a default case
[pixel shader todo(sm<4)]
uint4 v;
float4 main() : sv_target
{
switch (v.x)
{
default:
return 5.0;
}
}
[test]
if(sm<4) uniform 0 float4 3 0 0 0
if(sm>=4) uniform 0 uint4 3 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0)
if(sm<4) uniform 0 float4 1 0 0 0
if(sm>=4) uniform 0 uint4 1 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0)
if(sm<4) uniform 0 float4 0 0 0 0
if(sm>=4) uniform 0 uint4 0 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0)
% completely empty
[pixel shader fail]
uint4 v;
float4 main() : sv_target
{
switch (v.x)
{
}
}
% falling through is only supported for empty case statements
[pixel shader todo(sm<4)]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
switch (v.x)
{
case 0:
case 1:
c.x += 0.1f;
break;
}
return c;
}
[test]
if(sm<4) uniform 0 float4 2 0 0 0
if(sm>=4) uniform 0 uint4 2 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
if(sm<4) uniform 0 float4 1 0 0 0
if(sm>=4) uniform 0 uint4 1 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.1, 2.0, 3.0, 4.0)
if(sm<4) uniform 0 float4 0 0 0 0
if(sm>=4) uniform 0 uint4 0 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.1, 2.0, 3.0, 4.0)
% case value evaluation
[pixel shader todo(sm<4)]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
switch (v.x)
{
case 1+1:
c += 0.1f;
break;
case 0:
c += 0.2f;
break;
}
return c;
}
[test]
if(sm<4) uniform 0 float4 2 0 0 0
if(sm>=4) uniform 0 uint4 2 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1)
if(sm<4) uniform 0 float4 1 0 0 0
if(sm>=4) uniform 0 uint4 1 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
% floats are accepted
[pixel shader fail(sm>=6) todo(sm<4)]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
switch (v.x)
{
case 2.1f:
c += 0.1f;
break;
case 0.9f:
c += 0.2f;
break;
}
return c;
}
[test]
if(sm<4) uniform 0 float4 2 0 0 0
if(sm>=4) uniform 0 uint4 2 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1)
if(sm<4) uniform 0 float4 1 0 0 0
if(sm>=4) uniform 0 uint4 1 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
[pixel shader fail(sm<4 | sm>=6) todo(sm<4)]
float4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
switch (v.x)
{
case 2.1f:
c += 0.1f;
break;
case 0.9f:
c += 0.2f;
break;
}
return c;
}
[test]
uniform 0 float4 2.0 0.0 0.0 0.0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1)
uniform 0 float4 1.0 0.0 0.0 0.0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
[pixel shader fail]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
uint a = 1;
switch (v.x)
{
case 1+a:
c += 0.1f;
break;
case 0:
c += 0.2f;
break;
}
return c;
}
% duplicate cases
[pixel shader fail]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
switch (v.x)
{
case 2:
c += 0.1f;
break;
case 1+1:
c += 0.2f;
break;
}
return c;
}
% multiple default cases
[pixel shader fail]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
switch (v.x)
{
default:
case 2:
c += 0.1f;
break;
case 1:
c += 0.2f;
break;
default:
break;
}
return c;
}
% unterminated cases
[pixel shader fail(sm<6)]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
switch (v.x)
{
case 0:
c += 0.1f;
case 1:
c += 0.2f;
break;
}
return c;
}
[pixel shader fail]
uint4 v;
float4 main() : sv_target
{
switch (v.x)
{
case 0:
return 3.0;
case 1:
return 4.0;
case 2:
}
return 0.0;
}
[pixel shader fail]
uint4 v;
float4 main() : sv_target
{
switch (v.x)
{
case 0:
return 3.0;
case 1:
return 4.0;
default:
}
return 0.0;
}
[pixel shader fail(sm<6)]
uint4 v;
float4 main() : sv_target
{
switch (v.x)
{
case 0:
return 3.0;
case 1:
return 4.0;
default:
discard;
}
return 0.0;
}
[pixel shader fail(sm<6)]
uint4 v;
float4 main() : sv_target
{
switch (v.x)
{
case 0:
return 3.0;
case 1:
return 4.0;
case 2:
discard;
}
return 0.0;
}
[pixel shader fail(sm<6)]
uint4 v;
float4 main() : sv_target
{
switch (v.x)
{
case 0:
discard;
case 1:
return 4.0;
}
return 0.0;
}
% more complicated breaks
[pixel shader todo(sm<4)]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
switch (v.x)
{
case 2:
c += 0.1f;
if (true) break;
c = 9.0f;
case 1:
if (false) break;
c += 0.2f;
break;
default:
case 0:
break;
}
return c;
}
[test]
if(sm<4) uniform 0 float4 2 0 0 0
if(sm>=4) uniform 0 uint4 2 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1)
if(sm<4) uniform 0 float4 1 0 0 0
if(sm>=4) uniform 0 uint4 1 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.2, 2.2, 3.2, 4.2)
if(sm<4) uniform 0 float4 0 0 0 0
if(sm>=4) uniform 0 uint4 0 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
% switch breaks within a loop
[pixel shader todo(sm<4)]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0f, 2.0f, 3.0f, 4.0f};
for (int i = 0; i < 4; ++i)
{
switch (v.x)
{
case 2:
c += 1.0f;
break;
case 1:
c -= 1.0f;
break;
default:
case 0:
break;
}
}
return c;
}
[test]
if(sm<4) uniform 0 float4 2 0 0 0
if(sm>=4) uniform 0 uint4 2 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (5.0, 6.0, 7.0, 8.0)
% default case placement
[pixel shader todo(sm<4)]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0f, 2.0f, 3.0f, 4.0f};
switch (v.x)
{
case 2:
c += 1.0f;
break;
case 1:
c -= 1.0f;
break;
case 3:
default:
case 0:
c += 3.0f;
break;
}
return c;
}
[test]
if(sm<4) uniform 0 float4 0 0 0 0
if(sm>=4) uniform 0 uint4 0 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (4.0, 5.0, 6.0, 7.0)
if(sm<4) uniform 0 float4 2 0 0 0
if(sm>=4) uniform 0 uint4 2 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (2.0, 3.0, 4.0, 5.0)
if(sm<4) uniform 0 float4 3 0 0 0
if(sm>=4) uniform 0 uint4 3 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (4.0, 5.0, 6.0, 7.0)
[pixel shader todo(sm<4)]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0f, 2.0f, 3.0f, 4.0f};
switch (v.x)
{
case 2:
c += 1.0f;
break;
case 1:
c -= 1.0f;
break;
case 3:
default:
break;
case 0:
c += 3.0f;
break;
}
return c;
}
[test]
if(sm<4) uniform 0 float4 3 0 0 0
if(sm>=4) uniform 0 uint4 3 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
if(sm<4) uniform 0 float4 0 0 0 0
if(sm>=4) uniform 0 uint4 0 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (4.0, 5.0, 6.0, 7.0)
if(sm<4) uniform 0 float4 5 0 0 0
if(sm>=4) uniform 0 uint4 5 0 0 0
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
% 'continue' is not supported in switches
[pixel shader fail(sm<6)]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
uint i, j;
for (i = 0; i < v.z; i++)
{
switch (v.x)
{
case 0:
c += 0.1f;
continue;
break;
case 1:
c += 0.2f;
break;
}
}
return c;
}
[pixel shader fail(sm<4) todo(sm<4)]
uint4 v;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
uint i, j;
for (i = 0; i < v.z; i++)
{
switch (v.x)
{
case 1:
for (j = 0; j < v.z; j++)
{
c += 1.0f;
if (v.w)
continue;
}
break;
case 0:
c += 2.0f;
break;
}
}
return c;
}
[test]
if(sm<4) uniform 0 float4 1 0 3 1
if(sm>=4) uniform 0 uint4 1 0 3 1
todo(msl) draw quad
probe (0, 0) rgba (10.0, 11.0, 12.0, 13.0)
if(sm<4) uniform 0 float4 0 0 3 1
if(sm>=4) uniform 0 uint4 0 0 3 1
todo(msl) draw quad
probe (0, 0) rgba (7.0, 8.0, 9.0, 10.0)
% return from a switch nested in a loop
[pixel shader fail(sm<4) todo(sm<4)]
/* In theory this could be directly defined as uint4, but that hits some kind
* of optimization bug on Metal, which we work around this way. */
float4 vf;
float4 main() : sv_target
{
float4 c = {1.0, 2.0, 3.0, 4.0};
uint4 v = vf;
uint i, j;
for (i = 0; i < v.z; i++)
{
switch (v.x)
{
case 0:
c += 1.0f;
break;
case 1:
c += 2.0f;
return c;
}
c += 100.0f;
}
return c;
}
[test]
uniform 0 float4 0 0 3 1
todo(msl) draw quad
probe (0, 0) rgba (304.0, 305.0, 306.0, 307.0)
uniform 0 float4 1 0 3 1
todo(msl) draw quad
probe (0, 0) rgba (3.0, 4.0, 5.0, 6.0)
[require]
shader model >= 6.0
[pixel shader]
uint64_t2 v;
float4 main() : sv_target
{
// Need three cases because dxcompiler optimises two case values to a pair of vselect instructions.
switch (v.x)
{
case 0:
return 3.0;
case 0x100000002:
return 4.0;
case 3:
return 2.0;
default:
return 5.0;
}
}
[test]
uniform 0 uint64_t2 2 0
draw quad
probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0)
uniform 0 uint64_t2 0x100000002 0
draw quad
probe (0, 0) rgba (4.0, 4.0, 4.0, 4.0)
uniform 0 uint64_t2 0 0
draw quad
probe (0, 0) rgba (3.0, 3.0, 3.0, 3.0)