yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
dd275dd95
master
1//TEST:SIMPLE(filecheck=CHECK): -target spirv -emit-spirv-directly 2 3// CHECK: OpDecorate %primitives_color Location 0 4// CHECK: OpDecorate %primitives_color PerPrimitive 5// CHECK: OpDecorate %prim_color Location 0 6// CHECK: OpDecorate %prim_color Flat 7 8const static uint MAX_VERTS = 6; 9const static uint MAX_PRIMS = 2; 10 11const static float2 positions[MAX_VERTS] = { 12 float2(0.0, -0.5), 13 float2(0.5, 0), 14 float2(-0.5, 0), 15 float2(0.0, 0.5), 16 float2(0.5, 0), 17 float2(-0.5, 0), 18}; 19 20struct Vertex 21{ 22 float4 pos : SV_Position; 23}; 24 25struct Primitive 26{ 27 [[vk::location(0)]] float3 color; 28} 29 30[outputtopology("triangle")] 31[numthreads(MAX_VERTS, 1, 1)] 32[shader("mesh")] 33void entry_mesh( 34 in uint tig : SV_GroupThreadID, 35 OutputVertices<Vertex, MAX_VERTS> verts, 36 OutputIndices<uint3, MAX_PRIMS> triangles, 37 OutputPrimitives<Primitive, MAX_PRIMS> primitives) 38{ 39 const uint numVertices = MAX_VERTS; 40 const uint numPrimitives = MAX_PRIMS; 41 SetMeshOutputCounts(numVertices, numPrimitives); 42 43 if(tig < numVertices) { 44 verts[tig] = {float4(positions[tig], 0, 1)}; 45 } 46 47 if(tig < numPrimitives) { 48 triangles[tig] = uint3(0,1,2) + tig * 3; 49 primitives[tig] = { float3(1,0,0) }; 50 } 51} 52 53struct FragmentOut 54{ 55 [[vk::location(0)]] float3 color; 56}; 57 58[shader("fragment")] 59FragmentOut entry_fragment(in nointerpolation Primitive prim) 60{ 61 FragmentOut frag_out; 62 frag_out.color = prim.color; 63 return frag_out; 64}