yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
92ee2927d
master
1//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -vk -output-using-type -compute -emit-spirv-via-glsl -shaderobj -xslang -DTYPE=int 2//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -vk -output-using-type -compute -emit-spirv-via-glsl -shaderobj -xslang -DTYPE=uint 3 4#ifndef TYPE 5#define TYPE int 6#endif 7 8typealias m2x2 = matrix<TYPE, 2, 2>; 9typealias m2x3 = matrix<TYPE, 2, 3>; 10typealias m3x3 = matrix<TYPE, 3, 3>; 11typealias m2x4 = matrix<TYPE, 2, 4>; 12 13//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 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer 14//TEST_INPUT:ubuffer(data=[-1 4], stride=4):name expectedBuffer 15RWStructuredBuffer<TYPE> outputBuffer; 16RWStructuredBuffer<TYPE> expectedBuffer; 17 18struct matrixWrapper { 19 m2x2 mat1 = m2x2(1, 2, 3, 4); 20 m2x3 mat2 = m2x3(5, 6, 7, 8, 9, 10); 21}; 22 23TYPE elementAdd(m2x2 matrix) 24{ 25 return matrix[0][0] 26 + matrix[0][1] 27 + matrix[1][0] 28 + matrix[1][1]; 29} 30 31[numthreads(1, 1, 1)] 32void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) 33{ 34 // Test matrix construction 35 m2x2 mat1 = m2x2(1, 2, 3, 4); 36 m3x3 mat2 = m3x3( 37 1, 2, 3, 38 4, 5, 6, 39 7, 8, 9 40 ); 41 m2x4 mat3 = m2x4( 42 10, 11, 12, 13, 43 14, 15, 16, 17 44 ); 45 46 // Test matrix element access 47 TYPE val1 = mat1[0][0]; 48 TYPE val2 = mat2[2][1]; 49 50 // Test matrix row access 51 vector<TYPE, 2> row = mat1[1]; 52 vector<TYPE, 3> row3 = mat2[0]; 53 54 // Test arithmetic operations 55 m2x2 mat5 = m2x2(2, 4, 6, 7); 56 57 m2x2 mat_scalar = 2 * mat1; 58 m2x2 mat_add = mat1 + mat5; 59 m2x2 mat_sub = mat5 - mat1; 60 m2x2 mat_mul = mat1 * mat5; 61 62 // Test passing matrices to functions 63 TYPE added = elementAdd(mat1); 64 65 // Test structs with matrix fields 66 matrixWrapper wrapper = {}; 67 68 // Test matrix intrinsic operations 69 70 // Test determinant for square matrices 71 m2x2 mat6 = m2x2(2, 1, 4, 3); 72 TYPE det2x2 = TYPE(determinant(mat6)); 73 TYPE det3x3 = TYPE(determinant(mat2)); 74 75 // Test transpose 76 matrix<TYPE, 2, 2> trans2x2 = transpose(mat1); 77 matrix<TYPE, 3, 2> trans2x3 = transpose(wrapper.mat2); 78 79 // Test element-wise min/max 80 m2x2 mat_min = min(mat1, mat5); 81 m2x2 mat_max = max(mat1, mat5); 82 83 // Test all/any operations (these return bool, but we'll cast to TYPE for output) 84 m2x2 zero_mat = m2x2(0, 0, 0, 0); 85 m2x2 mixed_mat = m2x2(1, 0, 2, 0); 86 87 TYPE all_nonzero = TYPE(all(mat1)); 88 TYPE all_zero = TYPE(all(zero_mat)); 89 TYPE any_nonzero = TYPE(any(mixed_mat)); 90 TYPE any_zero = TYPE(any(zero_mat)); 91 92 // Test bit shift operations 93 m2x2 shift_mat = m2x2(1, 2, 4, 8); 94 m2x2 left_shift = shift_mat << 1; 95 m2x2 right_shift = shift_mat >> 1; 96 97 // Test comparison operations (these return bool matrices, cast to TYPE for output) 98 m2x2 comp_mat1 = m2x2(1, 3, 2, 4); 99 m2x2 comp_mat2 = m2x2(2, 2, 3, 3); 100 101 matrix<bool, 2, 2> less_than = comp_mat1 < comp_mat2; 102 matrix<bool, 2, 2> greater_than = comp_mat1 > comp_mat2; 103 matrix<bool, 2, 2> less_equal = comp_mat1 <= comp_mat2; 104 matrix<bool, 2, 2> greater_equal = comp_mat1 >= comp_mat2; 105 matrix<bool, 2, 2> equal_to = comp_mat1 == comp_mat2; 106 matrix<bool, 2, 2> not_equal = comp_mat1 != comp_mat2; 107 108 // Test matrix negation operations 109 m2x2 neg_mat = m2x2(1, -2, 3, -4); 110 m2x2 negated = -neg_mat; 111 112 // Store results 113 outputBuffer[0] = val1; 114 // CHECK: 1 115 outputBuffer[1] = val2; 116 // CHECK-NEXT: 8 117 outputBuffer[2] = row.x; 118 // CHECK-NEXT: 3 119 outputBuffer[3] = row.y; 120 // CHECK-NEXT: 4 121 outputBuffer[4] = row3.y; 122 // CHECK-NEXT: 2 123 outputBuffer[5] = mat_scalar[0][0]; 124 // CHECK-NEXT: 2 125 outputBuffer[6] = mat_add[0][0]; 126 // CHECK-NEXT: 3 127 outputBuffer[7] = mat_sub[0][0]; 128 // CHECK-NEXT: 1 129 outputBuffer[8] = mat_mul[1][1]; 130 // CHECK-NEXT: 28 131 outputBuffer[9] = added; 132 // CHECK-NEXT: 10 133 outputBuffer[10] = wrapper.mat1[0][0] * wrapper.mat2[0][0]; 134 // CHECK-NEXT: 5 135 136 // Matrix intrinsic operation results 137 outputBuffer[11] = det2x2; 138 // CHECK-NEXT: 2 139 outputBuffer[12] = det3x3; 140 // CHECK-NEXT: 0 141 outputBuffer[13] = mat_min[0][0]; 142 // CHECK-NEXT: 1 143 outputBuffer[14] = mat_min[1][1]; 144 // CHECK-NEXT: 4 145 outputBuffer[15] = mat_max[0][0]; 146 // CHECK-NEXT: 2 147 outputBuffer[16] = mat_max[1][1]; 148 // CHECK-NEXT: 7 149 outputBuffer[17] = all_nonzero; 150 // CHECK-NEXT: 1 151 outputBuffer[18] = all_zero; 152 // CHECK-NEXT: 0 153 outputBuffer[19] = any_nonzero; 154 // CHECK-NEXT: 1 155 outputBuffer[20] = any_zero; 156 // CHECK-NEXT: 0 157 outputBuffer[21] = trans2x2[0][0]; 158 // CHECK-NEXT: 1 159 outputBuffer[22] = trans2x2[1][0]; 160 // CHECK-NEXT: 2 161 outputBuffer[23] = trans2x3[0][0]; 162 // CHECK-NEXT: 5 163 164 // Bit shift operation results 165 outputBuffer[24] = left_shift[0][0]; 166 // CHECK-NEXT: 2 167 outputBuffer[25] = left_shift[0][1]; 168 // CHECK-NEXT: 4 169 outputBuffer[26] = right_shift[1][0]; 170 // CHECK-NEXT: 2 171 outputBuffer[27] = right_shift[1][1]; 172 // CHECK-NEXT: 4 173 174 // Comparison operation results (bool matrices cast to TYPE) 175 outputBuffer[28] = TYPE(less_than[0][0]); 176 // CHECK-NEXT: 1 177 outputBuffer[29] = TYPE(less_than[0][1]); 178 // CHECK-NEXT: 0 179 outputBuffer[30] = TYPE(greater_than[0][1]); 180 // CHECK-NEXT: 1 181 outputBuffer[31] = TYPE(greater_than[1][1]); 182 // CHECK-NEXT: 1 183 outputBuffer[32] = TYPE(less_equal[0][0]); 184 // CHECK-NEXT: 1 185 outputBuffer[33] = TYPE(less_equal[0][1]); 186 // CHECK-NEXT: 0 187 outputBuffer[34] = TYPE(greater_equal[0][1]); 188 // CHECK-NEXT: 1 189 outputBuffer[35] = TYPE(greater_equal[1][0]); 190 // CHECK-NEXT: 0 191 outputBuffer[36] = TYPE(equal_to[0][0]); 192 // CHECK-NEXT: 0 193 outputBuffer[37] = TYPE(not_equal[0][0]); 194 // CHECK-NEXT: 1 195 outputBuffer[38] = TYPE(negated[0][0] == expectedBuffer[0]); 196 // CHECK-NEXT: 1 197 outputBuffer[39] = TYPE(negated[1][1] == expectedBuffer[1]); 198 // CHECK-NEXT: 1 199}