diff options
Diffstat (limited to 'tests/spirv')
| -rw-r--r-- | tests/spirv/array-uniform-param.slang | 40 | ||||
| -rw-r--r-- | tests/spirv/atomic-image-access.slang | 24 | ||||
| -rw-r--r-- | tests/spirv/bit-field.slang | 54 | ||||
| -rw-r--r-- | tests/spirv/direct-spirv-emit.slang | 7 | ||||
| -rw-r--r-- | tests/spirv/geometry-shader.slang | 39 | ||||
| -rw-r--r-- | tests/spirv/scalar-buffer-packing.slang | 56 |
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 |
