yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
35f8e092f
master
1//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK): -vk -emit-spirv-directly -compute 2//TEST:SIMPLE(filecheck=SPIRV): -stage compute -entry computeMain -target spirv -fvk-use-c-layout 3struct A 4{ 5 uint64_t f0; 6 uint32_t f1; 7 // Padding of 4 bytes must exist in CPU layout, but not in scalar layout. 8}; 9 10struct B 11{ 12 float3 f; 13}; 14 15struct C // Total size should be 40 bytes. 16{ 17 A a; // 16 bytes, alignment 8 18 uint32_t test1; // 4 bytes, alignment 4 19 B b; // 12 bytes, alignment 4 20 uint32_t test2; // 4 bytes, alignment 4 21 bool c; // 1 bytes, alignment 1 22 bool d; // 1 bytes, alignment 1 23}; 24 25//TEST_INPUT:set cpuBuffer = ubuffer(data=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20], stride=4) 26StructuredBuffer<C, CDataLayout> cpuBuffer; 27 28//TEST_INPUT:set outputBuffer = out ubuffer(data=[0 0 0 0], stride=4) 29RWStructuredBuffer<int> outputBuffer; 30 31[numthreads(1,1,1)] 32void computeMain() 33{ 34 // The CPU layout should be the same as ScalarDataLayout, except that the 35 // size of structs is rounded up to their alignment. 36 37 // CHECK: 5 38 // CHECK: 9 39 // CHECK: F 40 // CHECK: 13 41 outputBuffer[0] = cpuBuffer[0].test1; 42 outputBuffer[1] = cpuBuffer[0].test2; 43 outputBuffer[2] = cpuBuffer[1].test1; 44 outputBuffer[3] = cpuBuffer[1].test2; 45} 46 47// SPIRV: OpMemberDecorate %A_c 0 Offset 0 48// SPIRV: OpMemberDecorate %A_c 1 Offset 8 49// SPIRV: OpMemberDecorate %B_c 0 Offset 0 50// SPIRV: OpMemberDecorate %C_c 0 Offset 0 51// SPIRV: OpMemberDecorate %C_c 1 Offset 16 52// SPIRV: OpMemberDecorate %C_c 2 Offset 20 53// SPIRV: OpMemberDecorate %C_c 3 Offset 32 54// SPIRV: OpMemberDecorate %C_c 4 Offset 36 55// SPIRV: OpMemberDecorate %C_c 5 Offset 37 56// SPIRV: OpDecorate %_runtimearr_C_c ArrayStride 40 57