From cbe55261ce07c9f737b5117dd1f703950190d843 Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 25 Mar 2024 09:24:04 -0700 Subject: Fix missing PerPrimitive decoration in mesh shader output. (#3828) --- tests/spirv/mesh-primitive.slang | 64 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 tests/spirv/mesh-primitive.slang (limited to 'tests') diff --git a/tests/spirv/mesh-primitive.slang b/tests/spirv/mesh-primitive.slang new file mode 100644 index 000000000..4daf21749 --- /dev/null +++ b/tests/spirv/mesh-primitive.slang @@ -0,0 +1,64 @@ +//TEST:SIMPLE(filecheck=CHECK): -target spirv -emit-spirv-directly + +// CHECK: OpDecorate %primitives_color Location 0 +// CHECK: OpDecorate %primitives_color PerPrimitive +// CHECK: OpDecorate %prim_color Location 0 +// CHECK: OpDecorate %prim_color Flat + +const static uint MAX_VERTS = 6; +const static uint MAX_PRIMS = 2; + +const static float2 positions[MAX_VERTS] = { + float2(0.0, -0.5), + float2(0.5, 0), + float2(-0.5, 0), + float2(0.0, 0.5), + float2(0.5, 0), + float2(-0.5, 0), +}; + +struct Vertex +{ + float4 pos : SV_Position; +}; + +struct Primitive +{ + [[vk::location(0)]] float3 color; +} + +[outputtopology("triangle")] +[numthreads(MAX_VERTS, 1, 1)] +[shader("mesh")] +void entry_mesh( + in uint tig : SV_GroupThreadID, + OutputVertices verts, + OutputIndices triangles, + OutputPrimitives primitives) +{ + const uint numVertices = MAX_VERTS; + const uint numPrimitives = MAX_PRIMS; + SetMeshOutputCounts(numVertices, numPrimitives); + + if(tig < numVertices) { + verts[tig] = {float4(positions[tig], 0, 1)}; + } + + if(tig < numPrimitives) { + triangles[tig] = uint3(0,1,2) + tig * 3; + primitives[tig] = { float3(1,0,0) }; + } +} + +struct FragmentOut +{ + [[vk::location(0)]] float3 color; +}; + +[shader("fragment")] +FragmentOut entry_fragment(in nointerpolation Primitive prim) +{ + FragmentOut frag_out; + frag_out.color = prim.color; + return frag_out; +} \ No newline at end of file -- cgit v1.2.3