% Test early return from the entry point. [pixel shader] float4 main() : sv_target { return float4(0.1, 0.2, 0.3, 0.4); return float4(0.5, 0.6, 0.7, 0.8); } [test] draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) [pixel shader] void main(out float4 ret : sv_target) { ret = float4(0.1, 0.2, 0.3, 0.4); return; ret = float4(0.5, 0.6, 0.7, 0.8); } [test] draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) [pixel shader todo(sm<4)] uniform float f; float4 main() : sv_target { if (f < 0.5) return float4(0.1, 0.2, 0.3, 0.4); return float4(0.5, 0.6, 0.7, 0.8); } [test] uniform 0 float 0.2 todo(sm<4) draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) uniform 0 float 0.8 todo(sm<4) draw quad probe (0, 0) rgba (0.5, 0.6, 0.7, 0.8) [pixel shader todo(sm<4)] uniform float f; void main(out float4 ret : sv_target) { ret = float4(0.1, 0.2, 0.3, 0.4); if (f < 0.5) { ret += 0.1; } else { return; ret += 0.3; } ret += 0.1; } [test] uniform 0 float 0.2 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.3, 0.4, 0.5, 0.6) uniform 0 float 0.8 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) [pixel shader todo(sm<4)] uniform float f; void main(out float4 ret : sv_target) { ret = float4(0.1, 0.2, 0.3, 0.4); if (f < 0.3) { return; } ret += 0.1; if (f < 0.7) { return; } ret += 0.3; } [test] uniform 0 float 0.1 todo(sm<4) draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) 1 uniform 0 float 0.5 todo(sm<4) draw quad probe (0, 0) rgba (0.2, 0.3, 0.4, 0.5) 1 uniform 0 float 0.9 todo(sm<4) draw quad probe (0, 0) rgba (0.5, 0.6, 0.7, 0.8) 1 [pixel shader todo(sm<4)] uniform float f; void main(out float4 ret : sv_target) { ret = float4(0.1, 0.2, 0.3, 0.4); if (f < 0.7) { if (f < 0.3) return; ret += 0.1; } ret += 0.3; } [test] uniform 0 float 0.1 todo(sm<4) draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) 1 uniform 0 float 0.5 todo(sm<4) draw quad probe (0, 0) rgba (0.5, 0.6, 0.7, 0.8) 1 uniform 0 float 0.9 todo(sm<4) draw quad probe (0, 0) rgba (0.4, 0.5, 0.6, 0.7) 1 [pixel shader] void main(out float4 ret : sv_target) { ret = float4(0.1, 0.2, 0.3, 0.4); for (;;) { ret *= 2; return; ret *= 3; } ret += 0.1; } [test] draw quad probe (0, 0) rgba (0.2, 0.4, 0.6, 0.8) [pixel shader todo(sm<4)] uniform float f; void main(out float4 ret : sv_target) { int i; ret = 0.1; for (i = 0; i < 4; ++i) { if (ret.x > f) return; ret *= 2; } ret = 0.9; } [test] uniform 0 float 0.0 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.1, 0.1, 0.1, 0.1) 1 uniform 0 float 0.1 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2) 1 uniform 0 float 0.3 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.4, 0.4, 0.4, 0.4) 1 uniform 0 float 0.7 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.8, 0.8, 0.8, 0.8) 1 uniform 0 float 0.9 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.9, 0.9, 0.9, 0.9) 1 [pixel shader todo(sm<4)] uniform float f; void main(out float4 ret : sv_target) { if (f < 0.5) { ret = 0.1; for (;;) { ret *= 2; return; } ret *= 3; return; } else { ret = 0.4; } ret = 0.5; } [test] uniform 0 float 0.2 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2) uniform 0 float 0.8 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.5, 0.5, 0.5, 0.5) [pixel shader todo(sm<4)] uniform float4 f[3]; void main(out float4 ret : sv_target) { int i, j; ret = 0.1; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { if (ret.x > f[j].x) return; } ret *= 2; } ret = 0.9; } [test] uniform 0 float4 0.3 0.0 0.0 0.0 uniform 4 float4 0.0 0.0 0.0 0.0 uniform 8 float4 0.1 0.0 0.0 0.0 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.1, 0.1, 0.1, 0.1) 1 uniform 4 float4 0.35 0.0 0.0 0.0 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2) 1 uniform 8 float4 0.5 0.0 0.0 0.0 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.4, 0.4, 0.4, 0.4) 1 uniform 0 float4 1.0 0.0 0.0 0.0 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.4, 0.4, 0.4, 0.4) 1 uniform 4 float4 2.0 0.0 0.0 0.0 todo(sm<4 | glsl) draw quad probe (0, 0) rgba (0.9, 0.9, 0.9, 0.9) 1