yum-mirror/slang

Making it easier to work with shaders

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

dubiousconst282Add generic descriptor indexing intrinsic (#4389)efa8d1ab4

master
1.8 KiB59 linesraw
1//TEST:SIMPLE(filecheck=CHECK): -stage compute -entry computeMain -target glsl
2//TEST:REFLECTION: -stage compute -entry computeMain -target glsl
3
4// CHECK-DAG: layout(binding = 0, set = 1)
5// CHECK-DAG: texture2D g_TextureHeap_1[]
6
7// CHECK-DAG: layout(binding = 0, set = 1)
8// CHECK-DAG: utexture2D g_TextureHeap_0[]
9
10[vk::binding(0, 1)]
11__DynamicResource<__DynamicResourceKind.General> g_TextureHeap[];
12
13// CHECK-DAG: layout(binding = 2, set = 1)
14// CHECK-DAG: sampler g_SamplerHeap_0[]
15[vk::binding(2, 1)]
16__DynamicResource<__DynamicResourceKind.Sampler> g_SamplerHeap[];
17
18// CHECK-DAG: layout(binding = 0, set = 2)
19// CHECK-DAG: texture2D g_SingleDynamicResourceA_0;
20[vk::binding(0, 2)]
21__DynamicResource g_SingleDynamicResourceA;
22
23// CHECK-DAG: layout(binding = 1, set = 2)
24// CHECK-DAG: texture2D g_SingleDynamicResourceB_0;
25[vk::binding(1, 2)]
26__DynamicResource g_SingleDynamicResourceB;
27
28// CHECK-DAG: layout(std430, binding = 2, set = 2) buffer
29[vk::binding(2, 2)]
30__DynamicResource g_SingleDynamicResourceC;
31
32// CHECK: IndirectAccess_0
33// CHECK: g_TextureHeap_0[_S1]
34[noinline]
35float4 IndirectAccess(__DynamicResource resource, int2 pos)
36{
37    let texture = resource.as<Texture2D<uint4>>();
38    return texture[pos] / 255.0;
39}
40
41// CHECK: main
42// CHECK-DAG: g_TextureHeap_1[3]
43// CHECK-DAG: g_SamplerHeap_0[2]
44[numthreads(16)]
45void computeMain(int2 tid: SV_DispatchThreadID)
46{
47    Texture2D texture = g_TextureHeap[3];
48    SamplerState sampler = g_SamplerHeap[2].as<SamplerState>();
49
50    float4 value = texture.SampleLevel(sampler, tid / 64.0, 0.0);
51
52    value += IndirectAccess(g_TextureHeap[1], tid);
53
54    value += g_SingleDynamicResourceA.as<Texture2D>()[tid];
55    value += g_SingleDynamicResourceB.as<Texture2D>()[tid];
56
57    RWStructuredBuffer<float4> outputBuffer = g_SingleDynamicResourceC;
58    outputBuffer[tid.x + tid.y * 64] = value;
59}