yum-mirror/slang

Making it easier to work with shaders

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

Ellie Hermaszewskamsvc style bitfield packing (#7963)66301ab90

master
931 B36 linesraw
1//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-cpu
2
3// Default packing keeps all fields in one backing field when they fit
4// struct MixedSizes { uint8_t a:4; uint8_t b:4; uint16_t c:8; uint16_t d:8; }
5// All packed in single uint32_t backing:
6// bits 0-3:   a (0xA)
7// bits 4-7:   b (0xB)
8// bits 8-15:  c (0xCD)
9// bits 16-23: d (0xEF)
10// Expected: 0x00EFCDBA (top 8 bits unused)
11
12// CHECK: EFCDBA
13
14//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer
15RWStructuredBuffer<uint> outputBuffer;
16
17struct MixedSizes {
18    uint8_t a : 4;   // bits 0-3
19    uint8_t b : 4;   // bits 4-7
20    uint16_t c : 8;  // bits 8-15
21    uint16_t d : 8;  // bits 16-23
22};
23
24[numthreads(1, 1, 1)]
25void computeMain()
26{
27    MixedSizes m;
28    m.a = 0xA;
29    m.b = 0xB;
30    m.c = 0xCD;
31    m.d = 0xEF;
32
33    // With default packing, all fields are in one backing field
34    outputBuffer[0] = *((uint*)&m) & 0xFFFFFF; // Mask to 24 bits
35}
36