Files
vkd3d/tests/hlsl/arithmetic-int.shader_test
Francisco Casas 080672478d tests/hlsl: Test integer modulus with big integers.
Note that in d3dbc target profiles it gives different results when this
operation is constant folded compared to when it is not.

This suggests that whatever pass lowers the modulus operation to d3dbc
operations doesn't do it before constant folding.

Also note that when constant folded, d3dbc results differ from tpf
results for negative operands, because of the loss of precision that
happens when NEG is constant folded.

So the same integer modulus expression can have 3 different results
depending on the context.
2025-03-18 15:21:43 +01:00

182 lines
3.1 KiB
Plaintext

[pixel shader]
float4 main() : SV_TARGET
{
int x = 5;
int y = 15;
return float4(x + y, x - y, x * y, x / y) / 100.0;
}
[test]
draw quad
probe (0, 0) rgba (0.20, -0.10, 0.75, 0.0) 1
[pixel shader]
float4 main() : SV_TARGET
{
int x = 5;
int y = 15;
return float4(x % y, +x, -x, y / x) / 10.0;
}
[test]
draw quad
probe (0, 0) rgba (0.5, 0.5, -0.5, 0.3)
[pixel shader]
float4 main() : SV_TARGET
{
int x = 42;
int y = 5;
return float4(x / y, -x / y, x / -y, -x / -y) / 10.0;
}
[test]
draw quad
probe (0, 0) rgba (0.8, -0.8, -0.8, 0.8)
[pixel shader]
float4 main() : SV_TARGET
{
int x = 42;
int y = 5;
return float4(x % y, -x % y, x % -y, -x % -y) / 10.0;
}
[test]
draw quad
probe (0, 0) rgba (0.2, -0.2, 0.2, -0.2)
[pixel shader]
float4 main() : SV_TARGET
{
int x = 45;
int y = 5;
return float4(x / y, -x / y, x / -y, -x / -y) / 10.0;
}
[test]
draw quad
probe (0, 0) rgba (0.9, -0.9, -0.9, 0.9) 1
[pixel shader]
float4 main() : SV_TARGET
{
int x = 45;
int y = 5;
return float4(x % y, -x % y, x % -y, -x % -y);
}
[test]
draw quad
probe (0, 0) rgba (0.0, 0.0, 0.0, 0.0)
[pixel shader fail(sm>=2&sm<6)]
float4 main() : SV_TARGET
{
int x = 1;
int y = 0;
return x / y;
}
[test]
draw quad
probe (0, 0) rgba (0.0, 0.0, 0.0, 0.0)
% Allowed regardless of shader model on 31 and below
[pixel shader fail(sm>=2&sm<6)]
float4 main() : SV_TARGET
{
int x = 1;
int y = 0;
return x % y;
}
[test]
draw quad
probe (0, 0) rgba (0.0, 0.0, 0.0, 0.0)
[require]
% Skip 1.x because of clamping.
shader model >= 2.0
[pixel shader]
float4 main() : SV_TARGET
{
int x = -2147483648;
int y = -1;
return x / y;
}
[test]
draw quad
if(sm<4) todo probe (0,0) rgba ( 2147483648.0, 2147483648.0, 2147483648.0, 2147483648.0)
if(sm>=4&sm<6) probe (0,0) rgba (-2147483648.0, -2147483648.0, -2147483648.0, -2147483648.0)
if(sm>=6) probe (0,0) rgba (0.0, 0.0, 0.0, 0.0)
[pixel shader]
float4 main() : sv_target
{
int2 x = {5, 15};
int2 y = {2, 5};
int2 z = {3, 8};
return float4(x / y, z % y);
}
[test]
draw quad
probe (0, 0) rgba (2.0, 3.0, 1.0, 3.0)
% On SM1, negation constant folding is performed with float arithmetic.
[pixel shader]
float4 main() : sv_target
{
int a = -2147483648;
return int4(a, -a, 0, 0);
}
[test]
draw quad
todo if(sm<4) probe (0, 0) rgba(-2147483648.0, 2147483648.0, 0, 0)
if(sm>=4) probe (0, 0) rgba(-2147483648.0, -2147483648.0, 0, 0)
% Note that the negation here causes loss of precision on SM1.
[pixel shader]
float4 main() : sv_target
{
int a = 16782201; // This rounds down to 16782200 when converted to float.
return float4(a + 1, (-(-a)) + 1, 0, 0);
}
[test]
draw quad
todo if(sm<4) probe (0, 0) rgba(16782202, 16782200, 0, 0)
if(sm>=4) probe (0, 0) rgba(16782202, 16782202, 0, 0)
[pixel shader]
float4 main() : sv_target
{
int a = 16777217; // This rounds down to 16777216 when converted to float.
int b = 10;
return float4(a % b, a % (-b), (-a) % b, (-a) % (-b));
}
[test]
draw quad
todo if(sm<4) probe (0, 0) rgba(7, 7, -6, -6)
if(sm>=4) probe (0, 0) rgba(7, 7, -7, -7)