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.4 KiB41 linesraw
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