yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f02b08490
master
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}