summaryrefslogtreecommitdiffstats
path: root/tests/compute
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2017-11-17 07:09:58 -0800
committerGitHub <noreply@github.com>2017-11-17 07:09:58 -0800
commit0298a0427bbfe19700169c4e239a1b9e91baa410 (patch)
tree659dfa11e5bc687bf8baab2a7b9f39708922671e /tests/compute
parent0e3d9ba255b86c11521a951183d38bffae008559 (diff)
IR: support `CompileTimeForStmt` (#286)
This statement type is a bit of a hack, to support loops that *must* be unrolled. The AST-to-AST pass handles them by cloning the AST for the loop body N times, and it was easy enough to do the same thing for the IR: emit the instructions for the body N times. The only thing that requires a bit of care is that now we might see the same variable declarations multiple times, so we need to play it safe and overwrite existing entries in our map from declarations to their IR values. Of course a better answer long-term would be to do the actual unrolling in the IR. This is especially true because we might some day want to support compile-time/must-unroll loops in functions, where the loop counter comes in as a parameter (but must still be compile-time-constant at every call site).
Diffstat (limited to 'tests/compute')
-rw-r--r--tests/compute/compile-time-loop.slang92
-rw-r--r--tests/compute/compile-time-loop.slang.expected.txt1
2 files changed, 93 insertions, 0 deletions
diff --git a/tests/compute/compile-time-loop.slang b/tests/compute/compile-time-loop.slang
new file mode 100644
index 000000000..43b35d42b
--- /dev/null
+++ b/tests/compute/compile-time-loop.slang
@@ -0,0 +1,92 @@
+//TEST(compute):COMPARE_RENDER_COMPUTE:-xslang -use-ir
+
+//TEST_INPUT: Texture2D(size=4, content = one) : dxbinding(0),glbinding(0)
+//TEST_INPUT: Sampler : dxbinding(0),glbinding(0)
+
+//TEST_INPUT: ubuffer(data=[0], stride=4):dxbinding(1),glbinding(0),out
+
+Texture2D t;
+SamplerState s;
+RWStructuredBuffer<float> outputBuffer;
+
+cbuffer Uniforms
+{
+ float4x4 modelViewProjection;
+}
+
+struct AssembledVertex
+{
+ float3 position;
+ float3 color;
+ float2 uv;
+};
+
+struct CoarseVertex
+{
+ float3 color;
+ float2 uv;
+};
+
+struct Fragment
+{
+ float4 color;
+};
+
+// Vertex Shader
+
+struct VertexStageInput
+{
+ AssembledVertex assembledVertex : A;
+};
+
+struct VertexStageOutput
+{
+ CoarseVertex coarseVertex : CoarseVertex;
+ float4 sv_position : SV_Position;
+};
+
+VertexStageOutput vertexMain(VertexStageInput input)
+{
+ VertexStageOutput output;
+
+ float3 position = input.assembledVertex.position;
+ float3 color = input.assembledVertex.color;
+
+ output.coarseVertex.color = color;
+ output.sv_position = mul(modelViewProjection, float4(position, 1.0));
+ output.coarseVertex.uv = input.assembledVertex.uv;
+ return output;
+}
+
+// Fragment Shader
+
+struct FragmentStageInput
+{
+ CoarseVertex coarseVertex : CoarseVertex;
+};
+
+struct FragmentStageOutput
+{
+ Fragment fragment : SV_Target;
+};
+
+FragmentStageOutput fragmentMain(FragmentStageInput input)
+{
+ FragmentStageOutput output;
+
+ float3 color = input.coarseVertex.color;
+ float2 uv = input.coarseVertex.uv;
+ output.fragment.color = float4(color, 1.0);
+
+
+ float4 result = 0;
+ $for(i in Range(0,5))
+ {
+ float4 v = t.Sample(s, uv, int2(i - 2, 0));
+ result += v;
+ }
+
+ outputBuffer[0] = result.x;
+
+ return output;
+}
diff --git a/tests/compute/compile-time-loop.slang.expected.txt b/tests/compute/compile-time-loop.slang.expected.txt
new file mode 100644
index 000000000..2b58069cf
--- /dev/null
+++ b/tests/compute/compile-time-loop.slang.expected.txt
@@ -0,0 +1 @@
+40A00000