% TODO: dxcompiler emits no loops for any of these test shaders. [pixel shader] float a; float4 main() : sv_target { float res = 0; for (int i = 0; i < 10; ++i) { res += a; // The temp copy of 'a' must reserve its registers for the rest of the loop. // It shall not be overwritten. } return res; } [test] uniform 0 float 5.0 todo(glsl) draw quad probe (0, 0) rgba (50.0, 50.0, 50.0, 50.0) [pixel shader] float a; float4 main() : sv_target { float res = 0; for (int i = 0; i < 10; ++i) { res += a; // The temp copy of 'a' must reserve its registers for the rest of the loop. // It shall not be overwritten. i++; } return res; } [test] uniform 0 float 4.0 todo(glsl) draw quad probe (0, 0) rgba (20.0, 20.0, 20.0, 20.0) [pixel shader] float a; float4 main() : sv_target { int i = 0; float res = a; while (i < 10) { if (i == 5) { res += 0.1f; break; } res += 1.0f; i++; if (i == 2) continue; res += 100.f; } return res; } [test] uniform 0 float 4.0 todo(glsl) draw quad probe (0, 0) rgba (409.1, 409.1, 409.1, 409.1) [pixel shader] float a; float4 main() : sv_target { int i = 0; float res = a; do { res += 1.0f; if (i == 5) { res += 0.1f; break; } i++; if (i == 2) continue; res += 100.f; } while (i < 10); return res; } [test] uniform 0 float 4.0 todo(glsl) draw quad probe (0, 0) rgba (410.1, 410.1, 410.1, 410.1) % loop attribute by itself [pixel shader todo(sm<4)] float4 main() : sv_target { float ret = 0.0; [loop] for (int i = 0; i < 10; ++i) { ret += 1.0; } return ret; } [test] todo(sm<4 | glsl) draw quad probe (0, 0) rgba (10.0, 10.0, 10.0, 10.0) [pixel shader todo(sm<4)] float4 main() : sv_target { float ret = 0.0; int i = 0; [loop] while (i < 10) { ret += 1.0; i++; } return ret; } [test] todo(sm<4 | glsl) draw quad probe (0, 0) rgba (10.0, 10.0, 10.0, 10.0) [pixel shader todo(sm<4)] float4 main() : sv_target { float ret = 0.0; int i = 0; [loop] do { i++; ret += 1.0; } while (i < 10); return ret; } [test] todo(sm<4 | glsl) draw quad probe (0, 0) rgba (10.0, 10.0, 10.0, 10.0) % unroll can't be used with fastopt or loop [pixel shader fail] float4 main() : sv_target { float ret = 0.0; [loop] [unroll(1)] for (int i = 0; i < 10; ++i) { ret += 1.0; } return ret; } [pixel shader fail] float4 main() : sv_target { float ret = 0.0; [fastopt] [unroll(1)] for (int i = 0; i < 10; ++i) { ret += 1.0; } return ret; } [pixel shader fail] float4 main() : sv_target { float ret = 0.0; int i = 0; [loop] [unroll(1)] while (i < 10) { ret += 1.0; i++; } return ret; } [pixel shader fail] float4 main() : sv_target { float ret = 0.0; int i = 0; [fastopt] [unroll(1)] while (i < 10) { ret += 1.0; i++; } return ret; } [pixel shader fail] float4 main() : sv_target { float ret = 0.0; int i = 0; [loop] [unroll(1)] do { ret += 1.0; i++; } while (i < 10) return ret; } [pixel shader fail] float4 main() : sv_target { float ret = 0.0; int i = 0; [fastopt] [unroll(1)] do { ret += 1.0; i++; } while (i < 10) return ret; }