yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

venkataram-nvLowering unsupported matrix types for GLSL/WGSL/Metal targets (#7936)92ee2927d

master
6.0 KiB199 linesraw
1//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -output-using-type -compute -vk -shaderobj -xslang -emit-spirv-directly -xslang -DTYPE=int
2//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -output-using-type -compute -vk -shaderobj -xslang -emit-spirv-directly -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}