summaryrefslogtreecommitdiffstats
path: root/tests/spirv
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-06-11 12:31:37 -0700
committerGitHub <noreply@github.com>2024-06-11 12:31:37 -0700
commit6909d65c77bb4e7c9cfb281bd1684a58d5f8b94d (patch)
tree396a628b7fda779dcc6e820e86d44e29d0c7be95 /tests/spirv
parentef20d9309674dc8c25a9798d95138cf739299928 (diff)
SPIRV backend: add support for tessellation stages, (#4336)
Diffstat (limited to 'tests/spirv')
-rw-r--r--tests/spirv/tessellation.slang65
1 files changed, 65 insertions, 0 deletions
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<VS_OUT, 4> patch, uint i : SV_OutputControlPointID)
+{
+ HS_OUT o;
+ o.position = patch[i].position;
+ return o;
+}
+
+HSC_OUT constants(InputPatch<VS_OUT, 4> 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