2 * Copyright © 2017 Gert Wollny
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
25 #include "st_tests_common.h"
27 #include "tgsi/tgsi_ureg.h"
28 #include "tgsi/tgsi_info.h"
29 #include "mesa/program/prog_instruction.h"
30 #include "gtest/gtest.h"
38 using namespace tgsi_array_merge
;
39 using ArrayLiveRangeMerge
=testing::Test
;
41 TEST_F(ArrayLiveRangeMerge
, SimpleLiveRange
)
43 array_live_range
a1(1, 10, 1, 5, WRITEMASK_X
);
44 array_live_range
a2(2, 5, 6, 10, WRITEMASK_X
);
46 array_live_range::merge(&a1
, &a2
);
48 EXPECT_EQ(a1
.array_id(), 1);
49 EXPECT_EQ(a1
.begin(), 1);
50 EXPECT_EQ(a1
.end(), 10);
51 EXPECT_EQ(a1
.target_array_id(), 0);
52 EXPECT_EQ(a1
.used_components(), 1);
53 EXPECT_EQ(a1
.access_mask(), WRITEMASK_X
);
55 EXPECT_EQ(a1
.remap_one_swizzle(0), 0);
56 EXPECT_EQ(a1
.remap_one_swizzle(1), 1);
57 EXPECT_EQ(a1
.remap_one_swizzle(2), 2);
58 EXPECT_EQ(a1
.remap_one_swizzle(3), 3);
60 EXPECT_EQ(a2
.array_id(), 2);
61 EXPECT_EQ(a2
.begin(), 6);
62 EXPECT_EQ(a2
.end(), 10);
63 EXPECT_EQ(a2
.target_array_id(), 1);
64 EXPECT_EQ(a2
.used_components(), 1);
65 EXPECT_EQ(a2
.access_mask(), WRITEMASK_X
);
67 EXPECT_EQ(a2
.remap_one_swizzle(0), 0);
68 EXPECT_EQ(a2
.remap_one_swizzle(1), 1);
69 EXPECT_EQ(a2
.remap_one_swizzle(2), 2);
70 EXPECT_EQ(a2
.remap_one_swizzle(3), 3);
73 TEST_F(ArrayLiveRangeMerge
, SimpleLiveRangeInverse
)
75 array_live_range
a1(1, 5, 1, 5, WRITEMASK_X
);
76 array_live_range
a2(2, 10, 6, 10, WRITEMASK_X
);
78 array_live_range::merge(&a1
, &a2
);
80 EXPECT_EQ(a1
.array_id(), 1);
81 EXPECT_EQ(a1
.begin(), 1);
82 EXPECT_EQ(a1
.end(), 5);
83 EXPECT_EQ(a1
.target_array_id(), 2);
84 EXPECT_EQ(a1
.used_components(), 1);
85 EXPECT_EQ(a1
.access_mask(), WRITEMASK_X
);
87 EXPECT_EQ(a1
.remap_one_swizzle(0), 0);
88 EXPECT_EQ(a1
.remap_one_swizzle(1), 1);
89 EXPECT_EQ(a1
.remap_one_swizzle(2), 2);
90 EXPECT_EQ(a1
.remap_one_swizzle(3), 3);
92 EXPECT_EQ(a2
.array_id(), 2);
93 EXPECT_EQ(a2
.begin(), 1);
94 EXPECT_EQ(a2
.end(), 10);
95 EXPECT_EQ(a2
.target_array_id(), 0);
96 EXPECT_EQ(a2
.used_components(), 1);
97 EXPECT_EQ(a2
.access_mask(), WRITEMASK_X
);
99 EXPECT_EQ(a2
.remap_one_swizzle(0), 0);
100 EXPECT_EQ(a2
.remap_one_swizzle(1), 1);
101 EXPECT_EQ(a2
.remap_one_swizzle(2), 2);
102 EXPECT_EQ(a2
.remap_one_swizzle(3), 3);
106 TEST_F(ArrayLiveRangeMerge
, Interleave_x_xyz
)
108 array_live_range
a1(1, 10, 1, 10, WRITEMASK_X
);
109 array_live_range
a2(2, 9, 1, 10, WRITEMASK_XYZ
);
111 array_live_range::interleave(&a1
, &a2
);
113 EXPECT_EQ(a1
.array_id(), 1);
114 EXPECT_EQ(a1
.begin(), 1);
115 EXPECT_EQ(a1
.end(), 10);
116 EXPECT_EQ(a1
.array_length(), 10u);
117 EXPECT_EQ(a1
.target_array_id(), 0);
118 EXPECT_EQ(a1
.used_components(), 4);
119 EXPECT_EQ(a1
.access_mask(), WRITEMASK_XYZW
);
121 EXPECT_EQ(a1
.remap_one_swizzle(0), 0);
122 EXPECT_EQ(a1
.remap_one_swizzle(1), 1);
123 EXPECT_EQ(a1
.remap_one_swizzle(2), 2);
124 EXPECT_EQ(a1
.remap_one_swizzle(3), 3);
126 EXPECT_EQ(a2
.array_id(), 2);
127 EXPECT_EQ(a2
.begin(), 1);
128 EXPECT_EQ(a2
.end(), 10);
129 EXPECT_EQ(a2
.target_array_id(), 1);
131 EXPECT_EQ(a2
.remap_one_swizzle(0), 1);
132 EXPECT_EQ(a2
.remap_one_swizzle(1), 2);
133 EXPECT_EQ(a2
.remap_one_swizzle(2), 3);
134 EXPECT_EQ(a2
.remap_one_swizzle(3), -1);
137 TEST_F(ArrayLiveRangeMerge
, Interleave_xyz_x
)
139 array_live_range
a1(1, 10, 1, 10, WRITEMASK_XYZ
);
140 array_live_range
a2(2, 9, 1, 10, WRITEMASK_X
);
142 array_live_range::interleave(&a1
, &a2
);
144 EXPECT_EQ(a1
.array_id(), 1);
145 EXPECT_EQ(a1
.begin(), 1);
146 EXPECT_EQ(a1
.end(), 10);
147 EXPECT_EQ(a1
.array_length(), 10u);
148 EXPECT_EQ(a1
.target_array_id(), 0);
149 EXPECT_EQ(a1
.used_components(), 4);
150 EXPECT_EQ(a1
.access_mask(), WRITEMASK_XYZW
);
152 EXPECT_EQ(a1
.remap_one_swizzle(0), 0);
153 EXPECT_EQ(a1
.remap_one_swizzle(1), 1);
154 EXPECT_EQ(a1
.remap_one_swizzle(2), 2);
155 EXPECT_EQ(a1
.remap_one_swizzle(3), 3);
157 EXPECT_EQ(a2
.array_id(), 2);
158 EXPECT_EQ(a2
.begin(), 1);
159 EXPECT_EQ(a2
.end(), 10);
160 EXPECT_EQ(a2
.target_array_id(), 1);
162 EXPECT_EQ(a2
.remap_one_swizzle(0), 3);
163 EXPECT_EQ(a2
.remap_one_swizzle(1), -1);
164 EXPECT_EQ(a2
.remap_one_swizzle(2), -1);
165 EXPECT_EQ(a2
.remap_one_swizzle(3), -1);
169 TEST_F(ArrayLiveRangeMerge
, SimpleInterleave
)
171 array_live_range
a1(1, 10, 1, 10, WRITEMASK_X
);
172 array_live_range
a2(2, 9, 1, 10, WRITEMASK_X
);
174 array_live_range::interleave(&a1
, &a2
);
176 EXPECT_EQ(a1
.array_id(), 1);
177 EXPECT_EQ(a1
.begin(), 1);
178 EXPECT_EQ(a1
.end(), 10);
179 EXPECT_EQ(a1
.array_length(), 10u);
180 EXPECT_EQ(a1
.target_array_id(), 0);
181 EXPECT_EQ(a1
.used_components(), 2);
182 EXPECT_EQ(a1
.access_mask(), WRITEMASK_XY
);
184 EXPECT_EQ(a1
.remap_one_swizzle(0), 0);
185 EXPECT_EQ(a1
.remap_one_swizzle(1), 1);
186 EXPECT_EQ(a1
.remap_one_swizzle(2), 2);
187 EXPECT_EQ(a1
.remap_one_swizzle(3), 3);
189 EXPECT_EQ(a2
.array_id(), 2);
190 EXPECT_EQ(a2
.begin(), 1);
191 EXPECT_EQ(a2
.end(), 10);
192 EXPECT_EQ(a2
.target_array_id(), 1);
194 EXPECT_EQ(a2
.remap_one_swizzle(0), 1);
195 EXPECT_EQ(a2
.remap_one_swizzle(1), -1);
196 EXPECT_EQ(a2
.remap_one_swizzle(2), -1);
197 EXPECT_EQ(a2
.remap_one_swizzle(3), -1);
201 TEST_F(ArrayLiveRangeMerge
, SimpleInterleaveInverse
)
203 array_live_range
a1(1, 8, 1, 10, WRITEMASK_X
);
204 array_live_range
a2(2, 9, 1, 10, WRITEMASK_X
);
206 array_live_range::interleave(&a1
, &a2
);
208 EXPECT_EQ(a1
.array_id(), 1);
209 EXPECT_EQ(a1
.begin(), 1);
210 EXPECT_EQ(a1
.end(), 10);
211 EXPECT_EQ(a1
.target_array_id(), 2);
213 EXPECT_EQ(a1
.remap_one_swizzle(0), 1);
214 EXPECT_EQ(a1
.remap_one_swizzle(1), -1);
215 EXPECT_EQ(a1
.remap_one_swizzle(2), -1);
216 EXPECT_EQ(a1
.remap_one_swizzle(3), -1);
218 EXPECT_EQ(a2
.array_id(), 2);
219 EXPECT_EQ(a2
.target_array_id(), 0);
220 EXPECT_EQ(a2
.begin(), 1);
221 EXPECT_EQ(a2
.end(), 10);
222 EXPECT_EQ(a2
.array_length(), 9u);
223 EXPECT_EQ(a2
.used_components(), 2);
224 EXPECT_EQ(a2
.access_mask(), WRITEMASK_XY
);
228 TEST_F(ArrayLiveRangeMerge
, InterleaveRiveRangeExtend
)
230 array_live_range
a1(1, 10, 2, 9, WRITEMASK_X
);
231 array_live_range
a2(2, 9, 1, 10, WRITEMASK_X
);
233 array_live_range::interleave(&a1
, &a2
);
235 EXPECT_EQ(a1
.array_id(), 1);
236 EXPECT_EQ(a1
.begin(), 1);
237 EXPECT_EQ(a1
.end(), 10);
238 EXPECT_EQ(a1
.array_length(), 10u);
239 EXPECT_EQ(a1
.target_array_id(), 0);
240 EXPECT_EQ(a1
.used_components(), 2);
241 EXPECT_EQ(a1
.access_mask(), WRITEMASK_XY
);
243 EXPECT_EQ(a1
.remap_one_swizzle(0), 0);
244 EXPECT_EQ(a1
.remap_one_swizzle(1), 1);
245 EXPECT_EQ(a1
.remap_one_swizzle(2), 2);
246 EXPECT_EQ(a1
.remap_one_swizzle(3), 3);
248 EXPECT_EQ(a2
.array_id(), 2);
249 EXPECT_EQ(a2
.begin(), 1);
250 EXPECT_EQ(a2
.end(), 10);
251 EXPECT_EQ(a2
.target_array_id(), 1);
253 EXPECT_EQ(a2
.remap_one_swizzle(0), 1);
254 EXPECT_EQ(a2
.remap_one_swizzle(1), -1);
255 EXPECT_EQ(a2
.remap_one_swizzle(2), -1);
256 EXPECT_EQ(a2
.remap_one_swizzle(3), -1);
259 TEST_F(ArrayLiveRangeMerge
, InterleaveLiveRangeExtendInverse
)
261 array_live_range
a1(1, 8, 2, 11, WRITEMASK_X
);
262 array_live_range
a2(2, 9, 1, 10, WRITEMASK_X
);
264 array_live_range::interleave(&a1
, &a2
);
266 EXPECT_EQ(a1
.array_id(), 1);
267 EXPECT_EQ(a1
.begin(), 2);
268 EXPECT_EQ(a1
.end(), 11);
269 EXPECT_EQ(a1
.target_array_id(), 2);
270 EXPECT_EQ(a1
.used_components(), 1);
271 EXPECT_EQ(a1
.access_mask(), WRITEMASK_X
);
273 EXPECT_EQ(a1
.remap_one_swizzle(0), 1);
274 EXPECT_EQ(a1
.remap_one_swizzle(1), -1);
275 EXPECT_EQ(a1
.remap_one_swizzle(2), -1);
276 EXPECT_EQ(a1
.remap_one_swizzle(3), -1);
278 EXPECT_EQ(a2
.array_id(), 2);
279 EXPECT_EQ(a2
.begin(), 1);
280 EXPECT_EQ(a2
.end(), 11);
281 EXPECT_EQ(a2
.target_array_id(), 0);
282 EXPECT_EQ(a2
.used_components(), 2);
283 EXPECT_EQ(a2
.access_mask(), WRITEMASK_XY
);
285 EXPECT_EQ(a2
.remap_one_swizzle(0), 0);
286 EXPECT_EQ(a2
.remap_one_swizzle(1), 1);
287 EXPECT_EQ(a2
.remap_one_swizzle(2), 2);
288 EXPECT_EQ(a2
.remap_one_swizzle(3), 3);
291 TEST_F(ArrayLiveRangeMerge
, InterleaveChained
)
293 array_live_range
a1(1, 8, 2, 11, WRITEMASK_X
);
294 array_live_range
a2(2, 9, 1, 10, WRITEMASK_X
);
295 array_live_range
a3(3, 10, 1, 10, WRITEMASK_X
);
297 array_live_range::interleave(&a1
, &a2
);
298 array_live_range::interleave(&a2
, &a3
);
300 EXPECT_EQ(a1
.array_id(), 1);
301 EXPECT_EQ(a1
.begin(), 2);
302 EXPECT_EQ(a1
.end(), 11);
303 EXPECT_EQ(a1
.target_array_id(), 2);
304 EXPECT_EQ(a1
.used_components(), 1);
305 EXPECT_EQ(a1
.access_mask(), WRITEMASK_X
);
307 EXPECT_EQ(a1
.remap_one_swizzle(0), 2);
308 EXPECT_EQ(a1
.remap_one_swizzle(1), -1);
309 EXPECT_EQ(a1
.remap_one_swizzle(2), -1);
310 EXPECT_EQ(a1
.remap_one_swizzle(3), -1);
312 EXPECT_EQ(a2
.array_id(), 2);
313 EXPECT_EQ(a2
.begin(), 1);
314 EXPECT_EQ(a2
.end(), 11);
315 EXPECT_EQ(a2
.target_array_id(), 3);
316 EXPECT_EQ(a2
.used_components(), 2);
317 EXPECT_EQ(a2
.access_mask(), WRITEMASK_XY
);
319 EXPECT_EQ(a2
.remap_one_swizzle(0), 1);
320 EXPECT_EQ(a2
.remap_one_swizzle(1), 2);
321 EXPECT_EQ(a2
.remap_one_swizzle(2), -1);
322 EXPECT_EQ(a2
.remap_one_swizzle(3), -1);
324 EXPECT_EQ(a3
.array_id(), 3);
325 EXPECT_EQ(a3
.begin(), 1);
326 EXPECT_EQ(a3
.end(), 11);
327 EXPECT_EQ(a3
.target_array_id(), 0);
328 EXPECT_EQ(a3
.used_components(), 3);
329 EXPECT_EQ(a3
.access_mask(), WRITEMASK_XYZ
);
331 EXPECT_EQ(a3
.remap_one_swizzle(0), 0);
332 EXPECT_EQ(a3
.remap_one_swizzle(1), 1);
333 EXPECT_EQ(a3
.remap_one_swizzle(2), 2);
334 EXPECT_EQ(a3
.remap_one_swizzle(3), 3);
337 TEST_F(ArrayLiveRangeMerge
, MergeInterleaveChained
)
339 array_live_range
a1(1, 8, 1, 5, WRITEMASK_X
);
340 array_live_range
a2(2, 9, 6, 10, WRITEMASK_X
);
341 array_live_range
a3(3, 10, 1, 10, WRITEMASK_X
);
343 array_live_range::merge(&a1
, &a2
);
344 array_live_range::interleave(&a2
, &a3
);
346 EXPECT_EQ(a1
.array_id(), 1);
347 EXPECT_EQ(a1
.begin(), 1);
348 EXPECT_EQ(a1
.end(), 5);
349 EXPECT_EQ(a1
.target_array_id(), 2);
350 EXPECT_EQ(a1
.used_components(), 1);
351 EXPECT_EQ(a1
.access_mask(), WRITEMASK_X
);
353 EXPECT_EQ(a1
.remap_one_swizzle(0), 1);
354 EXPECT_EQ(a1
.remap_one_swizzle(1), -1);
355 EXPECT_EQ(a1
.remap_one_swizzle(2), -1);
356 EXPECT_EQ(a1
.remap_one_swizzle(3), -1);
358 EXPECT_EQ(a2
.array_id(), 2);
359 EXPECT_EQ(a2
.begin(), 1);
360 EXPECT_EQ(a2
.end(), 10);
361 EXPECT_EQ(a2
.target_array_id(), 3);
362 EXPECT_EQ(a2
.used_components(), 1);
363 EXPECT_EQ(a2
.access_mask(), WRITEMASK_X
);
365 EXPECT_EQ(a2
.remap_one_swizzle(0), 1);
366 EXPECT_EQ(a2
.remap_one_swizzle(1), -1);
367 EXPECT_EQ(a2
.remap_one_swizzle(2), -1);
368 EXPECT_EQ(a2
.remap_one_swizzle(3), -1);
370 EXPECT_EQ(a3
.array_id(), 3);
371 EXPECT_EQ(a3
.begin(), 1);
372 EXPECT_EQ(a3
.end(), 10);
373 EXPECT_EQ(a3
.target_array_id(), 0);
374 EXPECT_EQ(a3
.used_components(), 2);
375 EXPECT_EQ(a3
.access_mask(), WRITEMASK_XY
);
377 EXPECT_EQ(a3
.remap_one_swizzle(0), 0);
378 EXPECT_EQ(a3
.remap_one_swizzle(1), 1);
379 EXPECT_EQ(a3
.remap_one_swizzle(2), 2);
380 EXPECT_EQ(a3
.remap_one_swizzle(3), 3);
383 TEST_F(ArrayLiveRangeMerge
, MergeMergeAndInterleave
)
385 array_live_range
a1(1, 5, 1, 5, WRITEMASK_X
);
386 array_live_range
a2(2, 4, 6, 7, WRITEMASK_X
);
387 array_live_range
a3(3, 3, 1, 5, WRITEMASK_X
);
388 array_live_range
a4(4, 2, 6, 8, WRITEMASK_X
);
390 array_live_range::merge(&a1
, &a2
);
391 array_live_range::merge(&a3
, &a4
);
392 array_live_range::interleave(&a1
, &a3
);
394 EXPECT_EQ(a1
.array_id(), 1);
395 EXPECT_EQ(a1
.begin(), 1);
396 EXPECT_EQ(a1
.end(), 8);
397 EXPECT_EQ(a1
.target_array_id(), 0);
398 EXPECT_EQ(a1
.used_components(), 2);
399 EXPECT_EQ(a1
.access_mask(), WRITEMASK_XY
);
401 EXPECT_EQ(a1
.remap_one_swizzle(0), 0);
402 EXPECT_EQ(a1
.remap_one_swizzle(1), 1);
403 EXPECT_EQ(a1
.remap_one_swizzle(2), 2);
404 EXPECT_EQ(a1
.remap_one_swizzle(3), 3);
406 EXPECT_EQ(a2
.array_id(), 2);
407 EXPECT_EQ(a2
.begin(), 6);
408 EXPECT_EQ(a2
.end(), 7);
409 EXPECT_EQ(a2
.target_array_id(), 1);
410 EXPECT_EQ(a2
.used_components(), 1);
411 EXPECT_EQ(a2
.access_mask(), WRITEMASK_X
);
413 EXPECT_EQ(a2
.remap_one_swizzle(0), 0);
414 EXPECT_EQ(a2
.remap_one_swizzle(1), 1);
415 EXPECT_EQ(a2
.remap_one_swizzle(2), 2);
416 EXPECT_EQ(a2
.remap_one_swizzle(3), 3);
418 EXPECT_EQ(a3
.array_id(), 3);
419 EXPECT_EQ(a3
.begin(), 1);
420 EXPECT_EQ(a3
.end(), 8);
421 EXPECT_EQ(a3
.target_array_id(), 1);
422 EXPECT_EQ(a3
.used_components(), 1);
423 EXPECT_EQ(a3
.access_mask(), WRITEMASK_X
);
425 EXPECT_EQ(a3
.remap_one_swizzle(0), 1);
426 EXPECT_EQ(a3
.remap_one_swizzle(1), -1);
427 EXPECT_EQ(a3
.remap_one_swizzle(2), -1);
428 EXPECT_EQ(a3
.remap_one_swizzle(3), -1);
430 EXPECT_EQ(a4
.array_id(), 4);
431 EXPECT_EQ(a4
.begin(), 6);
432 EXPECT_EQ(a4
.end(), 8);
433 EXPECT_EQ(a4
.target_array_id(), 3);
434 EXPECT_EQ(a4
.used_components(), 1);
435 EXPECT_EQ(a4
.access_mask(), WRITEMASK_X
);
437 EXPECT_EQ(a4
.remap_one_swizzle(0), 1);
438 EXPECT_EQ(a4
.remap_one_swizzle(1), -1);
439 EXPECT_EQ(a4
.remap_one_swizzle(2), -1);
440 EXPECT_EQ(a4
.remap_one_swizzle(3), -1);
445 TEST_F(ArrayLiveRangeMerge
, MergeInterleaveMergeInterleaveChained
)
447 array_live_range
a1(1, 8, 1, 5, WRITEMASK_X
);
448 array_live_range
a2(2, 9, 6, 10, WRITEMASK_X
);
449 array_live_range
a3(3, 10, 1, 10, WRITEMASK_X
);
450 array_live_range
a4(4, 11, 11, 20, WRITEMASK_XY
);
451 array_live_range
a5(5, 15, 5, 20, WRITEMASK_XY
);
453 array_live_range::merge(&a1
, &a2
);
454 array_live_range::interleave(&a2
, &a3
); // a2 -> a3
455 array_live_range::merge(&a3
, &a4
);
456 array_live_range::interleave(&a4
, &a5
); // a4 -> a5
459 EXPECT_EQ(a1
.array_id(), 1);
460 EXPECT_EQ(a1
.begin(), 1);
461 EXPECT_EQ(a1
.end(), 5);
462 EXPECT_EQ(a1
.target_array_id(), 2);
463 EXPECT_EQ(a1
.used_components(), 1);
464 EXPECT_EQ(a1
.access_mask(), WRITEMASK_X
);
466 EXPECT_EQ(a1
.remap_one_swizzle(0), 3);
467 EXPECT_EQ(a1
.remap_one_swizzle(1), -1);
468 EXPECT_EQ(a1
.remap_one_swizzle(2), -1);
469 EXPECT_EQ(a1
.remap_one_swizzle(3), -1);
471 EXPECT_EQ(a2
.array_id(), 2);
472 EXPECT_EQ(a2
.begin(), 1);
473 EXPECT_EQ(a2
.end(), 10);
474 EXPECT_EQ(a2
.target_array_id(), 3);
475 EXPECT_EQ(a2
.used_components(), 1);
476 EXPECT_EQ(a2
.access_mask(), WRITEMASK_X
);
478 EXPECT_EQ(a2
.remap_one_swizzle(0), 3);
479 EXPECT_EQ(a2
.remap_one_swizzle(1), -1);
480 EXPECT_EQ(a2
.remap_one_swizzle(2), -1);
481 EXPECT_EQ(a2
.remap_one_swizzle(3), -1);
483 EXPECT_EQ(a3
.array_id(), 3);
484 EXPECT_EQ(a3
.begin(), 1);
485 EXPECT_EQ(a3
.end(), 10);
486 EXPECT_EQ(a3
.target_array_id(), 4);
487 EXPECT_EQ(a3
.used_components(), 2);
488 EXPECT_EQ(a3
.access_mask(), WRITEMASK_XY
);
490 EXPECT_EQ(a3
.remap_one_swizzle(0), 2);
491 EXPECT_EQ(a3
.remap_one_swizzle(1), 3);
492 EXPECT_EQ(a3
.remap_one_swizzle(2), -1);
493 EXPECT_EQ(a3
.remap_one_swizzle(3), -1);
495 EXPECT_EQ(a4
.array_id(), 4);
496 EXPECT_EQ(a4
.begin(), 1);
497 EXPECT_EQ(a4
.end(), 20);
498 EXPECT_EQ(a4
.target_array_id(), 5);
499 EXPECT_EQ(a4
.used_components(), 2);
500 EXPECT_EQ(a4
.access_mask(), WRITEMASK_XY
);
502 EXPECT_EQ(a4
.remap_one_swizzle(0), 2);
503 EXPECT_EQ(a4
.remap_one_swizzle(1), 3);
504 EXPECT_EQ(a4
.remap_one_swizzle(2), -1);
505 EXPECT_EQ(a4
.remap_one_swizzle(3), -1);
507 EXPECT_EQ(a5
.array_id(), 5);
508 EXPECT_EQ(a5
.begin(), 1);
509 EXPECT_EQ(a5
.end(), 20);
510 EXPECT_EQ(a5
.target_array_id(), 0);
511 EXPECT_EQ(a5
.used_components(), 4);
512 EXPECT_EQ(a5
.access_mask(), WRITEMASK_XYZW
);
514 EXPECT_EQ(a5
.remap_one_swizzle(0), 0);
515 EXPECT_EQ(a5
.remap_one_swizzle(1), 1);
516 EXPECT_EQ(a5
.remap_one_swizzle(2), 2);
517 EXPECT_EQ(a5
.remap_one_swizzle(3), 3);
520 using ArrayMergeTest
=testing::Test
;
522 TEST_F(ArrayMergeTest
, ArrayMergeTwoSwizzles
)
524 vector
<array_live_range
> alt
= {
525 {1, 4, 1, 5, WRITEMASK_X
},
526 {2, 4, 2, 5, WRITEMASK_X
},
529 int8_t expect_swizzle
[] = {1, -1, -1, -1};
530 vector
<array_remapping
> expect
= {
535 vector
<array_remapping
> result(alt
.size() + 1);
537 get_array_remapping(2, &alt
[0], &result
[0]);
539 EXPECT_EQ(result
[1], expect
[0]);
540 EXPECT_EQ(result
[2], expect
[1]);
544 TEST_F(ArrayMergeTest
, ArrayMergeFourSwizzles
)
546 vector
<array_live_range
> alt
= {
547 {1, 8, 1, 7, WRITEMASK_X
},
548 {2, 7, 2, 7, WRITEMASK_X
},
549 {3, 6, 3, 7, WRITEMASK_X
},
550 {4, 5, 4, 7, WRITEMASK_X
},
552 int8_t expect_swizzle1
[] = {1, -1, -1, -1};
553 int8_t expect_swizzle2
[] = {2, -1, -1, -1};
554 int8_t expect_swizzle3
[] = {3, -1, -1, -1};
556 vector
<array_remapping
> expect
= {
558 {1, expect_swizzle1
},
559 {1, expect_swizzle2
},
560 {1, expect_swizzle3
},
563 vector
<array_remapping
> result(alt
.size() + 1);
565 get_array_remapping(4, &alt
[0], &result
[0]);
567 EXPECT_EQ(result
[1], expect
[0]);
568 EXPECT_EQ(result
[2], expect
[1]);
569 EXPECT_EQ(result
[3], expect
[2]);
570 EXPECT_EQ(result
[4], expect
[3]);
575 TEST_F(ArrayMergeTest
, SimpleChainMerge
)
577 vector
<array_live_range
> input
= {
578 {1, 3, 1, 5, WRITEMASK_XYZW
},
579 {2, 2, 6, 7, WRITEMASK_XYZW
},
582 int8_t expect_swizzle
[] = {0, 1, 2, 3};
583 vector
<array_remapping
> expect
= {
588 vector
<array_remapping
> result(3);
589 get_array_remapping(2, &input
[0], &result
[0]);
591 EXPECT_EQ(result
[1], expect
[0]);
592 EXPECT_EQ(result
[2], expect
[1]);
595 TEST_F(ArrayMergeTest
, MergeAndInterleave
)
597 vector
<array_live_range
> input
= {
598 {1, 5, 1, 5, WRITEMASK_X
},
599 {2, 4, 6, 7, WRITEMASK_X
},
600 {3, 3, 1, 5, WRITEMASK_X
},
601 {4, 2, 6, 7, WRITEMASK_X
},
604 int8_t expect_swizzle1
[] = {0, 1, 2, 3};
605 int8_t expect_swizzle2
[] = {1, -1, -1, -1};
606 int8_t expect_swizzle3
[] = {1, -1, -1, -1};
608 vector
<array_remapping
> expect
= {
610 {1, expect_swizzle1
},
611 {1, expect_swizzle2
},
614 vector
<array_remapping
> result(input
.size() + 1);
615 get_array_remapping(input
.size(), &input
[0], &result
[0]);
617 EXPECT_EQ(result
[1], expect
[0]);
618 EXPECT_EQ(result
[2], expect
[1]);
619 EXPECT_EQ(result
[3], expect
[2]);
620 EXPECT_EQ(result
[4], expect
[3]);
623 TEST_F(ArrayMergeTest
, MergeAndInterleave2
)
625 vector
<array_live_range
> input
= {
626 {1, 5, 1, 5, WRITEMASK_X
},
627 {2, 4, 6, 7, WRITEMASK_X
},
628 {3, 3, 1, 8, WRITEMASK_XY
},
629 {4, 2, 6, 7, WRITEMASK_X
},
632 int8_t expect_swizzle1
[] = {0, 1, 2, 3};
633 int8_t expect_swizzle2
[] = {1, 2, -1, -1};
634 int8_t expect_swizzle3
[] = {3, -1, -1, -1};
636 vector
<array_remapping
> expect
= {
638 {1, expect_swizzle1
},
639 {1, expect_swizzle2
},
642 vector
<array_remapping
> result(input
.size() + 1);
643 get_array_remapping(input
.size(), &input
[0], &result
[0]);
645 EXPECT_EQ(result
[1], expect
[0]);
646 EXPECT_EQ(result
[2], expect
[1]);
647 EXPECT_EQ(result
[3], expect
[2]);
648 EXPECT_EQ(result
[4], expect
[3]);
652 TEST_F(ArrayMergeTest
, MergeAndInterleave3
)
654 vector
<array_live_range
> input
= {
655 {1, 5, 1, 5, WRITEMASK_X
},
656 {2, 4, 6, 7, WRITEMASK_XY
},
657 {3, 3, 1, 5, WRITEMASK_X
}
660 int8_t expect_swizzle1
[] = {0, 1, 2, 3};
661 int8_t expect_swizzle2
[] = {1, -1, -1, -1};
663 vector
<array_remapping
> expect
= {
665 {1, expect_swizzle1
},
668 vector
<array_remapping
> result(input
.size() + 1);
669 get_array_remapping(input
.size(), &input
[0], &result
[0]);
671 EXPECT_EQ(result
[1], expect
[0]);
672 EXPECT_EQ(result
[2], expect
[1]);
673 EXPECT_EQ(result
[3], expect
[2]);
676 TEST_F(ArrayMergeTest
, MergeAndInterleave4
)
678 vector
<array_live_range
> input
= {
679 {1, 7, 1, 5, WRITEMASK_X
},
680 {2, 6, 6, 7, WRITEMASK_XY
},
681 {3, 5, 1, 5, WRITEMASK_X
},
682 {4, 4, 8, 9, WRITEMASK_XYZ
},
683 {5, 3, 8, 9, WRITEMASK_W
},
684 {6, 2, 10, 11, WRITEMASK_XYZW
},
687 int8_t expect_swizzle1
[] = {0, 1, 2, 3};
688 int8_t expect_swizzle2
[] = {1, -1, -1, -1};
689 int8_t expect_swizzle3
[] = {0, 1, 2, 3};
690 int8_t expect_swizzle4
[] = {-1, -1, -1, 3};
691 int8_t expect_swizzle5
[] = {0, 1, 2, 3};
693 vector
<array_remapping
> expect
= {
695 {1, expect_swizzle1
},
696 {1, expect_swizzle2
},
697 {1, expect_swizzle3
}, /* W from below will be interleaved in */
698 {1, expect_swizzle4
},
701 vector
<array_remapping
> result(input
.size() + 1);
702 get_array_remapping(input
.size(), &input
[0], &result
[0]);
704 EXPECT_EQ(result
[1], expect
[0]);
705 EXPECT_EQ(result
[2], expect
[1]);
706 EXPECT_EQ(result
[3], expect
[2]);
707 EXPECT_EQ(result
[4], expect
[3]);
708 EXPECT_EQ(result
[5], expect
[4]);
709 EXPECT_EQ(result
[6], expect
[5]);
713 TEST_F(ArrayMergeTest
, MergeAndInterleave5
)
715 vector
<array_live_range
> input
= {
716 {1, 7, 1, 5, WRITEMASK_X
},
717 {2, 6, 1, 3, WRITEMASK_X
},
718 {3, 5, 4, 5, WRITEMASK_X
},
719 {4, 4, 6, 10, WRITEMASK_XY
},
720 {5, 8, 1, 10, WRITEMASK_XY
}
724 * 2. interleave 2 into 1 (x -> y) --- (y -> w)
725 * 3. merge 4 into 1 /
726 * 4. interleave 1 into 5 (x,y - z,w)
729 /* swizzle1 holds the summary mask */
730 int8_t expect_swizzle1
[] = {2, 3, -1, -1};
731 int8_t expect_swizzle2
[] = {3, -1, -1, -1};
732 int8_t expect_swizzle3
[] = {3, -1, -1, -1};
733 int8_t expect_swizzle4
[] = {2, 3, -1, -1};
735 vector
<array_remapping
> expect
= {
736 {5, expect_swizzle1
},
737 {5, expect_swizzle2
},
738 {5, expect_swizzle3
},
739 {5, expect_swizzle4
},
742 vector
<array_remapping
> result(input
.size() + 1);
743 get_array_remapping(input
.size(), &input
[0], &result
[0]);
745 EXPECT_EQ(result
[1], expect
[0]);
746 EXPECT_EQ(result
[2], expect
[1]);
747 EXPECT_EQ(result
[3], expect
[2]);
748 EXPECT_EQ(result
[4], expect
[3]);
749 EXPECT_EQ(result
[5], expect
[4]);