diff --git a/tests/hlsl/register-reservations-numeric.shader_test b/tests/hlsl/register-reservations-numeric.shader_test index 1f32aa43..a87a3652 100644 --- a/tests/hlsl/register-reservations-numeric.shader_test +++ b/tests/hlsl/register-reservations-numeric.shader_test @@ -277,3 +277,223 @@ float4 main() : sv_target f += i; return f; } + +% Expressions as offsets. +[require] +% All shader models. + +[pixel shader] +// no offset at all, implicitly c0. +float a : register (c); + +float4 main() : sv_target +{ + return a; +} + +[test] +uniform 0 float 1.0 +todo(glsl) draw quad +probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0) + +[pixel shader todo] +// Numeric expr, no offset in the identifier. DXC ignores this. +float a : register (c[1 + 1 * 2 * 0]); + +float4 main() : sv_target +{ + return a; +} + +[test] +uniform 0 float 1.0 +uniform 4 float 2.0 +todo(glsl|sm<6) draw quad +if(sm<6) probe (0, 0) rgba (2.0, 2.0, 2.0, 2.0) +if(sm>=6) probe (0, 0) rgba(1.0, 1.0, 1.0, 1.0) + +[pixel shader todo] +// Numeric expr. DXC also ignores this. +float a : register (c0[1 + 1 * 2 * 0]); + +float4 main() : sv_target +{ + return a; +} + +[test] +uniform 0 float 0.0 +uniform 4 float 1.0 +todo(glsl|sm<6) draw quad +if(sm<6) probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0) +if(sm>=6) probe (0, 0) rgba (0.0, 0.0, 0.0, 0.0) + +[pixel shader todo] +// Float offsets truncate. +float a : register (c0[0.6 + 0.6]); + +float4 main() : sv_target +{ + return a; +} + +[test] +uniform 0 float 0.0 +uniform 4 float 1.0 +todo(glsl|sm<6) draw quad +if(sm<6) probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0) +if(sm>=6) probe (0, 0) rgba (0.0, 0.0, 0.0, 0.0) + +[pixel shader todo] +// Booleans are interpreted as integers in the usual way. +float a : register (c0[true + false * true]); + +float4 main() : sv_target +{ + return a; +} + +[test] +uniform 0 float 0.0 +uniform 4 float 1.0 +todo(glsl|sm<6) draw quad +if(sm<6) probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0) +if(sm>=6) probe (0, 0) rgba (0.0, 0.0, 0.0, 0.0) + +[pixel shader fail(sm>=6) todo] +// Negative offsets. DXC fails to compile this. +float a : register (c2[-1]); + +float4 main() : sv_target +{ + return a; +} + +[test] +uniform 4 float 1.0 +todo draw quad +probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0) + +% Weird FXC behavior. +% SM4 accepts anything for 'b' reservations and discards it silently for global numeric variables. + +[pixel shader fail(sm<4 | sm>=6) todo(sm>=4)] +float a : register(banana); + +float4 main() : sv_target +{ + return a; +} + +[test] +uniform 0 float 1.0 +todo(glsl | sm>=4 | sm<6) draw quad +probe (0, 0) rgba(1.0, 1.0, 1.0, 1.0) + +% Testing other reservation types. This is a parse failure, i.e "X3530: register sa not valid" + +[pixel shader fail] + +sampler s : register(samply); + +float4 main() : sv_target +{ + return tex2D(s, float2(0, 0)); +} + +% This seems to parse fine, but fails with a different error message: "X3530: sampler requires an 's' or 't' register". +% Resource types probably have extra validation. + +[pixel shader fail] + +sampler s : register(banana); + +float4 main() : sv_target +{ + return tex2D(s, float2(0, 0)); +} + +% Trailing characters after the reservation index are okay in SM < 6, except for 'b' reservations + +[pixel shader fail(sm>=6)] + +float a : register(c1manymanyletters); + +float4 main() : sv_target +{ + return a; +} + +[test] +uniform 0 float 0.0 +uniform 4 float 2.0 +todo(glsl) draw quad +probe (0, 0) rgba(2.0, 2.0, 2.0, 2.0) + +[require] +shader model >= 4.0 + +[pixel shader fail todo] + +cbuffer buf : register(b0manymanyletters) +{ + float a; +} + +float4 main() : sv_target +{ + return a; +} + +% SM4 fails, but not during parsing: it tries to reserve slot 4294967295 (i.e UINT_MAX) for the constant buffer. +% It'll attempt to reserve the same slot even if an offset is passed in brackets, which suggests it uses -1 +% as a "parsing failure" flag. + +% DXC fails during parsing. + +[pixel shader fail] +cbuffer buf : register(banana) +{ + float a; +} + +float4 main() : sv_target +{ + return a; +} + +% Some versions of fxc's SM5.1 completely ignore bracket exprs for samplers and textures. +% This was fixed (?) in later versions. + +[sampler 0] +filter linear linear linear +address clamp clamp clamp + +[sampler 1] +filter point point point +address clamp clamp clamp + +[srv 0] +size (2d, 1, 2) +0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 + +[srv 1] +size (2d, 1, 2) +1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 + +[require] +shader model >= 4.0 + +[pixel shader todo] +Texture2D tex : register(t[1]); +sampler sam : register(s[1]); + +float4 main() : sv_target +{ + return tex.Sample(sam, float2(0, 0.5)); +} + +[test] +todo(sm<6) draw quad +if(sm<6) probe (0, 0) rgba(2.0, 2.0, 2.0, 2.0) +if(sm>=6) probe (0, 0) rgba(0.5, 0.5, 0.5, 0.5) diff --git a/tests/hlsl/register-reservations-profile.shader_test b/tests/hlsl/register-reservations-profile.shader_test index a747ea6d..8b052231 100644 --- a/tests/hlsl/register-reservations-profile.shader_test +++ b/tests/hlsl/register-reservations-profile.shader_test @@ -259,3 +259,33 @@ float4 main() : sv_target [test] todo(sm<6) draw quad probe (0, 0) rgba (1, 1, 1, 99) + +% Bracket exprs should still parse correctly. + +[pixel shader todo] +Texture2D tex1 : register(ps, t[1]); + +float4 main() : sv_target +{ + return tex1.Load(int3(0, 0, 0)); +} + +[test] +todo(sm<6) draw quad +if(sm>=6) probe (0, 0) rgba(0, 0, 0, 99) +if(sm<6) probe (0, 0) rgba(1, 1, 1, 99) + +% This works, though the bind point is ignored. + +[pixel shader fail(sm>=6) todo(sm<6)] +float a : register(ps[5], c1); + +float4 main() : sv_target +{ + return a; +} + +[test] +uniform 0 float 1.0 +todo draw quad +probe (0, 0) rgba(1.0, 1.0, 1.0, 1.0) diff --git a/tests/hlsl/register-reservations-space.shader_test b/tests/hlsl/register-reservations-space.shader_test index 48fac6f4..71644e5e 100644 --- a/tests/hlsl/register-reservations-space.shader_test +++ b/tests/hlsl/register-reservations-space.shader_test @@ -29,6 +29,19 @@ float4 main() : sv_target todo(glsl) draw quad probe (0, 0) rgba (1, 1, 1, 99) +% Bracket syntax for registers. Ignored in SM>=6. +[pixel shader todo] +Texture2D tex1 : register(t[1], space0); + +float4 main() : sv_target +{ + return tex1.Load(int3(0, 0, 0)); +} + +[test] +todo(sm<6) draw quad +if(sm>=6) probe (0, 0) rgba (0, 0, 0, 99) +if(sm<6) probe (0, 0) rgba (1, 1, 1, 99) [pixel shader fail(sm>=6)] Texture2D tex1 : register(t1, sPaCe0); @@ -94,6 +107,20 @@ todo(sm<6) draw quad if(sm>=6) probe (0,0) rgba (2, 2, 2, 99) if(sm<6) probe (0,0) rgba (1, 1, 1, 99) +% Same as above, but with bracket exprs, which are ignored in SM>=6. + +[pixel shader todo] +Texture2D tex1 : register(vs, t[1], space0) : register(ps, t[2], space0); + +float4 main() : sv_target +{ + return tex1.Load(int3(0, 0, 0)); +} + +[test] +todo(sm<6) draw quad +if(sm>=6) probe (0, 0) rgba (0, 0, 0, 99) +if(sm<6) probe (0, 0) rgba (1, 1, 1, 99) % This actually inheres to 5.1+; it doesn't matter whether "space" is specified.