diff options
| author | Tim Foley <tfoley@nvidia.com> | 2017-07-18 14:51:12 -0700 |
|---|---|---|
| committer | Tim Foley <tfoley@nvidia.com> | 2017-07-18 14:51:12 -0700 |
| commit | 2476c035ec15d3ee22239ebd1fe10e6e8c1e01e3 (patch) | |
| tree | 30e1bf209e232d7f8d6723959db68b2c0cb015dd /tests | |
| parent | 3d313d963f29f6ca6a8d12bd5c403a70c49aca2a (diff) | |
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.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/cross-compile/compile-time-loop.slang | 14 | ||||
| -rw-r--r-- | tests/cross-compile/compile-time-loop.slang.glsl | 33 |
2 files changed, 47 insertions, 0 deletions
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; +} diff --git a/tests/cross-compile/compile-time-loop.slang.glsl b/tests/cross-compile/compile-time-loop.slang.glsl new file mode 100644 index 000000000..a1f87be65 --- /dev/null +++ b/tests/cross-compile/compile-time-loop.slang.glsl @@ -0,0 +1,33 @@ +//TEST_IGNORE_FILE: + +layout(binding = 0) +uniform texture2D t; + +layout(binding = 1) +uniform sampler s; + +vec4 main_(vec2 uv) +{ + vec4 result = vec4(0); + + result += textureOffset(sampler2D(t,s), uv, ivec2(0 - 2, 0)); + result += textureOffset(sampler2D(t,s), uv, ivec2(1 - 2, 0)); + result += textureOffset(sampler2D(t,s), uv, ivec2(2 - 2, 0)); + result += textureOffset(sampler2D(t,s), uv, ivec2(3 - 2, 0)); + result += textureOffset(sampler2D(t,s), uv, ivec2(4 - 2, 0)); + + return result; +} + +layout(location = 0) +in vec2 SLANG_in_uv; + +layout(location = 0) +out vec4 SLANG_out_main_result; + +void main() +{ + vec2 uv = SLANG_in_uv; + vec4 main_result = main_(uv); + SLANG_out_main_result = main_result; +}
\ No newline at end of file |
