yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
7758625d3
master
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}