summaryrefslogtreecommitdiffstats
path: root/tests/spirv
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-09-26 23:56:06 -0700
committerGitHub <noreply@github.com>2023-09-27 14:56:06 +0800
commitebe8ddefc48478307d5f206cd3e40c41d28a36e3 (patch)
tree8e13977979909a26394eea532d8b95cd5ad0f6d1 /tests/spirv
parentc5c8cfbb360d9a763f549df48636effde839eacd (diff)
Various SPIRV fixes. (#3231)
* Various SPIRV fixes. - Geometry shader support (WIP). - Fix texture get dimension and load. - Fold global GetElement(MakeArray/MakeVector) insts. - Call spvopt to inline all functions. - Translate OpImageSubscript. - Emit struct member names and global variable names. - Fix lowering of OpBitNot -> OpNot, instead of OpBitReverse. * Fix test. * Fix geometry shader. * Fix geometry shader emit. * Add atomic Image access test. * Fix tests. * don't fail if spirv-opt fails. * Update comments. * Fix test. * Cleanups. * indentation --------- Co-authored-by: Yong He <yhe@nvidia.com> Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
Diffstat (limited to 'tests/spirv')
-rw-r--r--tests/spirv/array-uniform-param.slang40
-rw-r--r--tests/spirv/atomic-image-access.slang24
-rw-r--r--tests/spirv/bit-field.slang54
-rw-r--r--tests/spirv/direct-spirv-emit.slang7
-rw-r--r--tests/spirv/geometry-shader.slang39
-rw-r--r--tests/spirv/scalar-buffer-packing.slang56
6 files changed, 219 insertions, 1 deletions
diff --git a/tests/spirv/array-uniform-param.slang b/tests/spirv/array-uniform-param.slang
new file mode 100644
index 000000000..235e85bbd
--- /dev/null
+++ b/tests/spirv/array-uniform-param.slang
@@ -0,0 +1,40 @@
+// array-uniform-param.slang
+
+//TESTD:SIMPLE:-target spirv -entry computeMain -stage compute -emit-spirv-directly -force-glsl-scalar-layout
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUFFER):-vk -compute -output-using-type
+
+// Test direct SPIR-V emit on arrays in uniforms.
+
+//TEST_INPUT:set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4)
+RWStructuredBuffer<uint> resultBuffer;
+
+struct Data
+{
+ uint arr[4];
+}
+
+struct Data2
+{
+ uint arr[4u];
+}
+
+//TEST_INPUT: set Uniforms.d = new Data{{1,2,3,4}};
+//TEST_INPUT: set Uniforms.d2 = new Data2{{1,2,3,4}};
+
+cbuffer Uniforms
+{
+ Data d;
+ Data2 d2;
+}
+
+// BUFFER: 3
+
+[numthreads(4,1,1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ uint threadId = dispatchThreadID.x;
+ uint result = d.arr[1];
+ var u2 = reinterpret<Data>(d2);
+ result += u2.arr[0];
+ resultBuffer[threadId] = result;
+}
diff --git a/tests/spirv/atomic-image-access.slang b/tests/spirv/atomic-image-access.slang
new file mode 100644
index 000000000..1fc7cd28f
--- /dev/null
+++ b/tests/spirv/atomic-image-access.slang
@@ -0,0 +1,24 @@
+// atomic-image-access.slang
+//TEST:SIMPLE(filecheck=CHECK): -target spirv -entry computeMain -stage compute -emit-spirv-directly
+
+// The executable test is disabled because it somehow doesn't work. Might be a gfx issue.
+//TEST_DISABLED(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUFFER):-vk -compute -output-using-type
+
+// Test direct SPIR-V emit on image atomics.
+
+//TEST_INPUT:set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4)
+RWStructuredBuffer<uint> resultBuffer;
+
+// TEST_INPUT: set tex = RWTexture2D(format=R32_UINT, size=4, content=zero, mipMaps = 1)
+[vk::image_format("r32ui")]
+RWTexture2D<uint> tex;
+
+[numthreads(1,1,1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ // CHECK: OpImageTexelPointer
+ InterlockedAdd(tex[uint2(0, 0)], 1);
+ uint oldVal;
+ InterlockedAdd(tex[uint2(0, 0)], 1, oldVal);
+ resultBuffer[0] = oldVal;
+}
diff --git a/tests/spirv/bit-field.slang b/tests/spirv/bit-field.slang
new file mode 100644
index 000000000..878b4483d
--- /dev/null
+++ b/tests/spirv/bit-field.slang
@@ -0,0 +1,54 @@
+// bit-field.slang
+
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUFFER):-vk -compute -output-using-type
+
+// Test direct SPIR-V emit on bit field operations.
+
+//TEST_INPUT:set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4)
+RWStructuredBuffer<uint> resultBuffer;
+
+enum Flag
+{
+ AAA = 1,
+ BBB = 2,
+ CCC = 4,
+}
+struct Data
+{
+ uint flags;
+ [mutating] void setFlag(Flag g, bool v)
+ {
+ const uint bit = uint(g) << 8;
+ if (v) flags |= bit;
+ else flags &= ~bit;
+ }
+ bool hasFlag(Flag g)
+ {
+ const uint bit = uint(g) << 8;
+ return (flags & bit) != 0;
+ }
+}
+
+//TEST_INPUT: set Uniforms.d = new Data{0};
+cbuffer Uniforms
+{
+ Data d;
+}
+
+// BUFFER: 1
+// BUFFER: 1
+// BUFFER: 1
+// BUFFER: 0
+
+[numthreads(1,1,1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ Data d1 = d;
+ d1.setFlag(Flag.BBB, true);
+ d1.setFlag(Flag.AAA, true);
+ resultBuffer[0] = d1.hasFlag(Flag.AAA) ? 1 : 0;
+ resultBuffer[1] = d1.hasFlag(Flag.BBB) ? 1 : 0;
+ d1.setFlag(Flag.BBB, false);
+ resultBuffer[2] = d1.hasFlag(Flag.AAA) ? 1 : 0;
+ resultBuffer[3] = d1.hasFlag(Flag.BBB) ? 1 : 0;
+}
diff --git a/tests/spirv/direct-spirv-emit.slang b/tests/spirv/direct-spirv-emit.slang
index 99507f795..4cf514a3d 100644
--- a/tests/spirv/direct-spirv-emit.slang
+++ b/tests/spirv/direct-spirv-emit.slang
@@ -1,9 +1,14 @@
// direct-spirv-emit.slang
-//TEST:SIMPLE:-target spirv -entry computeMain -stage compute -emit-spirv-directly
+//TEST:SIMPLE(filecheck=CHECK):-target spirv -entry computeMain -stage compute -emit-spirv-directly
// Test ability to directly output SPIR-V
+// CHECK: OpCapability Shader
+// CHECK: OpMemoryModel Logical GLSL450
+// CHECK: OpEntryPoint GLCompute %computeMain "main"
+// CHECK: OpExecutionMode %computeMain LocalSize 4 1 1
+
[numthreads(4,1,1)]
void computeMain()
{}
diff --git a/tests/spirv/geometry-shader.slang b/tests/spirv/geometry-shader.slang
new file mode 100644
index 000000000..08080ae59
--- /dev/null
+++ b/tests/spirv/geometry-shader.slang
@@ -0,0 +1,39 @@
+//TEST:SIMPLE(filecheck=CHECK):-entry gsMain -stage geometry -target spirv -emit-spirv-directly
+
+struct GsOut
+{
+ float2 uv : TexCoord;
+ float2 texelPos : TexelPosition;
+ float4 posH : SV_Position;
+};
+
+// CHECK-DAG: OpEntryPoint Geometry %gsMain "main" %[[OUT1:[A-Za-z0-9_]+]] %[[OUT2:[A-Za-z0-9_]+]] %gl_Position
+// CHECK-DAG: %[[OUT1]] = OpVariable %_ptr_Output_v2float Output
+// CHECK-DAG: %[[OUT2]] = OpVariable %_ptr_Output_v2float Output
+// CHECK-DAG: %gl_Position = OpVariable %_ptr_Output_v4float Output
+
+// CHECK-DAG: OpExecutionMode %gsMain Invocations 1
+// CHECK-DAG: OpExecutionMode %gsMain OutputTriangleStrip
+// CHECK-DAG: OpExecutionMode %gsMain Triangles
+// CHECK-DAG: OpExecutionMode %gsMain OutputVertices 15
+
+// CHECK: OpStore %gl_Position
+// CHECK: OpEmitVertex
+// CHECK: OpEndPrimitive
+
+[maxvertexcount(15)]
+void gsMain(uint triIdx : SV_PrimitiveID, inout TriangleStream<GsOut> outStream)
+{
+ for (int j = 0; j < 5; j++)
+ {
+ for (int i = 0; i < 3; i++)
+ {
+ GsOut v;
+ v.uv = float2(j,i);
+ v.texelPos = float2(0,0);
+ v.posH = float4(j, i, 1, 1);
+ outStream.Append(v);
+ }
+ outStream.RestartStrip();
+ }
+} \ No newline at end of file
diff --git a/tests/spirv/scalar-buffer-packing.slang b/tests/spirv/scalar-buffer-packing.slang
new file mode 100644
index 000000000..bc42cfa39
--- /dev/null
+++ b/tests/spirv/scalar-buffer-packing.slang
@@ -0,0 +1,56 @@
+// scalar-buffer-packing.slang
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute
+//TEST:SIMPLE(filecheck=SPIRV): -stage compute -entry computeMain -target spirv -emit-spirv-directly -force-glsl-scalar-layout
+// Test ability to directly output SPIR-V
+
+//TEST_INPUT:set Uniforms.v0 = 1
+//TEST_INPUT:set Uniforms.v1 = { 1.0, 2.0, 3.0}
+
+cbuffer Uniforms
+{
+ bool v0;
+ float3 v1[3];
+}
+
+struct Val
+{
+ bool x;
+ int3 v1[2];
+ [mutating]
+ void set(bool v)
+ {
+ x = v;
+ v1[0].x = 1;
+ v1[0].y = 2;
+ v1[0].z = 3;
+ v1[1].x = 4;
+ v1[1].y = 5;
+ v1[1].z = 6;
+ }
+}
+
+//TEST_INPUT:set result = out ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0], stride=4)
+RWStructuredBuffer<Val> result;
+[numthreads(1,1,1)]
+void computeMain()
+{
+ // CHECK: 1
+ // CHECK: 0
+ // CHECK: 0
+ // CHECK: 0
+ // CHECK: 1
+ // CHECK: 2
+ // CHECK: 3
+ // CHECK: 0
+ // CHECK: 4
+ // CHECK: 5
+ // CHECK: 6
+
+ result[0].set(v0);
+}
+
+// SPIRV: OpEntryPoint GLCompute
+
+// SPIRV-DAG: %[[STRUCTNAME:[A-Za-z0-9_]+]] = OpTypeStruct %int %_Array_natural_int32
+
+// SPIRV-DAG: OpMemberDecorate %[[STRUCTNAME:[A-Za-z0-9_]+]] 1 Offset 4