3 group varying "Varying linkage"
6 group rules "Varying linking rules"
7 # not declared in vertex shader, declared in fragment shader
10 desc "varying declared in fragment shader, no reference in vertex shader"
11 values { output float out0 = 1.0; }
14 ${VERTEX_DECLARATIONS}
22 precision mediump float;
24 ${FRAGMENT_DECLARATIONS}
33 # declared in vertex shader, no reference in frag shader
36 desc "varying declared in vertex shader, no reference in fragment shader"
39 ${VERTEX_DECLARATIONS}
40 out mediump float var;
48 ${FRAGMENT_DECLARATIONS}
51 ${FRAG_COLOR} = vec4(1.0);
56 # declared in vertex shader, declared in frag shader
59 desc "varying declared in both vertex and fragment shader, but not used"
62 ${VERTEX_DECLARATIONS}
63 out mediump float var;
72 ${FRAGMENT_DECLARATIONS}
75 ${FRAG_COLOR} = vec4(1.0);
80 # declared in vertex shader, static use in frag shader
81 case vertex_declare_fragment_use
83 desc "varying declared in both shaders, statically used in fragment shader"
84 values { uniform bool u_false = false; }
87 ${VERTEX_DECLARATIONS}
88 out mediump float var;
97 ${FRAGMENT_DECLARATIONS}
101 ${FRAG_COLOR} = vec4(var);
103 ${FRAG_COLOR} = vec4(1.0);
108 # static use in vertex shader, no reference in fragment shader
109 case vertex_use_fragment_declare
111 desc "varying declared and statically used in vertex shader, no reference in fragment shader"
112 values { uniform bool u_false = false; }
115 ${VERTEX_DECLARATIONS}
116 out mediump float var;
126 ${FRAGMENT_DECLARATIONS}
129 ${FRAG_COLOR} = vec4(1.0);
134 # static use in vertex shader, declared in fragment shader
135 case vertex_use_declare_fragment
137 desc "varying declared and statically used in vertex shader, only declared in fragment shader"
138 values { uniform bool u_false = false; }
141 ${VERTEX_DECLARATIONS}
142 out mediump float var;
152 in mediump float var;
153 ${FRAGMENT_DECLARATIONS}
156 ${FRAG_COLOR} = vec4(1.0);
161 # static use in vertex shader, used in fragment shader
162 case vertex_use_fragment_use
164 desc "varying statically used in both vertex and fragment shader"
165 values { uniform bool u_false = false; }
168 ${VERTEX_DECLARATIONS}
169 out mediump float var;
179 ${FRAGMENT_DECLARATIONS}
180 in mediump float var;
184 ${FRAG_COLOR} = vec4(var);
186 ${FRAG_COLOR} = vec4(1.0);
191 # differing precision tests
192 case differing_precision_1
194 desc "varying declared as highp in vertex shader, but mediump in fragment shader"
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 ];
203 ${VERTEX_DECLARATIONS}
213 precision mediump float;
214 ${FRAGMENT_DECLARATIONS}
215 in mediump float var;
224 # differing precision tests
225 case differing_precision_2
227 desc "varying declared as highp in vertex shader, but lowp in fragment shader"
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 ];
236 ${VERTEX_DECLARATIONS}
240 var = vec2(in0, 2.0*in0);
246 precision mediump float;
247 ${FRAGMENT_DECLARATIONS}
251 out0 = var.y - var.x;
257 # differing precision tests
258 case differing_precision_3
260 desc "varying declared as lowp in vertex shader, but mediump in fragment shader"
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 ];
269 ${VERTEX_DECLARATIONS}
273 var = vec4(in0, 2.0*in0, -in0, -in0);
279 precision mediump float;
280 ${FRAGMENT_DECLARATIONS}
284 out0 = var.x + var.y + var.z + var.w;
290 # mismatched type, static use but no runtime use in the fragment shader
293 desc "varying type mismatch (float vs. vec2), static use but no runtime use in the fragment shader"
297 ${VERTEX_DECLARATIONS}
298 out mediump float var;
307 ${FRAGMENT_DECLARATIONS}
313 ${FRAG_COLOR} = vec4(var.y);
317 ${FRAG_COLOR} = vec4(1.0);
323 # mismatched type, varyings used
326 desc "varying type mismatch (float vs. vec2)"
330 ${VERTEX_DECLARATIONS}
331 out mediump float var;
340 ${FRAGMENT_DECLARATIONS}
344 ${FRAG_COLOR} = var.xyyx;
349 # mismatched type, varyings used
352 desc "varying type mismatch (int vs. uint)"
356 ${VERTEX_DECLARATIONS}
357 flat out mediump int var;
366 ${FRAGMENT_DECLARATIONS}
367 flat in mediump uint var;
370 ${FRAG_COLOR} = vec4(var);
375 # mismatched type, varyings used
376 case struct_type_mismatch_1
378 desc "struct member mismatch"
382 ${VERTEX_DECLARATIONS}
383 struct S { highp float a; highp vec2 b; };
388 var.b = vec2(1.0, 0.0);
394 ${FRAGMENT_DECLARATIONS}
395 struct S { highp float a; highp vec3 b; };
399 ${FRAG_COLOR} = vec4(var.a, var.b);
404 # mismatched type, varyings unused in fragment shader (runtime)
405 case struct_type_mismatch_2
407 desc "struct member mismatch"
411 ${VERTEX_DECLARATIONS}
412 struct S { highp float a; highp vec2 b; };
417 var.b = vec2(1.0, 0.0);
423 ${FRAGMENT_DECLARATIONS}
424 struct S { highp float a; highp vec3 b; };
428 ${FRAG_COLOR} = vec4(var.a);
430 ${FRAG_COLOR}.yzw = var.b;
435 # mismatched type, varyings unused in both (runtime)
436 case struct_type_mismatch_3
438 desc "struct member mismatch"
442 ${VERTEX_DECLARATIONS}
443 struct S { highp float a; highp vec2 b; };
449 var.b = vec2(1.0, 0.0);
455 ${FRAGMENT_DECLARATIONS}
456 struct S { highp float a; highp vec3 b; };
460 ${FRAG_COLOR} = vec4(var.a);
462 ${FRAG_COLOR}.yzw = var.b;
467 # interpolation_mismatch
468 case interpolation_mismatch_1
470 desc "varying interpolation different (flat vs. smooth)"
475 ${VERTEX_DECLARATIONS}
477 flat out mediump float var;
486 precision mediump float;
487 ${FRAGMENT_DECLARATIONS}
488 in mediump float var;
491 ${FRAG_COLOR} = vec4(var);
496 # different interpolation
497 case differing_interpolation_2
499 desc "varying interpolation different (smooth vs. centroid)"
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 ];
508 ${VERTEX_DECLARATIONS}
509 smooth out mediump float var;
518 precision mediump float;
519 ${FRAGMENT_DECLARATIONS}
520 centroid in mediump float var;
529 # no declaration in vertex shader, but static use in fragment
532 desc "varying not declared in vertex shader, but statically used in fragment shader"
536 ${VERTEX_DECLARATIONS}
544 ${FRAGMENT_DECLARATIONS}
545 in mediump float var;
548 ${FRAG_COLOR} = vec4(var);
553 # non-flat integer varyings not allowed
554 case invalid_type_int
556 desc "integer varying used"
560 ${VERTEX_DECLARATIONS}
569 ${FRAGMENT_DECLARATIONS}
573 ${FRAG_COLOR} = vec4(1.0);
578 # non-flat integer varyings not allowed
579 case invalid_type_uint
581 desc "integer varying used"
585 ${VERTEX_DECLARATIONS}
586 out mediump uint var;
594 ${FRAGMENT_DECLARATIONS}
598 ${FRAG_COLOR} = vec4(1.0);
603 # bool varyings not allowed
604 case invalid_type_bool
606 desc "boolean varying used"
610 ${VERTEX_DECLARATIONS}
619 ${FRAGMENT_DECLARATIONS}
623 ${FRAG_COLOR} = vec4(1.0);
628 case invalid_type_struct_array
630 desc "float array inside struct"
634 ${VERTEX_DECLARATIONS}
635 struct S { mediump float a[3]; };
647 precision mediump float;
648 ${FRAGMENT_DECLARATIONS}
649 struct S { mediump float a[3]; };
653 ${FRAG_COLOR} = vec4(1.0);
658 case invalid_type_struct_struct
660 desc "struct inside struct"
664 ${VERTEX_DECLARATIONS}
665 struct S { mediump float a; };
676 precision mediump float;
677 ${FRAGMENT_DECLARATIONS}
678 struct S { mediump float a; };
683 ${FRAG_COLOR} = vec4(1.0);
688 case invalid_type_array_struct
690 desc "array of structs"
694 ${VERTEX_DECLARATIONS}
695 struct S { mediump int a; };
707 ${FRAGMENT_DECLARATIONS}
708 struct S { mediump int a; };
712 ${FRAG_COLOR} = vec4(1.0);
717 case invalid_type_array_array
719 desc "array of arrays"
723 ${VERTEX_DECLARATIONS}
724 out mediump float var[2][2];
734 ${FRAGMENT_DECLARATIONS}
735 in mediump float var[2][2];
738 ${FRAG_COLOR} = vec4(1.0);
744 group basic_types "Basic varying types"
747 desc "varying of type float"
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 ];
755 ${VERTEX_DECLARATIONS}
756 out mediump float var;
765 precision mediump float;
766 ${FRAGMENT_DECLARATIONS}
778 desc "varying of type vec2"
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) ];
786 ${VERTEX_DECLARATIONS}
787 out mediump vec2 var;
796 precision mediump float;
797 ${FRAGMENT_DECLARATIONS}
809 desc "varying of type vec3"
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) ];
817 ${VERTEX_DECLARATIONS}
818 out mediump vec3 var;
827 precision mediump float;
828 ${FRAGMENT_DECLARATIONS}
840 desc "varying of type vec4"
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) ];
848 ${VERTEX_DECLARATIONS}
849 out mediump vec4 var;
858 precision mediump float;
859 ${FRAGMENT_DECLARATIONS}
871 desc "varying of type mat2"
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) ];
879 ${VERTEX_DECLARATIONS}
880 out mediump mat2 var;
889 precision mediump float;
890 ${FRAGMENT_DECLARATIONS}
902 desc "varying of type mat2x3"
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) ];
910 ${VERTEX_DECLARATIONS}
911 out mediump mat2x3 var;
920 precision mediump float;
921 ${FRAGMENT_DECLARATIONS}
933 desc "varying of type mat2x4"
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) ];
941 ${VERTEX_DECLARATIONS}
942 out mediump mat2x4 var;
951 precision mediump float;
952 ${FRAGMENT_DECLARATIONS}
964 desc "varying of type mat3x2"
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) ];
972 ${VERTEX_DECLARATIONS}
973 out mediump mat3x2 var;
982 precision mediump float;
983 ${FRAGMENT_DECLARATIONS}
995 desc "varying of type mat3"
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) ];
1003 ${VERTEX_DECLARATIONS}
1004 out mediump mat3 var;
1013 precision mediump float;
1014 ${FRAGMENT_DECLARATIONS}
1026 desc "varying of type mat3x4"
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) ];
1034 ${VERTEX_DECLARATIONS}
1035 out mediump mat3x4 var;
1044 precision mediump float;
1045 ${FRAGMENT_DECLARATIONS}
1057 desc "varying of type mat4x2"
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) ];
1065 ${VERTEX_DECLARATIONS}
1066 out mediump mat4x2 var;
1075 precision mediump float;
1076 ${FRAGMENT_DECLARATIONS}
1088 desc "varying of type mat4x3"
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) ];
1096 ${VERTEX_DECLARATIONS}
1097 out mediump mat4x3 var;
1106 precision mediump float;
1107 ${FRAGMENT_DECLARATIONS}
1119 desc "varying of type mat4"
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) ];
1127 ${VERTEX_DECLARATIONS}
1128 out mediump mat4 var;
1137 precision mediump float;
1138 ${FRAGMENT_DECLARATIONS}
1150 desc "varying of type int"
1153 input int in0 = [ -1 | -25 | 1 | 2 | 3 | 16 ];
1154 output int out0 = [ -1 | -25 | 1 | 2 | 3 | 16 ];
1158 ${VERTEX_DECLARATIONS}
1159 flat out mediump int var;
1169 ${FRAGMENT_DECLARATIONS}
1181 desc "varying of type ivec2"
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) ];
1189 ${VERTEX_DECLARATIONS}
1190 flat out mediump ivec2 var;
1200 ${FRAGMENT_DECLARATIONS}
1212 desc "varying of type ivec3"
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) ];
1220 ${VERTEX_DECLARATIONS}
1221 flat out mediump ivec3 var;
1231 ${FRAGMENT_DECLARATIONS}
1243 desc "varying of type ivec4"
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) ];
1251 ${VERTEX_DECLARATIONS}
1252 flat out mediump ivec4 var;
1262 ${FRAGMENT_DECLARATIONS}
1274 desc "varying of type int"
1277 input uint in0 = [ 1 | 2 | 3 | 16 ];
1278 output uint out0 = [ 1 | 2 | 3 | 16 ];
1282 ${VERTEX_DECLARATIONS}
1283 flat out mediump uint var;
1293 ${FRAGMENT_DECLARATIONS}
1305 desc "varying of type uvec2"
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) ];
1313 ${VERTEX_DECLARATIONS}
1314 flat out mediump uvec2 var;
1324 ${FRAGMENT_DECLARATIONS}
1336 desc "varying of type uvec3"
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) ];
1344 ${VERTEX_DECLARATIONS}
1345 flat out mediump uvec3 var;
1355 ${FRAGMENT_DECLARATIONS}
1367 desc "varying of type uvec4"
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) ];
1375 ${VERTEX_DECLARATIONS}
1376 flat out mediump uvec4 var;
1386 ${FRAGMENT_DECLARATIONS}
1397 group struct "Structure varyings"
1400 desc "varying of type float inside struct"
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 ];
1408 ${VERTEX_DECLARATIONS}
1409 struct S { mediump float a; };
1419 precision mediump float;
1420 ${FRAGMENT_DECLARATIONS}
1421 struct S { mediump float a; };
1433 desc "varying of type vec2 inside struct"
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) ];
1441 ${VERTEX_DECLARATIONS}
1442 struct S { mediump vec2 a; };
1452 precision mediump float;
1453 ${FRAGMENT_DECLARATIONS}
1454 struct S { mediump vec2 a; };
1466 desc "varying of type vec3 inside struct"
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) ];
1474 ${VERTEX_DECLARATIONS}
1475 struct S { mediump vec3 a; };
1485 precision mediump float;
1486 ${FRAGMENT_DECLARATIONS}
1487 struct S { mediump vec3 a; };
1499 desc "varying of type vec4 inside struct"
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) ];
1507 ${VERTEX_DECLARATIONS}
1508 struct S { mediump vec4 a; };
1518 precision mediump float;
1519 ${FRAGMENT_DECLARATIONS}
1520 struct S { mediump vec4 a; };
1532 desc "varying of type mat2 inside struct"
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) ];
1540 ${VERTEX_DECLARATIONS}
1541 struct S { mediump mat2 a; };
1551 precision mediump float;
1552 ${FRAGMENT_DECLARATIONS}
1553 struct S { mediump mat2 a; };
1565 desc "varying of type mat2x3 inside struct"
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) ];
1573 ${VERTEX_DECLARATIONS}
1574 struct S { mediump mat2x3 a; };
1584 precision mediump float;
1585 ${FRAGMENT_DECLARATIONS}
1586 struct S { mediump mat2x3 a; };
1598 desc "varying of type mat2x4 inside struct"
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) ];
1606 ${VERTEX_DECLARATIONS}
1607 struct S { mediump mat2x4 a; };
1617 precision mediump float;
1618 ${FRAGMENT_DECLARATIONS}
1619 struct S { mediump mat2x4 a; };
1631 desc "varying of type mat3x2 inside struct"
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) ];
1639 ${VERTEX_DECLARATIONS}
1640 struct S { mediump mat3x2 a; };
1650 precision mediump float;
1651 ${FRAGMENT_DECLARATIONS}
1652 struct S { mediump mat3x2 a; };
1664 desc "varying of type mat3 inside struct"
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) ];
1672 ${VERTEX_DECLARATIONS}
1673 struct S { mediump mat3 a; };
1683 precision mediump float;
1684 ${FRAGMENT_DECLARATIONS}
1685 struct S { mediump mat3 a; };
1697 desc "varying of type mat3x4 inside struct"
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) ];
1705 ${VERTEX_DECLARATIONS}
1706 struct S { mediump mat3x4 a; };
1716 precision mediump float;
1717 ${FRAGMENT_DECLARATIONS}
1718 struct S { mediump mat3x4 a; };
1730 desc "varying of type mat4x2 inside struct"
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) ];
1738 ${VERTEX_DECLARATIONS}
1739 struct S { mediump mat4x2 a; };
1749 precision mediump float;
1750 ${FRAGMENT_DECLARATIONS}
1751 struct S { mediump mat4x2 a; };
1763 desc "varying of type mat4x3 inside struct"
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) ];
1771 ${VERTEX_DECLARATIONS}
1772 struct S { mediump mat4x3 a; };
1782 precision mediump float;
1783 ${FRAGMENT_DECLARATIONS}
1784 struct S { mediump mat4x3 a; };
1796 desc "varying of type mat4 inside struct"
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) ];
1804 ${VERTEX_DECLARATIONS}
1805 struct S { mediump mat4 a; };
1815 precision mediump float;
1816 ${FRAGMENT_DECLARATIONS}
1817 struct S { mediump mat4 a; };
1829 desc "varying of type int inside struct"
1832 input int in0 = [ -1 | -25 | 1 | 2 | 3 | 16 ];
1833 output int out0 = [ -1 | -25 | 1 | 2 | 3 | 16 ];
1837 ${VERTEX_DECLARATIONS}
1838 struct S { mediump int a; };
1849 ${FRAGMENT_DECLARATIONS}
1850 struct S { mediump int a; };
1862 desc "varying of type ivec2 inside struct"
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) ];
1870 ${VERTEX_DECLARATIONS}
1871 struct S { mediump ivec2 a; };
1882 ${FRAGMENT_DECLARATIONS}
1883 struct S { mediump ivec2 a; };
1895 desc "varying of type ivec3 inside struct"
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) ];
1903 ${VERTEX_DECLARATIONS}
1904 struct S { mediump ivec3 a; };
1915 ${FRAGMENT_DECLARATIONS}
1916 struct S { mediump ivec3 a; };
1928 desc "varying of type ivec4 inside struct"
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) ];
1936 ${VERTEX_DECLARATIONS}
1937 struct S { mediump ivec4 a; };
1948 ${FRAGMENT_DECLARATIONS}
1949 struct S { mediump ivec4 a; };
1961 desc "varying of type uint in struct"
1964 input uint in0 = [ 1 | 2 | 3 | 16 ];
1965 output uint out0 = [ 1 | 2 | 3 | 16 ];
1969 ${VERTEX_DECLARATIONS}
1970 struct S { mediump uint a; };
1981 ${FRAGMENT_DECLARATIONS}
1982 struct S { mediump uint a; };
1994 desc "varying of type uvec2 inside struct"
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) ];
2002 ${VERTEX_DECLARATIONS}
2003 struct S { mediump uvec2 a; };
2014 ${FRAGMENT_DECLARATIONS}
2015 struct S { mediump uvec2 a; };
2027 desc "varying of type uvec3 inside struct"
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) ];
2035 ${VERTEX_DECLARATIONS}
2036 struct S { mediump uvec3 a; };
2047 ${FRAGMENT_DECLARATIONS}
2048 struct S { mediump uvec3 a; };
2060 desc "varying of type uvec4 inside struct"
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) ];
2068 ${VERTEX_DECLARATIONS}
2069 struct S { mediump uvec4 a; };
2080 ${FRAGMENT_DECLARATIONS}
2081 struct S { mediump uvec4 a; };
2093 desc "varyings of type float and vec3 inside struct"
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) ];
2103 ${VERTEX_DECLARATIONS}
2104 struct S { mediump float a; highp vec3 b; };
2115 precision mediump float;
2116 ${FRAGMENT_DECLARATIONS}
2117 struct S { mediump float a; highp vec3 b; };
2128 case float_uvec2_vec3
2130 desc "varyings of type float and vec3 inside struct"
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) ];
2142 ${VERTEX_DECLARATIONS}
2143 struct S { mediump float a; highp uvec2 b; highp vec3 c; };
2156 precision mediump float;
2157 ${FRAGMENT_DECLARATIONS}
2158 struct S { mediump float a; highp uvec2 b; highp vec3 c; };
2171 group interpolation "Varying interpolation modes"
2174 desc "varying of type vec4"
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) ];
2182 ${VERTEX_DECLARATIONS}
2183 smooth out mediump vec4 var;
2192 precision mediump float;
2193 ${FRAGMENT_DECLARATIONS}
2205 desc "varying of type vec4"
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) ];
2213 ${VERTEX_DECLARATIONS}
2214 centroid out mediump vec4 var;
2223 precision mediump float;
2224 ${FRAGMENT_DECLARATIONS}
2225 centroid in vec4 var;
2236 desc "varying of type vec4"
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) ];
2244 ${VERTEX_DECLARATIONS}
2245 flat out mediump vec4 var;
2254 precision mediump float;
2255 ${FRAGMENT_DECLARATIONS}
2266 group usage "Varying usage in shaders"
2269 desc "read back (an already written) varying in the vertex shader"
2272 input float in0 = [ 1.0 | 0.0 | -2.0 | 10.0 ];
2273 output float out0 = [ 3.0 | 0.0 | -6.0 | 30.0 ];
2277 precision mediump float;
2278 ${VERTEX_DECLARATIONS}
2291 precision mediump float;
2292 ${FRAGMENT_DECLARATIONS}
2306 desc "write back a varying in the fragment shader"
2309 input float in0 = [ 1.0 | 0.0 | -2.0 | 10.0 ];
2314 precision mediump float;
2315 ${VERTEX_DECLARATIONS}
2328 precision mediump float;
2329 ${FRAGMENT_DECLARATIONS}
2344 group uniform "Uniform linkage"
2345 group basic "Default block uniforms of scalar and vector types"
2346 case precision_conflict_1
2348 desc "Vertex side uniform has highp, fragment side uniform mediump."
2350 values {output float out0 = 3.0;}
2353 ${VERTEX_DECLARATIONS}
2354 uniform highp float u_val;
2355 out mediump float res;
2364 precision mediump float;
2365 uniform float u_val;
2366 ${FRAGMENT_DECLARATIONS}
2367 in mediump float res;
2375 case precision_conflict_2
2377 desc "Vertex side uniform has highp, fragment side uniform mediump."
2379 values {output float out0 = 3.0;}
2382 ${VERTEX_DECLARATIONS}
2383 uniform highp float u_val;
2384 out mediump float res;
2393 precision highp float;
2394 uniform mediump float u_val;
2395 ${FRAGMENT_DECLARATIONS}
2396 in mediump float res;
2404 case precision_conflict_3
2406 desc "Vertex side uniform has lowp, fragment side uniform highp."
2408 values {output float out0 = 3.0;}
2411 ${VERTEX_DECLARATIONS}
2412 uniform lowp int u_val;
2413 out mediump float res;
2422 precision highp float;
2423 uniform highp int u_val;
2424 ${FRAGMENT_DECLARATIONS}
2425 in mediump float res;
2428 out0 = float(u_val) + res;
2433 case precision_conflict_4
2435 desc "Vertex side uniform has lowp, fragment side uniform mediump."
2437 values {output float out0 = 3.0;}
2440 ${VERTEX_DECLARATIONS}
2441 uniform lowp vec3 u_val;
2442 out mediump float res;
2451 precision highp float;
2452 uniform mediump vec3 u_val;
2453 ${FRAGMENT_DECLARATIONS}
2454 in mediump float res;
2457 out0 = u_val.z + res;
2464 group struct "Uniform structs"
2465 # Struct linkage handling
2468 desc "Same uniform struct in both shaders"
2470 uniform float val.a = 1.0;
2471 uniform float val.b = 2.0;
2472 output float out0 = 3.0;
2476 ${VERTEX_DECLARATIONS}
2477 struct Struct {mediump float a; mediump float b;};
2479 out mediump float dummy;
2482 dummy = val.a + val.b;
2488 precision mediump float;
2489 struct Struct {mediump float a; mediump float b;};
2491 in mediump float dummy;
2492 ${FRAGMENT_DECLARATIONS}
2495 out0 = val.b + val.a;
2496 out0 = out0 + dummy;
2497 out0 = out0 - dummy;
2505 desc "Uniform struct declared in both, used only in vertex."
2507 uniform float val.a = 1.0;
2508 uniform float val.b = 2.0;
2509 output float out0 = 3.0;
2513 ${VERTEX_DECLARATIONS}
2514 struct Struct {mediump float a; mediump float b;};
2516 out mediump float res;
2519 res = val.a + val.b;
2525 precision mediump float;
2526 struct Struct {mediump float a; mediump float b;};
2528 in mediump float res;
2529 ${FRAGMENT_DECLARATIONS}
2540 desc "Uniform struct declared in both, used only in fragment."
2542 uniform float val.a = 1.0;
2543 uniform float val.b = 2.0;
2544 output float out0 = 3.0;
2548 ${VERTEX_DECLARATIONS}
2549 struct Struct {mediump float a; mediump float b;};
2558 precision mediump float;
2559 struct Struct {mediump float a; mediump float b;};
2561 ${FRAGMENT_DECLARATIONS}
2564 out0 = val.a + val.b;
2572 desc "Uniform struct declared in both, used partially in both."
2574 uniform float val.a = 1.0;
2575 uniform float val.b = 2.0;
2576 output float out0 = 3.0;
2580 ${VERTEX_DECLARATIONS}
2581 struct Struct {mediump float a; mediump float b;};
2583 out mediump float res;
2592 precision mediump float;
2593 struct Struct {mediump float a; mediump float b;};
2595 ${FRAGMENT_DECLARATIONS}
2596 in mediump float res;
2607 desc "Same uniform struct in both shaders. Datatype vec4"
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;
2615 ${VERTEX_DECLARATIONS}
2616 struct Struct {mediump vec4 a; mediump vec4 b;};
2618 out mediump float dummy;
2621 dummy = val.a.x + val.b.y;
2627 precision mediump float;
2628 struct Struct {mediump vec4 a; mediump vec4 b;};
2630 in mediump float dummy;
2631 ${FRAGMENT_DECLARATIONS}
2634 out0 = val.b.y + val.a.x;
2635 out0 = out0 + dummy;
2636 out0 = out0 - dummy;
2642 case vertex_only_vec4
2644 desc "Uniform struct declared in both, used only in vertex. Datatype vec4 "
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;
2652 ${VERTEX_DECLARATIONS}
2653 struct Struct {mediump vec4 a; mediump vec4 b;};
2655 out mediump float res;
2658 res = val.a.x + val.b.y;
2664 precision mediump float;
2665 struct Struct {mediump vec4 a; mediump vec4 b;};
2667 in mediump float res;
2668 ${FRAGMENT_DECLARATIONS}
2676 case fragment_only_vec4
2678 desc "Uniform struct declared in both, used only in fragment. Datatype vec4"
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;
2686 ${VERTEX_DECLARATIONS}
2687 struct Struct {mediump vec4 a; mediump vec4 b;};
2696 precision mediump float;
2697 struct Struct {mediump vec4 a; mediump vec4 b;};
2699 ${FRAGMENT_DECLARATIONS}
2701 { out0 = val.a.x + val.b.y;
2709 desc "Uniform struct declared in both, used partially in both. Datatype vec4"
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;
2717 ${VERTEX_DECLARATIONS}
2718 struct Struct {mediump vec4 a; mediump vec4 b;};
2720 out mediump float res;
2729 precision mediump float;
2730 struct Struct {mediump vec4 a; mediump vec4 b;};
2732 ${FRAGMENT_DECLARATIONS}
2733 in mediump float res;
2735 { out0 = res + val.b.y;
2743 desc "Same uniform struct in both shaders. Datatype vec4 and vec3"
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;
2751 ${VERTEX_DECLARATIONS}
2752 struct Struct {mediump vec4 a; mediump vec3 b;};
2754 out mediump float dummy;
2757 dummy = val.a.x + val.b.y;
2763 precision mediump float;
2764 struct Struct {mediump vec4 a; mediump vec3 b;};
2766 in mediump float dummy;
2767 ${FRAGMENT_DECLARATIONS}
2769 { out0 = val.b.y + val.a.x;
2770 out0 = out0 + dummy;
2771 out0 = out0 - dummy;
2777 case vertex_only_vec4_vec3
2779 desc "Uniform struct declared in both, used only in vertex. Datatype vec4 and vec3"
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;
2787 ${VERTEX_DECLARATIONS}
2788 struct Struct {mediump vec4 a; mediump vec3 b;};
2790 out mediump float res;
2793 res = val.a.x + val.b.y;
2799 precision mediump float;
2800 struct Struct {mediump vec4 a; mediump vec3 b;};
2802 in mediump float res;
2803 ${FRAGMENT_DECLARATIONS}
2811 case fragment_only_vec4_vec3
2813 desc "Uniform struct declared in both, used only in fragment. Datatype vec4 and vec3"
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;
2821 ${VERTEX_DECLARATIONS}
2822 struct Struct {mediump vec4 a; mediump vec3 b;};
2831 precision mediump float;
2832 struct Struct {mediump vec4 a; mediump vec3 b;};
2834 ${FRAGMENT_DECLARATIONS}
2836 { out0 = val.a.x + val.b.y;
2842 case partial_vec4_vec3
2844 desc "Uniform struct declared in both, used partially in both. Datatype vec4 and vec3"
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;
2852 ${VERTEX_DECLARATIONS}
2853 struct Struct {mediump vec4 a; mediump vec3 b;};
2855 out mediump float res;
2864 precision mediump float;
2865 struct Struct {mediump vec4 a; mediump vec3 b;};
2867 ${FRAGMENT_DECLARATIONS}
2868 in mediump float res;
2870 { out0 = res + val.b.y;
2878 desc "Same uniform struct in both shaders. Datatype vec4 and float"
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;
2886 ${VERTEX_DECLARATIONS}
2887 struct Struct {mediump vec4 a; mediump float b;};
2889 out mediump float dummy;
2892 dummy = val.a.x + val.b;
2898 precision mediump float;
2899 struct Struct {mediump vec4 a; mediump float b;};
2901 in mediump float dummy;
2902 ${FRAGMENT_DECLARATIONS}
2904 { out0 = val.b + val.a.x;
2905 out0 = out0 + dummy;
2906 out0 = out0 - dummy;
2912 case vertex_only_vec4_float
2914 desc "Uniform struct declared in both, used only in vertex. Datatype vec4 and float"
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;
2922 ${VERTEX_DECLARATIONS}
2923 struct Struct {mediump vec4 a; mediump float b;};
2925 out mediump float res;
2928 res = val.a.x + val.b;
2934 precision mediump float;
2935 struct Struct {mediump vec4 a; mediump float b;};
2937 in mediump float res;
2938 ${FRAGMENT_DECLARATIONS}
2946 case fragment_only_vec4_float
2948 desc "Uniform struct declared in both, used only in fragment. Datatype vec4 and float"
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;
2956 ${VERTEX_DECLARATIONS}
2957 struct Struct {mediump vec4 a; mediump float b;};
2966 precision mediump float;
2967 struct Struct {mediump vec4 a; mediump float b;};
2969 ${FRAGMENT_DECLARATIONS}
2971 { out0 = val.a.x + val.b;
2977 case partial_vec4_float
2979 desc "Uniform struct declared in both, used partially in both. Datatype vec4 and float"
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;
2987 ${VERTEX_DECLARATIONS}
2988 struct Struct {mediump vec4 a; mediump float b;};
2990 out mediump float res;
2999 precision mediump float;
3000 struct Struct {mediump vec4 a; mediump float b;};
3002 ${FRAGMENT_DECLARATIONS}
3003 in mediump float res;
3005 { out0 = res + val.b;
3011 case partial_vec4_struct
3013 desc "Uniform struct declared in both, used partially in both. Datatype vec4 and struct with vec4"
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;
3021 ${VERTEX_DECLARATIONS}
3022 struct Inner {mediump vec4 c;};
3023 struct Struct {mediump vec4 a; Inner b;};
3025 out mediump float res;
3034 precision mediump float;
3035 struct Inner {mediump vec4 c;};
3036 struct Struct {mediump vec4 a; Inner b;};
3038 ${FRAGMENT_DECLARATIONS}
3039 in mediump float res;
3041 { out0 = res + val.b.c.y;
3047 case partial_vec4_vec3_struct
3049 desc "Uniform struct declared in both, used partially in both. Datatype vec4 and struct with vec3"
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;
3057 ${VERTEX_DECLARATIONS}
3058 struct Inner {mediump vec3 c;};
3059 struct Struct {mediump vec4 a; Inner b;};
3061 out mediump float res;
3070 precision mediump float;
3071 struct Inner {mediump vec3 c;};
3072 struct Struct {mediump vec4 a; Inner b;};
3074 ${FRAGMENT_DECLARATIONS}
3075 in mediump float res;
3077 { out0 = res + val.b.c.y;
3083 case partial_vec2_vec3
3085 desc "Uniform struct declared in both, used partially in both. Datatype vec2 and vec3"
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;
3093 ${VERTEX_DECLARATIONS}
3094 struct Struct {mediump vec2 a; mediump vec3 b;};
3096 out mediump float res;
3105 precision mediump float;
3106 struct Struct {mediump vec2 a; mediump vec3 b;};
3108 ${FRAGMENT_DECLARATIONS}
3109 in mediump float res;
3111 { out0 = res + val.b.y;
3117 case partial_vec2_int
3119 desc "Uniform struct declared in both, used partially in both. Datatype vec2 and int"
3121 uniform vec2 val.a = vec2(1.0, 2.0);
3122 uniform int val.b = 2;
3123 output float out0 = 3.0;
3127 ${VERTEX_DECLARATIONS}
3128 struct Struct {mediump vec2 a; mediump int b;};
3130 out mediump float res;
3139 precision mediump float;
3140 struct Struct {mediump vec2 a; mediump int b;};
3142 ${FRAGMENT_DECLARATIONS}
3143 in mediump float res;
3145 { out0 = res + float(val.b);
3151 case partial_int_float
3153 desc "Uniform struct declared in both, used partially in both. Datatype int and float"
3155 uniform float val.a = 1.0;
3156 uniform int val.b = 2;
3157 output float out0 = 3.0;
3161 ${VERTEX_DECLARATIONS}
3162 struct Struct {mediump float a; mediump int b;};
3164 out mediump float res;
3173 precision mediump float;
3174 struct Struct {mediump float a; mediump int b;};
3176 ${FRAGMENT_DECLARATIONS}
3177 in mediump float res;
3179 { out0 = res + float(val.b);
3185 case partial_bvec2_vec2
3187 desc "Uniform struct declared in both, used partially in both. Datatype bvec2 and vec2"
3189 uniform bvec2 val.a = bvec2(true, true);
3190 uniform vec2 val.b = vec2(1.0, 2.0);
3191 output float out0 = 3.0;
3195 ${VERTEX_DECLARATIONS}
3196 struct Struct {bvec2 a; mediump vec2 b;};
3198 out mediump float res;
3201 res = float(val.a.x);
3207 precision mediump float;
3208 struct Struct {bvec2 a; mediump vec2 b;};
3210 ${FRAGMENT_DECLARATIONS}
3211 in mediump float res;
3213 { out0 = res + val.b.y;
3219 case partial_ivec2_vec2
3221 desc "Uniform struct declared in both, used partially in both. Datatype ivec2 and vec2"
3223 uniform ivec2 val.a = ivec2(1, 2);
3224 uniform vec2 val.b = vec2(1.0, 2.0);
3225 output float out0 = 3.0;
3229 ${VERTEX_DECLARATIONS}
3230 struct Struct {mediump ivec2 a; mediump vec2 b;};
3232 out mediump float res;
3235 res = vec2(val.a).x;
3241 precision mediump float;
3242 struct Struct {mediump ivec2 a; mediump vec2 b;};
3244 ${FRAGMENT_DECLARATIONS}
3245 in mediump float res;
3247 { out0 = res + val.b.y;
3253 case partial_ivec2_ivec2
3255 desc "Uniform struct declared in both, used partially in both. Datatype ivec2 and ivec2"
3257 uniform ivec2 val.a = ivec2(1, 2);
3258 uniform ivec2 val.b = ivec2(1, 2);
3259 output float out0 = 3.0;
3263 ${VERTEX_DECLARATIONS}
3264 struct Struct {mediump ivec2 a; mediump ivec2 b;};
3266 out mediump float res;
3269 res = vec2(val.a).x;
3275 precision mediump float;
3276 struct Struct {mediump ivec2 a; mediump ivec2 b;};
3278 ${FRAGMENT_DECLARATIONS}
3279 in mediump float res;
3281 { out0 = res + vec2(val.b).y;
3287 case type_conflict_1
3289 desc "Fragment struct has one less member than fragment version"
3291 values {output float out0 = 3.0;}
3294 ${VERTEX_DECLARATIONS}
3295 struct Struct {mediump float a; mediump float b;};
3297 out mediump float res;
3306 precision mediump float;
3307 struct Struct {mediump float a;};
3309 ${FRAGMENT_DECLARATIONS}
3310 in mediump float res;
3312 { out0 = res + val.a;
3318 case type_conflict_2
3320 desc "Vertex struct has int, fragment struct has float."
3322 values {output float out0 = 3.0;}
3325 ${VERTEX_DECLARATIONS}
3326 struct Struct {mediump int a;};
3328 out mediump float res;
3337 precision mediump float;
3338 struct Struct {mediump float a;};
3340 ${FRAGMENT_DECLARATIONS}
3341 in mediump float res;
3349 case type_conflict_3
3351 desc "Vertex struct has vec3, fragment struct has vec4."
3353 values {output float out0 = 3.0;}
3356 ${VERTEX_DECLARATIONS}
3357 struct Struct {mediump vec3 a;};
3359 out mediump float res;
3362 res = float(val.a.x);
3368 precision mediump float;
3369 struct Struct {mediump vec4 a;};
3371 ${FRAGMENT_DECLARATIONS}
3372 in mediump float res;
3380 case precision_conflict_1
3382 desc "Vertex side struct has highp, fragment side struct mediump."
3384 values {output float out0 = 3.0;}
3387 ${VERTEX_DECLARATIONS}
3388 struct Struct {highp float a;};
3390 out mediump float res;
3399 precision mediump float;
3400 struct Struct {mediump float a;};
3402 ${FRAGMENT_DECLARATIONS}
3403 in mediump float res;
3411 case precision_conflict_2
3413 desc "Vertex side struct has mediump, fragment side struct lowp."
3415 values {output float out0 = 3.0;}
3418 ${VERTEX_DECLARATIONS}
3419 struct Struct {mediump float a;};
3421 out mediump float res;
3430 precision mediump float;
3431 struct Struct {lowp float a;};
3433 ${FRAGMENT_DECLARATIONS}
3434 in mediump float res;
3442 case precision_conflict_3
3444 desc "Vertex side struct has lowp, fragment side struct mediump."
3446 values {output float out0 = 3.0;}
3449 ${VERTEX_DECLARATIONS}
3450 struct Struct {lowp float a;};
3452 out mediump float res;
3461 precision mediump float;
3462 struct Struct {mediump float a;};
3464 ${FRAGMENT_DECLARATIONS}
3465 in mediump float res;
3473 case precision_conflict_4
3475 desc "Vertex side struct has lowp, fragment side struct implicit mediump."
3477 values {output float out0 = 3.0;}
3480 ${VERTEX_DECLARATIONS}
3481 struct Struct {lowp float a;};
3483 out mediump float res;
3492 precision mediump float;
3493 struct Struct {float a;};
3495 ${FRAGMENT_DECLARATIONS}
3496 in mediump float res;
3504 case light_struct_highp
3506 desc "Complex Light struct from use case tests."
3508 uniform float val.constantAttenuation = 1.0;
3509 uniform float val.quadraticAttenuation = 1.0;
3510 output float out0 = 2.0;
3517 highp vec4 position;
3518 highp vec3 direction;
3519 mediump float constantAttenuation;
3520 mediump float linearAttenuation;
3521 mediump float quadraticAttenuation;
3523 ${VERTEX_DECLARATIONS}
3525 out mediump float res;
3528 res = val.constantAttenuation;
3534 precision mediump float;
3538 highp vec4 position;
3539 highp vec3 direction;
3540 mediump float constantAttenuation;
3541 mediump float linearAttenuation;
3542 mediump float quadraticAttenuation;
3544 struct Struct {float a;};
3546 ${FRAGMENT_DECLARATIONS}
3547 in mediump float res;
3550 out0 = res + val.quadraticAttenuation;
3556 case light_struct_mediump
3558 desc "Complex Light struct from use case tests, without highp usage"
3560 uniform float val.constantAttenuation = 1.0;
3561 uniform float val.quadraticAttenuation = 1.0;
3562 output float out0 = 2.0;
3569 mediump vec4 position;
3570 mediump vec3 direction;
3571 mediump float constantAttenuation;
3572 mediump float linearAttenuation;
3573 mediump float quadraticAttenuation;
3575 ${VERTEX_DECLARATIONS}
3577 out mediump float res;
3580 res = val.constantAttenuation;
3586 precision mediump float;
3590 mediump vec4 position;
3591 mediump vec3 direction;
3592 mediump float constantAttenuation;
3593 mediump float linearAttenuation;
3594 mediump float quadraticAttenuation;
3596 struct Struct {float a;};
3598 ${FRAGMENT_DECLARATIONS}
3599 in mediump float res;
3602 out0 = res + val.quadraticAttenuation;
3609 group block "Uniform blocks"
3621 ${VERTEX_DECLARATIONS}
3622 out mediump float res;
3637 precision mediump float;
3638 ${FRAGMENT_DECLARATIONS}
3639 in mediump float res;
3642 dEQP_FragColor = vec4(val, 1.0);
3647 case members_mismatch
3658 ${VERTEX_DECLARATIONS}
3659 out mediump float res;
3675 precision mediump float;
3676 ${FRAGMENT_DECLARATIONS}
3677 in mediump float res;
3680 dEQP_FragColor = vec4(val);
3685 case layout_qualifier_mismatch_1
3691 layout(std140) uniform Block
3696 ${VERTEX_DECLARATIONS}
3697 out mediump float res;
3712 precision mediump float;
3713 ${FRAGMENT_DECLARATIONS}
3714 in mediump float res;
3717 dEQP_FragColor = vec4(val);
3722 case layout_qualifier_mismatch_2
3728 layout(shared) uniform Block
3733 ${VERTEX_DECLARATIONS}
3734 out mediump float res;
3744 layout(packed) uniform Block
3749 precision mediump float;
3750 ${FRAGMENT_DECLARATIONS}
3751 in mediump float res;
3754 dEQP_FragColor = vec4(val);
3759 case layout_qualifier_mismatch_3
3765 layout(row_major) uniform Block
3770 ${VERTEX_DECLARATIONS}
3771 out mediump float res;
3781 layout(column_major) uniform Block
3786 precision mediump float;
3787 ${FRAGMENT_DECLARATIONS}
3788 in mediump float res;
3791 dEQP_FragColor = vec4(val);
3796 case layout_qualifier_mismatch_4
3802 layout(row_major) uniform Block
3807 ${VERTEX_DECLARATIONS}
3808 out mediump float res;
3818 layout(column_major) uniform Block
3823 precision mediump float;
3824 ${FRAGMENT_DECLARATIONS}
3825 in mediump float res;
3828 dEQP_FragColor = vec4(val[2], 1.0);
3833 case layout_qualifier_mismatch_5
3841 layout(row_major) uniform highp mat3 val;
3844 ${VERTEX_DECLARATIONS}
3845 out mediump float res;
3857 layout(column_major) uniform highp mat3 val;
3860 precision mediump float;
3861 ${FRAGMENT_DECLARATIONS}
3862 in mediump float res;
3865 dEQP_FragColor = vec4(val[2], 1.0);