yum-mirror/slang

Making it easier to work with shaders

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

ArielG-NV[CBP] Pointer frontend changes + groupshared pointer support (#7848)7758625d3

master
1.1 KiB56 linesraw
1//TEST:SIMPLE(filecheck=CHECK): -target spirv -emit-spirv-directly -O0
2struct TestStruct
3{
4    uint index;
5};
6
7[[vk::binding(2, 0)]] uniform uint64_t* test;
8
9struct PP
10{
11    int data;
12    int data2;
13}
14struct Data
15{
16    int data;
17    PP* pNext;
18};
19
20void funcThatTakesPointer(PP* p)
21{
22    p.data = 2;
23}
24int* funcThatReturnsPointer(PP* p)
25{
26    return &p.data;
27}
28
29// CHECK: OpEntryPoint
30
31[[vk::binding(0, 0)]] uniform Data* buffer;
32[[vk::binding(1, 0)]] RWStructuredBuffer<int> output;
33[shader("compute")]
34[numthreads(8, 8, 1)]
35void main(int id : SV_DispatchThreadID)
36{
37    TestStruct* ptr = (TestStruct*)(test[0]);
38    output[0] = buffer[ptr.index].pNext.data;
39    let pData = __getAddress(buffer[0].pNext.data);
40    // CHECK: OpPtrAccessChain
41    int* pData1 = pData + 1;
42    *pData1 = 3;
43    *(int2*)pData = int2(1, 2);
44    pData1[-1] = 2;
45    buffer[0].pNext[1] = {5};
46    // CHECK: OpConvertPtrToU
47    // CHECK: OpINotEqual
48    if (pData1)
49    {
50        *(funcThatReturnsPointer(buffer[0].pNext)) = 4;
51    }
52    if (pData1 > pData)
53    {
54        funcThatTakesPointer(buffer[0].pNext);
55    }
56}