% The main objective of this test is to see if operations for SM1 vertex shaders work, because they % have a different instruction set than pixel shaders. % Considerations so that the vertex shader output matches the pixel shader input properly on all % backends: % - sv_position must be the last field in the output signature. % - the d3d9 backend, on Windows, clamps the value of the COLORX semantics before passing it to % the pixel shader, so their values must be between 0.0 and 1.0. [pixel shader] float4 main(in float4 res : COLOR1) : sv_target { return res; } % Check that -0.0f is not less than 0.0f [vertex shader] float a; void main(out float4 res : COLOR1, in float4 pos : position, out float4 out_pos : sv_position) { out_pos = pos; res = -0.0f < a; } [test] if(sm<4) uniform 0 float 0.0 if(sm>=4) uniform 0 float4 0.0 0.0 0.0 0.0 draw quad probe all rgba (0.0, 0.0, 0.0, 0.0) [vertex shader] int a, b; void main(out float4 res : COLOR1, in float4 pos : position, out float4 out_pos : sv_position) { out_pos = pos; res.x = a == b; res.y = a != b; res.z = a > b; res.w = b >= a; } [test] if(sm<4) uniform 0 float 3 if(sm<4) uniform 4 float 4 if(sm>=4) uniform 0 int4 3 4 0 0 draw quad probe all rgba (0.0, 1.0, 0.0, 1.0) if(sm<4) uniform 0 float -2 if(sm<4) uniform 4 float -2 if(sm>=4) uniform 0 int4 -2 -2 0 0 draw quad probe all rgba (1.0, 0.0, 0.0, 1.0) [vertex shader todo(sm<4)] int a, b; void main(out float4 res : COLOR1, in float4 pos : position, out float4 out_pos : sv_position) { out_pos = pos; res.x = a && b; res.y = a || b; res.z = b && a; res.w = b || a; } [test] if(sm<4) uniform 0 float 0 if(sm<4) uniform 4 float 2 if(sm>=4) uniform 0 int4 0 2 0 0 todo(sm<4) draw quad probe all rgba (0.0, 1.0, 0.0, 1.0) if(sm<4) uniform 0 float -2 if(sm<4) uniform 4 float 8 if(sm>=4) uniform 0 int4 -2 8 0 0 todo(sm<4) draw quad probe all rgba (1.0, 1.0, 1.0, 1.0) [require] % The ternary operator works differently in sm6. See sm6-ternary.shader_test. shader model < 6.0 [vertex shader todo(sm<4)] int a, b, c; void main(out float4 res : COLOR1, in float4 pos : position, out float4 out_pos : sv_position) { out_pos = pos; res = a ? b/1000.0 : c/1000.0; } [test] if(sm<4) uniform 0 float 0 if(sm<4) uniform 4 float 100 if(sm<4) uniform 8 float 200 if(sm>=4) uniform 0 int4 0 100 200 0 todo(sm<4) draw quad probe all rgba (0.2, 0.2, 0.2, 0.2) if(sm<4) uniform 0 float -4 if(sm<4) uniform 4 float 100 if(sm<4) uniform 8 float 200 if(sm>=4) uniform 0 int4 -4 100 200 0 todo(sm<4) draw quad probe all rgba (0.1, 0.1, 0.1, 0.1)