xref: /aosp_15_r20/external/deqp/data/gles3/shaders/linkage.test (revision 35238bce31c2a825756842865a792f8cf7f89930)
1
2# Varying tests
3group varying "Varying linkage"
4
5    # Linking rules
6    group rules "Varying linking rules"
7        # not declared in vertex shader, declared in fragment shader
8        case fragment_declare
9            version 300 es
10            desc "varying declared in fragment shader, no reference in vertex shader"
11            values { output float out0 = 1.0; }
12            vertex ""
13                #version 300 es
14                ${VERTEX_DECLARATIONS}
15                void main()
16                {
17                    ${VERTEX_OUTPUT}
18                }
19            ""
20            fragment ""
21                #version 300 es
22                precision mediump float;
23                in mediump float var;
24                ${FRAGMENT_DECLARATIONS}
25                void main()
26                {
27                    out0 = 1.0;
28                    ${FRAGMENT_OUTPUT}
29                }
30            ""
31        end
32
33        # declared in vertex shader, no reference in frag shader
34        case vertex_declare
35            version 300 es
36            desc "varying declared in vertex shader, no reference in fragment shader"
37            vertex ""
38                #version 300 es
39                ${VERTEX_DECLARATIONS}
40                out mediump float var;
41                void main()
42                {
43                    ${VERTEX_OUTPUT}
44                }
45            ""
46            fragment ""
47                #version 300 es
48                ${FRAGMENT_DECLARATIONS}
49                void main()
50                {
51                    ${FRAG_COLOR} = vec4(1.0);
52                }
53            ""
54        end
55
56        # declared in vertex shader, declared in frag shader
57        case both_declare
58            version 300 es
59            desc "varying declared in both vertex and fragment shader, but not used"
60            vertex ""
61                #version 300 es
62                ${VERTEX_DECLARATIONS}
63                out mediump float var;
64                void main()
65                {
66                    ${VERTEX_OUTPUT}
67                }
68            ""
69            fragment ""
70                #version 300 es
71                in mediump float var;
72                ${FRAGMENT_DECLARATIONS}
73                void main()
74                {
75                    ${FRAG_COLOR} = vec4(1.0);
76                }
77            ""
78        end
79
80        # declared in vertex shader, static use in frag shader
81        case vertex_declare_fragment_use
82            version 300 es
83            desc "varying declared in both shaders, statically used in fragment shader"
84            values { uniform bool u_false = false; }
85            vertex ""
86                #version 300 es
87                ${VERTEX_DECLARATIONS}
88                out mediump float var;
89                void main()
90                {
91                    ${VERTEX_OUTPUT}
92                }
93            ""
94            fragment ""
95                #version 300 es
96                in mediump float var;
97                ${FRAGMENT_DECLARATIONS}
98                void main()
99                {
100                    if (u_false)
101                        ${FRAG_COLOR} = vec4(var);
102                    else
103                        ${FRAG_COLOR} = vec4(1.0);
104                }
105            ""
106        end
107
108        # static use in vertex shader, no reference in fragment shader
109        case vertex_use_fragment_declare
110            version 300 es
111            desc "varying declared and statically used in vertex shader, no reference in fragment shader"
112            values { uniform bool u_false = false; }
113            vertex ""
114                #version 300 es
115                ${VERTEX_DECLARATIONS}
116                out mediump float var;
117                void main()
118                {
119                    if (u_false)
120                        var = 1.0;
121                    ${VERTEX_OUTPUT}
122                }
123            ""
124            fragment ""
125                #version 300 es
126                ${FRAGMENT_DECLARATIONS}
127                void main()
128                {
129                    ${FRAG_COLOR} = vec4(1.0);
130                }
131            ""
132        end
133
134        # static use in vertex shader, declared in fragment shader
135        case vertex_use_declare_fragment
136            version 300 es
137            desc "varying declared and statically used in vertex shader, only declared in fragment shader"
138            values { uniform bool u_false = false; }
139            vertex ""
140                #version 300 es
141                ${VERTEX_DECLARATIONS}
142                out mediump float var;
143                void main()
144                {
145                    if (u_false)
146                        var = 1.0;
147                    ${VERTEX_OUTPUT}
148                }
149            ""
150            fragment ""
151                #version 300 es
152                in mediump float var;
153                ${FRAGMENT_DECLARATIONS}
154                void main()
155                {
156                    ${FRAG_COLOR} = vec4(1.0);
157                }
158            ""
159        end
160
161        # static use in vertex shader, used in fragment shader
162        case vertex_use_fragment_use
163            version 300 es
164            desc "varying statically used in both vertex and fragment shader"
165            values { uniform bool u_false = false; }
166            vertex ""
167                #version 300 es
168                ${VERTEX_DECLARATIONS}
169                out mediump float var;
170                void main()
171                {
172                    if (u_false)
173                        var = 1.0;
174                    ${VERTEX_OUTPUT}
175                }
176            ""
177            fragment ""
178                #version 300 es
179                ${FRAGMENT_DECLARATIONS}
180                in mediump float var;
181                void main()
182                {
183                    if (u_false)
184                        ${FRAG_COLOR} = vec4(var);
185                    else
186                        ${FRAG_COLOR} = vec4(1.0);
187                }
188            ""
189        end
190
191        # differing precision tests
192        case differing_precision_1
193            version 300 es
194            desc "varying declared as highp in vertex shader, but mediump in fragment shader"
195            values
196            {
197                input float in0 = [ -1.25 | -25.55 | 1.0 | 2.25 | 3.4 | 16.0 ];
198                output float out0 = [ -1.25 | -25.55 | 1.0 | 2.25 | 3.4 | 16.0 ];
199            }
200
201            vertex ""
202                #version 300 es
203                ${VERTEX_DECLARATIONS}
204                out highp float var;
205                void main()
206                {
207                    var = in0;
208                    ${VERTEX_OUTPUT}
209                }
210            ""
211            fragment ""
212                #version 300 es
213                precision mediump float;
214                ${FRAGMENT_DECLARATIONS}
215                in mediump float var;
216                void main()
217                {
218                    out0 = var;
219                    ${FRAGMENT_OUTPUT}
220                }
221            ""
222        end
223
224        # differing precision tests
225        case differing_precision_2
226            version 300 es
227            desc "varying declared as highp in vertex shader, but lowp in fragment shader"
228            values
229            {
230                input float in0 = [ -1.25 | -25.56 | 1.0 | 2.25 | 3.4 | 16.0 ];
231                output float out0 = [ -1.25 | -25.56 | 1.0 | 2.25 | 3.4 | 16.0 ];
232            }
233
234            vertex ""
235                #version 300 es
236                ${VERTEX_DECLARATIONS}
237                out highp vec2 var;
238                void main()
239                {
240                    var = vec2(in0, 2.0*in0);
241                    ${VERTEX_OUTPUT}
242                }
243            ""
244            fragment ""
245                #version 300 es
246                precision mediump float;
247                ${FRAGMENT_DECLARATIONS}
248                in lowp vec2 var;
249                void main()
250                {
251                    out0 = var.y - var.x;
252                    ${FRAGMENT_OUTPUT}
253                }
254            ""
255        end
256
257        # differing precision tests
258        case differing_precision_3
259            version 300 es
260            desc "varying declared as lowp in vertex shader, but mediump in fragment shader"
261            values
262            {
263                input float in0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ];
264                output float out0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ];
265            }
266
267            vertex ""
268                #version 300 es
269                ${VERTEX_DECLARATIONS}
270                out lowp vec4 var;
271                void main()
272                {
273                    var = vec4(in0, 2.0*in0, -in0, -in0);
274                    ${VERTEX_OUTPUT}
275                }
276            ""
277            fragment ""
278                #version 300 es
279                precision mediump float;
280                ${FRAGMENT_DECLARATIONS}
281                in mediump vec4 var;
282                void main()
283                {
284                    out0 = var.x + var.y + var.z + var.w;
285                    ${FRAGMENT_OUTPUT}
286                }
287            ""
288        end
289
290        # mismatched type, static use but no runtime use in the fragment shader
291        case type_mismatch_1
292            version 300 es
293            desc "varying type mismatch (float vs. vec2), static use but no runtime use in the fragment shader"
294            expect link_fail
295            vertex ""
296                #version 300 es
297                ${VERTEX_DECLARATIONS}
298                out mediump float var;
299                void main()
300                {
301                    var = 2.0;
302                    ${VERTEX_OUTPUT}
303                }
304            ""
305            fragment ""
306                #version 300 es
307                ${FRAGMENT_DECLARATIONS}
308                in mediump vec2 var;
309                void main()
310                {
311                    if (false)
312                    {
313                        ${FRAG_COLOR} = vec4(var.y);
314                    }
315                    else
316                    {
317                        ${FRAG_COLOR} = vec4(1.0);
318                    }
319                }
320            ""
321        end
322
323        # mismatched type, varyings used
324        case type_mismatch_2
325            version 300 es
326            desc "varying type mismatch (float vs. vec2)"
327            expect link_fail
328            vertex ""
329                #version 300 es
330                ${VERTEX_DECLARATIONS}
331                out mediump float var;
332                void main()
333                {
334                    var = 2.0;
335                    ${VERTEX_OUTPUT}
336                }
337            ""
338            fragment ""
339                #version 300 es
340                ${FRAGMENT_DECLARATIONS}
341                in mediump vec2 var;
342                void main()
343                {
344                    ${FRAG_COLOR} = var.xyyx;
345                }
346            ""
347        end
348
349        # mismatched type, varyings used
350        case type_mismatch_3
351            version 300 es
352            desc "varying type mismatch (int vs. uint)"
353            expect link_fail
354            vertex ""
355                #version 300 es
356                ${VERTEX_DECLARATIONS}
357                flat out mediump int var;
358                void main()
359                {
360                    var = 2;
361                    ${VERTEX_OUTPUT}
362                }
363            ""
364            fragment ""
365                #version 300 es
366                ${FRAGMENT_DECLARATIONS}
367                flat in mediump uint var;
368                void main()
369                {
370                    ${FRAG_COLOR} = vec4(var);
371                }
372            ""
373        end
374
375        # mismatched type, varyings used
376        case struct_type_mismatch_1
377            version 300 es
378            desc "struct member mismatch"
379            expect link_fail
380            vertex ""
381                #version 300 es
382                ${VERTEX_DECLARATIONS}
383                struct S { highp float a; highp vec2 b; };
384                out S var;
385                void main()
386                {
387                    var.a = 2.0;
388                    var.b = vec2(1.0, 0.0);
389                    ${VERTEX_OUTPUT}
390                }
391            ""
392            fragment ""
393                #version 300 es
394                ${FRAGMENT_DECLARATIONS}
395                struct S { highp float a; highp vec3 b; };
396                in S var;
397                void main()
398                {
399                    ${FRAG_COLOR} = vec4(var.a, var.b);
400                }
401            ""
402        end
403
404        # mismatched type, varyings unused in fragment shader (runtime)
405        case struct_type_mismatch_2
406            version 300 es
407            desc "struct member mismatch"
408            expect link_fail
409            vertex ""
410                #version 300 es
411                ${VERTEX_DECLARATIONS}
412                struct S { highp float a; highp vec2 b; };
413                out S var;
414                void main()
415                {
416                    var.a = 2.0;
417                    var.b = vec2(1.0, 0.0);
418                    ${VERTEX_OUTPUT}
419                }
420            ""
421            fragment ""
422                #version 300 es
423                ${FRAGMENT_DECLARATIONS}
424                struct S { highp float a; highp vec3 b; };
425                in S var;
426                void main()
427                {
428                    ${FRAG_COLOR} = vec4(var.a);
429                    if (false)
430                        ${FRAG_COLOR}.yzw = var.b;
431                }
432            ""
433        end
434
435        # mismatched type, varyings unused in both (runtime)
436        case struct_type_mismatch_3
437            version 300 es
438            desc "struct member mismatch"
439            expect link_fail
440            vertex ""
441                #version 300 es
442                ${VERTEX_DECLARATIONS}
443                struct S { highp float a; highp vec2 b; };
444                out S var;
445                void main()
446                {
447                    var.a = 2.0;
448                    if (false)
449                        var.b = vec2(1.0, 0.0);
450                    ${VERTEX_OUTPUT}
451                }
452            ""
453            fragment ""
454                #version 300 es
455                ${FRAGMENT_DECLARATIONS}
456                struct S { highp float a; highp vec3 b; };
457                in S var;
458                void main()
459                {
460                    ${FRAG_COLOR} = vec4(var.a);
461                    if (false)
462                        ${FRAG_COLOR}.yzw = var.b;
463                }
464            ""
465        end
466
467        # interpolation_mismatch
468        case interpolation_mismatch_1
469            version 300 es
470            desc "varying interpolation different (flat vs. smooth)"
471            expect link_fail
472
473            vertex ""
474                #version 300 es
475                ${VERTEX_DECLARATIONS}
476                in highp float in0;
477                flat out mediump float var;
478                void main()
479                {
480                    var = in0;
481                    ${VERTEX_OUTPUT}
482                }
483            ""
484            fragment ""
485                #version 300 es
486                precision mediump float;
487                ${FRAGMENT_DECLARATIONS}
488                in mediump float var;
489                void main()
490                {
491                    ${FRAG_COLOR} = vec4(var);
492                }
493            ""
494        end
495
496        # different interpolation
497        case differing_interpolation_2
498            version 300 es
499            desc "varying interpolation different (smooth vs. centroid)"
500            values
501            {
502                input float in0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ];
503                output float out0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ];
504            }
505
506            vertex ""
507                #version 300 es
508                ${VERTEX_DECLARATIONS}
509                smooth out mediump float var;
510                void main()
511                {
512                    var = in0;
513                    ${VERTEX_OUTPUT}
514                }
515            ""
516            fragment ""
517                #version 300 es
518                precision mediump float;
519                ${FRAGMENT_DECLARATIONS}
520                centroid in mediump float var;
521                void main()
522                {
523                    out0 = var;
524                    ${FRAGMENT_OUTPUT}
525                }
526            ""
527        end
528
529        # no declaration in vertex shader, but static use in fragment
530        case illegal_usage_1
531            version 300 es
532            desc "varying not declared in vertex shader, but statically used in fragment shader"
533            expect link_fail
534            vertex ""
535                #version 300 es
536                ${VERTEX_DECLARATIONS}
537                void main()
538                {
539                    ${VERTEX_OUTPUT}
540                }
541            ""
542            fragment ""
543                #version 300 es
544                ${FRAGMENT_DECLARATIONS}
545                in mediump float var;
546                void main()
547                {
548                    ${FRAG_COLOR} = vec4(var);
549                }
550            ""
551        end
552
553        # non-flat integer varyings not allowed
554        case invalid_type_int
555            version 300 es
556            desc "integer varying used"
557            expect compile_fail
558            vertex ""
559                #version 300 es
560                ${VERTEX_DECLARATIONS}
561                out mediump int var;
562                void main()
563                {
564                    ${VERTEX_OUTPUT}
565                }
566            ""
567            fragment ""
568                #version 300 es
569                ${FRAGMENT_DECLARATIONS}
570                in mediump int var;
571                void main()
572                {
573                    ${FRAG_COLOR} = vec4(1.0);
574                }
575            ""
576        end
577
578        # non-flat integer varyings not allowed
579        case invalid_type_uint
580            version 300 es
581            desc "integer varying used"
582            expect compile_fail
583            vertex ""
584                #version 300 es
585                ${VERTEX_DECLARATIONS}
586                out mediump uint var;
587                void main()
588                {
589                    ${VERTEX_OUTPUT}
590                }
591            ""
592            fragment ""
593                #version 300 es
594                ${FRAGMENT_DECLARATIONS}
595                in mediump uint var;
596                void main()
597                {
598                    ${FRAG_COLOR} = vec4(1.0);
599                }
600            ""
601        end
602
603        # bool varyings not allowed
604        case invalid_type_bool
605            version 300 es
606            desc "boolean varying used"
607            expect compile_fail
608            vertex ""
609                #version 300 es
610                ${VERTEX_DECLARATIONS}
611                out bool var;
612                void main()
613                {
614                    ${VERTEX_OUTPUT}
615                }
616            ""
617            fragment ""
618                #version 300 es
619                ${FRAGMENT_DECLARATIONS}
620                in bool var;
621                void main()
622                {
623                    ${FRAG_COLOR} = vec4(1.0);
624                }
625            ""
626        end
627
628        case invalid_type_struct_array
629            version 300 es
630            desc "float array inside struct"
631            expect compile_fail
632            vertex ""
633                #version 300 es
634                ${VERTEX_DECLARATIONS}
635                struct S { mediump float a[3]; };
636                out S var;
637                void main()
638                {
639                    var.a[0] = 1.0;
640                    var.a[1] = 1.0;
641                    var.a[2] = 1.0;
642                    ${VERTEX_OUTPUT}
643                }
644            ""
645            fragment ""
646                #version 300 es
647                precision mediump float;
648                ${FRAGMENT_DECLARATIONS}
649                struct S { mediump float a[3]; };
650                in S var;
651                void main()
652                {
653                    ${FRAG_COLOR} = vec4(1.0);
654                }
655            ""
656        end
657
658        case invalid_type_struct_struct
659            version 300 es
660            desc "struct inside struct"
661            expect compile_fail
662            vertex ""
663                #version 300 es
664                ${VERTEX_DECLARATIONS}
665                struct S { mediump float a; };
666                struct T { S s; };
667                out T var;
668                void main()
669                {
670                    var.s.a = 1.0;
671                    ${VERTEX_OUTPUT}
672                }
673            ""
674            fragment ""
675                #version 300 es
676                precision mediump float;
677                ${FRAGMENT_DECLARATIONS}
678                struct S { mediump float a; };
679                struct T { S s; };
680                in T var;
681                void main()
682                {
683                    ${FRAG_COLOR} = vec4(1.0);
684                }
685            ""
686        end
687
688        case invalid_type_array_struct
689            version 300 es
690            desc "array of structs"
691            expect compile_fail
692            vertex ""
693                #version 300 es
694                ${VERTEX_DECLARATIONS}
695                struct S { mediump int a; };
696                flat out S var[2];
697                void main()
698                {
699                    ${VERTEX_SETUP}
700                    var[0].a = 1;
701                    var[1].a = 1;
702                    ${VERTEX_OUTPUT}
703                }
704            ""
705            fragment ""
706                #version 300 es
707                ${FRAGMENT_DECLARATIONS}
708                struct S { mediump int a; };
709                flat in S var[2];
710                void main()
711                {
712                    ${FRAG_COLOR} = vec4(1.0);
713                }
714            ""
715        end
716
717        case invalid_type_array_array
718            version 300 es
719            desc "array of arrays"
720            expect compile_fail
721            vertex ""
722                #version 300 es
723                ${VERTEX_DECLARATIONS}
724                out mediump float var[2][2];
725                void main()
726                {
727                    ${VERTEX_SETUP}
728                    var[0][0] = 1.0;
729                    ${VERTEX_OUTPUT}
730                }
731            ""
732            fragment ""
733                #version 300 es
734                ${FRAGMENT_DECLARATIONS}
735                in mediump float var[2][2];
736                void main()
737                {
738                    ${FRAG_COLOR} = vec4(1.0);
739                }
740            ""
741        end
742    end
743
744    group basic_types "Basic varying types"
745        case float
746            version 300 es
747            desc "varying of type float"
748            values
749            {
750                input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ];
751                output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ];
752            }
753            vertex ""
754                #version 300 es
755                ${VERTEX_DECLARATIONS}
756                out mediump float var;
757                void main()
758                {
759                    var = in0;
760                    ${VERTEX_OUTPUT}
761                }
762            ""
763            fragment ""
764                #version 300 es
765                precision mediump float;
766                ${FRAGMENT_DECLARATIONS}
767                in float var;
768                void main()
769                {
770                    out0 = var;
771                    ${FRAGMENT_OUTPUT}
772                }
773            ""
774        end
775
776        case vec2
777            version 300 es
778            desc "varying of type vec2"
779            values
780            {
781                input vec2 in0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ];
782                output vec2 out0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ];
783            }
784            vertex ""
785                #version 300 es
786                ${VERTEX_DECLARATIONS}
787                out mediump vec2 var;
788                void main()
789                {
790                    var = in0;
791                    ${VERTEX_OUTPUT}
792                }
793            ""
794            fragment ""
795                #version 300 es
796                precision mediump float;
797                ${FRAGMENT_DECLARATIONS}
798                in vec2 var;
799                void main()
800                {
801                    out0 = var;
802                    ${FRAGMENT_OUTPUT}
803                }
804            ""
805        end
806
807        case vec3
808            version 300 es
809            desc "varying of type vec3"
810            values
811            {
812                input vec3 in0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ];
813                output vec3 out0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ];
814            }
815            vertex ""
816                #version 300 es
817                ${VERTEX_DECLARATIONS}
818                out mediump vec3 var;
819                void main()
820                {
821                    var = in0;
822                    ${VERTEX_OUTPUT}
823                }
824            ""
825            fragment ""
826                #version 300 es
827                precision mediump float;
828                ${FRAGMENT_DECLARATIONS}
829                in vec3 var;
830                void main()
831                {
832                    out0 = var;
833                    ${FRAGMENT_OUTPUT}
834                }
835            ""
836        end
837
838        case vec4
839            version 300 es
840            desc "varying of type vec4"
841            values
842            {
843                input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ];
844                output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ];
845            }
846            vertex ""
847                #version 300 es
848                ${VERTEX_DECLARATIONS}
849                out mediump vec4 var;
850                void main()
851                {
852                    var = in0;
853                    ${VERTEX_OUTPUT}
854                }
855            ""
856            fragment ""
857                #version 300 es
858                precision mediump float;
859                ${FRAGMENT_DECLARATIONS}
860                in vec4 var;
861                void main()
862                {
863                    out0 = var;
864                    ${FRAGMENT_OUTPUT}
865                }
866            ""
867        end
868
869        case mat2
870            version 300 es
871            desc "varying of type mat2"
872            values
873            {
874                input mat2 in0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ];
875                output mat2 out0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ];
876            }
877            vertex ""
878                #version 300 es
879                ${VERTEX_DECLARATIONS}
880                out mediump mat2 var;
881                void main()
882                {
883                    var = in0;
884                    ${VERTEX_OUTPUT}
885                }
886            ""
887            fragment ""
888                #version 300 es
889                precision mediump float;
890                ${FRAGMENT_DECLARATIONS}
891                in mat2 var;
892                void main()
893                {
894                    out0 = var;
895                    ${FRAGMENT_OUTPUT}
896                }
897            ""
898        end
899
900        case mat2x3
901            version 300 es
902            desc "varying of type mat2x3"
903            values
904            {
905                input mat2x3 in0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ];
906                output mat2x3 out0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ];
907            }
908            vertex ""
909                #version 300 es
910                ${VERTEX_DECLARATIONS}
911                out mediump mat2x3 var;
912                void main()
913                {
914                    var = in0;
915                    ${VERTEX_OUTPUT}
916                }
917            ""
918            fragment ""
919                #version 300 es
920                precision mediump float;
921                ${FRAGMENT_DECLARATIONS}
922                in mat2x3 var;
923                void main()
924                {
925                    out0 = var;
926                    ${FRAGMENT_OUTPUT}
927                }
928            ""
929        end
930
931        case mat2x4
932            version 300 es
933            desc "varying of type mat2x4"
934            values
935            {
936                input mat2x4 in0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ];
937                output mat2x4 out0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ];
938            }
939            vertex ""
940                #version 300 es
941                ${VERTEX_DECLARATIONS}
942                out mediump mat2x4 var;
943                void main()
944                {
945                    var = in0;
946                    ${VERTEX_OUTPUT}
947                }
948            ""
949            fragment ""
950                #version 300 es
951                precision mediump float;
952                ${FRAGMENT_DECLARATIONS}
953                in mat2x4 var;
954                void main()
955                {
956                    out0 = var;
957                    ${FRAGMENT_OUTPUT}
958                }
959            ""
960        end
961
962        case mat3x2
963            version 300 es
964            desc "varying of type mat3x2"
965            values
966            {
967                input mat3x2 in0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ];
968                output mat3x2 out0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ];
969            }
970            vertex ""
971                #version 300 es
972                ${VERTEX_DECLARATIONS}
973                out mediump mat3x2 var;
974                void main()
975                {
976                    var = in0;
977                    ${VERTEX_OUTPUT}
978                }
979            ""
980            fragment ""
981                #version 300 es
982                precision mediump float;
983                ${FRAGMENT_DECLARATIONS}
984                in mat3x2 var;
985                void main()
986                {
987                    out0 = var;
988                    ${FRAGMENT_OUTPUT}
989                }
990            ""
991        end
992
993        case mat3
994            version 300 es
995            desc "varying of type mat3"
996            values
997            {
998                input mat3 in0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ];
999                output mat3 out0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ];
1000            }
1001            vertex ""
1002                #version 300 es
1003                ${VERTEX_DECLARATIONS}
1004                out mediump mat3 var;
1005                void main()
1006                {
1007                    var = in0;
1008                    ${VERTEX_OUTPUT}
1009                }
1010            ""
1011            fragment ""
1012                #version 300 es
1013                precision mediump float;
1014                ${FRAGMENT_DECLARATIONS}
1015                in mat3 var;
1016                void main()
1017                {
1018                    out0 = var;
1019                    ${FRAGMENT_OUTPUT}
1020                }
1021            ""
1022        end
1023
1024        case mat3x4
1025            version 300 es
1026            desc "varying of type mat3x4"
1027            values
1028            {
1029                input mat3x4 in0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ];
1030                output mat3x4 out0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ];
1031            }
1032            vertex ""
1033                #version 300 es
1034                ${VERTEX_DECLARATIONS}
1035                out mediump mat3x4 var;
1036                void main()
1037                {
1038                    var = in0;
1039                    ${VERTEX_OUTPUT}
1040                }
1041            ""
1042            fragment ""
1043                #version 300 es
1044                precision mediump float;
1045                ${FRAGMENT_DECLARATIONS}
1046                in mat3x4 var;
1047                void main()
1048                {
1049                    out0 = var;
1050                    ${FRAGMENT_OUTPUT}
1051                }
1052            ""
1053        end
1054
1055        case mat4x2
1056            version 300 es
1057            desc "varying of type mat4x2"
1058            values
1059            {
1060                input mat4x2 in0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ];
1061                output mat4x2 out0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ];
1062            }
1063            vertex ""
1064                #version 300 es
1065                ${VERTEX_DECLARATIONS}
1066                out mediump mat4x2 var;
1067                void main()
1068                {
1069                    var = in0;
1070                    ${VERTEX_OUTPUT}
1071                }
1072            ""
1073            fragment ""
1074                #version 300 es
1075                precision mediump float;
1076                ${FRAGMENT_DECLARATIONS}
1077                in mat4x2 var;
1078                void main()
1079                {
1080                    out0 = var;
1081                    ${FRAGMENT_OUTPUT}
1082                }
1083            ""
1084        end
1085
1086        case mat4x3
1087            version 300 es
1088            desc "varying of type mat4x3"
1089            values
1090            {
1091                input mat4x3 in0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ];
1092                output mat4x3 out0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ];
1093            }
1094            vertex ""
1095                #version 300 es
1096                ${VERTEX_DECLARATIONS}
1097                out mediump mat4x3 var;
1098                void main()
1099                {
1100                    var = in0;
1101                    ${VERTEX_OUTPUT}
1102                }
1103            ""
1104            fragment ""
1105                #version 300 es
1106                precision mediump float;
1107                ${FRAGMENT_DECLARATIONS}
1108                in mat4x3 var;
1109                void main()
1110                {
1111                    out0 = var;
1112                    ${FRAGMENT_OUTPUT}
1113                }
1114            ""
1115        end
1116
1117        case mat4
1118            version 300 es
1119            desc "varying of type mat4"
1120            values
1121            {
1122                input mat4 in0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ];
1123                output mat4 out0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ];
1124            }
1125            vertex ""
1126                #version 300 es
1127                ${VERTEX_DECLARATIONS}
1128                out mediump mat4 var;
1129                void main()
1130                {
1131                    var = in0;
1132                    ${VERTEX_OUTPUT}
1133                }
1134            ""
1135            fragment ""
1136                #version 300 es
1137                precision mediump float;
1138                ${FRAGMENT_DECLARATIONS}
1139                in mat4 var;
1140                void main()
1141                {
1142                    out0 = var;
1143                    ${FRAGMENT_OUTPUT}
1144                }
1145            ""
1146        end
1147
1148        case int
1149            version 300 es
1150            desc "varying of type int"
1151            values
1152            {
1153                input int in0 = [ -1 | -25 | 1 | 2 | 3 | 16 ];
1154                output int out0 = [ -1 | -25 | 1 | 2 | 3 | 16 ];
1155            }
1156            vertex ""
1157                #version 300 es
1158                ${VERTEX_DECLARATIONS}
1159                flat out mediump int var;
1160                void main()
1161                {
1162                    ${VERTEX_SETUP}
1163                    var = in0;
1164                    ${VERTEX_OUTPUT}
1165                }
1166            ""
1167            fragment ""
1168                #version 300 es
1169                ${FRAGMENT_DECLARATIONS}
1170                flat in int var;
1171                void main()
1172                {
1173                    out0 = var;
1174                    ${FRAGMENT_OUTPUT}
1175                }
1176            ""
1177        end
1178
1179        case ivec2
1180            version 300 es
1181            desc "varying of type ivec2"
1182            values
1183            {
1184                input ivec2 in0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ];
1185                output ivec2 out0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ];
1186            }
1187            vertex ""
1188                #version 300 es
1189                ${VERTEX_DECLARATIONS}
1190                flat out mediump ivec2 var;
1191                void main()
1192                {
1193                    ${VERTEX_SETUP}
1194                    var = in0;
1195                    ${VERTEX_OUTPUT}
1196                }
1197            ""
1198            fragment ""
1199                #version 300 es
1200                ${FRAGMENT_DECLARATIONS}
1201                flat in ivec2 var;
1202                void main()
1203                {
1204                    out0 = var;
1205                    ${FRAGMENT_OUTPUT}
1206                }
1207            ""
1208        end
1209
1210        case ivec3
1211            version 300 es
1212            desc "varying of type ivec3"
1213            values
1214            {
1215                input ivec3 in0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ];
1216                output ivec3 out0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ];
1217            }
1218            vertex ""
1219                #version 300 es
1220                ${VERTEX_DECLARATIONS}
1221                flat out mediump ivec3 var;
1222                void main()
1223                {
1224                    ${VERTEX_SETUP}
1225                    var = in0;
1226                    ${VERTEX_OUTPUT}
1227                }
1228            ""
1229            fragment ""
1230                #version 300 es
1231                ${FRAGMENT_DECLARATIONS}
1232                flat in ivec3 var;
1233                void main()
1234                {
1235                    out0 = var;
1236                    ${FRAGMENT_OUTPUT}
1237                }
1238            ""
1239        end
1240
1241        case ivec4
1242            version 300 es
1243            desc "varying of type ivec4"
1244            values
1245            {
1246                input ivec4 in0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ];
1247                output ivec4 out0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ];
1248            }
1249            vertex ""
1250                #version 300 es
1251                ${VERTEX_DECLARATIONS}
1252                flat out mediump ivec4 var;
1253                void main()
1254                {
1255                    ${VERTEX_SETUP}
1256                    var = in0;
1257                    ${VERTEX_OUTPUT}
1258                }
1259            ""
1260            fragment ""
1261                #version 300 es
1262                ${FRAGMENT_DECLARATIONS}
1263                flat in ivec4 var;
1264                void main()
1265                {
1266                    out0 = var;
1267                    ${FRAGMENT_OUTPUT}
1268                }
1269            ""
1270        end
1271
1272        case uint
1273            version 300 es
1274            desc "varying of type int"
1275            values
1276            {
1277                input uint in0 = [ 1 | 2 | 3 | 16 ];
1278                output uint out0 = [ 1 | 2 | 3 | 16 ];
1279            }
1280            vertex ""
1281                #version 300 es
1282                ${VERTEX_DECLARATIONS}
1283                flat out mediump uint var;
1284                void main()
1285                {
1286                    ${VERTEX_SETUP}
1287                    var = in0;
1288                    ${VERTEX_OUTPUT}
1289                }
1290            ""
1291            fragment ""
1292                #version 300 es
1293                ${FRAGMENT_DECLARATIONS}
1294                flat in uint var;
1295                void main()
1296                {
1297                    out0 = var;
1298                    ${FRAGMENT_OUTPUT}
1299                }
1300            ""
1301        end
1302
1303        case uvec2
1304            version 300 es
1305            desc "varying of type uvec2"
1306            values
1307            {
1308                input uvec2 in0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ];
1309                output uvec2 out0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ];
1310            }
1311            vertex ""
1312                #version 300 es
1313                ${VERTEX_DECLARATIONS}
1314                flat out mediump uvec2 var;
1315                void main()
1316                {
1317                    ${VERTEX_SETUP}
1318                    var = in0;
1319                    ${VERTEX_OUTPUT}
1320                }
1321            ""
1322            fragment ""
1323                #version 300 es
1324                ${FRAGMENT_DECLARATIONS}
1325                flat in uvec2 var;
1326                void main()
1327                {
1328                    out0 = var;
1329                    ${FRAGMENT_OUTPUT}
1330                }
1331            ""
1332        end
1333
1334        case uvec3
1335            version 300 es
1336            desc "varying of type uvec3"
1337            values
1338            {
1339                input uvec3 in0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ];
1340                output uvec3 out0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ];
1341            }
1342            vertex ""
1343                #version 300 es
1344                ${VERTEX_DECLARATIONS}
1345                flat out mediump uvec3 var;
1346                void main()
1347                {
1348                    ${VERTEX_SETUP}
1349                    var = in0;
1350                    ${VERTEX_OUTPUT}
1351                }
1352            ""
1353            fragment ""
1354                #version 300 es
1355                ${FRAGMENT_DECLARATIONS}
1356                flat in uvec3 var;
1357                void main()
1358                {
1359                    out0 = var;
1360                    ${FRAGMENT_OUTPUT}
1361                }
1362            ""
1363        end
1364
1365        case uvec4
1366            version 300 es
1367            desc "varying of type uvec4"
1368            values
1369            {
1370                input uvec4 in0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ];
1371                output uvec4 out0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ];
1372            }
1373            vertex ""
1374                #version 300 es
1375                ${VERTEX_DECLARATIONS}
1376                flat out mediump uvec4 var;
1377                void main()
1378                {
1379                    ${VERTEX_SETUP}
1380                    var = in0;
1381                    ${VERTEX_OUTPUT}
1382                }
1383            ""
1384            fragment ""
1385                #version 300 es
1386                ${FRAGMENT_DECLARATIONS}
1387                flat in uvec4 var;
1388                void main()
1389                {
1390                    out0 = var;
1391                    ${FRAGMENT_OUTPUT}
1392                }
1393            ""
1394        end
1395    end
1396
1397    group struct "Structure varyings"
1398        case float
1399            version 300 es
1400            desc "varying of type float inside struct"
1401            values
1402            {
1403                input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ];
1404                output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ];
1405            }
1406            vertex ""
1407                #version 300 es
1408                ${VERTEX_DECLARATIONS}
1409                struct S { mediump float a; };
1410                out S var;
1411                void main()
1412                {
1413                    var.a = in0;
1414                    ${VERTEX_OUTPUT}
1415                }
1416            ""
1417            fragment ""
1418                #version 300 es
1419                precision mediump float;
1420                ${FRAGMENT_DECLARATIONS}
1421                struct S { mediump float a; };
1422                in S var;
1423                void main()
1424                {
1425                    out0 = var.a;
1426                    ${FRAGMENT_OUTPUT}
1427                }
1428            ""
1429        end
1430
1431        case vec2
1432            version 300 es
1433            desc "varying of type vec2 inside struct"
1434            values
1435            {
1436                input vec2 in0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ];
1437                output vec2 out0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ];
1438            }
1439            vertex ""
1440                #version 300 es
1441                ${VERTEX_DECLARATIONS}
1442                struct S { mediump vec2 a; };
1443                out S var;
1444                void main()
1445                {
1446                    var.a = in0;
1447                    ${VERTEX_OUTPUT}
1448                }
1449            ""
1450            fragment ""
1451                #version 300 es
1452                precision mediump float;
1453                ${FRAGMENT_DECLARATIONS}
1454                struct S { mediump vec2 a; };
1455                in S var;
1456                void main()
1457                {
1458                    out0 = var.a;
1459                    ${FRAGMENT_OUTPUT}
1460                }
1461            ""
1462        end
1463
1464        case vec3
1465            version 300 es
1466            desc "varying of type vec3 inside struct"
1467            values
1468            {
1469                input vec3 in0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ];
1470                output vec3 out0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ];
1471            }
1472            vertex ""
1473                #version 300 es
1474                ${VERTEX_DECLARATIONS}
1475                struct S { mediump vec3 a; };
1476                out S var;
1477                void main()
1478                {
1479                    var.a = in0;
1480                    ${VERTEX_OUTPUT}
1481                }
1482            ""
1483            fragment ""
1484                #version 300 es
1485                precision mediump float;
1486                ${FRAGMENT_DECLARATIONS}
1487                struct S { mediump vec3 a; };
1488                in S var;
1489                void main()
1490                {
1491                    out0 = var.a;
1492                    ${FRAGMENT_OUTPUT}
1493                }
1494            ""
1495        end
1496
1497        case vec4
1498            version 300 es
1499            desc "varying of type vec4 inside struct"
1500            values
1501            {
1502                input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ];
1503                output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ];
1504            }
1505            vertex ""
1506                #version 300 es
1507                ${VERTEX_DECLARATIONS}
1508                struct S { mediump vec4 a; };
1509                out S var;
1510                void main()
1511                {
1512                    var.a = in0;
1513                    ${VERTEX_OUTPUT}
1514                }
1515            ""
1516            fragment ""
1517                #version 300 es
1518                precision mediump float;
1519                ${FRAGMENT_DECLARATIONS}
1520                struct S { mediump vec4 a; };
1521                in S var;
1522                void main()
1523                {
1524                    out0 = var.a;
1525                    ${FRAGMENT_OUTPUT}
1526                }
1527            ""
1528        end
1529
1530        case mat2
1531            version 300 es
1532            desc "varying of type mat2 inside struct"
1533            values
1534            {
1535                input mat2 in0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ];
1536                output mat2 out0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ];
1537            }
1538            vertex ""
1539                #version 300 es
1540                ${VERTEX_DECLARATIONS}
1541                struct S { mediump mat2 a; };
1542                out S var;
1543                void main()
1544                {
1545                    var.a = in0;
1546                    ${VERTEX_OUTPUT}
1547                }
1548            ""
1549            fragment ""
1550                #version 300 es
1551                precision mediump float;
1552                ${FRAGMENT_DECLARATIONS}
1553                struct S { mediump mat2 a; };
1554                in S var;
1555                void main()
1556                {
1557                    out0 = var.a;
1558                    ${FRAGMENT_OUTPUT}
1559                }
1560            ""
1561        end
1562
1563        case mat2x3
1564            version 300 es
1565            desc "varying of type mat2x3 inside struct"
1566            values
1567            {
1568                input mat2x3 in0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ];
1569                output mat2x3 out0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ];
1570            }
1571            vertex ""
1572                #version 300 es
1573                ${VERTEX_DECLARATIONS}
1574                struct S { mediump mat2x3 a; };
1575                out S var;
1576                void main()
1577                {
1578                    var.a = in0;
1579                    ${VERTEX_OUTPUT}
1580                }
1581            ""
1582            fragment ""
1583                #version 300 es
1584                precision mediump float;
1585                ${FRAGMENT_DECLARATIONS}
1586                struct S { mediump mat2x3 a; };
1587                in S var;
1588                void main()
1589                {
1590                    out0 = var.a;
1591                    ${FRAGMENT_OUTPUT}
1592                }
1593            ""
1594        end
1595
1596        case mat2x4
1597            version 300 es
1598            desc "varying of type mat2x4 inside struct"
1599            values
1600            {
1601                input mat2x4 in0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ];
1602                output mat2x4 out0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ];
1603            }
1604            vertex ""
1605                #version 300 es
1606                ${VERTEX_DECLARATIONS}
1607                struct S { mediump mat2x4 a; };
1608                out S var;
1609                void main()
1610                {
1611                    var.a = in0;
1612                    ${VERTEX_OUTPUT}
1613                }
1614            ""
1615            fragment ""
1616                #version 300 es
1617                precision mediump float;
1618                ${FRAGMENT_DECLARATIONS}
1619                struct S { mediump mat2x4 a; };
1620                in S var;
1621                void main()
1622                {
1623                    out0 = var.a;
1624                    ${FRAGMENT_OUTPUT}
1625                }
1626            ""
1627        end
1628
1629        case mat3x2
1630            version 300 es
1631            desc "varying of type mat3x2 inside struct"
1632            values
1633            {
1634                input mat3x2 in0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ];
1635                output mat3x2 out0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ];
1636            }
1637            vertex ""
1638                #version 300 es
1639                ${VERTEX_DECLARATIONS}
1640                struct S { mediump mat3x2 a; };
1641                out S var;
1642                void main()
1643                {
1644                    var.a = in0;
1645                    ${VERTEX_OUTPUT}
1646                }
1647            ""
1648            fragment ""
1649                #version 300 es
1650                precision mediump float;
1651                ${FRAGMENT_DECLARATIONS}
1652                struct S { mediump mat3x2 a; };
1653                in S var;
1654                void main()
1655                {
1656                    out0 = var.a;
1657                    ${FRAGMENT_OUTPUT}
1658                }
1659            ""
1660        end
1661
1662        case mat3
1663            version 300 es
1664            desc "varying of type mat3 inside struct"
1665            values
1666            {
1667                input mat3 in0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ];
1668                output mat3 out0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ];
1669            }
1670            vertex ""
1671                #version 300 es
1672                ${VERTEX_DECLARATIONS}
1673                struct S { mediump mat3 a; };
1674                out S var;
1675                void main()
1676                {
1677                    var.a = in0;
1678                    ${VERTEX_OUTPUT}
1679                }
1680            ""
1681            fragment ""
1682                #version 300 es
1683                precision mediump float;
1684                ${FRAGMENT_DECLARATIONS}
1685                struct S { mediump mat3 a; };
1686                in S var;
1687                void main()
1688                {
1689                    out0 = var.a;
1690                    ${FRAGMENT_OUTPUT}
1691                }
1692            ""
1693        end
1694
1695        case mat3x4
1696            version 300 es
1697            desc "varying of type mat3x4 inside struct"
1698            values
1699            {
1700                input mat3x4 in0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ];
1701                output mat3x4 out0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ];
1702            }
1703            vertex ""
1704                #version 300 es
1705                ${VERTEX_DECLARATIONS}
1706                struct S { mediump mat3x4 a; };
1707                out S var;
1708                void main()
1709                {
1710                    var.a = in0;
1711                    ${VERTEX_OUTPUT}
1712                }
1713            ""
1714            fragment ""
1715                #version 300 es
1716                precision mediump float;
1717                ${FRAGMENT_DECLARATIONS}
1718                struct S { mediump mat3x4 a; };
1719                in S var;
1720                void main()
1721                {
1722                    out0 = var.a;
1723                    ${FRAGMENT_OUTPUT}
1724                }
1725            ""
1726        end
1727
1728        case mat4x2
1729            version 300 es
1730            desc "varying of type mat4x2 inside struct"
1731            values
1732            {
1733                input mat4x2 in0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ];
1734                output mat4x2 out0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ];
1735            }
1736            vertex ""
1737                #version 300 es
1738                ${VERTEX_DECLARATIONS}
1739                struct S { mediump mat4x2 a; };
1740                out S var;
1741                void main()
1742                {
1743                    var.a = in0;
1744                    ${VERTEX_OUTPUT}
1745                }
1746            ""
1747            fragment ""
1748                #version 300 es
1749                precision mediump float;
1750                ${FRAGMENT_DECLARATIONS}
1751                struct S { mediump mat4x2 a; };
1752                in S var;
1753                void main()
1754                {
1755                    out0 = var.a;
1756                    ${FRAGMENT_OUTPUT}
1757                }
1758            ""
1759        end
1760
1761        case mat4x3
1762            version 300 es
1763            desc "varying of type mat4x3 inside struct"
1764            values
1765            {
1766                input mat4x3 in0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ];
1767                output mat4x3 out0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ];
1768            }
1769            vertex ""
1770                #version 300 es
1771                ${VERTEX_DECLARATIONS}
1772                struct S { mediump mat4x3 a; };
1773                out S var;
1774                void main()
1775                {
1776                    var.a = in0;
1777                    ${VERTEX_OUTPUT}
1778                }
1779            ""
1780            fragment ""
1781                #version 300 es
1782                precision mediump float;
1783                ${FRAGMENT_DECLARATIONS}
1784                struct S { mediump mat4x3 a; };
1785                in S var;
1786                void main()
1787                {
1788                    out0 = var.a;
1789                    ${FRAGMENT_OUTPUT}
1790                }
1791            ""
1792        end
1793
1794        case mat4
1795            version 300 es
1796            desc "varying of type mat4 inside struct"
1797            values
1798            {
1799                input mat4 in0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ];
1800                output mat4 out0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ];
1801            }
1802            vertex ""
1803                #version 300 es
1804                ${VERTEX_DECLARATIONS}
1805                struct S { mediump mat4 a; };
1806                out S var;
1807                void main()
1808                {
1809                    var.a = in0;
1810                    ${VERTEX_OUTPUT}
1811                }
1812            ""
1813            fragment ""
1814                #version 300 es
1815                precision mediump float;
1816                ${FRAGMENT_DECLARATIONS}
1817                struct S { mediump mat4 a; };
1818                in S var;
1819                void main()
1820                {
1821                    out0 = var.a;
1822                    ${FRAGMENT_OUTPUT}
1823                }
1824            ""
1825        end
1826
1827        case int
1828            version 300 es
1829            desc "varying of type int inside struct"
1830            values
1831            {
1832                input int in0 = [ -1 | -25 | 1 | 2 | 3 | 16 ];
1833                output int out0 = [ -1 | -25 | 1 | 2 | 3 | 16 ];
1834            }
1835            vertex ""
1836                #version 300 es
1837                ${VERTEX_DECLARATIONS}
1838                struct S { mediump int a; };
1839                flat out S var;
1840                void main()
1841                {
1842                    ${VERTEX_SETUP}
1843                    var.a = in0;
1844                    ${VERTEX_OUTPUT}
1845                }
1846            ""
1847            fragment ""
1848                #version 300 es
1849                ${FRAGMENT_DECLARATIONS}
1850                struct S { mediump int a; };
1851                flat in S var;
1852                void main()
1853                {
1854                    out0 = var.a;
1855                    ${FRAGMENT_OUTPUT}
1856                }
1857            ""
1858        end
1859
1860        case ivec2
1861            version 300 es
1862            desc "varying of type ivec2 inside struct"
1863            values
1864            {
1865                input ivec2 in0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ];
1866                output ivec2 out0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ];
1867            }
1868            vertex ""
1869                #version 300 es
1870                ${VERTEX_DECLARATIONS}
1871                struct S { mediump ivec2 a; };
1872                flat out S var;
1873                void main()
1874                {
1875                    ${VERTEX_SETUP}
1876                    var.a = in0;
1877                    ${VERTEX_OUTPUT}
1878                }
1879            ""
1880            fragment ""
1881                #version 300 es
1882                ${FRAGMENT_DECLARATIONS}
1883                struct S { mediump ivec2 a; };
1884                flat in S var;
1885                void main()
1886                {
1887                    out0 = var.a;
1888                    ${FRAGMENT_OUTPUT}
1889                }
1890            ""
1891        end
1892
1893        case ivec3
1894            version 300 es
1895            desc "varying of type ivec3 inside struct"
1896            values
1897            {
1898                input ivec3 in0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ];
1899                output ivec3 out0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ];
1900            }
1901            vertex ""
1902                #version 300 es
1903                ${VERTEX_DECLARATIONS}
1904                struct S { mediump ivec3 a; };
1905                flat out S var;
1906                void main()
1907                {
1908                    ${VERTEX_SETUP}
1909                    var.a = in0;
1910                    ${VERTEX_OUTPUT}
1911                }
1912            ""
1913            fragment ""
1914                #version 300 es
1915                ${FRAGMENT_DECLARATIONS}
1916                struct S { mediump ivec3 a; };
1917                flat in S var;
1918                void main()
1919                {
1920                    out0 = var.a;
1921                    ${FRAGMENT_OUTPUT}
1922                }
1923            ""
1924        end
1925
1926        case ivec4
1927            version 300 es
1928            desc "varying of type ivec4 inside struct"
1929            values
1930            {
1931                input ivec4 in0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ];
1932                output ivec4 out0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ];
1933            }
1934            vertex ""
1935                #version 300 es
1936                ${VERTEX_DECLARATIONS}
1937                struct S { mediump ivec4 a; };
1938                flat out S var;
1939                void main()
1940                {
1941                    ${VERTEX_SETUP}
1942                    var.a = in0;
1943                    ${VERTEX_OUTPUT}
1944                }
1945            ""
1946            fragment ""
1947                #version 300 es
1948                ${FRAGMENT_DECLARATIONS}
1949                struct S { mediump ivec4 a; };
1950                flat in S var;
1951                void main()
1952                {
1953                    out0 = var.a;
1954                    ${FRAGMENT_OUTPUT}
1955                }
1956            ""
1957        end
1958
1959        case uint
1960            version 300 es
1961            desc "varying of type uint in struct"
1962            values
1963            {
1964                input uint in0 = [ 1 | 2 | 3 | 16 ];
1965                output uint out0 = [ 1 | 2 | 3 | 16 ];
1966            }
1967            vertex ""
1968                #version 300 es
1969                ${VERTEX_DECLARATIONS}
1970                struct S { mediump uint a; };
1971                flat out S var;
1972                void main()
1973                {
1974                    ${VERTEX_SETUP}
1975                    var.a = in0;
1976                    ${VERTEX_OUTPUT}
1977                }
1978            ""
1979            fragment ""
1980                #version 300 es
1981                ${FRAGMENT_DECLARATIONS}
1982                struct S { mediump uint a; };
1983                flat in S var;
1984                void main()
1985                {
1986                    out0 = var.a;
1987                    ${FRAGMENT_OUTPUT}
1988                }
1989            ""
1990        end
1991
1992        case uvec2
1993            version 300 es
1994            desc "varying of type uvec2 inside struct"
1995            values
1996            {
1997                input uvec2 in0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ];
1998                output uvec2 out0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ];
1999            }
2000            vertex ""
2001                #version 300 es
2002                ${VERTEX_DECLARATIONS}
2003                struct S { mediump uvec2 a; };
2004                flat out S var;
2005                void main()
2006                {
2007                    ${VERTEX_SETUP}
2008                    var.a = in0;
2009                    ${VERTEX_OUTPUT}
2010                }
2011            ""
2012            fragment ""
2013                #version 300 es
2014                ${FRAGMENT_DECLARATIONS}
2015                struct S { mediump uvec2 a; };
2016                flat in S var;
2017                void main()
2018                {
2019                    out0 = var.a;
2020                    ${FRAGMENT_OUTPUT}
2021                }
2022            ""
2023        end
2024
2025        case uvec3
2026            version 300 es
2027            desc "varying of type uvec3 inside struct"
2028            values
2029            {
2030                input uvec3 in0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ];
2031                output uvec3 out0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ];
2032            }
2033            vertex ""
2034                #version 300 es
2035                ${VERTEX_DECLARATIONS}
2036                struct S { mediump uvec3 a; };
2037                flat out S var;
2038                void main()
2039                {
2040                    ${VERTEX_SETUP}
2041                    var.a = in0;
2042                    ${VERTEX_OUTPUT}
2043                }
2044            ""
2045            fragment ""
2046                #version 300 es
2047                ${FRAGMENT_DECLARATIONS}
2048                struct S { mediump uvec3 a; };
2049                flat in S var;
2050                void main()
2051                {
2052                    out0 = var.a;
2053                    ${FRAGMENT_OUTPUT}
2054                }
2055            ""
2056        end
2057
2058        case uvec4
2059            version 300 es
2060            desc "varying of type uvec4 inside struct"
2061            values
2062            {
2063                input uvec4 in0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ];
2064                output uvec4 out0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ];
2065            }
2066            vertex ""
2067                #version 300 es
2068                ${VERTEX_DECLARATIONS}
2069                struct S { mediump uvec4 a; };
2070                flat out S var;
2071                void main()
2072                {
2073                    ${VERTEX_SETUP}
2074                    var.a = in0;
2075                    ${VERTEX_OUTPUT}
2076                }
2077            ""
2078            fragment ""
2079                #version 300 es
2080                ${FRAGMENT_DECLARATIONS}
2081                struct S { mediump uvec4 a; };
2082                flat in S var;
2083                void main()
2084                {
2085                    out0 = var.a;
2086                    ${FRAGMENT_OUTPUT}
2087                }
2088            ""
2089        end
2090
2091        case float_vec3
2092            version 300 es
2093            desc "varyings of type float and vec3 inside struct"
2094            values
2095            {
2096                input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ];
2097                output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ];
2098                input vec3 in1 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ];
2099                output vec3 out1 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ];
2100            }
2101            vertex ""
2102                #version 300 es
2103                ${VERTEX_DECLARATIONS}
2104                struct S { mediump float a; highp vec3 b; };
2105                out S var;
2106                void main()
2107                {
2108                    var.a = in0;
2109                    var.b = in1;
2110                    ${VERTEX_OUTPUT}
2111                }
2112            ""
2113            fragment ""
2114                #version 300 es
2115                precision mediump float;
2116                ${FRAGMENT_DECLARATIONS}
2117                struct S { mediump float a; highp vec3 b; };
2118                in S var;
2119                void main()
2120                {
2121                    out0 = var.a;
2122                    out1 = var.b;
2123                    ${FRAGMENT_OUTPUT}
2124                }
2125            ""
2126        end
2127
2128        case float_uvec2_vec3
2129            version 300 es
2130            desc "varyings of type float and vec3 inside struct"
2131            values
2132            {
2133                input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ];
2134                output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ];
2135                input uvec2 in1 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) | uvec2(8, 7) ];
2136                output uvec2 out1 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) | uvec2(8, 7) ];
2137                input vec3 in2 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ];
2138                output vec3 out2 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ];
2139            }
2140            vertex ""
2141                #version 300 es
2142                ${VERTEX_DECLARATIONS}
2143                struct S { mediump float a; highp uvec2 b; highp vec3 c; };
2144                flat out S var;
2145                void main()
2146                {
2147                    ${VERTEX_SETUP}
2148                    var.a = in0;
2149                    var.b = in1;
2150                    var.c = in2;
2151                    ${VERTEX_OUTPUT}
2152                }
2153            ""
2154            fragment ""
2155                #version 300 es
2156                precision mediump float;
2157                ${FRAGMENT_DECLARATIONS}
2158                struct S { mediump float a; highp uvec2 b; highp vec3 c; };
2159                flat in S var;
2160                void main()
2161                {
2162                    out0 = var.a;
2163                    out1 = var.b;
2164                    out2 = var.c;
2165                    ${FRAGMENT_OUTPUT}
2166                }
2167            ""
2168        end
2169    end
2170
2171    group interpolation "Varying interpolation modes"
2172        case smooth
2173            version 300 es
2174            desc "varying of type vec4"
2175            values
2176            {
2177                input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ];
2178                output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ];
2179            }
2180            vertex ""
2181                #version 300 es
2182                ${VERTEX_DECLARATIONS}
2183                smooth out mediump vec4 var;
2184                void main()
2185                {
2186                    var = in0;
2187                    ${VERTEX_OUTPUT}
2188                }
2189            ""
2190            fragment ""
2191                #version 300 es
2192                precision mediump float;
2193                ${FRAGMENT_DECLARATIONS}
2194                smooth in vec4 var;
2195                void main()
2196                {
2197                    out0 = var;
2198                    ${FRAGMENT_OUTPUT}
2199                }
2200            ""
2201        end
2202
2203        case centroid
2204            version 300 es
2205            desc "varying of type vec4"
2206            values
2207            {
2208                input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ];
2209                output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ];
2210            }
2211            vertex ""
2212                #version 300 es
2213                ${VERTEX_DECLARATIONS}
2214                centroid out mediump vec4 var;
2215                void main()
2216                {
2217                    var = in0;
2218                    ${VERTEX_OUTPUT}
2219                }
2220            ""
2221            fragment ""
2222                #version 300 es
2223                precision mediump float;
2224                ${FRAGMENT_DECLARATIONS}
2225                centroid in vec4 var;
2226                void main()
2227                {
2228                    out0 = var;
2229                    ${FRAGMENT_OUTPUT}
2230                }
2231            ""
2232        end
2233
2234        case flat
2235            version 300 es
2236            desc "varying of type vec4"
2237            values
2238            {
2239                input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ];
2240                output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ];
2241            }
2242            vertex ""
2243                #version 300 es
2244                ${VERTEX_DECLARATIONS}
2245                flat out mediump vec4 var;
2246                void main()
2247                {
2248                    var = in0;
2249                    ${VERTEX_OUTPUT}
2250                }
2251            ""
2252            fragment ""
2253                #version 300 es
2254                precision mediump float;
2255                ${FRAGMENT_DECLARATIONS}
2256                flat in vec4 var;
2257                void main()
2258                {
2259                    out0 = var;
2260                    ${FRAGMENT_OUTPUT}
2261                }
2262            ""
2263        end
2264    end
2265
2266    group usage "Varying usage in shaders"
2267        case readback_1
2268            version 300 es
2269            desc "read back (an already written) varying in the vertex shader"
2270            values
2271            {
2272                input float in0 = [ 1.0 | 0.0 | -2.0 | 10.0 ];
2273                output float out0 = [ 3.0 | 0.0 | -6.0 | 30.0 ];
2274            }
2275            vertex ""
2276                #version 300 es
2277                precision mediump float;
2278                ${VERTEX_DECLARATIONS}
2279                out float var1;
2280                out float var2;
2281
2282                void main()
2283                {
2284                    var1 = in0;
2285                    var2 = var1 + in0;
2286                    ${VERTEX_OUTPUT}
2287                }
2288            ""
2289            fragment ""
2290                #version 300 es
2291                precision mediump float;
2292                ${FRAGMENT_DECLARATIONS}
2293                in float var1;
2294                in float var2;
2295
2296                void main()
2297                {
2298                    out0 = var1 + var2;
2299                    ${FRAGMENT_OUTPUT}
2300                }
2301            ""
2302        end
2303
2304        case writeback_1
2305            version 300 es
2306            desc "write back a varying in the fragment shader"
2307            values
2308            {
2309                input float in0 = [ 1.0 | 0.0 | -2.0 | 10.0 ];
2310            }
2311            expect compile_fail
2312            vertex ""
2313                #version 300 es
2314                precision mediump float;
2315                ${VERTEX_DECLARATIONS}
2316                out float var1;
2317                out float var2;
2318
2319                void main()
2320                {
2321                    var1 = in0;
2322                    var2 = var1 + in0;
2323                    ${VERTEX_OUTPUT}
2324                }
2325            ""
2326            fragment ""
2327                #version 300 es
2328                precision mediump float;
2329                ${FRAGMENT_DECLARATIONS}
2330                in float var1;
2331                in float var2;
2332
2333                void main()
2334                {
2335                    var2 = var1;
2336                    out0 = var1;
2337                    ${FRAGMENT_OUTPUT}
2338                }
2339            ""
2340        end
2341    end
2342end
2343
2344group uniform "Uniform linkage"
2345    group basic "Default block uniforms of scalar and vector types"
2346        case precision_conflict_1
2347            version 300 es
2348            desc "Vertex side uniform has highp, fragment side uniform mediump."
2349            expect link_fail
2350            values {output float out0 = 3.0;}
2351            vertex ""
2352                #version 300 es
2353                ${VERTEX_DECLARATIONS}
2354                uniform highp float u_val;
2355                out mediump float res;
2356                void main()
2357                {
2358                    res = u_val;
2359                    ${VERTEX_OUTPUT}
2360                }
2361            ""
2362            fragment ""
2363                #version 300 es
2364                precision mediump float;
2365                uniform float u_val;
2366                ${FRAGMENT_DECLARATIONS}
2367                in mediump float res;
2368                void main()
2369                {
2370                    out0 = u_val + res;
2371                    ${FRAGMENT_OUTPUT}
2372                }
2373            ""
2374        end
2375        case precision_conflict_2
2376            version 300 es
2377            desc "Vertex side uniform has highp, fragment side uniform mediump."
2378            expect link_fail
2379            values {output float out0 = 3.0;}
2380            vertex ""
2381                #version 300 es
2382                ${VERTEX_DECLARATIONS}
2383                uniform highp float u_val;
2384                out mediump float res;
2385                void main()
2386                {
2387                    res = u_val;
2388                    ${VERTEX_OUTPUT}
2389                }
2390            ""
2391            fragment ""
2392                #version 300 es
2393                precision highp float;
2394                uniform mediump float u_val;
2395                ${FRAGMENT_DECLARATIONS}
2396                in mediump float res;
2397                void main()
2398                {
2399                    out0 = u_val + res;
2400                    ${FRAGMENT_OUTPUT}
2401                }
2402            ""
2403        end
2404        case precision_conflict_3
2405            version 300 es
2406            desc "Vertex side uniform has lowp, fragment side uniform highp."
2407            expect link_fail
2408            values {output float out0 = 3.0;}
2409            vertex ""
2410                #version 300 es
2411                ${VERTEX_DECLARATIONS}
2412                uniform lowp int u_val;
2413                out mediump float res;
2414                void main()
2415                {
2416                    res = float(u_val);
2417                    ${VERTEX_OUTPUT}
2418                }
2419            ""
2420            fragment ""
2421                #version 300 es
2422                precision highp float;
2423                uniform highp int u_val;
2424                ${FRAGMENT_DECLARATIONS}
2425                in mediump float res;
2426                void main()
2427                {
2428                    out0 = float(u_val) + res;
2429                    ${FRAGMENT_OUTPUT}
2430                }
2431            ""
2432        end
2433        case precision_conflict_4
2434            version 300 es
2435            desc "Vertex side uniform has lowp, fragment side uniform mediump."
2436            expect link_fail
2437            values {output float out0 = 3.0;}
2438            vertex ""
2439                #version 300 es
2440                ${VERTEX_DECLARATIONS}
2441                uniform lowp vec3 u_val;
2442                out mediump float res;
2443                void main()
2444                {
2445                    res = u_val.y;
2446                    ${VERTEX_OUTPUT}
2447                }
2448            ""
2449            fragment ""
2450                #version 300 es
2451                precision highp float;
2452                uniform mediump vec3 u_val;
2453                ${FRAGMENT_DECLARATIONS}
2454                in mediump float res;
2455                void main()
2456                {
2457                    out0 = u_val.z + res;
2458                    ${FRAGMENT_OUTPUT}
2459                }
2460            ""
2461        end
2462    end
2463
2464    group struct "Uniform structs"
2465        # Struct linkage handling
2466        case basic
2467            version 300 es
2468            desc "Same uniform struct in both shaders"
2469            values {
2470                uniform float val.a = 1.0;
2471                uniform float val.b = 2.0;
2472                output float out0 = 3.0;
2473            }
2474            vertex ""
2475                #version 300 es
2476                ${VERTEX_DECLARATIONS}
2477                struct Struct {mediump float a; mediump float b;};
2478                uniform Struct val;
2479                out mediump float dummy;
2480                void main()
2481                {
2482                    dummy = val.a + val.b;
2483                    ${VERTEX_OUTPUT}
2484                }
2485            ""
2486            fragment ""
2487                #version 300 es
2488                precision mediump float;
2489                struct Struct {mediump float a; mediump float b;};
2490                uniform Struct val;
2491                in mediump float dummy;
2492                ${FRAGMENT_DECLARATIONS}
2493                void main()
2494                {
2495                    out0 = val.b + val.a;
2496                    out0 = out0 + dummy;
2497                    out0 = out0 - dummy;
2498                    ${FRAGMENT_OUTPUT}
2499                }
2500            ""
2501        end
2502
2503        case vertex_only
2504            version 300 es
2505            desc "Uniform struct declared in both, used only in vertex."
2506            values {
2507                uniform float val.a = 1.0;
2508                uniform float val.b = 2.0;
2509                output float out0 = 3.0;
2510            }
2511            vertex ""
2512                #version 300 es
2513                ${VERTEX_DECLARATIONS}
2514                struct Struct {mediump float a; mediump float b;};
2515                uniform Struct val;
2516                out mediump float res;
2517                void main()
2518                {
2519                    res = val.a + val.b;
2520                    ${VERTEX_OUTPUT}
2521                }
2522            ""
2523            fragment ""
2524                #version 300 es
2525                precision mediump float;
2526                struct Struct {mediump float a; mediump float b;};
2527                uniform Struct val;
2528                in mediump float res;
2529                ${FRAGMENT_DECLARATIONS}
2530                void main()
2531                {
2532                    out0 = res;
2533                    ${FRAGMENT_OUTPUT}
2534                }
2535            ""
2536        end
2537
2538        case fragment_only
2539            version 300 es
2540            desc "Uniform struct declared in both, used only in fragment."
2541            values {
2542                uniform float val.a = 1.0;
2543                uniform float val.b = 2.0;
2544                output float out0 = 3.0;
2545            }
2546            vertex ""
2547                #version 300 es
2548                ${VERTEX_DECLARATIONS}
2549                struct Struct {mediump float a; mediump float b;};
2550                uniform Struct val;
2551                void main()
2552                {
2553                    ${VERTEX_OUTPUT}
2554                }
2555            ""
2556            fragment ""
2557                #version 300 es
2558                precision mediump float;
2559                struct Struct {mediump float a; mediump float b;};
2560                uniform Struct val;
2561                ${FRAGMENT_DECLARATIONS}
2562                void main()
2563                {
2564                    out0 = val.a + val.b;
2565                    ${FRAGMENT_OUTPUT}
2566                }
2567            ""
2568        end
2569
2570        case partial
2571            version 300 es
2572            desc "Uniform struct declared in both, used partially in both."
2573            values {
2574                uniform float val.a = 1.0;
2575                uniform float val.b = 2.0;
2576                output float out0 = 3.0;
2577            }
2578            vertex ""
2579                #version 300 es
2580                ${VERTEX_DECLARATIONS}
2581                struct Struct {mediump float a; mediump float b;};
2582                uniform Struct val;
2583                out mediump float res;
2584                void main()
2585                {
2586                    res = val.a;
2587                    ${VERTEX_OUTPUT}
2588                }
2589            ""
2590            fragment ""
2591                #version 300 es
2592                precision mediump float;
2593                struct Struct {mediump float a; mediump float b;};
2594                uniform Struct val;
2595                ${FRAGMENT_DECLARATIONS}
2596                in mediump float res;
2597                void main()
2598                {
2599                    out0 = res + val.b;
2600                    ${FRAGMENT_OUTPUT}
2601                }
2602            ""
2603        end
2604
2605        case vec4
2606            version 300 es
2607            desc "Same uniform struct in both shaders. Datatype vec4"
2608            values {
2609                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2610                uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
2611                output float out0 = 3.0;
2612            }
2613            vertex ""
2614                #version 300 es
2615                ${VERTEX_DECLARATIONS}
2616                struct Struct {mediump vec4 a; mediump vec4 b;};
2617                uniform Struct val;
2618                out mediump float dummy;
2619                void main()
2620                {
2621                    dummy = val.a.x + val.b.y;
2622                    ${VERTEX_OUTPUT}
2623                }
2624            ""
2625            fragment ""
2626                #version 300 es
2627                precision mediump float;
2628                struct Struct {mediump vec4 a; mediump vec4 b;};
2629                uniform Struct val;
2630                in mediump float dummy;
2631                ${FRAGMENT_DECLARATIONS}
2632                void main()
2633                {
2634                    out0 = val.b.y + val.a.x;
2635                    out0 = out0 + dummy;
2636                    out0 = out0 - dummy;
2637                    ${FRAGMENT_OUTPUT}
2638                }
2639            ""
2640        end
2641
2642        case vertex_only_vec4
2643            version 300 es
2644            desc "Uniform struct declared in both, used only in vertex. Datatype vec4    "
2645            values {
2646                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2647                uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
2648                output float out0 = 3.0;
2649            }
2650            vertex ""
2651                #version 300 es
2652                ${VERTEX_DECLARATIONS}
2653                struct Struct {mediump vec4 a; mediump vec4 b;};
2654                uniform Struct val;
2655                out mediump float res;
2656                void main()
2657                {
2658                    res = val.a.x + val.b.y;
2659                    ${VERTEX_OUTPUT}
2660                }
2661            ""
2662            fragment ""
2663                #version 300 es
2664                precision mediump float;
2665                struct Struct {mediump vec4 a; mediump vec4 b;};
2666                uniform Struct val;
2667                in mediump float res;
2668                ${FRAGMENT_DECLARATIONS}
2669                void main()
2670                {            out0 = res;
2671                    ${FRAGMENT_OUTPUT}
2672                }
2673            ""
2674        end
2675
2676        case fragment_only_vec4
2677            version 300 es
2678            desc "Uniform struct declared in both, used only in fragment. Datatype vec4"
2679            values {
2680                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2681                uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
2682                output float out0 = 3.0;
2683            }
2684            vertex ""
2685                #version 300 es
2686                ${VERTEX_DECLARATIONS}
2687                struct Struct {mediump vec4 a; mediump vec4 b;};
2688                uniform Struct val;
2689                void main()
2690                {
2691                    ${VERTEX_OUTPUT}
2692                }
2693            ""
2694            fragment ""
2695                #version 300 es
2696                precision mediump float;
2697                struct Struct {mediump vec4 a; mediump vec4 b;};
2698                uniform Struct val;
2699                ${FRAGMENT_DECLARATIONS}
2700                void main()
2701                {            out0 = val.a.x + val.b.y;
2702                    ${FRAGMENT_OUTPUT}
2703                }
2704            ""
2705        end
2706
2707        case partial_vec4
2708            version 300 es
2709            desc "Uniform struct declared in both, used partially in both. Datatype vec4"
2710            values {
2711                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2712                uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
2713                output float out0 = 3.0;
2714            }
2715            vertex ""
2716                #version 300 es
2717                ${VERTEX_DECLARATIONS}
2718                struct Struct {mediump vec4 a; mediump vec4 b;};
2719                uniform Struct val;
2720                out mediump float res;
2721                void main()
2722                {
2723                    res = val.a.x;
2724                    ${VERTEX_OUTPUT}
2725                }
2726            ""
2727            fragment ""
2728                #version 300 es
2729                precision mediump float;
2730                struct Struct {mediump vec4 a; mediump vec4 b;};
2731                uniform Struct val;
2732                ${FRAGMENT_DECLARATIONS}
2733                in mediump float res;
2734                void main()
2735                {            out0 = res + val.b.y;
2736                    ${FRAGMENT_OUTPUT}
2737                }
2738            ""
2739        end
2740
2741        case vec4_vec3
2742            version 300 es
2743            desc "Same uniform struct in both shaders. Datatype vec4 and vec3"
2744            values {
2745                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2746                uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
2747                output float out0 = 3.0;
2748            }
2749            vertex ""
2750                #version 300 es
2751                ${VERTEX_DECLARATIONS}
2752                struct Struct {mediump vec4 a; mediump vec3 b;};
2753                uniform Struct val;
2754                out mediump float dummy;
2755                void main()
2756                {
2757                    dummy = val.a.x + val.b.y;
2758                    ${VERTEX_OUTPUT}
2759                }
2760            ""
2761            fragment ""
2762                #version 300 es
2763                precision mediump float;
2764                struct Struct {mediump vec4 a; mediump vec3 b;};
2765                uniform Struct val;
2766                in mediump float dummy;
2767                ${FRAGMENT_DECLARATIONS}
2768                void main()
2769                {            out0 = val.b.y + val.a.x;
2770                    out0 = out0 + dummy;
2771                    out0 = out0 - dummy;
2772                    ${FRAGMENT_OUTPUT}
2773                }
2774            ""
2775        end
2776
2777        case vertex_only_vec4_vec3
2778            version 300 es
2779            desc "Uniform struct declared in both, used only in vertex. Datatype vec4 and vec3"
2780            values {
2781                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2782                uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
2783                output float out0 = 3.0;
2784            }
2785            vertex ""
2786                #version 300 es
2787                ${VERTEX_DECLARATIONS}
2788                struct Struct {mediump vec4 a; mediump vec3 b;};
2789                uniform Struct val;
2790                out mediump float res;
2791                void main()
2792                {
2793                    res = val.a.x + val.b.y;
2794                    ${VERTEX_OUTPUT}
2795                }
2796            ""
2797            fragment ""
2798                #version 300 es
2799                precision mediump float;
2800                struct Struct {mediump vec4 a; mediump vec3 b;};
2801                uniform Struct val;
2802                in mediump float res;
2803                ${FRAGMENT_DECLARATIONS}
2804                void main()
2805                {            out0 = res;
2806                    ${FRAGMENT_OUTPUT}
2807                }
2808            ""
2809        end
2810
2811        case fragment_only_vec4_vec3
2812            version 300 es
2813            desc "Uniform struct declared in both, used only in fragment. Datatype vec4 and vec3"
2814            values {
2815                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2816                uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
2817                output float out0 = 3.0;
2818            }
2819            vertex ""
2820                #version 300 es
2821                ${VERTEX_DECLARATIONS}
2822                struct Struct {mediump vec4 a; mediump vec3 b;};
2823                uniform Struct val;
2824                void main()
2825                {
2826                    ${VERTEX_OUTPUT}
2827                }
2828            ""
2829            fragment ""
2830                #version 300 es
2831                precision mediump float;
2832                struct Struct {mediump vec4 a; mediump vec3 b;};
2833                uniform Struct val;
2834                ${FRAGMENT_DECLARATIONS}
2835                void main()
2836                {            out0 = val.a.x + val.b.y;
2837                    ${FRAGMENT_OUTPUT}
2838                }
2839            ""
2840        end
2841
2842        case partial_vec4_vec3
2843            version 300 es
2844            desc "Uniform struct declared in both, used partially in both. Datatype vec4 and vec3"
2845            values {
2846                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2847                uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
2848                output float out0 = 3.0;
2849            }
2850            vertex ""
2851                #version 300 es
2852                ${VERTEX_DECLARATIONS}
2853                struct Struct {mediump vec4 a; mediump vec3 b;};
2854                uniform Struct val;
2855                out mediump float res;
2856                void main()
2857                {
2858                    res = val.a.x;
2859                    ${VERTEX_OUTPUT}
2860                }
2861            ""
2862            fragment ""
2863                #version 300 es
2864                precision mediump float;
2865                struct Struct {mediump vec4 a; mediump vec3 b;};
2866                uniform Struct val;
2867                ${FRAGMENT_DECLARATIONS}
2868                in mediump float res;
2869                void main()
2870                {            out0 = res + val.b.y;
2871                    ${FRAGMENT_OUTPUT}
2872                }
2873            ""
2874        end
2875
2876        case vec4_float
2877            version 300 es
2878            desc "Same uniform struct in both shaders. Datatype vec4 and float"
2879            values {
2880                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2881                uniform float val.b = 2.0;
2882                output float out0 = 3.0;
2883            }
2884            vertex ""
2885                #version 300 es
2886                ${VERTEX_DECLARATIONS}
2887                struct Struct {mediump vec4 a; mediump float b;};
2888                uniform Struct val;
2889                out mediump float dummy;
2890                void main()
2891                {
2892                    dummy = val.a.x + val.b;
2893                    ${VERTEX_OUTPUT}
2894                }
2895            ""
2896            fragment ""
2897                #version 300 es
2898                precision mediump float;
2899                struct Struct {mediump vec4 a; mediump float b;};
2900                uniform Struct val;
2901                in mediump float dummy;
2902                ${FRAGMENT_DECLARATIONS}
2903                void main()
2904                {            out0 = val.b + val.a.x;
2905                    out0 = out0 + dummy;
2906                    out0 = out0 - dummy;
2907                    ${FRAGMENT_OUTPUT}
2908                }
2909            ""
2910        end
2911
2912        case vertex_only_vec4_float
2913            version 300 es
2914            desc "Uniform struct declared in both, used only in vertex. Datatype vec4 and float"
2915            values {
2916                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2917                uniform float val.b = 2.0;
2918                output float out0 = 3.0;
2919            }
2920            vertex ""
2921                #version 300 es
2922                ${VERTEX_DECLARATIONS}
2923                struct Struct {mediump vec4 a; mediump float b;};
2924                uniform Struct val;
2925                out mediump float res;
2926                void main()
2927                {
2928                    res = val.a.x + val.b;
2929                    ${VERTEX_OUTPUT}
2930                }
2931            ""
2932            fragment ""
2933                #version 300 es
2934                precision mediump float;
2935                struct Struct {mediump vec4 a; mediump float b;};
2936                uniform Struct val;
2937                in mediump float res;
2938                ${FRAGMENT_DECLARATIONS}
2939                void main()
2940                {            out0 = res;
2941                    ${FRAGMENT_OUTPUT}
2942                }
2943            ""
2944        end
2945
2946        case fragment_only_vec4_float
2947            version 300 es
2948            desc "Uniform struct declared in both, used only in fragment. Datatype vec4 and float"
2949            values {
2950                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2951                uniform float val.b = 2.0;
2952                output float out0 = 3.0;
2953            }
2954            vertex ""
2955                #version 300 es
2956                ${VERTEX_DECLARATIONS}
2957                struct Struct {mediump vec4 a; mediump float b;};
2958                uniform Struct val;
2959                void main()
2960                {
2961                    ${VERTEX_OUTPUT}
2962                }
2963            ""
2964            fragment ""
2965                #version 300 es
2966                precision mediump float;
2967                struct Struct {mediump vec4 a; mediump float b;};
2968                uniform Struct val;
2969                ${FRAGMENT_DECLARATIONS}
2970                void main()
2971                {            out0 = val.a.x + val.b;
2972                    ${FRAGMENT_OUTPUT}
2973                }
2974            ""
2975        end
2976
2977        case partial_vec4_float
2978            version 300 es
2979            desc "Uniform struct declared in both, used partially in both. Datatype vec4 and float"
2980            values {
2981                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
2982                uniform float val.b = 2.0;
2983                output float out0 = 3.0;
2984            }
2985            vertex ""
2986                #version 300 es
2987                ${VERTEX_DECLARATIONS}
2988                struct Struct {mediump vec4 a; mediump float b;};
2989                uniform Struct val;
2990                out mediump float res;
2991                void main()
2992                {
2993                    res = val.a.x;
2994                    ${VERTEX_OUTPUT}
2995                }
2996            ""
2997            fragment ""
2998                #version 300 es
2999                precision mediump float;
3000                struct Struct {mediump vec4 a; mediump float b;};
3001                uniform Struct val;
3002                ${FRAGMENT_DECLARATIONS}
3003                in mediump float res;
3004                void main()
3005                {            out0 = res + val.b;
3006                    ${FRAGMENT_OUTPUT}
3007                }
3008            ""
3009        end
3010
3011        case partial_vec4_struct
3012            version 300 es
3013            desc "Uniform struct declared in both, used partially in both. Datatype vec4 and struct with vec4"
3014            values {
3015                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
3016                uniform vec4 val.b.c = vec4(1.0, 2.0, 3.0, 4.0);
3017                output float out0 = 3.0;
3018            }
3019            vertex ""
3020                #version 300 es
3021                ${VERTEX_DECLARATIONS}
3022                struct Inner {mediump vec4 c;};
3023                struct Struct {mediump vec4 a; Inner b;};
3024                uniform Struct val;
3025                out mediump float res;
3026                void main()
3027                {
3028                    res = val.a.x;
3029                    ${VERTEX_OUTPUT}
3030                }
3031            ""
3032            fragment ""
3033                #version 300 es
3034                precision mediump float;
3035                struct Inner {mediump vec4 c;};
3036                struct Struct {mediump vec4 a; Inner b;};
3037                uniform Struct val;
3038                ${FRAGMENT_DECLARATIONS}
3039                in mediump float res;
3040                void main()
3041                {            out0 = res + val.b.c.y;
3042                    ${FRAGMENT_OUTPUT}
3043                }
3044            ""
3045        end
3046
3047        case partial_vec4_vec3_struct
3048            version 300 es
3049            desc "Uniform struct declared in both, used partially in both. Datatype vec4 and struct with vec3"
3050            values {
3051                uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
3052                uniform vec3 val.b.c = vec3(1.0, 2.0, 3.0);
3053                output float out0 = 3.0;
3054            }
3055            vertex ""
3056                #version 300 es
3057                ${VERTEX_DECLARATIONS}
3058                struct Inner {mediump vec3 c;};
3059                struct Struct {mediump vec4 a; Inner b;};
3060                uniform Struct val;
3061                out mediump float res;
3062                void main()
3063                {
3064                    res = val.a.x;
3065                    ${VERTEX_OUTPUT}
3066                }
3067            ""
3068            fragment ""
3069                #version 300 es
3070                precision mediump float;
3071                struct Inner {mediump vec3 c;};
3072                struct Struct {mediump vec4 a; Inner b;};
3073                uniform Struct val;
3074                ${FRAGMENT_DECLARATIONS}
3075                in mediump float res;
3076                void main()
3077                {            out0 = res + val.b.c.y;
3078                    ${FRAGMENT_OUTPUT}
3079                }
3080            ""
3081        end
3082
3083        case partial_vec2_vec3
3084            version 300 es
3085            desc "Uniform struct declared in both, used partially in both. Datatype vec2 and vec3"
3086            values {
3087                uniform vec2 val.a = vec2(1.0, 2.0);
3088                uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
3089                output float out0 = 3.0;
3090            }
3091            vertex ""
3092                #version 300 es
3093                ${VERTEX_DECLARATIONS}
3094                struct Struct {mediump vec2 a; mediump vec3 b;};
3095                uniform Struct val;
3096                out mediump float res;
3097                void main()
3098                {
3099                    res = val.a.x;
3100                    ${VERTEX_OUTPUT}
3101                }
3102            ""
3103            fragment ""
3104                #version 300 es
3105                precision mediump float;
3106                struct Struct {mediump vec2 a; mediump vec3 b;};
3107                uniform Struct val;
3108                ${FRAGMENT_DECLARATIONS}
3109                in mediump float res;
3110                void main()
3111                {            out0 = res + val.b.y;
3112                    ${FRAGMENT_OUTPUT}
3113                }
3114            ""
3115        end
3116
3117        case partial_vec2_int
3118            version 300 es
3119            desc "Uniform struct declared in both, used partially in both. Datatype vec2 and int"
3120            values {
3121                uniform vec2 val.a = vec2(1.0, 2.0);
3122                uniform int val.b = 2;
3123                output float out0 = 3.0;
3124            }
3125            vertex ""
3126                #version 300 es
3127                ${VERTEX_DECLARATIONS}
3128                struct Struct {mediump vec2 a; mediump int b;};
3129                uniform Struct val;
3130                out mediump float res;
3131                void main()
3132                {
3133                    res = val.a.x;
3134                    ${VERTEX_OUTPUT}
3135                }
3136            ""
3137            fragment ""
3138                #version 300 es
3139                precision mediump float;
3140                struct Struct {mediump vec2 a; mediump int b;};
3141                uniform Struct val;
3142                ${FRAGMENT_DECLARATIONS}
3143                in mediump float res;
3144                void main()
3145                {            out0 = res + float(val.b);
3146                    ${FRAGMENT_OUTPUT}
3147                }
3148            ""
3149        end
3150
3151        case partial_int_float
3152            version 300 es
3153            desc "Uniform struct declared in both, used partially in both. Datatype int and float"
3154            values {
3155                uniform float val.a = 1.0;
3156                uniform int val.b = 2;
3157                output float out0 = 3.0;
3158            }
3159            vertex ""
3160                #version 300 es
3161                ${VERTEX_DECLARATIONS}
3162                struct Struct {mediump float a; mediump int b;};
3163                uniform Struct val;
3164                out mediump float res;
3165                void main()
3166                {
3167                    res = val.a;
3168                    ${VERTEX_OUTPUT}
3169                }
3170            ""
3171            fragment ""
3172                #version 300 es
3173                precision mediump float;
3174                struct Struct {mediump float a; mediump int b;};
3175                uniform Struct val;
3176                ${FRAGMENT_DECLARATIONS}
3177                in mediump float res;
3178                void main()
3179                {            out0 = res + float(val.b);
3180                    ${FRAGMENT_OUTPUT}
3181                }
3182            ""
3183        end
3184
3185        case partial_bvec2_vec2
3186            version 300 es
3187            desc "Uniform struct declared in both, used partially in both. Datatype bvec2 and vec2"
3188            values {
3189                uniform bvec2 val.a = bvec2(true, true);
3190                uniform vec2 val.b = vec2(1.0, 2.0);
3191                output float out0 = 3.0;
3192            }
3193            vertex ""
3194                #version 300 es
3195                ${VERTEX_DECLARATIONS}
3196                struct Struct {bvec2 a; mediump vec2 b;};
3197                uniform Struct val;
3198                out mediump float res;
3199                void main()
3200                {
3201                    res = float(val.a.x);
3202                    ${VERTEX_OUTPUT}
3203                }
3204            ""
3205            fragment ""
3206                #version 300 es
3207                precision mediump float;
3208                struct Struct {bvec2 a; mediump vec2 b;};
3209                uniform Struct val;
3210                ${FRAGMENT_DECLARATIONS}
3211                in mediump float res;
3212                void main()
3213                {            out0 = res + val.b.y;
3214                    ${FRAGMENT_OUTPUT}
3215                }
3216            ""
3217        end
3218
3219        case partial_ivec2_vec2
3220            version 300 es
3221            desc "Uniform struct declared in both, used partially in both. Datatype ivec2 and vec2"
3222            values {
3223                uniform ivec2 val.a = ivec2(1, 2);
3224                uniform vec2 val.b = vec2(1.0, 2.0);
3225                output float out0 = 3.0;
3226            }
3227            vertex ""
3228                #version 300 es
3229                ${VERTEX_DECLARATIONS}
3230                struct Struct {mediump ivec2 a; mediump vec2 b;};
3231                uniform Struct val;
3232                out mediump float res;
3233                void main()
3234                {
3235                    res = vec2(val.a).x;
3236                    ${VERTEX_OUTPUT}
3237                }
3238            ""
3239            fragment ""
3240                #version 300 es
3241                precision mediump float;
3242                struct Struct {mediump ivec2 a; mediump vec2 b;};
3243                uniform Struct val;
3244                ${FRAGMENT_DECLARATIONS}
3245                in mediump float res;
3246                void main()
3247                {            out0 = res + val.b.y;
3248                    ${FRAGMENT_OUTPUT}
3249                }
3250            ""
3251        end
3252
3253        case partial_ivec2_ivec2
3254            version 300 es
3255            desc "Uniform struct declared in both, used partially in both. Datatype ivec2 and ivec2"
3256            values {
3257                uniform ivec2 val.a = ivec2(1, 2);
3258                uniform ivec2 val.b = ivec2(1, 2);
3259                output float out0 = 3.0;
3260            }
3261            vertex ""
3262                #version 300 es
3263                ${VERTEX_DECLARATIONS}
3264                struct Struct {mediump ivec2 a; mediump ivec2 b;};
3265                uniform Struct val;
3266                out mediump float res;
3267                void main()
3268                {
3269                    res = vec2(val.a).x;
3270                    ${VERTEX_OUTPUT}
3271                }
3272            ""
3273            fragment ""
3274                #version 300 es
3275                precision mediump float;
3276                struct Struct {mediump ivec2 a; mediump ivec2 b;};
3277                uniform Struct val;
3278                ${FRAGMENT_DECLARATIONS}
3279                in mediump float res;
3280                void main()
3281                {            out0 = res + vec2(val.b).y;
3282                    ${FRAGMENT_OUTPUT}
3283                }
3284            ""
3285        end
3286
3287        case type_conflict_1
3288            version 300 es
3289            desc "Fragment struct has one less member than fragment version"
3290            expect link_fail
3291            values {output float out0 = 3.0;}
3292            vertex ""
3293                #version 300 es
3294                ${VERTEX_DECLARATIONS}
3295                struct Struct {mediump float a; mediump float b;};
3296                uniform Struct val;
3297                out mediump float res;
3298                void main()
3299                {
3300                    res = val.a;
3301                    ${VERTEX_OUTPUT}
3302                }
3303            ""
3304            fragment ""
3305                #version 300 es
3306                precision mediump float;
3307                struct Struct {mediump float a;};
3308                uniform Struct val;
3309                ${FRAGMENT_DECLARATIONS}
3310                in mediump float res;
3311                void main()
3312                {            out0 = res + val.a;
3313                    ${FRAGMENT_OUTPUT}
3314                }
3315            ""
3316        end
3317
3318        case type_conflict_2
3319            version 300 es
3320            desc "Vertex struct has int, fragment struct has float."
3321            expect link_fail
3322            values {output float out0 = 3.0;}
3323            vertex ""
3324                #version 300 es
3325                ${VERTEX_DECLARATIONS}
3326                struct Struct {mediump int a;};
3327                uniform Struct val;
3328                out mediump float res;
3329                void main()
3330                {
3331                    res = float(val.a);
3332                    ${VERTEX_OUTPUT}
3333                }
3334            ""
3335            fragment ""
3336                #version 300 es
3337                precision mediump float;
3338                struct Struct {mediump float a;};
3339                uniform Struct val;
3340                ${FRAGMENT_DECLARATIONS}
3341                in mediump float res;
3342                void main()
3343                {            out0 = val.a;
3344                    ${FRAGMENT_OUTPUT}
3345                }
3346            ""
3347        end
3348
3349        case type_conflict_3
3350            version 300 es
3351            desc "Vertex struct has vec3, fragment struct has vec4."
3352            expect link_fail
3353            values {output float out0 = 3.0;}
3354            vertex ""
3355                #version 300 es
3356                ${VERTEX_DECLARATIONS}
3357                struct Struct {mediump vec3 a;};
3358                uniform Struct val;
3359                out mediump float res;
3360                void main()
3361                {
3362                    res = float(val.a.x);
3363                    ${VERTEX_OUTPUT}
3364                }
3365            ""
3366            fragment ""
3367                #version 300 es
3368                precision mediump float;
3369                struct Struct {mediump vec4 a;};
3370                uniform Struct val;
3371                ${FRAGMENT_DECLARATIONS}
3372                in mediump float res;
3373                void main()
3374                {            out0 = val.a.x;
3375                    ${FRAGMENT_OUTPUT}
3376                }
3377            ""
3378        end
3379
3380        case precision_conflict_1
3381            version 300 es
3382            desc "Vertex side struct has highp, fragment side struct mediump."
3383            expect link_fail
3384            values {output float out0 = 3.0;}
3385            vertex ""
3386                #version 300 es
3387                ${VERTEX_DECLARATIONS}
3388                struct Struct {highp float a;};
3389                uniform Struct val;
3390                out mediump float res;
3391                void main()
3392                {
3393                    res = val.a;
3394                    ${VERTEX_OUTPUT}
3395                }
3396            ""
3397            fragment ""
3398                #version 300 es
3399                precision mediump float;
3400                struct Struct {mediump float a;};
3401                uniform Struct val;
3402                ${FRAGMENT_DECLARATIONS}
3403                in mediump float res;
3404                void main()
3405                {            out0 = val.a;
3406                    ${FRAGMENT_OUTPUT}
3407                }
3408            ""
3409        end
3410
3411        case precision_conflict_2
3412            version 300 es
3413            desc "Vertex side struct has mediump, fragment side struct lowp."
3414            expect link_fail
3415            values {output float out0 = 3.0;}
3416            vertex ""
3417                #version 300 es
3418                ${VERTEX_DECLARATIONS}
3419                struct Struct {mediump float a;};
3420                uniform Struct val;
3421                out mediump float res;
3422                void main()
3423                {
3424                    res = val.a;
3425                    ${VERTEX_OUTPUT}
3426                }
3427            ""
3428            fragment ""
3429                #version 300 es
3430                precision mediump float;
3431                struct Struct {lowp float a;};
3432                uniform Struct val;
3433                ${FRAGMENT_DECLARATIONS}
3434                in mediump float res;
3435                void main()
3436                {            out0 = val.a;
3437                    ${FRAGMENT_OUTPUT}
3438                }
3439            ""
3440        end
3441
3442        case precision_conflict_3
3443            version 300 es
3444            desc "Vertex side struct has lowp, fragment side struct mediump."
3445            expect link_fail
3446            values {output float out0 = 3.0;}
3447            vertex ""
3448                #version 300 es
3449                ${VERTEX_DECLARATIONS}
3450                struct Struct {lowp float a;};
3451                uniform Struct val;
3452                out mediump float res;
3453                void main()
3454                {
3455                    res = val.a;
3456                    ${VERTEX_OUTPUT}
3457                }
3458            ""
3459            fragment ""
3460                #version 300 es
3461                precision mediump float;
3462                struct Struct {mediump float a;};
3463                uniform Struct val;
3464                ${FRAGMENT_DECLARATIONS}
3465                in mediump float res;
3466                void main()
3467                {            out0 = val.a;
3468                    ${FRAGMENT_OUTPUT}
3469                }
3470            ""
3471        end
3472
3473        case precision_conflict_4
3474            version 300 es
3475            desc "Vertex side struct has lowp, fragment side struct implicit mediump."
3476            expect link_fail
3477            values {output float out0 = 3.0;}
3478            vertex ""
3479                #version 300 es
3480                ${VERTEX_DECLARATIONS}
3481                struct Struct {lowp float a;};
3482                uniform Struct val;
3483                out mediump float res;
3484                void main()
3485                {
3486                    res = val.a;
3487                    ${VERTEX_OUTPUT}
3488                }
3489            ""
3490            fragment ""
3491                #version 300 es
3492                precision mediump float;
3493                struct Struct {float a;};
3494                uniform Struct val;
3495                ${FRAGMENT_DECLARATIONS}
3496                in mediump float res;
3497                void main()
3498                {            out0 = val.a;
3499                    ${FRAGMENT_OUTPUT}
3500                }
3501            ""
3502        end
3503
3504        case light_struct_highp
3505            version 300 es
3506            desc "Complex Light struct from use case tests."
3507            values {
3508                uniform float val.constantAttenuation = 1.0;
3509                uniform float val.quadraticAttenuation = 1.0;
3510                output float out0 = 2.0;
3511            }
3512            vertex ""
3513                #version 300 es
3514                struct Light
3515                {
3516                    mediump vec3    color;
3517                    highp vec4        position;
3518                    highp vec3        direction;
3519                    mediump float    constantAttenuation;
3520                    mediump float    linearAttenuation;
3521                    mediump float    quadraticAttenuation;
3522                };
3523                ${VERTEX_DECLARATIONS}
3524                uniform Light val;
3525                out mediump float res;
3526                void main()
3527                {
3528                    res = val.constantAttenuation;
3529                    ${VERTEX_OUTPUT}
3530                }
3531            ""
3532            fragment ""
3533                #version 300 es
3534                precision mediump float;
3535                struct Light
3536                {
3537                    mediump vec3    color;
3538                    highp vec4        position;
3539                    highp vec3        direction;
3540                    mediump float    constantAttenuation;
3541                    mediump float    linearAttenuation;
3542                    mediump float    quadraticAttenuation;
3543                };
3544                struct Struct {float a;};
3545                uniform Light val;
3546                ${FRAGMENT_DECLARATIONS}
3547                in mediump float res;
3548                void main()
3549                {
3550                    out0 = res + val.quadraticAttenuation;
3551                    ${FRAGMENT_OUTPUT}
3552                }
3553            ""
3554        end
3555
3556        case light_struct_mediump
3557            version 300 es
3558            desc "Complex Light struct from use case tests, without highp usage"
3559            values {
3560                uniform float val.constantAttenuation = 1.0;
3561                uniform float val.quadraticAttenuation = 1.0;
3562                output float out0 = 2.0;
3563            }
3564            vertex ""
3565                #version 300 es
3566                struct Light
3567                {
3568                    mediump vec3    color;
3569                    mediump vec4    position;
3570                    mediump vec3    direction;
3571                    mediump float    constantAttenuation;
3572                    mediump float    linearAttenuation;
3573                    mediump float    quadraticAttenuation;
3574                };
3575                ${VERTEX_DECLARATIONS}
3576                uniform Light val;
3577                out mediump float res;
3578                void main()
3579                {
3580                    res = val.constantAttenuation;
3581                    ${VERTEX_OUTPUT}
3582                }
3583            ""
3584            fragment ""
3585                #version 300 es
3586                precision mediump float;
3587                struct Light
3588                {
3589                    mediump vec3    color;
3590                    mediump vec4    position;
3591                    mediump vec3    direction;
3592                    mediump float    constantAttenuation;
3593                    mediump float    linearAttenuation;
3594                    mediump float    quadraticAttenuation;
3595                };
3596                struct Struct {float a;};
3597                uniform Light val;
3598                ${FRAGMENT_DECLARATIONS}
3599                in mediump float res;
3600                void main()
3601                {
3602                    out0 = res + val.quadraticAttenuation;
3603                    ${FRAGMENT_OUTPUT}
3604                }
3605            ""
3606        end
3607    end
3608
3609    group block "Uniform blocks"
3610        case type_mismatch
3611            version 300 es
3612            expect link_fail
3613            vertex ""
3614                #version 300 es
3615
3616                uniform Block
3617                {
3618                    highp vec4 val;
3619                };
3620
3621                ${VERTEX_DECLARATIONS}
3622                out mediump float res;
3623                void main()
3624                {
3625                    res = val.x;
3626                    ${VERTEX_OUTPUT}
3627                }
3628            ""
3629            fragment ""
3630                #version 300 es
3631
3632                uniform Block
3633                {
3634                    highp vec3 val;
3635                };
3636
3637                precision mediump float;
3638                ${FRAGMENT_DECLARATIONS}
3639                in mediump float res;
3640                void main()
3641                {
3642                    dEQP_FragColor = vec4(val, 1.0);
3643                }
3644            ""
3645        end
3646
3647        case members_mismatch
3648            version 300 es
3649            expect link_fail
3650            vertex ""
3651                #version 300 es
3652
3653                uniform Block
3654                {
3655                    highp vec4 val;
3656                };
3657
3658                ${VERTEX_DECLARATIONS}
3659                out mediump float res;
3660                void main()
3661                {
3662                    res = val.x;
3663                    ${VERTEX_OUTPUT}
3664                }
3665            ""
3666            fragment ""
3667                #version 300 es
3668
3669                uniform Block
3670                {
3671                    highp vec4 val;
3672                    lowp uint u;
3673                };
3674
3675                precision mediump float;
3676                ${FRAGMENT_DECLARATIONS}
3677                in mediump float res;
3678                void main()
3679                {
3680                    dEQP_FragColor = vec4(val);
3681                }
3682            ""
3683        end
3684
3685        case layout_qualifier_mismatch_1
3686            version 300 es
3687            expect link_fail
3688            vertex ""
3689                #version 300 es
3690
3691                layout(std140) uniform Block
3692                {
3693                    highp vec4 val;
3694                };
3695
3696                ${VERTEX_DECLARATIONS}
3697                out mediump float res;
3698                void main()
3699                {
3700                    res = val.x;
3701                    ${VERTEX_OUTPUT}
3702                }
3703            ""
3704            fragment ""
3705                #version 300 es
3706
3707                uniform Block
3708                {
3709                    highp vec4 val;
3710                };
3711
3712                precision mediump float;
3713                ${FRAGMENT_DECLARATIONS}
3714                in mediump float res;
3715                void main()
3716                {
3717                    dEQP_FragColor = vec4(val);
3718                }
3719            ""
3720        end
3721
3722        case layout_qualifier_mismatch_2
3723            version 300 es
3724            expect link_fail
3725            vertex ""
3726                #version 300 es
3727
3728                layout(shared) uniform Block
3729                {
3730                    highp vec4 val;
3731                };
3732
3733                ${VERTEX_DECLARATIONS}
3734                out mediump float res;
3735                void main()
3736                {
3737                    res = val.x;
3738                    ${VERTEX_OUTPUT}
3739                }
3740            ""
3741            fragment ""
3742                #version 300 es
3743
3744                layout(packed) uniform Block
3745                {
3746                    highp vec4 val;
3747                };
3748
3749                precision mediump float;
3750                ${FRAGMENT_DECLARATIONS}
3751                in mediump float res;
3752                void main()
3753                {
3754                    dEQP_FragColor = vec4(val);
3755                }
3756            ""
3757        end
3758
3759        case layout_qualifier_mismatch_3
3760            version 300 es
3761            expect link_fail
3762            vertex ""
3763                #version 300 es
3764
3765                layout(row_major) uniform Block
3766                {
3767                    highp vec4 val;
3768                };
3769
3770                ${VERTEX_DECLARATIONS}
3771                out mediump float res;
3772                void main()
3773                {
3774                    res = val.x;
3775                    ${VERTEX_OUTPUT}
3776                }
3777            ""
3778            fragment ""
3779                #version 300 es
3780
3781                layout(column_major) uniform Block
3782                {
3783                    highp vec4 val;
3784                };
3785
3786                precision mediump float;
3787                ${FRAGMENT_DECLARATIONS}
3788                in mediump float res;
3789                void main()
3790                {
3791                    dEQP_FragColor = vec4(val);
3792                }
3793            ""
3794        end
3795
3796        case layout_qualifier_mismatch_4
3797            version 300 es
3798            expect link_fail
3799            vertex ""
3800                #version 300 es
3801
3802                layout(row_major) uniform Block
3803                {
3804                    highp mat3 val;
3805                };
3806
3807                ${VERTEX_DECLARATIONS}
3808                out mediump float res;
3809                void main()
3810                {
3811                    res = val[0][1];
3812                    ${VERTEX_OUTPUT}
3813                }
3814            ""
3815            fragment ""
3816                #version 300 es
3817
3818                layout(column_major) uniform Block
3819                {
3820                    highp mat3 val;
3821                };
3822
3823                precision mediump float;
3824                ${FRAGMENT_DECLARATIONS}
3825                in mediump float res;
3826                void main()
3827                {
3828                    dEQP_FragColor = vec4(val[2], 1.0);
3829                }
3830            ""
3831        end
3832
3833        case layout_qualifier_mismatch_5
3834            version 300 es
3835            expect link_fail
3836            vertex ""
3837                #version 300 es
3838
3839                uniform Block
3840                {
3841                    layout(row_major) uniform highp mat3 val;
3842                };
3843
3844                ${VERTEX_DECLARATIONS}
3845                out mediump float res;
3846                void main()
3847                {
3848                    res = val[0][1];
3849                    ${VERTEX_OUTPUT}
3850                }
3851            ""
3852            fragment ""
3853                #version 300 es
3854
3855                uniform Block
3856                {
3857                    layout(column_major) uniform highp mat3 val;
3858                };
3859
3860                precision mediump float;
3861                ${FRAGMENT_DECLARATIONS}
3862                in mediump float res;
3863                void main()
3864                {
3865                    dEQP_FragColor = vec4(val[2], 1.0);
3866                }
3867            ""
3868        end
3869    end
3870end
3871