From 2476c035ec15d3ee22239ebd1fe10e6e8c1e01e3 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Tue, 18 Jul 2017 14:51:12 -0700 Subject: Add a compile-time loop construct to Slang The basic syntax is: $for(i in Range(0,99)) { /* stuff goes here */ } Note that the exact form is very restrictive. All that you are allowed to change is `i`, `0`, `99` or `/* stuff goes here */`. As a tiny bit of syntax sugar, the following should work: $for(i in Range(99)) { /* stuff goes here */ } Note that the range given is half-open (C++ iterator `[begin,end)` style). Both the beginning and end of the range must be compile-time constant expressions that Slang knows how to constant-fold. The implementation will basically generate code for `/* stuff goes here */` N times, once for each value in the half-open range. Each time, the variable `i` will be replaced with a different compile-time-constant expression. While I was working on a test case for this, I also found that our build of glslang had an issue with resource limits, so I fixed that. Clients will need to build a new glslang to use the fix. --- tests/cross-compile/compile-time-loop.slang | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tests/cross-compile/compile-time-loop.slang (limited to 'tests/cross-compile/compile-time-loop.slang') diff --git a/tests/cross-compile/compile-time-loop.slang b/tests/cross-compile/compile-time-loop.slang new file mode 100644 index 000000000..aae35f09e --- /dev/null +++ b/tests/cross-compile/compile-time-loop.slang @@ -0,0 +1,14 @@ +//TEST:CROSS_COMPILE: -profile ps_5_0 -entry main -target spirv-assembly + +Texture2D t; +SamplerState s; + +float4 main(float2 uv) : SV_Target +{ + float4 result = 0; + $for(i in Range(0,5)) + { + result += t.Sample(s, uv, int2(i - 2, 0)); + } + return result; +} -- cgit v1.2.3