yum-mirror/slang

Making it easier to work with shaders

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

James Helferty (NVIDIA)render-test: Change D3D12 default to sm_6_5 (#8320)f02b08490

master
2.6 KiB104 linesraw
1// bit-cast-16-bit.slang
2
3//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile sm_6_2 -shaderobj
4//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature int16,half
5//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
6
7//TEST_INPUT:ubuffer(data=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16], stride=4):name inputBuffer
8RWStructuredBuffer<int> inputBuffer;
9
10int16_t readI(inout int index) { return int16_t(inputBuffer[(index++) & 0xF]); }
11uint16_t readU(inout int index) { return int16_t(inputBuffer[(index++) & 0xF]); }
12float16_t readF(inout int index) { return float16_t(float(inputBuffer[(index++) & 0xF])); }
13
14//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
15RWStructuredBuffer<int> outputBuffer;
16
17void write(int initial, inout int index, uint value)
18{
19    let tmp = index++;
20    if((tmp & 3) == initial)
21    {
22        outputBuffer[tmp & 0xF] = int(value);
23    }
24}
25
26void write(int initial, inout int index, uint16_t value)
27{
28    write(initial, index, uint(value));
29}
30
31void write(int initial, inout int index, int16_t value)
32{
33    write(initial, index, uint(int(value)));
34}
35
36void write(int initial, inout int index, float16_t value)
37{
38    write(initial, index, asuint(float(value)));
39}
40
41
42void test(int initial)
43{
44    int input = initial;
45    int output = 0;
46
47    // Scalar
48    {
49        let i = readI(input);
50        let u = readU(input);
51        let f = readF(input);
52
53        // int->float
54        let a = asfloat16(i);
55        write(initial, output, a);
56
57        // float->uint
58        let b = asuint16(f);
59        write(initial, output, b);
60
61        // uint->int
62        let c = asint16(u);
63        write(initial, output, c);
64
65        // float->float
66        let d = asfloat16(f);
67        write(initial, output, d);
68    }
69
70    // Vector
71    {
72        let i = int16_t2(readI(input), readI(input));
73        let u = uint16_t2(readU(input), readU(input));
74        let f = float16_t2(readF(input), readF(input));
75
76        // uint->float
77        let a = asfloat16(u);
78        write(initial, output, a.x);
79        write(initial, output, a.y);
80
81        // float->int
82        let b = asint16(f);
83        write(initial, output, b.x);
84        write(initial, output, b.y);
85
86        // int->uint
87        let c = asuint16(i);
88        write(initial, output, c.x);
89        write(initial, output, c.y);
90
91        // int->int
92        let d = asint16(i);
93        write(initial, output, d.x);
94        write(initial, output, d.y);
95    }
96
97}
98
99
100[numthreads(4, 1, 1)]
101void computeMain(int3 dispatchThreadID : SV_DispatchThreadID)
102{
103    test(dispatchThreadID.x);
104}