1 /* -*- mesa-c++ -*-
2 *
3 * Copyright (c) 2023 Collabora LTD
4 *
5 * Author: Gert Wollny <gert.wollny@collabora.com>
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * on the rights to use, copy, modify, merge, publish, distribute, sub
11 * license, and/or sell copies of the Software, and to permit persons to whom
12 * the Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the next
15 * paragraph) shall be included in all copies or substantial portions of the
16 * Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24 * USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27 #include "sfn_test_shaders.h"
28 #include "../sfn_split_address_loads.h"
29 #include "../sfn_optimizer.h"
30 #include "../sfn_scheduler.h"
31
32
33 using namespace r600;
34
TEST_F(TestShaderFromNir,SimpleLoadAddress)35 TEST_F(TestShaderFromNir, SimpleLoadAddress)
36 {
37 const char *input =
38 R"(
39 FS
40 CHIPCLASS EVERGREEN
41 PROP MAX_COLOR_EXPORTS:1
42 PROP COLOR_EXPORTS:1
43 PROP COLOR_EXPORT_MASK:15
44 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
45 SYSVALUES R0.x__
46 ARRAYS A1[4].x
47 REGISTERS AR
48 SHADER
49 ALU ADD A1[R0.x].x : L[0xbf000000] KC0[0].x {WL}
50 ALU MOV S1.x@group : A1[0].x {WL}
51 EXPORT_DONE PIXEL 0 S1.xxxx
52 )";
53
54 const char *expect =
55 R"(
56 FS
57 CHIPCLASS EVERGREEN
58 PROP MAX_COLOR_EXPORTS:1
59 PROP COLOR_EXPORTS:1
60 PROP COLOR_EXPORT_MASK:15
61 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
62 SYSVALUES R0.x__
63 ARRAYS A1[4].x
64 REGISTERS AR
65 SHADER
66 ALU MOVA_INT AR : R0.x
67 ALU ADD A1[AR].x : L[0xbf000000] KC0[0].x {WL}
68 ALU MOV S1.x@group : A1[0].x {WL}
69 EXPORT_DONE PIXEL 0 S1.xxxx
70 )";
71
72 auto sh = from_string(input);
73 split_address_loads(*sh);
74 check(sh, expect);
75 }
76
77
TEST_F(TestShaderFromNir,DestIndirectAddress)78 TEST_F(TestShaderFromNir, DestIndirectAddress)
79 {
80 const char *input =
81 R"(VS
82 CHIPCLASS EVERGREEN
83 INPUT LOC:0
84 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
85 OUTPUT LOC:1 VARYING_SLOT:32 MASK:15
86 OUTPUT LOC:2 VARYING_SLOT:33 MASK:15
87 OUTPUT LOC:3 VARYING_SLOT:34 MASK:15
88 OUTPUT LOC:4 VARYING_SLOT:35 MASK:15
89 REGISTERS R1.xyzw
90 ARRAYS A2[4].xy A2[4].zw
91 SHADER
92 ALU MUL_IEEE S14.x : KC0[2].x R1.y@fully {W}
93 ALU MUL_IEEE S14.y : KC0[2].y R1.y@fully {W}
94 ALU MUL_IEEE S14.z : KC0[2].z R1.y@fully {W}
95 ALU MUL_IEEE S14.w : KC0[2].w R1.y@fully {WL}
96 ALU MULADD_IEEE S15.x : KC0[1].x R1.x@fully S14.x {W}
97 ALU MULADD_IEEE S15.y : KC0[1].y R1.x@fully S14.y {W}
98 ALU MULADD_IEEE S15.z : KC0[1].z R1.x@fully S14.z {W}
99 ALU MULADD_IEEE S15.w : KC0[1].w R1.x@fully S14.w {WL}
100 ALU MULADD_IEEE S17.x : KC0[3].x R1.z@fully S15.x {W}
101 ALU MULADD_IEEE S17.y : KC0[3].y R1.z@fully S15.y {W}
102 ALU MULADD_IEEE S17.z : KC0[3].z R1.z@fully S15.z {W}
103 ALU MULADD_IEEE S17.w : KC0[3].w R1.z@fully S15.w {WL}
104 ALU MULADD_IEEE S19.x@group : KC0[4].x R1.w@fully S17.x {W}
105 ALU MULADD_IEEE S19.y@group : KC0[4].y R1.w@fully S17.y {W}
106 ALU MULADD_IEEE S19.z@group : KC0[4].z R1.w@fully S17.z {W}
107 ALU MULADD_IEEE S19.w@group : KC0[4].w R1.w@fully S17.w {WL}
108 ALU MOV A2[0].x : I[1.0] {W}
109 ALU MOV A2[0].y : L[0x3f8ccccd] {WL}
110 ALU MOV A2[1].x : L[0x40000000] {W}
111 ALU MOV A2[1].y : L[0x40066666] {WL}
112 ALU MOV A2[2].x : L[0x40400000] {W}
113 ALU MOV A2[2].y : L[0x40466666] {WL}
114 ALU MOV A2[3].x : L[0x40800000] {W}
115 ALU MOV A2[3].y : L[0x40833333] {WL}
116 ALU MOV A2[0].z : L[0x40a00000] {W}
117 ALU MOV A2[0].w : L[0x40a33333] {WL}
118 ALU MOV A2[1].z : L[0x40c00000] {W}
119 ALU MOV A2[1].w : L[0x40c33333] {WL}
120 ALU MOV A2[2].z : L[0x40e00000] {W}
121 ALU MOV A2[2].w : L[0x40e33333] {WL}
122 ALU MOV A2[3].z : L[0x41000000] {W}
123 ALU MOV A2[3].w : L[0x4101999a] {WL}
124 IF (( ALU PRED_SETGE_INT __.x@free : KC0[0].x L[0x4] {LEP} PUSH_BEFORE ))
125 ALU ADD_INT S34.x : KC0[0].x L[0xfffffffc] {WL}
126 ALU MOV A2[S34.x].z : I[0] {W}
127 ALU MOV A2[S34.x].w : L[0x3dcccccd] {WL}
128 ELSE
129 ALU MOV S37.x : KC0[0].x {WL}
130 ALU MOV A2[S37.x].x : I[0] {W}
131 ALU MOV A2[S37.x].y : L[0x3dcccccd] {WL}
132 ENDIF
133 EXPORT_DONE POS 0 S19.xyzw
134 ALU MOV S46.x@group : A2[0].x {W}
135 ALU MOV S46.y@group : A2[0].y {W}
136 ALU MOV S46.z@group : A2[1].x {W}
137 ALU MOV S46.w@group : A2[1].y {WL}
138 EXPORT PARAM 0 S46.xyzw
139 ALU MOV S47.x@group : A2[2].x {W}
140 ALU MOV S47.y@group : A2[2].y {W}
141 ALU MOV S47.z@group : A2[3].x {W}
142 ALU MOV S47.w@group : A2[3].y {WL}
143 EXPORT PARAM 1 S47.xyzw
144 ALU MOV S48.x@group : A2[0].z {W}
145 ALU MOV S48.y@group : A2[0].w {W}
146 ALU MOV S48.z@group : A2[1].z {W}
147 ALU MOV S48.w@group : A2[1].w {WL}
148 EXPORT PARAM 2 S48.xyzw
149 ALU MOV S49.x@group : A2[2].z {W}
150 ALU MOV S49.y@group : A2[2].w {W}
151 ALU MOV S49.z@group : A2[3].z {W}
152 ALU MOV S49.w@group : A2[3].w {WL}
153 EXPORT_DONE PARAM 3 S49.xyzw
154 )";
155
156
157 const char *expect =
158 R"(VS
159 CHIPCLASS EVERGREEN
160 INPUT LOC:0
161 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
162 OUTPUT LOC:1 VARYING_SLOT:32 MASK:15
163 OUTPUT LOC:2 VARYING_SLOT:33 MASK:15
164 OUTPUT LOC:3 VARYING_SLOT:34 MASK:15
165 OUTPUT LOC:4 VARYING_SLOT:35 MASK:15
166 REGISTERS R1.xyzw
167 ARRAYS A2[4].xy A2[4].zw
168 SHADER
169 ALU MUL_IEEE S14.x : KC0[2].x R1.y@fully {W}
170 ALU MUL_IEEE S14.y : KC0[2].y R1.y@fully {W}
171 ALU MUL_IEEE S14.z : KC0[2].z R1.y@fully {W}
172 ALU MUL_IEEE S14.w : KC0[2].w R1.y@fully {WL}
173 ALU MULADD_IEEE S15.x : KC0[1].x R1.x@fully S14.x {W}
174 ALU MULADD_IEEE S15.y : KC0[1].y R1.x@fully S14.y {W}
175 ALU MULADD_IEEE S15.z : KC0[1].z R1.x@fully S14.z {W}
176 ALU MULADD_IEEE S15.w : KC0[1].w R1.x@fully S14.w {WL}
177 ALU MULADD_IEEE S17.x : KC0[3].x R1.z@fully S15.x {W}
178 ALU MULADD_IEEE S17.y : KC0[3].y R1.z@fully S15.y {W}
179 ALU MULADD_IEEE S17.z : KC0[3].z R1.z@fully S15.z {W}
180 ALU MULADD_IEEE S17.w : KC0[3].w R1.z@fully S15.w {WL}
181 ALU MULADD_IEEE S19.x@group : KC0[4].x R1.w@fully S17.x {W}
182 ALU MULADD_IEEE S19.y@group : KC0[4].y R1.w@fully S17.y {W}
183 ALU MULADD_IEEE S19.z@group : KC0[4].z R1.w@fully S17.z {W}
184 ALU MULADD_IEEE S19.w@group : KC0[4].w R1.w@fully S17.w {WL}
185 ALU MOV A2[0].x : I[1.0] {W}
186 ALU MOV A2[0].y : L[0x3f8ccccd] {WL}
187 ALU MOV A2[1].x : L[0x40000000] {W}
188 ALU MOV A2[1].y : L[0x40066666] {WL}
189 ALU MOV A2[2].x : L[0x40400000] {W}
190 ALU MOV A2[2].y : L[0x40466666] {WL}
191 ALU MOV A2[3].x : L[0x40800000] {W}
192 ALU MOV A2[3].y : L[0x40833333] {WL}
193 ALU MOV A2[0].z : L[0x40a00000] {W}
194 ALU MOV A2[0].w : L[0x40a33333] {WL}
195 ALU MOV A2[1].z : L[0x40c00000] {W}
196 ALU MOV A2[1].w : L[0x40c33333] {WL}
197 ALU MOV A2[2].z : L[0x40e00000] {W}
198 ALU MOV A2[2].w : L[0x40e33333] {WL}
199 ALU MOV A2[3].z : L[0x41000000] {W}
200 ALU MOV A2[3].w : L[0x4101999a] {WL}
201 IF (( ALU PRED_SETGE_INT __.x@free : KC0[0].x L[0x4] {LEP} PUSH_BEFORE ))
202 ALU ADD_INT S34.x : KC0[0].x L[0xfffffffc] {WL}
203 ALU MOVA_INT AR : S34.x
204 ALU MOV A2[AR].z : I[0] {W}
205 ALU MOV A2[AR].w : L[0x3dcccccd] {WL}
206 ELSE
207 ALU MOV S37.x : KC0[0].x {WL}
208 ALU MOVA_INT AR : S37.x
209 ALU MOV A2[AR].x : I[0] {W}
210 ALU MOV A2[AR].y : L[0x3dcccccd] {WL}
211 ENDIF
212 EXPORT_DONE POS 0 S19.xyzw
213 ALU MOV S46.x@group : A2[0].x {W}
214 ALU MOV S46.y@group : A2[0].y {W}
215 ALU MOV S46.z@group : A2[1].x {W}
216 ALU MOV S46.w@group : A2[1].y {WL}
217 EXPORT PARAM 0 S46.xyzw
218 ALU MOV S47.x@group : A2[2].x {W}
219 ALU MOV S47.y@group : A2[2].y {W}
220 ALU MOV S47.z@group : A2[3].x {W}
221 ALU MOV S47.w@group : A2[3].y {WL}
222 EXPORT PARAM 1 S47.xyzw
223 ALU MOV S48.x@group : A2[0].z {W}
224 ALU MOV S48.y@group : A2[0].w {W}
225 ALU MOV S48.z@group : A2[1].z {W}
226 ALU MOV S48.w@group : A2[1].w {WL}
227 EXPORT PARAM 2 S48.xyzw
228 ALU MOV S49.x@group : A2[2].z {W}
229 ALU MOV S49.y@group : A2[2].w {W}
230 ALU MOV S49.z@group : A2[3].z {W}
231 ALU MOV S49.w@group : A2[3].w {WL}
232 EXPORT_DONE PARAM 3 S49.xyzw
233 )";
234
235 auto sh = from_string(input);
236 split_address_loads(*sh);
237 check(sh, expect);
238 }
239
240
241
242
TEST_F(TestShaderFromNir,SimpleLoadIndexEG)243 TEST_F(TestShaderFromNir, SimpleLoadIndexEG)
244 {
245 const char *input =
246 R"(
247 FS
248 CHIPCLASS EVERGREEN
249 PROP MAX_COLOR_EXPORTS:1
250 PROP COLOR_EXPORTS:1
251 PROP COLOR_EXPORT_MASK:15
252 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
253 SYSVALUES R0.x
254 ARRAYS A1[4].x
255 REGISTERS AR
256 SHADER
257 ALU ADD S1.x : L[0xbf000000] KC0[R0.x][0].x {WL}
258 EXPORT_DONE PIXEL 0 S1.xxxx
259 )";
260
261 const char *expect =
262 R"(
263 FS
264 CHIPCLASS EVERGREEN
265 PROP MAX_COLOR_EXPORTS:1
266 PROP COLOR_EXPORTS:1
267 PROP COLOR_EXPORT_MASK:15
268 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
269 SYSVALUES R0.x
270 ARRAYS A1[4].x
271 REGISTERS AR
272 SHADER
273 ALU MOVA_INT AR : R0.x
274 ALU SET_CF_IDX0 IDX0 : AR
275 ALU ADD S1.x@group : L[0xbf000000] KC0[IDX0][0].x {WL}
276 EXPORT_DONE PIXEL 0 S1.xxxx
277 )";
278
279 auto sh = from_string(input);
280 split_address_loads(*sh);
281 check(sh, expect);
282 }
283
TEST_F(TestShaderFromNir,SimpleLoadIndexCA)284 TEST_F(TestShaderFromNir, SimpleLoadIndexCA)
285 {
286 const char *input =
287 R"(
288 FS
289 CHIPCLASS CAYMAN
290 PROP MAX_COLOR_EXPORTS:1
291 PROP COLOR_EXPORTS:1
292 PROP COLOR_EXPORT_MASK:15
293 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
294 SYSVALUES R0.x
295 ARRAYS A1[4].x
296 REGISTERS AR
297 SHADER
298 ALU ADD S1.x : L[0xbf000000] KC0[R0.x][0].x {WL}
299 EXPORT_DONE PIXEL 0 S1.xxxx
300 )";
301
302 const char *expect =
303 R"(
304 FS
305 CHIPCLASS CAYMAN
306 PROP MAX_COLOR_EXPORTS:1
307 PROP COLOR_EXPORTS:1
308 PROP COLOR_EXPORT_MASK:15
309 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
310 SYSVALUES R0.x
311 ARRAYS A1[4].x
312 REGISTERS AR
313 SHADER
314 ALU MOVA_INT IDX0 : R0.x
315 ALU ADD S1.x@group : L[0xbf000000] KC0[IDX0][0].x {WL}
316 EXPORT_DONE PIXEL 0 S1.xxxx
317 )";
318
319 auto sh = from_string(input);
320 split_address_loads(*sh);
321 check(sh, expect);
322 }
323
324
TEST_F(TestShaderFromNir,SimpleLoadIndexBuf)325 TEST_F(TestShaderFromNir, SimpleLoadIndexBuf)
326 {
327 const char *input =
328 R"(
329 FS
330 CHIPCLASS CAYMAN
331 PROP MAX_COLOR_EXPORTS:1
332 PROP COLOR_EXPORTS:1
333 PROP COLOR_EXPORT_MASK:15
334 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
335 SYSVALUES R0.x R0.y
336 REGISTERS AR
337 SHADER
338 LOAD_BUF S1.xyzw : R0.x + 16b RID:10 + R0.y
339 EXPORT_DONE PIXEL 0 S1.xyzw
340 )";
341
342 const char *expect =
343 R"(
344 FS
345 CHIPCLASS CAYMAN
346 PROP MAX_COLOR_EXPORTS:1
347 PROP COLOR_EXPORTS:1
348 PROP COLOR_EXPORT_MASK:15
349 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
350 SYSVALUES R0.x R0.y
351 SHADER
352 ALU MOVA_INT IDX0 : R0.y
353 LOAD_BUF S1.xyzw : R0.x + 16b RID:10 + IDX0
354 EXPORT_DONE PIXEL 0 S1.xyzw
355 )";
356
357 auto sh = from_string(input);
358 split_address_loads(*sh);
359 check(sh, expect);
360 }
361
362
TEST_F(TestShaderFromNir,SplitLoadIndexConst)363 TEST_F(TestShaderFromNir, SplitLoadIndexConst)
364 {
365 const char *input =
366 R"(
367 FS
368 CHIPCLASS CAYMAN
369 PROP MAX_COLOR_EXPORTS:1
370 PROP COLOR_EXPORTS:1
371 PROP COLOR_EXPORT_MASK:15
372 PROP WRITE_ALL_COLORS:0
373 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
374 SHADER
375 BLOCK_START
376 ALU MIN_UINT S3.w@free{s} : KC0[0].x L[0x2] {WL}
377 ALU MOV S4.x@group{s} : KC1[S3.w@free{s}][0].x {W}
378 ALU MOV S4.y@group{s} : KC1[S3.w@free{s}][0].y {W}
379 ALU MOV S4.z@group{s} : KC1[S3.w@free{s}][0].z {W}
380 ALU MOV S4.w@group{s} : KC1[S3.w@free{s}][0].w {WL}
381 EXPORT_DONE PIXEL 0 S4.xyzw
382 BLOCK_END
383 )";
384
385 const char *expect =
386 R"(
387 FS
388 CHIPCLASS CAYMAN
389 PROP MAX_COLOR_EXPORTS:1
390 PROP COLOR_EXPORTS:1
391 PROP COLOR_EXPORT_MASK:15
392 PROP WRITE_ALL_COLORS:0
393 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
394 SHADER
395 BLOCK_START
396 ALU MIN_UINT S3.w@free{s} : KC0[0].x L[0x2] {WL}
397 ALU MOVA_INT IDX0 : S3.w@free{s} {}
398 ALU MOV S4.x@group{s} : KC1[IDX0][0].x {W}
399 ALU MOV S4.y@group{s} : KC1[IDX0][0].y {W}
400 ALU MOV S4.z@group{s} : KC1[IDX0][0].z {W}
401 ALU MOV S4.w@group{s} : KC1[IDX0][0].w {WL}
402 EXPORT_DONE PIXEL 0 S4.xyzw
403 BLOCK_END
404 )";
405 auto sh = from_string(input);
406 split_address_loads(*sh);
407 check(sh, expect);
408 }
409
410
TEST_F(TestShaderFromNir,SplitLoadIndexConstOptAndSchedule)411 TEST_F(TestShaderFromNir, SplitLoadIndexConstOptAndSchedule)
412 {
413 const char *input =
414 R"(
415 FS
416 CHIPCLASS CAYMAN
417 PROP MAX_COLOR_EXPORTS:1
418 PROP COLOR_EXPORTS:1
419 PROP COLOR_EXPORT_MASK:15
420 PROP WRITE_ALL_COLORS:0
421 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
422 SHADER
423 BLOCK_START
424 ALU MIN_UINT S3.w@free : KC0[0].x L[0x2] {WL}
425 ALU MOV S4.x@group : KC1[S3.w@free{s}][0].x {W}
426 ALU MOV S4.y@group : KC1[S3.w@free{s}][0].y {W}
427 ALU MOV S4.z@group : KC1[S3.w@free{s}][0].z {W}
428 ALU MOV S4.w@group : KC1[S3.w@free{s}][0].w {WL}
429 EXPORT_DONE PIXEL 0 S4.xyzw
430 BLOCK_END
431 )";
432
433 const char *expect =
434 R"(
435 FS
436 CHIPCLASS CAYMAN
437 PROP MAX_COLOR_EXPORTS:1
438 PROP COLOR_EXPORTS:1
439 PROP COLOR_EXPORT_MASK:15
440 PROP WRITE_ALL_COLORS:0
441 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
442 SHADER
443 BLOCK_START
444 ALU_GROUP_BEGIN
445 ALU MIN_UINT S3.w@free : KC0[0].x L[0x2] {WL}
446 ALU_GROUP_END
447 ALU_GROUP_BEGIN
448 ALU MOVA_INT IDX0 : S3.w@free {L}
449 ALU_GROUP_END
450 BLOCK_END
451 BLOCK_START
452 ALU_GROUP_BEGIN
453 ALU MOV S4.x@chgr : KC1[IDX0][0].x {W}
454 ALU MOV S4.y@chgr : KC1[IDX0][0].y {W}
455 ALU MOV S4.z@chgr : KC1[IDX0][0].z {W}
456 ALU MOV S4.w@chgr : KC1[IDX0][0].w {WL}
457 ALU_GROUP_END
458 BLOCK_END
459 BLOCK_START
460 EXPORT_DONE PIXEL 0 S4.xyzw
461 BLOCK_END
462 )";
463 auto sh = from_string(input);
464 split_address_loads(*sh);
465 optimize(*sh);
466 check(schedule(sh), expect);
467 }
468
469
TEST_F(TestShaderFromNir,SplitLoadWithNonAlu)470 TEST_F(TestShaderFromNir, SplitLoadWithNonAlu)
471 {
472 const char *input =
473 R"(
474 FS
475 CHIPCLASS EVERGREEN
476 PROP MAX_COLOR_EXPORTS:1
477 PROP COLOR_EXPORTS:1
478 PROP COLOR_EXPORT_MASK:15
479 PROP WRITE_ALL_COLORS:0
480 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
481 SHADER
482 BLOCK_START
483 ALU MOV S0.x@free : KC0[1].x {W}
484 ALU MOV S0.y@free : KC0[1].y {W}
485 ALU MOV S2.w@free : KC0[0].x {WL}
486 TEX SAMPLE S3.xyzw : S0.xy__ RID:0 SID:0 NNNN
487 ALU ADD S4.x@group : KC1[S2.w@free{s}][0].x S3.x {W}
488 ALU ADD S4.y@group : KC1[S2.w@free{s}][0].y S3.y {W}
489 ALU ADD S4.z@group : KC1[S2.w@free{s}][0].z S3.z {W}
490 ALU ADD S4.w@group : KC1[S2.w@free{s}][0].w S3.w {WL}
491 EXPORT_DONE PIXEL 0 S4.xyzw
492 BLOCK_END
493 )";
494
495 const char *expect =
496 R"(
497 FS
498 CHIPCLASS EVERGREEN
499 PROP MAX_COLOR_EXPORTS:1
500 PROP COLOR_EXPORTS:1
501 PROP COLOR_EXPORT_MASK:15
502 PROP WRITE_ALL_COLORS:0
503 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
504 SHADER
505 BLOCK_START
506 ALU_GROUP_BEGIN
507 ALU MOVA_INT AR : KC0[0].x {}
508 ALU MOV S0.y@free : KC0[1].y {W}
509 ALU MOV S0.z@free : KC0[1].x {WL}
510 ALU_GROUP_END
511 ALU_GROUP_BEGIN
512 ALU SET_CF_IDX0 IDX0 : AR {L}
513 ALU_GROUP_END
514 BLOCK_END
515 BLOCK_START
516 TEX SAMPLE S3.xyzw : S0.zy__ RID:0 SID:0 NNNN
517 BLOCK_END
518 BLOCK_START
519 ALU_GROUP_BEGIN
520 ALU ADD S4.x@chgr : KC1[IDX0][0].x S3.x {W}
521 ALU ADD S4.y@chgr : KC1[IDX0][0].y S3.y {W}
522 ALU ADD S4.z@chgr : KC1[IDX0][0].z S3.z {W}
523 ALU ADD S4.w@chgr : KC1[IDX0][0].w S3.w {WL}
524 ALU_GROUP_END
525 BLOCK_END
526 BLOCK_START
527 EXPORT_DONE PIXEL 0 S4.xyzw
528 BLOCK_END
529 )";
530 auto sh = from_string(input);
531 split_address_loads(*sh);
532 optimize(*sh);
533 check(schedule(sh), expect);
534 }
535
TEST_F(TestShaderFromNir,SplitLoadIndexTwoTimesOptAndSchedule)536 TEST_F(TestShaderFromNir, SplitLoadIndexTwoTimesOptAndSchedule)
537 {
538 const char *input =
539 R"(
540 FS
541 CHIPCLASS CAYMAN
542 PROP MAX_COLOR_EXPORTS:1
543 PROP COLOR_EXPORTS:1
544 PROP COLOR_EXPORT_MASK:15
545 PROP WRITE_ALL_COLORS:0
546 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
547 SHADER
548 BLOCK_START
549 ALU MIN_UINT S3.x@free : KC0[0].x L[0x2] {W}
550 ALU MIN_UINT S3.y@free : KC0[0].y L[0x2] {W}
551 ALU MIN_UINT S3.z@free : KC0[0].z L[0x2] {W}
552 ALU MIN_UINT S3.w@free : KC0[0].w L[0x2] {WL}
553 ALU MOV S4.x@group : KC1[S3.x@free{s}][0].x {W}
554 ALU MOV S4.y@group : KC1[S3.y@free{s}][0].y {W}
555 ALU MOV S4.z@group : KC1[S3.z@free{s}][0].z {W}
556 ALU MOV S4.w@group : KC1[S3.w@free{s}][0].w {WL}
557 EXPORT_DONE PIXEL 0 S4.xyzw
558 BLOCK_END
559 )";
560
561 const char *expect =
562 R"(
563 FS
564 CHIPCLASS CAYMAN
565 PROP MAX_COLOR_EXPORTS:1
566 PROP COLOR_EXPORTS:1
567 PROP COLOR_EXPORT_MASK:15
568 PROP WRITE_ALL_COLORS:0
569 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
570 SHADER
571 BLOCK_START
572 ALU_GROUP_BEGIN
573 ALU MIN_UINT S3.x@free : KC0[0].x L[0x2] {W}
574 ALU MIN_UINT S3.y@free : KC0[0].y L[0x2] {W}
575 ALU MIN_UINT S3.z@free : KC0[0].z L[0x2] {W}
576 ALU MIN_UINT S3.w@free : KC0[0].w L[0x2] {WL}
577 ALU_GROUP_END
578 ALU_GROUP_BEGIN
579 ALU MOVA_INT IDX0 : S3.x@free {L}
580 ALU_GROUP_END
581 ALU_GROUP_BEGIN
582 ALU MOVA_INT IDX1 : S3.y@free {L}
583 ALU_GROUP_END
584 BLOCK_END
585 BLOCK_START
586 ALU_GROUP_BEGIN
587 ALU MOV S4.x@chgr : KC1[IDX0][0].x {WL}
588 ALU_GROUP_END
589 ALU_GROUP_BEGIN
590 ALU MOVA_INT IDX0 : S3.z@free {L}
591 ALU_GROUP_END
592 BLOCK_END
593 BLOCK_START
594 ALU_GROUP_BEGIN
595 ALU MOV S4.z@chgr : KC1[IDX0][0].z {WL}
596 ALU_GROUP_END
597 BLOCK_END
598 BLOCK_START
599 ALU_GROUP_BEGIN
600 ALU MOV S4.y@chgr : KC1[IDX1][0].y {WL}
601 ALU_GROUP_END
602 ALU_GROUP_BEGIN
603 ALU MOVA_INT IDX1 : S3.w@free {L}
604 ALU_GROUP_END
605 BLOCK_END
606 BLOCK_START
607 ALU_GROUP_BEGIN
608 ALU MOV S4.w@chgr : KC1[IDX1][0].w {WL}
609 ALU_GROUP_END
610 BLOCK_END
611 BLOCK_START
612 EXPORT_DONE PIXEL 0 S4.xyzw
613 BLOCK_END
614 )";
615 auto sh = from_string(input);
616 split_address_loads(*sh);
617 optimize(*sh);
618 check(schedule(sh), expect);
619 }
620
621