xref: /aosp_15_r20/external/deqp/data/gles31/shaders/gl45/linkage_uniform.test (revision 35238bce31c2a825756842865a792f8cf7f89930)
1group struct "Uniform structs"
2    # Struct linkage handling
3    case basic
4        version 450
5        desc "Same uniform struct in both shaders"
6        values {
7            uniform float val.a = 1.0;
8            uniform float val.b = 2.0;
9            output float out0 = 3.0;
10        }
11        vertex ""
12            #version 450
13            ${VERTEX_DECLARATIONS}
14            struct Struct {mediump float a; mediump float b;};
15            uniform Struct val;
16            out mediump float dummy;
17            void main()
18            {
19                dummy = val.a + val.b;
20                ${VERTEX_OUTPUT}
21            }
22        ""
23        fragment ""
24            #version 450
25            precision mediump float;
26            struct Struct {mediump float a; mediump float b;};
27            uniform Struct val;
28            in mediump float dummy;
29            ${FRAGMENT_DECLARATIONS}
30            void main()
31            {
32                out0 = val.b + val.a;
33                out0 = out0 + dummy;
34                out0 = out0 - dummy;
35                ${FRAGMENT_OUTPUT}
36            }
37        ""
38    end
39
40    case vertex_only
41        version 450
42        desc "Uniform struct declared in both, used only in vertex."
43        values {
44            uniform float val.a = 1.0;
45            uniform float val.b = 2.0;
46            output float out0 = 3.0;
47        }
48        vertex ""
49            #version 450
50            ${VERTEX_DECLARATIONS}
51            struct Struct {mediump float a; mediump float b;};
52            uniform Struct val;
53            out mediump float res;
54            void main()
55            {
56                res = val.a + val.b;
57                ${VERTEX_OUTPUT}
58            }
59        ""
60        fragment ""
61            #version 450
62            precision mediump float;
63            struct Struct {mediump float a; mediump float b;};
64            uniform Struct val;
65            in mediump float res;
66            ${FRAGMENT_DECLARATIONS}
67            void main()
68            {
69                out0 = res;
70                ${FRAGMENT_OUTPUT}
71            }
72        ""
73    end
74
75    case fragment_only
76        version 450
77        desc "Uniform struct declared in both, used only in fragment."
78        values {
79            uniform float val.a = 1.0;
80            uniform float val.b = 2.0;
81            output float out0 = 3.0;
82        }
83        vertex ""
84            #version 450
85            ${VERTEX_DECLARATIONS}
86            struct Struct {mediump float a; mediump float b;};
87            uniform Struct val;
88            void main()
89            {
90                ${VERTEX_OUTPUT}
91            }
92        ""
93        fragment ""
94            #version 450
95            precision mediump float;
96            struct Struct {mediump float a; mediump float b;};
97            uniform Struct val;
98            ${FRAGMENT_DECLARATIONS}
99            void main()
100            {
101                out0 = val.a + val.b;
102                ${FRAGMENT_OUTPUT}
103            }
104        ""
105    end
106
107    case partial
108        version 450
109        desc "Uniform struct declared in both, used partially in both."
110        values {
111            uniform float val.a = 1.0;
112            uniform float val.b = 2.0;
113            output float out0 = 3.0;
114        }
115        vertex ""
116            #version 450
117            ${VERTEX_DECLARATIONS}
118            struct Struct {mediump float a; mediump float b;};
119            uniform Struct val;
120            out mediump float res;
121            void main()
122            {
123                res = val.a;
124                ${VERTEX_OUTPUT}
125            }
126        ""
127        fragment ""
128            #version 450
129            precision mediump float;
130            struct Struct {mediump float a; mediump float b;};
131            uniform Struct val;
132            ${FRAGMENT_DECLARATIONS}
133            in mediump float res;
134            void main()
135            {
136                out0 = res + val.b;
137                ${FRAGMENT_OUTPUT}
138            }
139        ""
140    end
141
142    case vec4
143        version 450
144        desc "Same uniform struct in both shaders. Datatype vec4"
145        values {
146            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
147            uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
148            output float out0 = 3.0;
149        }
150        vertex ""
151            #version 450
152            ${VERTEX_DECLARATIONS}
153            struct Struct {mediump vec4 a; mediump vec4 b;};
154            uniform Struct val;
155            out mediump float dummy;
156            void main()
157            {
158                dummy = val.a.x + val.b.y;
159                ${VERTEX_OUTPUT}
160            }
161        ""
162        fragment ""
163            #version 450
164            precision mediump float;
165            struct Struct {mediump vec4 a; mediump vec4 b;};
166            uniform Struct val;
167            in mediump float dummy;
168            ${FRAGMENT_DECLARATIONS}
169            void main()
170            {
171                out0 = val.b.y + val.a.x;
172                out0 = out0 + dummy;
173                out0 = out0 - dummy;
174                ${FRAGMENT_OUTPUT}
175            }
176        ""
177    end
178
179    case vertex_only_vec4
180        version 450
181        desc "Uniform struct declared in both, used only in vertex. Datatype vec4    "
182        values {
183            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
184            uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
185            output float out0 = 3.0;
186        }
187        vertex ""
188            #version 450
189            ${VERTEX_DECLARATIONS}
190            struct Struct {mediump vec4 a; mediump vec4 b;};
191            uniform Struct val;
192            out mediump float res;
193            void main()
194            {
195                res = val.a.x + val.b.y;
196                ${VERTEX_OUTPUT}
197            }
198        ""
199        fragment ""
200            #version 450
201            precision mediump float;
202            struct Struct {mediump vec4 a; mediump vec4 b;};
203            uniform Struct val;
204            in mediump float res;
205            ${FRAGMENT_DECLARATIONS}
206            void main()
207            {            out0 = res;
208                ${FRAGMENT_OUTPUT}
209            }
210        ""
211    end
212
213    case fragment_only_vec4
214        version 450
215        desc "Uniform struct declared in both, used only in fragment. Datatype vec4"
216        values {
217            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
218            uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
219            output float out0 = 3.0;
220        }
221        vertex ""
222            #version 450
223            ${VERTEX_DECLARATIONS}
224            struct Struct {mediump vec4 a; mediump vec4 b;};
225            uniform Struct val;
226            void main()
227            {
228                ${VERTEX_OUTPUT}
229            }
230        ""
231        fragment ""
232            #version 450
233            precision mediump float;
234            struct Struct {mediump vec4 a; mediump vec4 b;};
235            uniform Struct val;
236            ${FRAGMENT_DECLARATIONS}
237            void main()
238            {            out0 = val.a.x + val.b.y;
239                ${FRAGMENT_OUTPUT}
240            }
241        ""
242    end
243
244    case partial_vec4
245        version 450
246        desc "Uniform struct declared in both, used partially in both. Datatype vec4"
247        values {
248            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
249            uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
250            output float out0 = 3.0;
251        }
252        vertex ""
253            #version 450
254            ${VERTEX_DECLARATIONS}
255            struct Struct {mediump vec4 a; mediump vec4 b;};
256            uniform Struct val;
257            out mediump float res;
258            void main()
259            {
260                res = val.a.x;
261                ${VERTEX_OUTPUT}
262            }
263        ""
264        fragment ""
265            #version 450
266            precision mediump float;
267            struct Struct {mediump vec4 a; mediump vec4 b;};
268            uniform Struct val;
269            ${FRAGMENT_DECLARATIONS}
270            in mediump float res;
271            void main()
272            {            out0 = res + val.b.y;
273                ${FRAGMENT_OUTPUT}
274            }
275        ""
276    end
277
278    case vec4_vec3
279        version 450
280        desc "Same uniform struct in both shaders. Datatype vec4 and vec3"
281        values {
282            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
283            uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
284            output float out0 = 3.0;
285        }
286        vertex ""
287            #version 450
288            ${VERTEX_DECLARATIONS}
289            struct Struct {mediump vec4 a; mediump vec3 b;};
290            uniform Struct val;
291            out mediump float dummy;
292            void main()
293            {
294                dummy = val.a.x + val.b.y;
295                ${VERTEX_OUTPUT}
296            }
297        ""
298        fragment ""
299            #version 450
300            precision mediump float;
301            struct Struct {mediump vec4 a; mediump vec3 b;};
302            uniform Struct val;
303            in mediump float dummy;
304            ${FRAGMENT_DECLARATIONS}
305            void main()
306            {            out0 = val.b.y + val.a.x;
307                out0 = out0 + dummy;
308                out0 = out0 - dummy;
309                ${FRAGMENT_OUTPUT}
310            }
311        ""
312    end
313
314    case vertex_only_vec4_vec3
315        version 450
316        desc "Uniform struct declared in both, used only in vertex. Datatype vec4 and vec3"
317        values {
318            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
319            uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
320            output float out0 = 3.0;
321        }
322        vertex ""
323            #version 450
324            ${VERTEX_DECLARATIONS}
325            struct Struct {mediump vec4 a; mediump vec3 b;};
326            uniform Struct val;
327            out mediump float res;
328            void main()
329            {
330                res = val.a.x + val.b.y;
331                ${VERTEX_OUTPUT}
332            }
333        ""
334        fragment ""
335            #version 450
336            precision mediump float;
337            struct Struct {mediump vec4 a; mediump vec3 b;};
338            uniform Struct val;
339            in mediump float res;
340            ${FRAGMENT_DECLARATIONS}
341            void main()
342            {            out0 = res;
343                ${FRAGMENT_OUTPUT}
344            }
345        ""
346    end
347
348    case fragment_only_vec4_vec3
349        version 450
350        desc "Uniform struct declared in both, used only in fragment. Datatype vec4 and vec3"
351        values {
352            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
353            uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
354            output float out0 = 3.0;
355        }
356        vertex ""
357            #version 450
358            ${VERTEX_DECLARATIONS}
359            struct Struct {mediump vec4 a; mediump vec3 b;};
360            uniform Struct val;
361            void main()
362            {
363                ${VERTEX_OUTPUT}
364            }
365        ""
366        fragment ""
367            #version 450
368            precision mediump float;
369            struct Struct {mediump vec4 a; mediump vec3 b;};
370            uniform Struct val;
371            ${FRAGMENT_DECLARATIONS}
372            void main()
373            {            out0 = val.a.x + val.b.y;
374                ${FRAGMENT_OUTPUT}
375            }
376        ""
377    end
378
379    case partial_vec4_vec3
380        version 450
381        desc "Uniform struct declared in both, used partially in both. Datatype vec4 and vec3"
382        values {
383            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
384            uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
385            output float out0 = 3.0;
386        }
387        vertex ""
388            #version 450
389            ${VERTEX_DECLARATIONS}
390            struct Struct {mediump vec4 a; mediump vec3 b;};
391            uniform Struct val;
392            out mediump float res;
393            void main()
394            {
395                res = val.a.x;
396                ${VERTEX_OUTPUT}
397            }
398        ""
399        fragment ""
400            #version 450
401            precision mediump float;
402            struct Struct {mediump vec4 a; mediump vec3 b;};
403            uniform Struct val;
404            ${FRAGMENT_DECLARATIONS}
405            in mediump float res;
406            void main()
407            {            out0 = res + val.b.y;
408                ${FRAGMENT_OUTPUT}
409            }
410        ""
411    end
412
413    case vec4_float
414        version 450
415        desc "Same uniform struct in both shaders. Datatype vec4 and float"
416        values {
417            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
418            uniform float val.b = 2.0;
419            output float out0 = 3.0;
420        }
421        vertex ""
422            #version 450
423            ${VERTEX_DECLARATIONS}
424            struct Struct {mediump vec4 a; mediump float b;};
425            uniform Struct val;
426            out mediump float dummy;
427            void main()
428            {
429                dummy = val.a.x + val.b;
430                ${VERTEX_OUTPUT}
431            }
432        ""
433        fragment ""
434            #version 450
435            precision mediump float;
436            struct Struct {mediump vec4 a; mediump float b;};
437            uniform Struct val;
438            in mediump float dummy;
439            ${FRAGMENT_DECLARATIONS}
440            void main()
441            {            out0 = val.b + val.a.x;
442                out0 = out0 + dummy;
443                out0 = out0 - dummy;
444                ${FRAGMENT_OUTPUT}
445            }
446        ""
447    end
448
449    case vertex_only_vec4_float
450        version 450
451        desc "Uniform struct declared in both, used only in vertex. Datatype vec4 and float"
452        values {
453            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
454            uniform float val.b = 2.0;
455            output float out0 = 3.0;
456        }
457        vertex ""
458            #version 450
459            ${VERTEX_DECLARATIONS}
460            struct Struct {mediump vec4 a; mediump float b;};
461            uniform Struct val;
462            out mediump float res;
463            void main()
464            {
465                res = val.a.x + val.b;
466                ${VERTEX_OUTPUT}
467            }
468        ""
469        fragment ""
470            #version 450
471            precision mediump float;
472            struct Struct {mediump vec4 a; mediump float b;};
473            uniform Struct val;
474            in mediump float res;
475            ${FRAGMENT_DECLARATIONS}
476            void main()
477            {            out0 = res;
478                ${FRAGMENT_OUTPUT}
479            }
480        ""
481    end
482
483    case fragment_only_vec4_float
484        version 450
485        desc "Uniform struct declared in both, used only in fragment. Datatype vec4 and float"
486        values {
487            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
488            uniform float val.b = 2.0;
489            output float out0 = 3.0;
490        }
491        vertex ""
492            #version 450
493            ${VERTEX_DECLARATIONS}
494            struct Struct {mediump vec4 a; mediump float b;};
495            uniform Struct val;
496            void main()
497            {
498                ${VERTEX_OUTPUT}
499            }
500        ""
501        fragment ""
502            #version 450
503            precision mediump float;
504            struct Struct {mediump vec4 a; mediump float b;};
505            uniform Struct val;
506            ${FRAGMENT_DECLARATIONS}
507            void main()
508            {            out0 = val.a.x + val.b;
509                ${FRAGMENT_OUTPUT}
510            }
511        ""
512    end
513
514    case partial_vec4_float
515        version 450
516        desc "Uniform struct declared in both, used partially in both. Datatype vec4 and float"
517        values {
518            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
519            uniform float val.b = 2.0;
520            output float out0 = 3.0;
521        }
522        vertex ""
523            #version 450
524            ${VERTEX_DECLARATIONS}
525            struct Struct {mediump vec4 a; mediump float b;};
526            uniform Struct val;
527            out mediump float res;
528            void main()
529            {
530                res = val.a.x;
531                ${VERTEX_OUTPUT}
532            }
533        ""
534        fragment ""
535            #version 450
536            precision mediump float;
537            struct Struct {mediump vec4 a; mediump float b;};
538            uniform Struct val;
539            ${FRAGMENT_DECLARATIONS}
540            in mediump float res;
541            void main()
542            {            out0 = res + val.b;
543                ${FRAGMENT_OUTPUT}
544            }
545        ""
546    end
547
548    case partial_vec4_struct
549        version 450
550        desc "Uniform struct declared in both, used partially in both. Datatype vec4 and struct with vec4"
551        values {
552            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
553            uniform vec4 val.b.c = vec4(1.0, 2.0, 3.0, 4.0);
554            output float out0 = 3.0;
555        }
556        vertex ""
557            #version 450
558            ${VERTEX_DECLARATIONS}
559            struct Inner {mediump vec4 c;};
560            struct Struct {mediump vec4 a; Inner b;};
561            uniform Struct val;
562            out mediump float res;
563            void main()
564            {
565                res = val.a.x;
566                ${VERTEX_OUTPUT}
567            }
568        ""
569        fragment ""
570            #version 450
571            precision mediump float;
572            struct Inner {mediump vec4 c;};
573            struct Struct {mediump vec4 a; Inner b;};
574            uniform Struct val;
575            ${FRAGMENT_DECLARATIONS}
576            in mediump float res;
577            void main()
578            {            out0 = res + val.b.c.y;
579                ${FRAGMENT_OUTPUT}
580            }
581        ""
582    end
583
584    case partial_vec4_vec3_struct
585        version 450
586        desc "Uniform struct declared in both, used partially in both. Datatype vec4 and struct with vec3"
587        values {
588            uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
589            uniform vec3 val.b.c = vec3(1.0, 2.0, 3.0);
590            output float out0 = 3.0;
591        }
592        vertex ""
593            #version 450
594            ${VERTEX_DECLARATIONS}
595            struct Inner {mediump vec3 c;};
596            struct Struct {mediump vec4 a; Inner b;};
597            uniform Struct val;
598            out mediump float res;
599            void main()
600            {
601                res = val.a.x;
602                ${VERTEX_OUTPUT}
603            }
604        ""
605        fragment ""
606            #version 450
607            precision mediump float;
608            struct Inner {mediump vec3 c;};
609            struct Struct {mediump vec4 a; Inner b;};
610            uniform Struct val;
611            ${FRAGMENT_DECLARATIONS}
612            in mediump float res;
613            void main()
614            {            out0 = res + val.b.c.y;
615                ${FRAGMENT_OUTPUT}
616            }
617        ""
618    end
619
620    case partial_vec2_vec3
621        version 450
622        desc "Uniform struct declared in both, used partially in both. Datatype vec2 and vec3"
623        values {
624            uniform vec2 val.a = vec2(1.0, 2.0);
625            uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
626            output float out0 = 3.0;
627        }
628        vertex ""
629            #version 450
630            ${VERTEX_DECLARATIONS}
631            struct Struct {mediump vec2 a; mediump vec3 b;};
632            uniform Struct val;
633            out mediump float res;
634            void main()
635            {
636                res = val.a.x;
637                ${VERTEX_OUTPUT}
638            }
639        ""
640        fragment ""
641            #version 450
642            precision mediump float;
643            struct Struct {mediump vec2 a; mediump vec3 b;};
644            uniform Struct val;
645            ${FRAGMENT_DECLARATIONS}
646            in mediump float res;
647            void main()
648            {            out0 = res + val.b.y;
649                ${FRAGMENT_OUTPUT}
650            }
651        ""
652    end
653
654    case partial_vec2_int
655        version 450
656        desc "Uniform struct declared in both, used partially in both. Datatype vec2 and int"
657        values {
658            uniform vec2 val.a = vec2(1.0, 2.0);
659            uniform int val.b = 2;
660            output float out0 = 3.0;
661        }
662        vertex ""
663            #version 450
664            ${VERTEX_DECLARATIONS}
665            struct Struct {mediump vec2 a; mediump int b;};
666            uniform Struct val;
667            out mediump float res;
668            void main()
669            {
670                res = val.a.x;
671                ${VERTEX_OUTPUT}
672            }
673        ""
674        fragment ""
675            #version 450
676            precision mediump float;
677            struct Struct {mediump vec2 a; mediump int b;};
678            uniform Struct val;
679            ${FRAGMENT_DECLARATIONS}
680            in mediump float res;
681            void main()
682            {            out0 = res + float(val.b);
683                ${FRAGMENT_OUTPUT}
684            }
685        ""
686    end
687
688    case partial_int_float
689        version 450
690        desc "Uniform struct declared in both, used partially in both. Datatype int and float"
691        values {
692            uniform float val.a = 1.0;
693            uniform int val.b = 2;
694            output float out0 = 3.0;
695        }
696        vertex ""
697            #version 450
698            ${VERTEX_DECLARATIONS}
699            struct Struct {mediump float a; mediump int b;};
700            uniform Struct val;
701            out mediump float res;
702            void main()
703            {
704                res = val.a;
705                ${VERTEX_OUTPUT}
706            }
707        ""
708        fragment ""
709            #version 450
710            precision mediump float;
711            struct Struct {mediump float a; mediump int b;};
712            uniform Struct val;
713            ${FRAGMENT_DECLARATIONS}
714            in mediump float res;
715            void main()
716            {            out0 = res + float(val.b);
717                ${FRAGMENT_OUTPUT}
718            }
719        ""
720    end
721
722    case partial_bvec2_vec2
723        version 450
724        desc "Uniform struct declared in both, used partially in both. Datatype bvec2 and vec2"
725        values {
726            uniform bvec2 val.a = bvec2(true, true);
727            uniform vec2 val.b = vec2(1.0, 2.0);
728            output float out0 = 3.0;
729        }
730        vertex ""
731            #version 450
732            ${VERTEX_DECLARATIONS}
733            struct Struct {bvec2 a; mediump vec2 b;};
734            uniform Struct val;
735            out mediump float res;
736            void main()
737            {
738                res = float(val.a.x);
739                ${VERTEX_OUTPUT}
740            }
741        ""
742        fragment ""
743            #version 450
744            precision mediump float;
745            struct Struct {bvec2 a; mediump vec2 b;};
746            uniform Struct val;
747            ${FRAGMENT_DECLARATIONS}
748            in mediump float res;
749            void main()
750            {            out0 = res + val.b.y;
751                ${FRAGMENT_OUTPUT}
752            }
753        ""
754    end
755
756    case partial_ivec2_vec2
757        version 450
758        desc "Uniform struct declared in both, used partially in both. Datatype ivec2 and vec2"
759        values {
760            uniform ivec2 val.a = ivec2(1, 2);
761            uniform vec2 val.b = vec2(1.0, 2.0);
762            output float out0 = 3.0;
763        }
764        vertex ""
765            #version 450
766            ${VERTEX_DECLARATIONS}
767            struct Struct {mediump ivec2 a; mediump vec2 b;};
768            uniform Struct val;
769            out mediump float res;
770            void main()
771            {
772                res = vec2(val.a).x;
773                ${VERTEX_OUTPUT}
774            }
775        ""
776        fragment ""
777            #version 450
778            precision mediump float;
779            struct Struct {mediump ivec2 a; mediump vec2 b;};
780            uniform Struct val;
781            ${FRAGMENT_DECLARATIONS}
782            in mediump float res;
783            void main()
784            {            out0 = res + val.b.y;
785                ${FRAGMENT_OUTPUT}
786            }
787        ""
788    end
789
790    case partial_ivec2_ivec2
791        version 450
792        desc "Uniform struct declared in both, used partially in both. Datatype ivec2 and ivec2"
793        values {
794            uniform ivec2 val.a = ivec2(1, 2);
795            uniform ivec2 val.b = ivec2(1, 2);
796            output float out0 = 3.0;
797        }
798        vertex ""
799            #version 450
800            ${VERTEX_DECLARATIONS}
801            struct Struct {mediump ivec2 a; mediump ivec2 b;};
802            uniform Struct val;
803            out mediump float res;
804            void main()
805            {
806                res = vec2(val.a).x;
807                ${VERTEX_OUTPUT}
808            }
809        ""
810        fragment ""
811            #version 450
812            precision mediump float;
813            struct Struct {mediump ivec2 a; mediump ivec2 b;};
814            uniform Struct val;
815            ${FRAGMENT_DECLARATIONS}
816            in mediump float res;
817            void main()
818            {            out0 = res + vec2(val.b).y;
819                ${FRAGMENT_OUTPUT}
820            }
821        ""
822    end
823
824    case type_conflict_1
825        version 450
826        desc "Fragment struct has one less member than fragment version"
827        expect link_fail
828        values {output float out0 = 3.0;}
829        vertex ""
830            #version 450
831            ${VERTEX_DECLARATIONS}
832            struct Struct {mediump float a; mediump float b;};
833            uniform Struct val;
834            out mediump float res;
835            void main()
836            {
837                res = val.a;
838                ${VERTEX_OUTPUT}
839            }
840        ""
841        fragment ""
842            #version 450
843            precision mediump float;
844            struct Struct {mediump float a;};
845            uniform Struct val;
846            ${FRAGMENT_DECLARATIONS}
847            in mediump float res;
848            void main()
849            {            out0 = res + val.a;
850                ${FRAGMENT_OUTPUT}
851            }
852        ""
853    end
854
855    case type_conflict_2
856        version 450
857        desc "Vertex struct has int, fragment struct has float."
858        expect link_fail
859        values {output float out0 = 3.0;}
860        vertex ""
861            #version 450
862            ${VERTEX_DECLARATIONS}
863            struct Struct {mediump int a;};
864            uniform Struct val;
865            out mediump float res;
866            void main()
867            {
868                res = float(val.a);
869                ${VERTEX_OUTPUT}
870            }
871        ""
872        fragment ""
873            #version 450
874            precision mediump float;
875            struct Struct {mediump float a;};
876            uniform Struct val;
877            ${FRAGMENT_DECLARATIONS}
878            in mediump float res;
879            void main()
880            {            out0 = val.a;
881                ${FRAGMENT_OUTPUT}
882            }
883        ""
884    end
885
886    case type_conflict_3
887        version 450
888        desc "Vertex struct has vec3, fragment struct has vec4."
889        expect link_fail
890        values {output float out0 = 3.0;}
891        vertex ""
892            #version 450
893            ${VERTEX_DECLARATIONS}
894            struct Struct {mediump vec3 a;};
895            uniform Struct val;
896            out mediump float res;
897            void main()
898            {
899                res = float(val.a.x);
900                ${VERTEX_OUTPUT}
901            }
902        ""
903        fragment ""
904            #version 450
905            precision mediump float;
906            struct Struct {mediump vec4 a;};
907            uniform Struct val;
908            ${FRAGMENT_DECLARATIONS}
909            in mediump float res;
910            void main()
911            {            out0 = val.a.x;
912                ${FRAGMENT_OUTPUT}
913            }
914        ""
915    end
916
917    case light_struct_highp
918        version 450
919        desc "Complex Light struct from use case tests."
920        values {
921            uniform float val.constantAttenuation = 1.0;
922            uniform float val.quadraticAttenuation = 1.0;
923            output float out0 = 2.0;
924        }
925        vertex ""
926            #version 450
927            struct Light
928            {
929                mediump vec3    color;
930                highp vec4        position;
931                highp vec3        direction;
932                mediump float    constantAttenuation;
933                mediump float    linearAttenuation;
934                mediump float    quadraticAttenuation;
935            };
936            ${VERTEX_DECLARATIONS}
937            uniform Light val;
938            out mediump float res;
939            void main()
940            {
941                res = val.constantAttenuation;
942                ${VERTEX_OUTPUT}
943            }
944        ""
945        fragment ""
946            #version 450
947            precision mediump float;
948            struct Light
949            {
950                mediump vec3    color;
951                highp vec4        position;
952                highp vec3        direction;
953                mediump float    constantAttenuation;
954                mediump float    linearAttenuation;
955                mediump float    quadraticAttenuation;
956            };
957            struct Struct {float a;};
958            uniform Light val;
959            ${FRAGMENT_DECLARATIONS}
960            in mediump float res;
961            void main()
962            {
963                out0 = res + val.quadraticAttenuation;
964                ${FRAGMENT_OUTPUT}
965            }
966        ""
967    end
968
969    case light_struct_mediump
970        version 450
971        desc "Complex Light struct from use case tests, without highp usage"
972        values {
973            uniform float val.constantAttenuation = 1.0;
974            uniform float val.quadraticAttenuation = 1.0;
975            output float out0 = 2.0;
976        }
977        vertex ""
978            #version 450
979            struct Light
980            {
981                mediump vec3    color;
982                mediump vec4    position;
983                mediump vec3    direction;
984                mediump float    constantAttenuation;
985                mediump float    linearAttenuation;
986                mediump float    quadraticAttenuation;
987            };
988            ${VERTEX_DECLARATIONS}
989            uniform Light val;
990            out mediump float res;
991            void main()
992            {
993                res = val.constantAttenuation;
994                ${VERTEX_OUTPUT}
995            }
996        ""
997        fragment ""
998            #version 450
999            precision mediump float;
1000            struct Light
1001            {
1002                mediump vec3    color;
1003                mediump vec4    position;
1004                mediump vec3    direction;
1005                mediump float    constantAttenuation;
1006                mediump float    linearAttenuation;
1007                mediump float    quadraticAttenuation;
1008            };
1009            struct Struct {float a;};
1010            uniform Light val;
1011            ${FRAGMENT_DECLARATIONS}
1012            in mediump float res;
1013            void main()
1014            {
1015                out0 = res + val.quadraticAttenuation;
1016                ${FRAGMENT_OUTPUT}
1017            }
1018        ""
1019    end
1020end
1021
1022group block "Uniform blocks"
1023    case differing_precision
1024        version 450
1025        expect build_successful
1026        vertex ""
1027            #version 450
1028
1029            uniform Block
1030            {
1031                highp vec4 val;
1032            };
1033
1034            ${VERTEX_DECLARATIONS}
1035            out mediump float res;
1036            void main()
1037            {
1038                res = val.x;
1039                ${VERTEX_OUTPUT}
1040            }
1041        ""
1042        fragment ""
1043            #version 450
1044
1045            uniform Block
1046            {
1047                mediump vec4 val;
1048            };
1049
1050            precision mediump float;
1051            ${FRAGMENT_DECLARATIONS}
1052            in mediump float res;
1053            void main()
1054            {
1055                dEQP_FragColor = val;
1056            }
1057        ""
1058    end
1059
1060    case type_mismatch
1061        version 450
1062        expect link_fail
1063        vertex ""
1064            #version 450
1065
1066            uniform Block
1067            {
1068                highp vec4 val;
1069            };
1070
1071            ${VERTEX_DECLARATIONS}
1072            out mediump float res;
1073            void main()
1074            {
1075                res = val.x;
1076                ${VERTEX_OUTPUT}
1077            }
1078        ""
1079        fragment ""
1080            #version 450
1081
1082            uniform Block
1083            {
1084                highp vec3 val;
1085            };
1086
1087            precision mediump float;
1088            ${FRAGMENT_DECLARATIONS}
1089            in mediump float res;
1090            void main()
1091            {
1092                dEQP_FragColor = vec4(val, 1.0);
1093            }
1094        ""
1095    end
1096
1097    case members_mismatch
1098        version 450
1099        expect link_fail
1100        vertex ""
1101            #version 450
1102
1103            uniform Block
1104            {
1105                highp vec4 val;
1106            };
1107
1108            ${VERTEX_DECLARATIONS}
1109            out mediump float res;
1110            void main()
1111            {
1112                res = val.x;
1113                ${VERTEX_OUTPUT}
1114            }
1115        ""
1116        fragment ""
1117            #version 450
1118
1119            uniform Block
1120            {
1121                highp vec4 val;
1122                lowp uint u;
1123            };
1124
1125            precision mediump float;
1126            ${FRAGMENT_DECLARATIONS}
1127            in mediump float res;
1128            void main()
1129            {
1130                dEQP_FragColor = vec4(val);
1131            }
1132        ""
1133    end
1134
1135    case layout_qualifier_mismatch_4
1136        version 450
1137        expect link_fail
1138        vertex ""
1139            #version 450
1140
1141            layout(row_major) uniform Block
1142            {
1143                highp mat3 val;
1144            };
1145
1146            ${VERTEX_DECLARATIONS}
1147            out mediump float res;
1148            void main()
1149            {
1150                res = val[0][1];
1151                ${VERTEX_OUTPUT}
1152            }
1153        ""
1154        fragment ""
1155            #version 450
1156
1157            layout(column_major) uniform Block
1158            {
1159                highp mat3 val;
1160            };
1161
1162            precision mediump float;
1163            ${FRAGMENT_DECLARATIONS}
1164            in mediump float res;
1165            void main()
1166            {
1167                dEQP_FragColor = vec4(val[2], 1.0);
1168            }
1169        ""
1170    end
1171
1172    case layout_qualifier_mismatch_5
1173        version 450
1174        expect link_fail
1175        vertex ""
1176            #version 450
1177
1178            uniform Block
1179            {
1180                layout(row_major) uniform highp mat3 val;
1181            };
1182
1183            ${VERTEX_DECLARATIONS}
1184            out mediump float res;
1185            void main()
1186            {
1187                res = val[0][1];
1188                ${VERTEX_OUTPUT}
1189            }
1190        ""
1191        fragment ""
1192            #version 450
1193
1194            uniform Block
1195            {
1196                layout(column_major) uniform highp mat3 val;
1197            };
1198
1199            precision mediump float;
1200            ${FRAGMENT_DECLARATIONS}
1201            in mediump float res;
1202            void main()
1203            {
1204                dEQP_FragColor = vec4(val[2], 1.0);
1205            }
1206        ""
1207    end
1208end
1209