yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
7758625d3
master
1//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-cpu -compile-arg -msvc-style-bitfield-packing 2 3// MSVC creates separate backing fields for different type sizes 4// struct MixedSizes { uint8_t a:4; uint8_t b:4; uint16_t c:8; uint16_t d:8; } 5// First backing (uint8_t): a=0xA (bits 4-7), b=0xB (bits 0-3) => 0xAB 6// Second backing (uint16_t): c=0xCD (bits 8-15), d=0xEF (bits 0-7) => 0xCDEF 7// Memory layout: [0xAB, padding, 0xCDEF] or [0xAB, padding, 0xEF, 0xCD] depending on endianness 8 9// CHECK: AB 10// CHECK-NEXT: CDEF 11 12//TEST_INPUT:ubuffer(data=[0 0], stride=4):out,name=outputBuffer 13RWStructuredBuffer<uint> outputBuffer; 14 15struct MixedSizes { 16 uint8_t a : 4; // First backing field (uint8_t) 17 uint8_t b : 4; // Same backing field 18 uint16_t c : 8; // New backing field (uint16_t) due to type change 19 uint16_t d : 8; // Same backing field 20}; 21 22groupshared MixedSizes m; 23 24typealias GroupSharedPtr<T> = Ptr<T, Access::ReadWrite, AddressSpace::GroupShared>; 25 26[numthreads(1, 1, 1)] 27void computeMain() 28{ 29 m.a = 0xA; 30 m.b = 0xB; 31 m.c = 0xCD; 32 m.d = 0xEF; 33 34 // Read the two backing fields separately 35 GroupSharedPtr<uint8_t> p8 = (GroupSharedPtr<uint8_t>)__getAddress(m); 36 GroupSharedPtr<uint16_t> p16 = (GroupSharedPtr<uint16_t>)( ((GroupSharedPtr<uint8_t>)__getAddress(m)) + 2); // Skip uint8_t + padding 37 38 outputBuffer[0] = (uint)*p8; 39 outputBuffer[1] = (uint)*p16; 40} 41