yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Jay KwakRe-enable spirv-validation, because the issue is no longer repro (#7082)dd275dd95

master
1.4 KiB64 linesraw
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}