From 6909d65c77bb4e7c9cfb281bd1684a58d5f8b94d Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 11 Jun 2024 12:31:37 -0700 Subject: SPIRV backend: add support for tessellation stages, (#4336) --- tests/spirv/tessellation.slang | 65 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 tests/spirv/tessellation.slang (limited to 'tests') diff --git a/tests/spirv/tessellation.slang b/tests/spirv/tessellation.slang new file mode 100644 index 000000000..deb6ed298 --- /dev/null +++ b/tests/spirv/tessellation.slang @@ -0,0 +1,65 @@ +//TEST:SIMPLE(filecheck=CHECK): -target spirv + +// CHECK-DAG: OpExecutionMode %main SpacingEqual + +// CHECK-DAG: OpExecutionMode %main OutputVertices 4 + +// CHECK-DAG: OpExecutionMode %main VertexOrderCw + +// CHECK-DAG: OpExecutionMode %main Quads + +// CHECK: OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter +// CHECK: OpDecorate %gl_TessLevelOuter Patch +// CHECK: OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner +// CHECK: OpDecorate %gl_TessLevelInner Patch + +// CHECK: OpControlBarrier %uint_2 %uint_4 %uint_0 + +// CHECK: OpStore %gl_TessLevelOuter +// CHECK: OpStore %gl_TessLevelInner + +struct VS_OUT +{ + float3 position : POSITION; +}; + +struct HS_OUT +{ + float3 position : POSITION; +}; + +struct HSC_OUT +{ + float EdgeTessFactor[4] : SV_TessFactor; + float InsideTessFactor[2] : SV_InsideTessFactor; +}; + +// Hull Shader (HS) +[domain("quad")] +[partitioning("integer")] +[outputtopology("triangle_cw")] +[outputcontrolpoints(4)] +[patchconstantfunc("constants")] +HS_OUT main(InputPatch patch, uint i : SV_OutputControlPointID) +{ + HS_OUT o; + o.position = patch[i].position; + return o; +} + +HSC_OUT constants(InputPatch patch) +{ + float3 p0 = patch[0].position; + float3 p1 = patch[1].position; + float3 p2 = patch[2].position; + float3 p3 = patch[3].position; + + HSC_OUT o; + o.EdgeTessFactor[0] = dot(p0, p1); + o.EdgeTessFactor[1] = dot(p0, p3); + o.EdgeTessFactor[2] = dot(p2, p3); + o.EdgeTessFactor[3] = dot(p1, p2); + o.InsideTessFactor[0] = lerp(o.EdgeTessFactor[1], o.EdgeTessFactor[3], 0.5); + o.InsideTessFactor[1] = lerp(o.EdgeTessFactor[0], o.EdgeTessFactor[2], 0.5); + return o; +} \ No newline at end of file -- cgit v1.2.3