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
6.9 KiB177 linesraw
1//TEST(compute):SIMPLE(filecheck=CHECK_SPV): -target spirv
2//TEST(compute):SIMPLE(filecheck=CHECK_GLSL): -target glsl
3//TEST(compute):SIMPLE(filecheck=CHECK_METAL): -target metal
4//TEST(compute):SIMPLE(filecheck=CHECK_WGSL): -target wgsl
5
6//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -shaderobj -emit-spirv-via-glsl -output-using-type
7//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -shaderobj -emit-spirv-directly -output-using-type -allow-glsl
8//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-slang -compute -profile cs_6_6 -dx12 -shaderobj -render-feature hardware-device -output-using-type
9//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-metal -compute -shaderobj -output-using-type
10//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-cpu -compute -shaderobj -output-using-type -allow-glsl
11
12// 16 bit variants are not supported by WGSL.
13//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-wgpu -compute -shaderobj -xslang -DWGSL -render-feature half -output-using-type
14// Debug info for inlining errors can be given out, so disable them for this test.
15//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-cuda -compute -g0 -output-using-type
16
17//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
18RWStructuredBuffer<uint> outputBuffer;
19
20bool verifyResult<T: IFloat> (T expected, T actual, T tolerance)
21{
22    return (expected - tolerance) <= actual && actual <= (expected + tolerance);
23}
24
25bool verifyResultVector<T: IFloat, let N: int>(vector<T, N> expected, vector<T, N> actual, T tolerance = T(0.01))
26{
27    bool isValid = true;
28    for (int i = 0; i < N; ++i)
29        isValid = isValid && verifyResult(expected[i], actual[i], tolerance);
30    return isValid;
31}
32
33[numthreads(1, 1, 1)]
34void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
35{
36    uint index = 0U;
37
38    //
39    // Unorm4x8
40    //
41    // CHECK_SPV: OpExtInst{{.*}} PackUnorm4x8
42    // CHECK_SPV: OpExtInst{{.*}} UnpackUnorm4x8
43    //
44    // CHECK_GLSL: (unpackUnorm4x8
45    // CHECK_GLSL: (packUnorm4x8
46    //
47    // CHECK_METAL: unpack_unorm4x8_to_float
48    // CHECK_METAL: pack_float_to_unorm4x8
49    // CHECK_METAL: unpack_unorm4x8_to_half
50    // CHECK_METAL: pack_half_to_unorm4x8
51    //
52    // CHECK_WGSL: (unpack4x8unorm
53    // CHECK_WGSL: (pack4x8unorm
54    //
55    float4 unorm4x8Expected = float4(0.777, 0.233, 0.931, 0.777);
56    uint unorm4x8Packed = packUnorm4x8(unorm4x8Expected);
57    float4 unorm4x8Actual = unpackUnorm4x8ToFloat(unorm4x8Packed);
58    // BUF: 1
59    outputBuffer[index++] = verifyResultVector(unorm4x8Expected, unorm4x8Actual);
60
61    half4 unorm4x8HalfExpected = half4(0.123h, 0.456h, 0.789h, 0.321h);
62    uint unorm4x8HalfPacked = packUnorm4x8(unorm4x8HalfExpected);
63    half4 unorm4x8HalfActual = unpackUnorm4x8ToHalf(unorm4x8HalfPacked);
64    // BUF-NEXT: 1
65    outputBuffer[index++] = verifyResultVector(unorm4x8HalfExpected, unorm4x8HalfActual);
66
67    //
68    // Snorm4x8
69    //
70    // CHECK_SPV: OpExtInst{{.*}} PackSnorm4x8
71    // CHECK_SPV: OpExtInst{{.*}} UnpackSnorm4x8
72    //
73    // CHECK_GLSL: (unpackSnorm4x8
74    // CHECK_GLSL: (packSnorm4x8
75    //
76    // CHECK_METAL: unpack_snorm4x8_to_float
77    // CHECK_METAL: pack_float_to_snorm4x8
78    // CHECK_METAL: unpack_snorm4x8_to_half
79    // CHECK_METAL: pack_half_to_snorm4x8
80    //
81    // CHECK_WGSL: (unpack4x8snorm
82    // CHECK_WGSL: (pack4x8snorm
83    //
84    float4 snorm4x8Expected = float4(-0.500, 0.250, -0.750, 0.999);
85    uint snorm4x8Packed = packSnorm4x8(snorm4x8Expected);
86    float4 snorm4x8Actual = unpackSnorm4x8ToFloat(snorm4x8Packed);
87    // BUF-NEXT: 1
88    outputBuffer[index++] = verifyResultVector(snorm4x8Expected, snorm4x8Actual);
89
90    half4 snorm4x8HalfExpected = half4(-0.333h, 0.666h, -1.000h, 0.500h);
91    uint snorm4x8HalfPacked = packSnorm4x8(snorm4x8HalfExpected);
92    half4 snorm4x8HalfActual = unpackSnorm4x8ToHalf(snorm4x8HalfPacked);
93    // BUF-NEXT: 1
94    outputBuffer[index++] = verifyResultVector(snorm4x8HalfExpected, snorm4x8HalfActual);
95
96    //
97    // Unorm2x16
98    //
99    // CHECK_SPV: OpExtInst{{.*}} PackUnorm2x16
100    // CHECK_SPV: OpExtInst{{.*}} UnpackUnorm2x16
101    //
102    // CHECK_GLSL: (unpackUnorm2x16
103    // CHECK_GLSL: (packUnorm2x16
104    //
105    // CHECK_METAL: unpack_unorm2x16_to_float
106    // CHECK_METAL: pack_float_to_unorm2x16
107    // CHECK_METAL: unpack_unorm2x16_to_half
108    // CHECK_METAL: pack_half_to_unorm2x16
109    //
110    // CHECK_WGSL: (unpack2x16unorm
111    // CHECK_WGSL: (pack2x16unorm
112    //
113    float2 unorm2x16Expected = float2(0.1234, 0.8765);
114    uint unorm2x16Packed = packUnorm2x16(unorm2x16Expected);
115    float2 unorm2x16Actual = unpackUnorm2x16ToFloat(unorm2x16Packed);
116    // BUF-NEXT: 1
117    outputBuffer[index++] = verifyResultVector(unorm2x16Expected, unorm2x16Actual);
118
119    half2 unorm2x16HalfExpected = half2(0.7777h, 0.7777h);
120    uint unorm2x16HalfPacked = packUnorm2x16(unorm2x16HalfExpected);
121    half2 unorm2x16HalfActual = unpackUnorm2x16ToHalf(unorm2x16HalfPacked);
122    // BUF-NEXT: 1
123    outputBuffer[index++] = verifyResultVector(unorm2x16HalfExpected, unorm2x16HalfActual);
124
125    //
126    // Snorm2x16
127    //
128    // CHECK_SPV: OpExtInst{{.*}} UnpackSnorm2x16
129    // CHECK_SPV: OpExtInst{{.*}} PackSnorm2x16
130    //
131    // CHECK_GLSL: (unpackSnorm2x16
132    // CHECK_GLSL: (packSnorm2x16
133    //
134    // CHECK_METAL: unpack_snorm2x16_to_float
135    // CHECK_METAL: pack_float_to_snorm2x16
136    // CHECK_METAL: unpack_snorm2x16_to_half
137    // CHECK_METAL: pack_half_to_snorm2x16
138    //
139    // CHECK_WGSL: (unpack2x16snorm
140    // CHECK_WGSL: (pack2x16snorm
141    //
142    float2 snorm2x16Expected = float2(-0.4444, 0.8888);
143    uint snorm2x16Packed = packSnorm2x16(snorm2x16Expected);
144    float2 snorm2x16Actual = unpackSnorm2x16ToFloat(snorm2x16Packed);
145    // BUF-NEXT: 1
146    outputBuffer[index++] = verifyResultVector(snorm2x16Expected, snorm2x16Actual);
147
148    half2 snorm2x16HalfExpected = half2(-0.9999h, 0.3333h);
149    uint snorm2x16HalfPacked = packSnorm2x16(snorm2x16HalfExpected);
150    half2 snorm2x16HalfActual = unpackSnorm2x16ToHalf(snorm2x16HalfPacked);
151    // BUF-NEXT: 1
152    outputBuffer[index++] = verifyResultVector(snorm2x16HalfExpected, snorm2x16HalfActual);
153
154    //
155    // Half2x16
156    //
157    // CHECK_SPV: OpExtInst{{.*}} UnpackHalf2x16
158    // CHECK_SPV: OpExtInst{{.*}} PackHalf2x16
159    //
160    // CHECK_GLSL: (unpackHalf2x16
161    // CHECK_GLSL: (packHalf2x16
162    //
163    // CHECK_WGSL: (unpack2x16float
164    // CHECK_WGSL: (pack2x16float
165    //
166    float2 half2x16Expected = float2(130.32, -12.12);
167    uint half2x16Packed = packHalf2x16(half2x16Expected);
168    float2 half2x16Actual = unpackHalf2x16ToFloat(half2x16Packed);
169    // BUF-NEXT: 1
170    outputBuffer[index++] = verifyResultVector(half2x16Expected.x, half2x16Actual.x, 0.1);
171
172    half2 half2x16HalfExpected = half2(-2.1111h, 4450.9999h);
173    uint half2x16HalfPacked = packHalf2x16(half2x16HalfExpected);
174    half2 half2x16HalfActual = unpackHalf2x16ToHalf(half2x16HalfPacked);
175    // BUF-NEXT: 1
176    outputBuffer[index++] = verifyResultVector(half2x16HalfExpected, half2x16HalfActual);
177}