[pixel shader todo(sm<4)] uniform float4 u; float4 main() : sv_target { if (u.x > 0.0) return float4(0.1, 0.2, 0.3, 0.4); else return float4(0.9, 0.8, 0.7, 0.6); } [test] uniform 0 float4 0.0 0.0 0.0 0.0 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.9, 0.8, 0.7, 0.6) uniform 0 float4 0.1 0.0 0.0 0.0 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) [pixel shader todo(sm<4)] uniform float4 u; float4 main() : sv_target { [attr1] if (u.x > 0.0) return float4(0.1, 0.2, 0.3, 0.4); else return float4(0.9, 0.8, 0.7, 0.6); } [pixel shader todo(sm<4)] uniform float4 u; float4 main() : sv_target { [flatten] if (u.x > 0.0) return float4(0.1, 0.2, 0.3, 0.4); else return float4(0.9, 0.8, 0.7, 0.6); } [test] uniform 0 float4 0.0 0.0 0.0 0.0 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.9, 0.8, 0.7, 0.6) [pixel shader fail(sm<6)] float4 u; float main() : sv_target { [branch] [branch] if (u.x > 0.0) return float4(0.1, 0.2, 0.3, 0.4); else return float4(0.9, 0.8, 0.7, 0.6); } [pixel shader fail todo] float4 u; float main() : sv_target { [branch] [flatten] if (u.x > 0.0) return float4(0.1, 0.2, 0.3, 0.4); else return float4(0.9, 0.8, 0.7, 0.6); } % Using older profiles fails to compile with forced control flow instruction [require] shader model >= 3.0 [pixel shader] uniform float a; float4 main() : sv_target { if (a < 4) return float4(1, 2, 3, 4); return float4(10, 20, 30, 40); } [test] uniform 0 float -2 todo(glsl) draw quad probe (0, 0) rgba (1, 2, 3, 4) uniform 0 float 10 todo(glsl) draw quad probe (0, 0) rgba (10, 20, 30, 40) [pixel shader] uniform float4 u; float4 main() : sv_target { [branch] if (u.x > 0.0) return float4(0.1, 0.2, 0.3, 0.4); else return float4(0.9, 0.8, 0.7, 0.6); } [test] uniform 0 float4 0.0 0.0 0.0 0.0 todo(glsl) draw quad probe (0, 0) rgba (0.9, 0.8, 0.7, 0.6) [pixel shader] float4 main() : sv_target { bool c = false; float a = -1.0f; if (c) return float4(1.0, 2.0, 3.0, 4.0); else if (a > 0) return float4(5.0, 6.0, 7.0, 8.0); else return float4(9.0, 10.0, 11.0, 12.0); } [test] todo(glsl) draw quad probe (0, 0) rgba (9.0, 10.0, 11.0, 12.0) [pixel shader] int a, b; float4 main() : sv_target { if (a < b) return -1.0; else return 1.0; } [test] if(sm<4) uniform 0 float 8 if(sm<4) uniform 4 float 9 if(sm>=4) uniform 0 int 8 if(sm>=4) uniform 1 int 9 todo(glsl) draw quad probe (0, 0) rgba (-1.0, -1.0, -1.0, -1.0) if(sm<4) uniform 0 float -3 if(sm<4) uniform 4 float -4 if(sm>=4) uniform 0 int -3 if(sm>=4) uniform 1 int -4 todo(glsl) draw quad probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0) if(sm<4) uniform 0 float 7 if(sm<4) uniform 4 float 7 if(sm>=4) uniform 0 int 7 if(sm>=4) uniform 1 int 7 todo(glsl) draw quad probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0) [pixel shader] int a, b; float4 main() : sv_target { if (a <= b) return -1.0; else return 1.0; } [test] if(sm<4) uniform 0 float 8 if(sm<4) uniform 4 float 9 if(sm>=4) uniform 0 int 8 if(sm>=4) uniform 1 int 9 todo(glsl) draw quad probe (0, 0) rgba (-1.0, -1.0, -1.0, -1.0) if(sm<4) uniform 0 float -3 if(sm<4) uniform 4 float -4 if(sm>=4) uniform 0 int -3 if(sm>=4) uniform 1 int -4 todo(glsl) draw quad probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0) if(sm<4) uniform 0 float 7 if(sm<4) uniform 4 float 7 if(sm>=4) uniform 0 int 7 if(sm>=4) uniform 1 int 7 todo(glsl) draw quad probe (0, 0) rgba (-1.0, -1.0, -1.0, -1.0) [pixel shader] int a, b; float4 main() : sv_target { if (a != b) return -1.0; else return 1.0; } [test] if(sm<4) uniform 0 float -3 if(sm<4) uniform 4 float -2 if(sm>=4) uniform 0 int -3 if(sm>=4) uniform 1 int -2 todo(glsl) draw quad probe (0, 0) rgba (-1.0, -1.0, -1.0, -1.0) if(sm<4) uniform 0 float 4 if(sm<4) uniform 4 float 4 if(sm>=4) uniform 0 int 4 if(sm>=4) uniform 1 int 4 todo(glsl) draw quad probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0) % Test "if" conditionals, using resource loads to ensure we aren't removing these instruction with optimizations. [srv 0] size (2d, 2, 2) 0.0 0.0 0.0 4.0 1.0 0.0 0.0 4.0 0.0 1.0 0.0 4.0 1.0 1.0 0.0 4.0 [sampler 0] filter linear linear linear address clamp clamp clamp [pixel shader todo(sm<4)] Texture2D tex; sampler sam; float a; float4 main() : sv_target { if (a < 4) return tex.Sample(sam, float2(0, 0)); return float4(1, 2, 3, 4); } [test] uniform 0 float -2 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.0, 0.0, 0.0, 4.0) uniform 0 float 4 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0) [pixel shader todo(sm<4)] Texture2D tex; sampler sam; float a; float4 main() : sv_target { if (a >= 2) return tex.Sample(sam, float2(0, 0)); else if (a >= 1) return tex.Sample(sam, float2(1, 0)); else return tex.Sample(sam, float2(1, 1)); } [test] uniform 0 float 2 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.0, 0.0, 0.0, 4.0) uniform 0 float 1 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (1.0, 0.0, 0.0, 4.0) uniform 0 float 0 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (1.0, 1.0, 0.0, 4.0)