yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f02b08490
master
1//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-slang -compute -output-using-type 2//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-slang -compute -output-using-type -dx12 -profile cs_6_6 3//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -shaderobj -output-using-type 4//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -shaderobj -output-using-type -emit-spirv-directly 5//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-cpu -compute -output-using-type 6//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-cuda -compute -output-using-type 7//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUF):-slang -shaderobj -mtl -output-using-type 8 9// Slang removes parentheses characters for the bitwise operators when they are not needed. 10// DXC prints warning messages even when the expression is correct. 11// We are snoozing the warning and testing it here to prevent a regression. 12 13//TEST_INPUT: ubuffer(data=[0 1 2 3 4 5 6 7 8 9], stride=4):name inputBuffer 14RWStructuredBuffer<int> inputBuffer; 15 16//TEST_INPUT: ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer 17RWStructuredBuffer<int> outputBuffer; 18 19// -----------+----------+------------------------------+--------------- 20// Precedence | Operator | Description | Associativity 21// -----------+----------+------------------------------+--------------- 22// 4 | + - | Addition and subtraction | Left-to-right 23// -----------+----------+------------------------------+ 24// 5 | << >> | Bitwise left and right shift | 25// -----------+----------+------------------------------+ 26// 8 | & | Bitwise AND | 27// -----------+----------+------------------------------+ 28// 9 | ^ | Bitwise XOR (exclusive or) | 29// -----------+----------+------------------------------+ 30// 10 | | | Bitwise OR (inclusive or) | 31// -----------+----------+------------------------------+--------------- 32 33bool Test_And_Or() 34{ 35 uint32_t a = inputBuffer[1]; 36 uint32_t b = inputBuffer[3]; 37 uint32_t c = inputBuffer[2]; 38 uint32_t d = inputBuffer[6]; 39 40 return true 41 && 3 == ((a & b) | (c & d)) 42 && 0 == (a & (b | c) & d) 43 && 2 == (((a & b) | c) & d) 44 && 1 == (a & (b | (c & d))) 45 && 3 == (a & b | c & d) 46 47 && 2 == ((a | b) & (c | d)) 48 && 7 == (a | (b & c) | d) 49 && 6 == (((a | b) & c) | d) 50 && 3 == (a | (b & (c | d))) 51 && 7 == (a | b & c | d) 52 ; 53} 54 55bool Test_And_Xor() 56{ 57 uint32_t a = inputBuffer[1]; 58 uint32_t b = inputBuffer[3]; 59 uint32_t c = inputBuffer[2]; 60 uint32_t d = inputBuffer[6]; 61 62 return true 63 && 3 == ((a & b) ^ (c & d)) 64 && 0 == (a & (b ^ c) & d) 65 && 2 == (((a & b) ^ c) & d) 66 && 1 == (a & (b ^ (c & d))) 67 && 3 == (a & b ^ c & d) 68 69 && 0 == ((a ^ b) & (c ^ d)) 70 && 5 == (a ^ (b & c) ^ d) 71 && 4 == (((a ^ b) & c) ^ d) 72 && 1 == (a ^ (b & (c ^ d))) 73 && 5 == (a ^ b & c ^ d) 74 ; 75} 76 77bool Test_Xor_Or() 78{ 79 uint32_t a = inputBuffer[1]; 80 uint32_t b = inputBuffer[4]; 81 uint32_t c = inputBuffer[2]; 82 uint32_t d = inputBuffer[7]; 83 84 return true 85 && 5 == ((a ^ b) | (c ^ d)) 86 && 0 == (a ^ (b | c) ^ d) 87 && 0 == (((a ^ b) | c) ^ d) 88 && 4 == (a ^ (b | (c ^ d))) 89 && 5 == (a ^ b | c ^ d) 90 91 && 2 == ((a | b) ^ (c | d)) 92 && 7 == (a | (b ^ c) | d) 93 && 7 == (((a | b) ^ c) | d) 94 && 3 == (a | (b ^ (c | d))) 95 && 7 == (a | b ^ c | d) 96 ; 97} 98 99bool Test_LShift_RShift() 100{ 101 uint32_t a = inputBuffer[4]; 102 uint32_t b = inputBuffer[1]; 103 uint32_t c = inputBuffer[2]; 104 uint32_t d = inputBuffer[3]; 105 106 return true 107 && 0 == ((a << b) >> (c << d)) 108 && 32 == (a << (b >> c) << d) 109 && 16 == (((a << b) >> c) << d) 110 && 4 == (a << (b >> (c << d))) 111 && 16 == (a << b >> c << d) 112 113 && 2 == ((a >> b) << (c >> d)) 114 && 0 == (a >> (b << c) >> d) 115 && 1 == (((a >> b) << c) >> d) 116 && 2 == (a >> (b << (c >> d))) 117 && 1 == (a >> b << c >> d) 118 ; 119} 120 121bool Test_LShift_And() 122{ 123 uint32_t a = inputBuffer[1]; 124 uint32_t b = inputBuffer[5]; 125 uint32_t c = inputBuffer[2]; 126 uint32_t d = inputBuffer[4]; 127 128 return true 129 && 32 == ((a << b) & (c << d)) 130 && 16 == (a << (b & c) << d) 131 && 0 == (((a << b) & c) << d) 132 && 1 == (a << (b & (c << d))) 133 && 32 == (a << b & c << d) 134 135 && 1 == ((a & b) << (c & d)) 136 && 0 == (a & (b << c) & d) 137 && 4 == (((a & b) << c) & d) 138 && 1 == (a & (b << (c & d))) 139 && 0 == (a & b << c & d) 140 ; 141} 142 143bool Test_LShift_Or() 144{ 145 uint32_t a = inputBuffer[1]; 146 uint32_t b = inputBuffer[2]; 147 uint32_t c = inputBuffer[4]; 148 uint32_t d = inputBuffer[3]; 149 150 return true 151 && 36 == ((a << b) | (c << d)) 152 && 512 == (a << (b | c) << d) 153 && 32 == (((a << b) | c) << d) 154 && 1073741824 == (a << ((b | (c << d)) - 4)) 155 && 36 == (a << b | c << d) 156 157 && 384 == ((a | b) << (c | d)) 158 && 35 == (a | (b << c) | d) 159 && 51 == (((a | b) << c) | d) 160 && 257 == (a | (b << (c | d))) 161 && 35 == (a | b << c | d) 162 ; 163} 164 165bool Test_LShift_Xor() 166{ 167 uint32_t a = inputBuffer[1]; 168 uint32_t b = inputBuffer[2]; 169 uint32_t c = inputBuffer[4]; 170 uint32_t d = inputBuffer[3]; 171 172 return true 173 && 36 == ((a << b) ^ (c << d)) 174 && 512 == (a << (b ^ c) << d) 175 && 0 == (((a << b) ^ c) << d) 176 && 1073741824 == ((a << ((b ^ (c << d)) - 4))) 177 && 36 == (a << b ^ c << d) 178 179 && 384 == ((a ^ b) << (c ^ d)) 180 && 34 == (a ^ (b << c) ^ d) 181 && 51 == (((a ^ b) << c) ^ d) 182 && 257 == (a ^ (b << (c ^ d))) 183 && 34 == (a ^ b << c ^ d) 184 ; 185} 186 187bool Test_Add_LShift() 188{ 189 uint32_t a = inputBuffer[1]; 190 uint32_t b = inputBuffer[3]; 191 uint32_t c = inputBuffer[2]; 192 uint32_t d = inputBuffer[4]; 193 194 return true 195 && 256 == ((a + b) << (c + d)) 196 && 17 == (a + (b << c) + d) 197 && 20 == (((a + b) << c) + d) 198 && 193 == (a + (b << (c + d))) 199 && 256 == (a + b << c + d) 200 201 && 40 == ((a << b) + (c << d)) 202 && 512 == (a << (b + c) << d) 203 && 160 == (((a << b) + c) << d) 204 && 1073741824 == (a << ((b + (c << d)) - 5)) 205 && 512 == (a << b + c << d) 206 ; 207} 208 209[numthreads(1, 1, 1)] 210void computeMain(uint groupIndex : SV_GroupIndex, int3 dispatchThreadID: SV_DispatchThreadID) 211{ 212 //BUF: 1 213 bool result = true 214 && Test_And_Or() 215 && Test_And_Xor() 216 && Test_Xor_Or() 217 && Test_LShift_RShift() 218 && Test_LShift_And() 219 && Test_LShift_Or() 220 && Test_LShift_Xor() 221 && Test_Add_LShift() 222 ; 223 224 outputBuffer[0] = int(result); 225}