yum-mirror/slang

Making it easier to work with shaders

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

Yong HeVarious SPIRV fixes. (#3231)ebe8ddefc

master
1.1 KiB54 linesraw
1// bit-field.slang
2
3//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUFFER):-vk -compute -output-using-type
4
5// Test direct SPIR-V emit on bit field operations.
6
7//TEST_INPUT:set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4)
8RWStructuredBuffer<uint> resultBuffer;
9
10enum Flag
11{
12    AAA = 1,
13    BBB = 2,
14    CCC = 4,
15}
16struct Data
17{
18    uint flags;
19    [mutating] void setFlag(Flag g, bool v)
20    {
21        const uint bit = uint(g) << 8;
22        if (v) flags |= bit;
23        else flags &= ~bit;
24    }
25    bool hasFlag(Flag g)
26    {
27        const uint bit = uint(g) << 8;
28        return (flags & bit) != 0;
29    }
30}
31
32//TEST_INPUT: set Uniforms.d = new Data{0};
33cbuffer Uniforms
34{
35    Data d;
36}
37
38// BUFFER: 1
39// BUFFER: 1
40// BUFFER: 1
41// BUFFER: 0
42
43[numthreads(1,1,1)]
44void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
45{
46    Data d1 = d;
47    d1.setFlag(Flag.BBB, true);
48    d1.setFlag(Flag.AAA, true);
49    resultBuffer[0] = d1.hasFlag(Flag.AAA) ? 1 : 0;
50    resultBuffer[1] = d1.hasFlag(Flag.BBB) ? 1 : 0;
51    d1.setFlag(Flag.BBB, false);
52    resultBuffer[2] = d1.hasFlag(Flag.AAA) ? 1 : 0;
53    resultBuffer[3] = d1.hasFlag(Flag.BBB) ? 1 : 0;
54}