vkd3d-shader/hlsl: Use a block in hlsl_normalize_binary_exprs().
[vkd3d.git] / tests / hlsl / switch.shader_test
blob9aa59175c85ddab5eca04f80bd41c8dc5d6834ca
1 [pixel shader todo(sm<4)]
2 uint4 v;
4 float4 main() : sv_target
6     switch (v.x)
7     {
8     case 0:
9         return 3.0;
10     case 1:
11         return 4.0;
12     default:
13         return 5.0;
14     }
17 [test]
18 if(sm<4)  uniform 0 float4 3 0 0 0
19 if(sm>=4) uniform 0 uint4 3 0 0 0
20 todo(sm<4 | msl) draw quad
21 probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0)
22 if(sm<4)  uniform 0 float4 1 0 0 0
23 if(sm>=4) uniform 0 uint4 1 0 0 0
24 todo(sm<4 | msl) draw quad
25 probe (0, 0) rgba (4.0, 4.0, 4.0, 4.0)
26 if(sm<4)  uniform 0 float4 0 0 0 0
27 if(sm>=4) uniform 0 uint4 0 0 0 0
28 todo(sm<4 | msl) draw quad
29 probe (0, 0) rgba (3.0, 3.0, 3.0, 3.0)
32 % just a default case
33 [pixel shader todo(sm<4)]
34 uint4 v;
36 float4 main() : sv_target
38     switch (v.x)
39     {
40     default:
41         return 5.0;
42     }
45 [test]
46 if(sm<4)  uniform 0 float4 3 0 0 0
47 if(sm>=4) uniform 0 uint4 3 0 0 0
48 todo(sm<4 | msl) draw quad
49 probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0)
50 if(sm<4)  uniform 0 float4 1 0 0 0
51 if(sm>=4) uniform 0 uint4 1 0 0 0
52 todo(sm<4 | msl) draw quad
53 probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0)
54 if(sm<4)  uniform 0 float4 0 0 0 0
55 if(sm>=4) uniform 0 uint4 0 0 0 0
56 todo(sm<4 | msl) draw quad
57 probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0)
60 % completely empty
61 [pixel shader fail]
62 uint4 v;
64 float4 main() : sv_target
66     switch (v.x)
67     {
68     }
72 % falling through is only supported for empty case statements
73 [pixel shader todo(sm<4)]
74 uint4 v;
76 float4 main() : sv_target
78     float4 c = {1.0, 2.0, 3.0, 4.0};
80     switch (v.x)
81     {
82     case 0:
83     case 1:
84         c.x += 0.1f;
85         break;
86     }
88     return c;
91 [test]
92 if(sm<4)  uniform 0 float4 2 0 0 0
93 if(sm>=4) uniform 0 uint4 2 0 0 0
94 todo(sm<4 | msl) draw quad
95 probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
96 if(sm<4)  uniform 0 float4 1 0 0 0
97 if(sm>=4) uniform 0 uint4 1 0 0 0
98 todo(sm<4 | msl) draw quad
99 probe (0, 0) rgba (1.1, 2.0, 3.0, 4.0)
100 if(sm<4)  uniform 0 float4 0 0 0 0
101 if(sm>=4) uniform 0 uint4 0 0 0 0
102 todo(sm<4 | msl) draw quad
103 probe (0, 0) rgba (1.1, 2.0, 3.0, 4.0)
106 % case value evaluation
107 [pixel shader todo(sm<4)]
108 uint4 v;
110 float4 main() : sv_target
112     float4 c = {1.0, 2.0, 3.0, 4.0};
114     switch (v.x)
115     {
116     case 1+1:
117         c += 0.1f;
118         break;
119     case 0:
120         c += 0.2f;
121         break;
122     }
124     return c;
127 [test]
128 if(sm<4)  uniform 0 float4 2 0 0 0
129 if(sm>=4) uniform 0 uint4 2 0 0 0
130 todo(sm<4 | msl) draw quad
131 probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1)
132 if(sm<4)  uniform 0 float4 1 0 0 0
133 if(sm>=4) uniform 0 uint4 1 0 0 0
134 todo(sm<4 | msl) draw quad
135 probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
138 % floats are accepted
139 [pixel shader fail(sm>=6) todo(sm<4)]
140 uint4 v;
142 float4 main() : sv_target
144     float4 c = {1.0, 2.0, 3.0, 4.0};
146     switch (v.x)
147     {
148     case 2.1f:
149         c += 0.1f;
150         break;
151     case 0.9f:
152         c += 0.2f;
153         break;
154     }
156     return c;
159 [test]
160 if(sm<4)  uniform 0 float4 2 0 0 0
161 if(sm>=4) uniform 0 uint4 2 0 0 0
162 todo(sm<4 | msl) draw quad
163 probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1)
164 if(sm<4)  uniform 0 float4 1 0 0 0
165 if(sm>=4) uniform 0 uint4 1 0 0 0
166 todo(sm<4 | msl) draw quad
167 probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
169 [pixel shader fail(sm<4 | sm>=6) todo(sm<4)]
170 float4 v;
172 float4 main() : sv_target
174     float4 c = {1.0, 2.0, 3.0, 4.0};
176     switch (v.x)
177     {
178     case 2.1f:
179         c += 0.1f;
180         break;
181     case 0.9f:
182         c += 0.2f;
183         break;
184     }
186     return c;
189 [test]
190 uniform 0 float4 2.0 0.0 0.0 0.0
191 todo(sm<4 | msl) draw quad
192 probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1)
193 uniform 0 float4 1.0 0.0 0.0 0.0
194 todo(sm<4 | msl) draw quad
195 probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
197 [pixel shader fail]
198 uint4 v;
200 float4 main() : sv_target
202     float4 c = {1.0, 2.0, 3.0, 4.0};
203     uint a = 1;
205     switch (v.x)
206     {
207     case 1+a:
208         c += 0.1f;
209         break;
210     case 0:
211         c += 0.2f;
212         break;
213     }
215     return c;
218 % duplicate cases
219 [pixel shader fail]
220 uint4 v;
222 float4 main() : sv_target
224     float4 c = {1.0, 2.0, 3.0, 4.0};
226     switch (v.x)
227     {
228     case 2:
229         c += 0.1f;
230         break;
231     case 1+1:
232         c += 0.2f;
233         break;
234     }
236     return c;
239 % multiple default cases
240 [pixel shader fail]
241 uint4 v;
243 float4 main() : sv_target
245     float4 c = {1.0, 2.0, 3.0, 4.0};
247     switch (v.x)
248     {
249     default:
250     case 2:
251         c += 0.1f;
252         break;
253     case 1:
254         c += 0.2f;
255         break;
256     default:
257         break;
258     }
260     return c;
263 % unterminated cases
264 [pixel shader fail(sm<6)]
265 uint4 v;
267 float4 main() : sv_target
269     float4 c = {1.0, 2.0, 3.0, 4.0};
271     switch (v.x)
272     {
273     case 0:
274         c += 0.1f;
275     case 1:
276         c += 0.2f;
277         break;
278     }
280     return c;
283 [pixel shader fail]
284 uint4 v;
286 float4 main() : sv_target
288     switch (v.x)
289     {
290     case 0:
291         return 3.0;
292     case 1:
293         return 4.0;
294     case 2:
295     }
296     return 0.0;
299 [pixel shader fail]
300 uint4 v;
302 float4 main() : sv_target
304     switch (v.x)
305     {
306     case 0:
307         return 3.0;
308     case 1:
309         return 4.0;
310     default:
311     }
312     return 0.0;
315 [pixel shader fail(sm<6)]
316 uint4 v;
318 float4 main() : sv_target
320     switch (v.x)
321     {
322     case 0:
323         return 3.0;
324     case 1:
325         return 4.0;
326     default:
327         discard;
328     }
329     return 0.0;
332 [pixel shader fail(sm<6)]
333 uint4 v;
335 float4 main() : sv_target
337     switch (v.x)
338     {
339     case 0:
340         return 3.0;
341     case 1:
342         return 4.0;
343     case 2:
344         discard;
345     }
346     return 0.0;
349 [pixel shader fail(sm<6)]
350 uint4 v;
352 float4 main() : sv_target
354     switch (v.x)
355     {
356     case 0:
357         discard;
358     case 1:
359         return 4.0;
360     }
361     return 0.0;
364 % more complicated breaks
365 [pixel shader todo(sm<4)]
366 uint4 v;
368 float4 main() : sv_target
370     float4 c = {1.0, 2.0, 3.0, 4.0};
372     switch (v.x)
373     {
374     case 2:
375         c += 0.1f;
376         if (true) break;
377         c = 9.0f;
378     case 1:
379         if (false) break;
380         c += 0.2f;
381         break;
382     default:
383     case 0:
384         break;
385     }
387     return c;
390 [test]
391 if(sm<4)  uniform 0 float4 2 0 0 0
392 if(sm>=4) uniform 0 uint4 2 0 0 0
393 todo(sm<4 | msl) draw quad
394 probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1)
395 if(sm<4)  uniform 0 float4 1 0 0 0
396 if(sm>=4) uniform 0 uint4 1 0 0 0
397 todo(sm<4 | msl) draw quad
398 probe (0, 0) rgba (1.2, 2.2, 3.2, 4.2)
399 if(sm<4)  uniform 0 float4 0 0 0 0
400 if(sm>=4) uniform 0 uint4 0 0 0 0
401 todo(sm<4 | msl) draw quad
402 probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
404 % switch breaks within a loop
405 [pixel shader todo(sm<4)]
406 uint4 v;
408 float4 main() : sv_target
410     float4 c = {1.0f, 2.0f, 3.0f, 4.0f};
412     for (int i = 0; i < 4; ++i)
413     {
414         switch (v.x)
415         {
416         case 2:
417             c += 1.0f;
418             break;
419         case 1:
420             c -= 1.0f;
421             break;
422         default:
423         case 0:
424             break;
425         }
426     }
428     return c;
431 [test]
432 if(sm<4)  uniform 0 float4 2 0 0 0
433 if(sm>=4) uniform 0 uint4 2 0 0 0
434 todo(sm<4 | msl) draw quad
435 probe (0, 0) rgba (5.0, 6.0, 7.0, 8.0)
438 % default case placement
439 [pixel shader todo(sm<4)]
440 uint4 v;
442 float4 main() : sv_target
444     float4 c = {1.0f, 2.0f, 3.0f, 4.0f};
446     switch (v.x)
447     {
448     case 2:
449         c += 1.0f;
450         break;
451     case 1:
452         c -= 1.0f;
453         break;
454     case 3:
455     default:
456     case 0:
457         c += 3.0f;
458         break;
459     }
461     return c;
464 [test]
465 if(sm<4)  uniform 0 float4 0 0 0 0
466 if(sm>=4) uniform 0 uint4 0 0 0 0
467 todo(sm<4 | msl) draw quad
468 probe (0, 0) rgba (4.0, 5.0, 6.0, 7.0)
469 if(sm<4)  uniform 0 float4 2 0 0 0
470 if(sm>=4) uniform 0 uint4 2 0 0 0
471 todo(sm<4 | msl) draw quad
472 probe (0, 0) rgba (2.0, 3.0, 4.0, 5.0)
473 if(sm<4)  uniform 0 float4 3 0 0 0
474 if(sm>=4) uniform 0 uint4 3 0 0 0
475 todo(sm<4 | msl) draw quad
476 probe (0, 0) rgba (4.0, 5.0, 6.0, 7.0)
479 [pixel shader todo(sm<4)]
480 uint4 v;
482 float4 main() : sv_target
484     float4 c = {1.0f, 2.0f, 3.0f, 4.0f};
486     switch (v.x)
487     {
488     case 2:
489         c += 1.0f;
490         break;
491     case 1:
492         c -= 1.0f;
493         break;
494     case 3:
495     default:
496         break;
497     case 0:
498         c += 3.0f;
499         break;
500     }
502     return c;
505 [test]
506 if(sm<4)  uniform 0 float4 3 0 0 0
507 if(sm>=4) uniform 0 uint4 3 0 0 0
508 todo(sm<4 | msl) draw quad
509 probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
510 if(sm<4)  uniform 0 float4 0 0 0 0
511 if(sm>=4) uniform 0 uint4 0 0 0 0
512 todo(sm<4 | msl) draw quad
513 probe (0, 0) rgba (4.0, 5.0, 6.0, 7.0)
514 if(sm<4)  uniform 0 float4 5 0 0 0
515 if(sm>=4) uniform 0 uint4 5 0 0 0
516 todo(sm<4 | msl) draw quad
517 probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
519 % 'continue' is not supported in switches
520 [pixel shader fail(sm<6)]
521 uint4 v;
523 float4 main() : sv_target
525     float4 c = {1.0, 2.0, 3.0, 4.0};
526     uint i, j;
528     for (i = 0; i < v.z; i++)
529     {
530         switch (v.x)
531         {
532             case 0:
533                 c += 0.1f;
534                 continue;
535                 break;
536             case 1:
537                 c += 0.2f;
538                 break;
539         }
540     }
542     return c;
545 [pixel shader fail(sm<4) todo(sm<4)]
546 uint4 v;
548 float4 main() : sv_target
550     float4 c = {1.0, 2.0, 3.0, 4.0};
551     uint i, j;
553     for (i = 0; i < v.z; i++)
554     {
555         switch (v.x)
556         {
557             case 1:
558                 for (j = 0; j < v.z; j++)
559                 {
560                     c += 1.0f;
561                     if (v.w)
562                         continue;
563                 }
564                 break;
565             case 0:
566                 c += 2.0f;
567                 break;
568         }
569     }
571     return c;
574 [test]
575 if(sm<4)  uniform 0 float4 1 0 3 1
576 if(sm>=4) uniform 0 uint4 1 0 3 1
577 todo(msl) draw quad
578 probe (0, 0) rgba (10.0, 11.0, 12.0, 13.0)
579 if(sm<4)  uniform 0 float4 0 0 3 1
580 if(sm>=4) uniform 0 uint4 0 0 3 1
581 todo(msl) draw quad
582 probe (0, 0) rgba (7.0, 8.0, 9.0, 10.0)
584 % return from a switch nested in a loop
585 [pixel shader fail(sm<4) todo(sm<4)]
586 /* In theory this could be directly defined as uint4, but that hits some kind
587  * of optimization bug on Metal, which we work around this way. */
588 float4 vf;
590 float4 main() : sv_target
592     float4 c = {1.0, 2.0, 3.0, 4.0};
593     uint4 v = vf;
594     uint i, j;
596     for (i = 0; i < v.z; i++)
597     {
598         switch (v.x)
599         {
600             case 0:
601                 c += 1.0f;
602                 break;
603             case 1:
604                 c += 2.0f;
605                 return c;
606         }
607         c += 100.0f;
608     }
610     return c;
613 [test]
614 uniform 0 float4 0 0 3 1
615 todo(msl) draw quad
616 probe (0, 0) rgba (304.0, 305.0, 306.0, 307.0)
617 uniform 0 float4 1 0 3 1
618 todo(msl) draw quad
619 probe (0, 0) rgba (3.0, 4.0, 5.0, 6.0)
621 [require]
622 shader model >= 6.0
624 [pixel shader]
625 uint64_t2 v;
627 float4 main() : sv_target
629     // Need three cases because dxcompiler optimises two case values to a pair of vselect instructions.
630     switch (v.x)
631     {
632     case 0:
633         return 3.0;
634     case 0x100000002:
635         return 4.0;
636     case 3:
637         return 2.0;
638     default:
639         return 5.0;
640     }
643 [test]
644 uniform 0 uint64_t2 2 0
645 draw quad
646 probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0)
647 uniform 0 uint64_t2 0x100000002 0
648 draw quad
649 probe (0, 0) rgba (4.0, 4.0, 4.0, 4.0)
650 uniform 0 uint64_t2 0 0
651 draw quad
652 probe (0, 0) rgba (3.0, 3.0, 3.0, 3.0)