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
4.9 KiB136 linesraw
1//TEST_CATEGORY(wave, compute)
2//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-directly
3//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-via-glsl
4//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -dx12 -profile sm_6_5 -shaderobj
5//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-cuda -compute  -shaderobj -xslang -DCUDA
6
7//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-directly -xslang -DUSE_GLSL_SYNTAX -allow-glsl
8
9//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
10RWStructuredBuffer<uint> outputBuffer;
11
12#if defined(USE_GLSL_SYNTAX)
13#define __partitionedInclusiveSum subgroupPartitionedInclusiveAddNV
14#define __partitionedInclusiveProduct subgroupPartitionedInclusiveMulNV
15#define __partitionedExclusiveSum subgroupPartitionedExclusiveAddNV
16#define __partitionedExclusiveProduct subgroupPartitionedExclusiveMulNV
17#else
18#define __partitionedInclusiveSum WaveMultiPrefixInclusiveSum
19#define __partitionedInclusiveProduct WaveMultiPrefixInclusiveProduct
20#define __partitionedExclusiveSum WaveMultiPrefixExclusiveSum
21#define __partitionedExclusiveProduct WaveMultiPrefixExclusiveProduct
22#endif
23
24static uint partitionedIndex = 0;
25static uint gProductValue = 0;
26
27__generic<T : __BuiltinArithmeticType>
28bool test1SumProduct(uint4 mask)
29{
30    let productValue = T(gProductValue);
31
32    return true
33        & (__partitionedInclusiveSum(T(1), mask) == T(partitionedIndex + 1))
34        & (__partitionedInclusiveProduct(productValue, mask) == productValue)
35        & (__partitionedExclusiveSum(T(1), mask) == T(partitionedIndex))
36        & (__partitionedExclusiveProduct(productValue, mask) == T(1))
37        ;
38}
39
40__generic<T : __BuiltinArithmeticType, let N : int>
41bool testVSumProduct(uint4 mask) {
42    typealias GVec = vector<T, N>;
43
44    let productValue = GVec(T(gProductValue));
45
46    return true
47        & all(__partitionedInclusiveSum(GVec(T(1)), mask) == GVec(T(partitionedIndex + 1)))
48        & all(__partitionedInclusiveProduct(productValue, mask) == productValue)
49        & all(__partitionedExclusiveSum(GVec(T(1)), mask) == GVec(T(partitionedIndex)))
50        & all(__partitionedExclusiveProduct(productValue, mask) == GVec(T(1)))
51        ;
52}
53
54bool testSumProduct(uint4 mask)
55{
56    return true
57        & test1SumProduct<int>(mask)
58        & testVSumProduct<int, 2>(mask)
59        & testVSumProduct<int, 3>(mask)
60        & testVSumProduct<int, 4>(mask)
61        & test1SumProduct<uint>(mask)
62        & testVSumProduct<uint, 2>(mask)
63        & testVSumProduct<uint, 3>(mask)
64        & testVSumProduct<uint, 4>(mask)
65        & test1SumProduct<float>(mask)
66        & testVSumProduct<float, 2>(mask)
67        & testVSumProduct<float, 3>(mask)
68        & testVSumProduct<float, 4>(mask)
69        & test1SumProduct<double>(mask)
70        & testVSumProduct<double, 2>(mask)
71        & testVSumProduct<double, 3>(mask)
72        & testVSumProduct<double, 4>(mask)
73
74#if defined(VK)
75        & test1SumProduct<int8_t>(mask)
76        & testVSumProduct<int8_t, 2>(mask)
77        & testVSumProduct<int8_t, 3>(mask)
78        & testVSumProduct<int8_t, 4>(mask)
79        & test1SumProduct<uint8_t>(mask)
80        & testVSumProduct<uint8_t, 2>(mask)
81        & testVSumProduct<uint8_t, 3>(mask)
82        & testVSumProduct<uint8_t, 4>(mask)
83#endif
84
85#if !defined(CUDA)
86        & test1SumProduct<int16_t>(mask)
87        & testVSumProduct<int16_t, 2>(mask)
88        & testVSumProduct<int16_t, 3>(mask)
89        & testVSumProduct<int16_t, 4>(mask)
90        & test1SumProduct<int64_t>(mask)
91        & testVSumProduct<int64_t, 2>(mask)
92        & testVSumProduct<int64_t, 3>(mask)
93        & testVSumProduct<int64_t, 4>(mask)
94        & test1SumProduct<uint16_t>(mask)
95        & testVSumProduct<uint16_t, 2>(mask)
96        & testVSumProduct<uint16_t, 3>(mask)
97        & testVSumProduct<uint16_t, 4>(mask)
98        & test1SumProduct<uint64_t>(mask)
99        & testVSumProduct<uint64_t, 2>(mask)
100        & testVSumProduct<uint64_t, 3>(mask)
101        & testVSumProduct<uint64_t, 4>(mask)
102        & test1SumProduct<half>(mask)
103        & testVSumProduct<half, 2>(mask)
104        & testVSumProduct<half, 3>(mask)
105        & testVSumProduct<half, 4>(mask)
106#endif
107        ;
108}
109
110[numthreads(32, 1, 1)]
111[shader("compute")]
112void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
113{
114    uint index = dispatchThreadID.x;
115    partitionedIndex = index;
116    bool isSecondGroup = false;
117
118    // Split into two groups, first group has 15 invocations/lanes and second group has 17.
119    uint4 mask = uint4(0x0007FFF, 0, 0, 0);
120    if (index >=  15)
121    {
122        isSecondGroup = true;
123        mask = uint4(0xFFFF8000, 0, 0, 0);
124        partitionedIndex -= 15;
125    }
126
127    let isLastInPartition = (index == 14) || (index == 31);
128    gProductValue = isLastInPartition ? uint(0) : uint(1);
129
130    bool result = true
131            & testSumProduct(mask)
132            ;
133
134    // CHECK-COUNT-32: 1
135    outputBuffer[index] = uint(result);
136}