Home | History | Annotate | Download | only in es32
      1 # -------------------------------------------------
      2 # drawElements Quality Program OpenGL ES 3.2 Module
      3 # -------------------------------------------------
      4 #
      5 # Copyright 2016 The Android Open Source Project
      6 #
      7 # Licensed under the Apache License, Version 2.0 (the "License");
      8 # you may not use this file except in compliance with the License.
      9 # You may obtain a copy of the License at
     10 #
     11 #      http://www.apache.org/licenses/LICENSE-2.0
     12 #
     13 # Unless required by applicable law or agreed to in writing, software
     14 # distributed under the License is distributed on an "AS IS" BASIS,
     15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16 # See the License for the specific language governing permissions and
     17 # limitations under the License.
     18 
     19 
     20 group varying "Varying linkage"
     21 	group rules "Rules"
     22 
     23 		case input_type_mismatch
     24 			version 320 es
     25 			desc "Tessellation control shader input type mismatch"
     26 			expect link_fail
     27 			values
     28 			{
     29 				input float in0 = 1.0;
     30 				output float out0 = 1.0;
     31 			}
     32 			vertex ""
     33 				#version 320 es
     34 				${VERTEX_DECLARATIONS}
     35 				out mediump float tc_in;
     36 				void main()
     37 				{
     38 					tc_in = in0;
     39 					${VERTEX_OUTPUT}
     40 				}
     41 			""
     42 			tessellation_control ""
     43 				#version 320 es
     44 				${TESSELLATION_CONTROL_DECLARATIONS}
     45 				in mediump vec2 tc_in[];
     46 				out mediump float tc_out[];
     47 				void main()
     48 				{
     49 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID].x;
     50 					${TESSELLATION_CONTROL_OUTPUT}
     51 				}
     52 			""
     53 			tessellation_evaluation ""
     54 				#version 320 es
     55 				${TESSELLATION_EVALUATION_DECLARATIONS}
     56 				in mediump float tc_out[];
     57 				out mediump float te_out;
     58 				void main()
     59 				{
     60 					te_out = tc_out[2];
     61 					${TESSELLATION_EVALUATION_OUTPUT}
     62 				}
     63 			""
     64 			fragment ""
     65 				#version 320 es
     66 				precision mediump float;
     67 				${FRAGMENT_DECLARATIONS}
     68 				in mediump float te_out;
     69 				void main()
     70 				{
     71 					out0 = te_out;
     72 					${FRAGMENT_OUTPUT}
     73 				}
     74 			""
     75 		end
     76 
     77 		case output_type_mismatch
     78 			version 320 es
     79 			desc "Tessellation evaluation shader output type mismatch"
     80 			expect link_fail
     81 			values
     82 			{
     83 				input float in0 = 1.0;
     84 				output float out0 = 1.0;
     85 			}
     86 			vertex ""
     87 				#version 320 es
     88 				${VERTEX_DECLARATIONS}
     89 				out mediump float tc_in;
     90 				void main()
     91 				{
     92 					tc_in = in0;
     93 					${VERTEX_OUTPUT}
     94 				}
     95 			""
     96 			tessellation_control ""
     97 				#version 320 es
     98 				${TESSELLATION_CONTROL_DECLARATIONS}
     99 				in mediump float tc_in[];
    100 				out mediump float tc_out[];
    101 				void main()
    102 				{
    103 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    104 					${TESSELLATION_CONTROL_OUTPUT}
    105 				}
    106 			""
    107 			tessellation_evaluation ""
    108 				#version 320 es
    109 				${TESSELLATION_EVALUATION_DECLARATIONS}
    110 				in mediump float tc_out[];
    111 				out mediump float te_out;
    112 				void main()
    113 				{
    114 					te_out = tc_out[2];
    115 					${TESSELLATION_EVALUATION_OUTPUT}
    116 				}
    117 			""
    118 			fragment ""
    119 				#version 320 es
    120 				precision mediump float;
    121 				${FRAGMENT_DECLARATIONS}
    122 				in mediump vec2 te_out;
    123 				void main()
    124 				{
    125 					out0 = te_out.x + te_out.y;
    126 					${FRAGMENT_OUTPUT}
    127 				}
    128 			""
    129 		end
    130 
    131 		case internal_type_mismatch
    132 			version 320 es
    133 			desc "Tessellation control and evaluation shader varying type mismatch"
    134 			expect link_fail
    135 			values
    136 			{
    137 				input float in0 = 1.0;
    138 				output float out0 = 1.0;
    139 			}
    140 			vertex ""
    141 				#version 320 es
    142 				${VERTEX_DECLARATIONS}
    143 				out mediump float tc_in;
    144 				void main()
    145 				{
    146 					tc_in = in0;
    147 					${VERTEX_OUTPUT}
    148 				}
    149 			""
    150 			tessellation_control ""
    151 				#version 320 es
    152 				${TESSELLATION_CONTROL_DECLARATIONS}
    153 				in mediump float tc_in[];
    154 				out mediump float tc_out[];
    155 				void main()
    156 				{
    157 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    158 					${TESSELLATION_CONTROL_OUTPUT}
    159 				}
    160 			""
    161 			tessellation_evaluation ""
    162 				#version 320 es
    163 				${TESSELLATION_EVALUATION_DECLARATIONS}
    164 				in mediump vec2 tc_out[];
    165 				out mediump float te_out;
    166 				void main()
    167 				{
    168 					te_out = tc_out[2].x + tc_out[0].y;
    169 					${TESSELLATION_EVALUATION_OUTPUT}
    170 				}
    171 			""
    172 			fragment ""
    173 				#version 320 es
    174 				precision mediump float;
    175 				${FRAGMENT_DECLARATIONS}
    176 				in mediump float te_out;
    177 				void main()
    178 				{
    179 					out0 = te_out;
    180 					${FRAGMENT_OUTPUT}
    181 				}
    182 			""
    183 		end
    184 
    185 		case input_different_precision
    186 			version 320 es
    187 			desc "Tessellation control shader input precisions different"
    188 			values
    189 			{
    190 				input float in0 = 1.0;
    191 				output float out0 = 1.0;
    192 			}
    193 			vertex ""
    194 				#version 320 es
    195 				${VERTEX_DECLARATIONS}
    196 				out highp float tc_in;
    197 				void main()
    198 				{
    199 					tc_in = in0;
    200 					${VERTEX_OUTPUT}
    201 				}
    202 			""
    203 			tessellation_control ""
    204 				#version 320 es
    205 				${TESSELLATION_CONTROL_DECLARATIONS}
    206 				in lowp float tc_in[];
    207 				out mediump float tc_out[];
    208 				void main()
    209 				{
    210 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    211 					${TESSELLATION_CONTROL_OUTPUT}
    212 				}
    213 			""
    214 			tessellation_evaluation ""
    215 				#version 320 es
    216 				${TESSELLATION_EVALUATION_DECLARATIONS}
    217 				in mediump float tc_out[];
    218 				out mediump float te_out;
    219 				void main()
    220 				{
    221 					te_out = tc_out[2];
    222 					${TESSELLATION_EVALUATION_OUTPUT}
    223 				}
    224 			""
    225 			fragment ""
    226 				#version 320 es
    227 				precision mediump float;
    228 				${FRAGMENT_DECLARATIONS}
    229 				in mediump float te_out;
    230 				void main()
    231 				{
    232 					out0 = te_out;
    233 					${FRAGMENT_OUTPUT}
    234 				}
    235 			""
    236 		end
    237 
    238 		case output_different_precision
    239 			version 320 es
    240 			desc "Tessellation evaluation shader output precisions different"
    241 			values
    242 			{
    243 				input float in0 = 1.0;
    244 				output float out0 = 1.0;
    245 			}
    246 			vertex ""
    247 				#version 320 es
    248 				${VERTEX_DECLARATIONS}
    249 				out mediump float tc_in;
    250 				void main()
    251 				{
    252 					tc_in = in0;
    253 					${VERTEX_OUTPUT}
    254 				}
    255 			""
    256 			tessellation_control ""
    257 				#version 320 es
    258 				${TESSELLATION_CONTROL_DECLARATIONS}
    259 				in mediump float tc_in[];
    260 				out mediump float tc_out[];
    261 				void main()
    262 				{
    263 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    264 					${TESSELLATION_CONTROL_OUTPUT}
    265 				}
    266 			""
    267 			tessellation_evaluation ""
    268 				#version 320 es
    269 				${TESSELLATION_EVALUATION_DECLARATIONS}
    270 				in mediump float tc_out[];
    271 				out highp float te_out;
    272 				void main()
    273 				{
    274 					te_out = tc_out[2];
    275 					${TESSELLATION_EVALUATION_OUTPUT}
    276 				}
    277 			""
    278 			fragment ""
    279 				#version 320 es
    280 				precision mediump float;
    281 				${FRAGMENT_DECLARATIONS}
    282 				in lowp float te_out;
    283 				void main()
    284 				{
    285 					out0 = te_out;
    286 					${FRAGMENT_OUTPUT}
    287 				}
    288 			""
    289 		end
    290 
    291 		case internal_different_precision
    292 			version 320 es
    293 			desc "Tessellation control and evaluation shader varying precisions different"
    294 			values
    295 			{
    296 				input float in0 = 1.0;
    297 				output float out0 = 1.0;
    298 			}
    299 			vertex ""
    300 				#version 320 es
    301 				${VERTEX_DECLARATIONS}
    302 				out mediump float tc_in;
    303 				void main()
    304 				{
    305 					tc_in = in0;
    306 					${VERTEX_OUTPUT}
    307 				}
    308 			""
    309 			tessellation_control ""
    310 				#version 320 es
    311 				${TESSELLATION_CONTROL_DECLARATIONS}
    312 				in mediump float tc_in[];
    313 				out highp float tc_out[];
    314 				void main()
    315 				{
    316 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    317 					${TESSELLATION_CONTROL_OUTPUT}
    318 				}
    319 			""
    320 			tessellation_evaluation ""
    321 				#version 320 es
    322 				${TESSELLATION_EVALUATION_DECLARATIONS}
    323 				in lowp float tc_out[];
    324 				out mediump float te_out;
    325 				void main()
    326 				{
    327 					te_out = tc_out[2];
    328 					${TESSELLATION_EVALUATION_OUTPUT}
    329 				}
    330 			""
    331 			fragment ""
    332 				#version 320 es
    333 				precision mediump float;
    334 				${FRAGMENT_DECLARATIONS}
    335 				in mediump float te_out;
    336 				void main()
    337 				{
    338 					out0 = te_out;
    339 					${FRAGMENT_OUTPUT}
    340 				}
    341 			""
    342 		end
    343 
    344 		case input_no_declaration
    345 			version 320 es
    346 			desc "Tessellation control shader input with no matching output"
    347 			expect link_fail
    348 			values
    349 			{
    350 				input float in0 = 1.0;
    351 				output float out0 = 1.0;
    352 			}
    353 			vertex ""
    354 				#version 320 es
    355 				${VERTEX_DECLARATIONS}
    356 				void main()
    357 				{
    358 					${VERTEX_OUTPUT}
    359 				}
    360 			""
    361 			tessellation_control ""
    362 				#version 320 es
    363 				${TESSELLATION_CONTROL_DECLARATIONS}
    364 				in mediump float tc_in[];
    365 				out mediump float tc_out[];
    366 				void main()
    367 				{
    368 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    369 					${TESSELLATION_CONTROL_OUTPUT}
    370 				}
    371 			""
    372 			tessellation_evaluation ""
    373 				#version 320 es
    374 				${TESSELLATION_EVALUATION_DECLARATIONS}
    375 				in mediump float tc_out[];
    376 				out mediump float te_out;
    377 				void main()
    378 				{
    379 					te_out = tc_out[2];
    380 					${TESSELLATION_EVALUATION_OUTPUT}
    381 				}
    382 			""
    383 			fragment ""
    384 				#version 320 es
    385 				precision mediump float;
    386 				${FRAGMENT_DECLARATIONS}
    387 				in mediump float te_out;
    388 				void main()
    389 				{
    390 					out0 = te_out;
    391 					${FRAGMENT_OUTPUT}
    392 				}
    393 			""
    394 		end
    395 
    396 		case output_no_declaration
    397 			version 320 es
    398 			desc "Tessellation evaluation shader without output for an fragment shader input"
    399 			expect link_fail
    400 			values
    401 			{
    402 				output float out0 = 1.0;
    403 			}
    404 			vertex ""
    405 				#version 320 es
    406 				${VERTEX_DECLARATIONS}
    407 				void main()
    408 				{
    409 					${VERTEX_OUTPUT}
    410 				}
    411 			""
    412 			tessellation_control ""
    413 				#version 320 es
    414 				${TESSELLATION_CONTROL_DECLARATIONS}
    415 				void main()
    416 				{
    417 					${TESSELLATION_CONTROL_OUTPUT}
    418 				}
    419 			""
    420 			tessellation_evaluation ""
    421 				#version 320 es
    422 				${TESSELLATION_EVALUATION_DECLARATIONS}
    423 				void main()
    424 				{
    425 					${TESSELLATION_EVALUATION_OUTPUT}
    426 				}
    427 			""
    428 			fragment ""
    429 				#version 320 es
    430 				precision mediump float;
    431 				${FRAGMENT_DECLARATIONS}
    432 				in mediump float te_out;
    433 				void main()
    434 				{
    435 					out0 = te_out;
    436 					${FRAGMENT_OUTPUT}
    437 				}
    438 			""
    439 		end
    440 
    441 		case internal_no_declaration
    442 			version 320 es
    443 			desc "Tessellation evaluation shader input without matching output"
    444 			expect link_fail
    445 			values
    446 			{
    447 				output float out0 = 1.0;
    448 			}
    449 			vertex ""
    450 				#version 320 es
    451 				${VERTEX_DECLARATIONS}
    452 				void main()
    453 				{
    454 					${VERTEX_OUTPUT}
    455 				}
    456 			""
    457 			tessellation_control ""
    458 				#version 320 es
    459 				${TESSELLATION_CONTROL_DECLARATIONS}
    460 				void main()
    461 				{
    462 					${TESSELLATION_CONTROL_OUTPUT}
    463 				}
    464 			""
    465 			tessellation_evaluation ""
    466 				#version 320 es
    467 				${TESSELLATION_EVALUATION_DECLARATIONS}
    468 				in mediump float tc_out[];
    469 				out mediump float te_out;
    470 				void main()
    471 				{
    472 					te_out = tc_out[2];
    473 					${TESSELLATION_EVALUATION_OUTPUT}
    474 				}
    475 			""
    476 			fragment ""
    477 				#version 320 es
    478 				precision mediump float;
    479 				${FRAGMENT_DECLARATIONS}
    480 				in mediump float te_out;
    481 				void main()
    482 				{
    483 					out0 = te_out;
    484 					${FRAGMENT_OUTPUT}
    485 				}
    486 			""
    487 		end
    488 
    489 		case input_superfluous_declaration
    490 			version 320 es
    491 			desc "Tessellation control has no input for an output"
    492 			values
    493 			{
    494 				input float in0 = 1.0;
    495 				output float out0 = 1.0;
    496 			}
    497 			vertex ""
    498 				#version 320 es
    499 				${VERTEX_DECLARATIONS}
    500 				out mediump float tc_in;
    501 				out mediump float tc_in_unused;
    502 				void main()
    503 				{
    504 					tc_in = in0;
    505 					tc_in_unused = in0 + 1.0;
    506 					${VERTEX_OUTPUT}
    507 				}
    508 			""
    509 			tessellation_control ""
    510 				#version 320 es
    511 				${TESSELLATION_CONTROL_DECLARATIONS}
    512 				in mediump float tc_in[];
    513 				out mediump float tc_out[];
    514 				void main()
    515 				{
    516 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    517 					${TESSELLATION_CONTROL_OUTPUT}
    518 				}
    519 			""
    520 			tessellation_evaluation ""
    521 				#version 320 es
    522 				${TESSELLATION_EVALUATION_DECLARATIONS}
    523 				in mediump float tc_out[];
    524 				out mediump float te_out;
    525 				void main()
    526 				{
    527 					te_out = tc_out[2];
    528 					${TESSELLATION_EVALUATION_OUTPUT}
    529 				}
    530 			""
    531 			fragment ""
    532 				#version 320 es
    533 				precision mediump float;
    534 				${FRAGMENT_DECLARATIONS}
    535 				in mediump float te_out;
    536 				void main()
    537 				{
    538 					out0 = te_out;
    539 					${FRAGMENT_OUTPUT}
    540 				}
    541 			""
    542 		end
    543 
    544 		case output_superfluous_declaration
    545 			version 320 es
    546 			desc "Tessellation has an output without a matching input"
    547 			values
    548 			{
    549 				input float in0 = 1.0;
    550 				output float out0 = 1.0;
    551 			}
    552 			vertex ""
    553 				#version 320 es
    554 				${VERTEX_DECLARATIONS}
    555 				out mediump float tc_in;
    556 				void main()
    557 				{
    558 					tc_in = in0;
    559 					${VERTEX_OUTPUT}
    560 				}
    561 			""
    562 			tessellation_control ""
    563 				#version 320 es
    564 				${TESSELLATION_CONTROL_DECLARATIONS}
    565 				in mediump float tc_in[];
    566 				out mediump float tc_out[];
    567 				void main()
    568 				{
    569 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    570 					${TESSELLATION_CONTROL_OUTPUT}
    571 				}
    572 			""
    573 			tessellation_evaluation ""
    574 				#version 320 es
    575 				${TESSELLATION_EVALUATION_DECLARATIONS}
    576 				in mediump float tc_out[];
    577 				out mediump float te_out;
    578 				out mediump float te_out_unused;
    579 				void main()
    580 				{
    581 					te_out = tc_out[2];
    582 					te_out_unused = tc_out[0];
    583 					${TESSELLATION_EVALUATION_OUTPUT}
    584 				}
    585 			""
    586 			fragment ""
    587 				#version 320 es
    588 				precision mediump float;
    589 				${FRAGMENT_DECLARATIONS}
    590 				in mediump float te_out;
    591 				void main()
    592 				{
    593 					out0 = te_out;
    594 					${FRAGMENT_OUTPUT}
    595 				}
    596 			""
    597 		end
    598 
    599 		case internal_superfluous_declaration
    600 			version 320 es
    601 			desc "Tessellation control has an output without a matching input"
    602 			values
    603 			{
    604 				input float in0 = 1.0;
    605 				output float out0 = 1.0;
    606 			}
    607 			vertex ""
    608 				#version 320 es
    609 				${VERTEX_DECLARATIONS}
    610 				out mediump float tc_in;
    611 				void main()
    612 				{
    613 					tc_in = in0;
    614 					${VERTEX_OUTPUT}
    615 				}
    616 			""
    617 			tessellation_control ""
    618 				#version 320 es
    619 				${TESSELLATION_CONTROL_DECLARATIONS}
    620 				in mediump float tc_in[];
    621 				out mediump float tc_out[];
    622 				out mediump float tc_out_unused[];
    623 				void main()
    624 				{
    625 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    626 					tc_out_unused[gl_InvocationID] = tc_in[gl_InvocationID] + 1.0;
    627 					${TESSELLATION_CONTROL_OUTPUT}
    628 				}
    629 			""
    630 			tessellation_evaluation ""
    631 				#version 320 es
    632 				${TESSELLATION_EVALUATION_DECLARATIONS}
    633 				in mediump float tc_out[];
    634 				out mediump float te_out;
    635 				void main()
    636 				{
    637 					te_out = tc_out[2];
    638 					${TESSELLATION_EVALUATION_OUTPUT}
    639 				}
    640 			""
    641 			fragment ""
    642 				#version 320 es
    643 				precision mediump float;
    644 				${FRAGMENT_DECLARATIONS}
    645 				in mediump float te_out;
    646 				void main()
    647 				{
    648 					out0 = te_out;
    649 					${FRAGMENT_OUTPUT}
    650 				}
    651 			""
    652 		end
    653 
    654 		case vertex_fragment_same_varying_name_1
    655 			version 320 es
    656 			desc "Tessellation control has an output without a matching input"
    657 			values
    658 			{
    659 				input float in0 = 1.0;
    660 				output float out0 = 2.0;
    661 			}
    662 			vertex ""
    663 				#version 320 es
    664 				${VERTEX_DECLARATIONS}
    665 				out mediump float sharedVaringName;
    666 				void main()
    667 				{
    668 					sharedVaringName = in0;
    669 					${VERTEX_OUTPUT}
    670 				}
    671 			""
    672 			tessellation_control ""
    673 				#version 320 es
    674 				${TESSELLATION_CONTROL_DECLARATIONS}
    675 				in mediump float sharedVaringName[];
    676 				out mediump float tc_out[];
    677 				void main()
    678 				{
    679 					tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID];
    680 					${TESSELLATION_CONTROL_OUTPUT}
    681 				}
    682 			""
    683 			tessellation_evaluation ""
    684 				#version 320 es
    685 				${TESSELLATION_EVALUATION_DECLARATIONS}
    686 				in mediump float tc_out[];
    687 				out mediump float sharedVaringName;
    688 				void main()
    689 				{
    690 					sharedVaringName = 2.0 * tc_out[2];
    691 					${TESSELLATION_EVALUATION_OUTPUT}
    692 				}
    693 			""
    694 			fragment ""
    695 				#version 320 es
    696 				precision mediump float;
    697 				${FRAGMENT_DECLARATIONS}
    698 				in mediump float sharedVaringName;
    699 				void main()
    700 				{
    701 					out0 = sharedVaringName;
    702 					${FRAGMENT_OUTPUT}
    703 				}
    704 			""
    705 		end
    706 
    707 		case vertex_fragment_same_varying_name_2
    708 			version 320 es
    709 			desc "Tessellation control has an output without a matching input"
    710 			values
    711 			{
    712 				input vec2 in0 = vec2(1.0, 3.0);
    713 				output float out0 = 4.0;
    714 			}
    715 			vertex ""
    716 				#version 320 es
    717 				${VERTEX_DECLARATIONS}
    718 				out mediump vec2 sharedVaringName;
    719 				void main()
    720 				{
    721 					sharedVaringName = in0;
    722 					${VERTEX_OUTPUT}
    723 				}
    724 			""
    725 			tessellation_control ""
    726 				#version 320 es
    727 				${TESSELLATION_CONTROL_DECLARATIONS}
    728 				in mediump vec2 sharedVaringName[];
    729 				out mediump float tc_out[];
    730 				void main()
    731 				{
    732 					tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID].x + sharedVaringName[gl_InvocationID].y;
    733 					${TESSELLATION_CONTROL_OUTPUT}
    734 				}
    735 			""
    736 			tessellation_evaluation ""
    737 				#version 320 es
    738 				${TESSELLATION_EVALUATION_DECLARATIONS}
    739 				in mediump float tc_out[];
    740 				out mediump float sharedVaringName;
    741 				void main()
    742 				{
    743 					sharedVaringName = tc_out[2];
    744 					${TESSELLATION_EVALUATION_OUTPUT}
    745 				}
    746 			""
    747 			fragment ""
    748 				#version 320 es
    749 				precision mediump float;
    750 				${FRAGMENT_DECLARATIONS}
    751 				in mediump float sharedVaringName;
    752 				void main()
    753 				{
    754 					out0 = sharedVaringName;
    755 					${FRAGMENT_OUTPUT}
    756 				}
    757 			""
    758 		end
    759 
    760 		case invalid_vertex_index
    761 			version 320 es
    762 			desc "Tessellation control output not indexed with gl_InvocationID"
    763 			expect compile_or_link_fail
    764 			vertex ""
    765 				#version 320 es
    766 				${VERTEX_DECLARATIONS}
    767 				void main()
    768 				{
    769 					${VERTEX_OUTPUT}
    770 				}
    771 			""
    772 			tessellation_control ""
    773 				#version 320 es
    774 				${TESSELLATION_CONTROL_DECLARATIONS}
    775 				out mediump float tc_out[];
    776 				void main()
    777 				{
    778 					tc_out[2 - gl_InvocationID] = float(gl_InvocationID);
    779 					${TESSELLATION_CONTROL_OUTPUT}
    780 				}
    781 			""
    782 			tessellation_evaluation ""
    783 				#version 320 es
    784 				${TESSELLATION_EVALUATION_DECLARATIONS}
    785 				in mediump float tc_out[];
    786 				out mediump float te_out;
    787 				void main()
    788 				{
    789 					te_out = tc_out[2];
    790 					${TESSELLATION_EVALUATION_OUTPUT}
    791 				}
    792 			""
    793 			fragment ""
    794 				#version 320 es
    795 				precision mediump float;
    796 				${FRAGMENT_DECLARATIONS}
    797 				in mediump float te_out;
    798 				void main()
    799 				{
    800 					${FRAG_COLOR} = vec4(te_out);
    801 				}
    802 			""
    803 		end
    804 
    805 		case input_non_array
    806 			version 320 es
    807 			desc "Tessellation control input in not an array"
    808 			expect compile_or_link_fail
    809 			values
    810 			{
    811 				input float in0 = 1.0;
    812 				output float out0 = 1.0;
    813 			}
    814 			vertex ""
    815 				#version 320 es
    816 				${VERTEX_DECLARATIONS}
    817 				out mediump float tc_in;
    818 				void main()
    819 				{
    820 					tc_in = in0;
    821 					${VERTEX_OUTPUT}
    822 				}
    823 			""
    824 			tessellation_control ""
    825 				#version 320 es
    826 				${TESSELLATION_CONTROL_DECLARATIONS}
    827 				in mediump float tc_in;
    828 				out mediump float tc_out[];
    829 				void main()
    830 				{
    831 					tc_out[gl_InvocationID] = tc_in;
    832 					${TESSELLATION_CONTROL_OUTPUT}
    833 				}
    834 			""
    835 			tessellation_evaluation ""
    836 				#version 320 es
    837 				${TESSELLATION_EVALUATION_DECLARATIONS}
    838 				in mediump float tc_out[];
    839 				out mediump float te_out;
    840 				void main()
    841 				{
    842 					te_out = tc_out[2];
    843 					${TESSELLATION_EVALUATION_OUTPUT}
    844 				}
    845 			""
    846 			fragment ""
    847 				#version 320 es
    848 				precision mediump float;
    849 				${FRAGMENT_DECLARATIONS}
    850 				in mediump float te_out;
    851 				void main()
    852 				{
    853 					out0 = te_out;
    854 					${FRAGMENT_OUTPUT}
    855 				}
    856 			""
    857 		end
    858 
    859 		case input_array_size_mismatch
    860 			version 320 es
    861 			desc "Tessellation control input array size is not gl_MaxPatchVertices"
    862 			expect compile_or_link_fail
    863 			values
    864 			{
    865 				input float in0 = 1.0;
    866 				output float out0 = 1.0;
    867 			}
    868 			vertex ""
    869 				#version 320 es
    870 				${VERTEX_DECLARATIONS}
    871 				out mediump float tc_in;
    872 				void main()
    873 				{
    874 					tc_in = in0;
    875 					${VERTEX_OUTPUT}
    876 				}
    877 			""
    878 			tessellation_control ""
    879 				#version 320 es
    880 				${TESSELLATION_CONTROL_DECLARATIONS}
    881 				in mediump float tc_in[2]; // not gl_MaxPatchVertices
    882 				out mediump float tc_out[];
    883 				void main()
    884 				{
    885 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    886 					${TESSELLATION_CONTROL_OUTPUT}
    887 				}
    888 			""
    889 			tessellation_evaluation ""
    890 				#version 320 es
    891 				${TESSELLATION_EVALUATION_DECLARATIONS}
    892 				in mediump float tc_out[];
    893 				out mediump float te_out;
    894 				void main()
    895 				{
    896 					te_out = tc_out[2];
    897 					${TESSELLATION_EVALUATION_OUTPUT}
    898 				}
    899 			""
    900 			fragment ""
    901 				#version 320 es
    902 				precision mediump float;
    903 				${FRAGMENT_DECLARATIONS}
    904 				in mediump float te_out;
    905 				void main()
    906 				{
    907 					out0 = te_out;
    908 					${FRAGMENT_OUTPUT}
    909 				}
    910 			""
    911 		end
    912 
    913 		case internal_array_size_mismatch
    914 			version 320 es
    915 			desc "Tessellation control output array size is not consistent with layout qualifier"
    916 			expect compile_or_link_fail
    917 			values
    918 			{
    919 				input float in0 = 1.0;
    920 				output float out0 = 1.0;
    921 			}
    922 			vertex ""
    923 				#version 320 es
    924 				${VERTEX_DECLARATIONS}
    925 				out mediump float tc_in;
    926 				void main()
    927 				{
    928 					tc_in = in0;
    929 					${VERTEX_OUTPUT}
    930 				}
    931 			""
    932 			tessellation_control ""
    933 				#version 320 es
    934 				${TESSELLATION_CONTROL_DECLARATIONS}
    935 				in mediump float tc_in[];
    936 				out mediump float tc_out[2]; // does not match output layout qualifier
    937 				void main()
    938 				{
    939 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    940 					${TESSELLATION_CONTROL_OUTPUT}
    941 				}
    942 			""
    943 			tessellation_evaluation ""
    944 				#version 320 es
    945 				${TESSELLATION_EVALUATION_DECLARATIONS}
    946 				in mediump float tc_out[2];
    947 				out mediump float te_out;
    948 				void main()
    949 				{
    950 					te_out = tc_out[1];
    951 					${TESSELLATION_EVALUATION_OUTPUT}
    952 				}
    953 			""
    954 			fragment ""
    955 				#version 320 es
    956 				precision mediump float;
    957 				${FRAGMENT_DECLARATIONS}
    958 				in mediump float te_out;
    959 				void main()
    960 				{
    961 					out0 = te_out;
    962 					${FRAGMENT_OUTPUT}
    963 				}
    964 			""
    965 		end
    966 
    967 		case per_patch_qualifier_mismatch_1
    968 			version 320 es
    969 			desc "Tessellation control output is per-patch qualified, evaluation input is not"
    970 			expect compile_or_link_fail
    971 			values
    972 			{
    973 				input float in0 = 1.0;
    974 				output float out0 = 1.0;
    975 			}
    976 			vertex ""
    977 				#version 320 es
    978 				${VERTEX_DECLARATIONS}
    979 				out mediump float tc_in;
    980 				void main()
    981 				{
    982 					tc_in = in0;
    983 					${VERTEX_OUTPUT}
    984 				}
    985 			""
    986 			tessellation_control ""
    987 				#version 320 es
    988 				${TESSELLATION_CONTROL_DECLARATIONS}
    989 				in mediump float tc_in[];
    990 				patch out mediump float tc_out[gl_MaxPatchVertices];
    991 				void main()
    992 				{
    993 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    994 					${TESSELLATION_CONTROL_OUTPUT}
    995 				}
    996 			""
    997 			tessellation_evaluation ""
    998 				#version 320 es
    999 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1000 				in mediump float tc_out[gl_MaxPatchVertices];
   1001 				out mediump float te_out;
   1002 				void main()
   1003 				{
   1004 					te_out = tc_out[2];
   1005 					${TESSELLATION_EVALUATION_OUTPUT}
   1006 				}
   1007 			""
   1008 			fragment ""
   1009 				#version 320 es
   1010 				precision mediump float;
   1011 				${FRAGMENT_DECLARATIONS}
   1012 				in mediump float te_out;
   1013 				void main()
   1014 				{
   1015 					out0 = te_out;
   1016 					${FRAGMENT_OUTPUT}
   1017 				}
   1018 			""
   1019 		end
   1020 
   1021 		case per_patch_qualifier_mismatch_2
   1022 			version 320 es
   1023 			desc "Tessellation control output is not per-patch qualified, evaluation input is"
   1024 			expect compile_or_link_fail
   1025 			values
   1026 			{
   1027 				input float in0 = 1.0;
   1028 				output float out0 = 1.0;
   1029 			}
   1030 			vertex ""
   1031 				#version 320 es
   1032 				${VERTEX_DECLARATIONS}
   1033 				out mediump float tc_in;
   1034 				void main()
   1035 				{
   1036 					tc_in = in0;
   1037 					${VERTEX_OUTPUT}
   1038 				}
   1039 			""
   1040 			tessellation_control ""
   1041 				#version 320 es
   1042 				${TESSELLATION_CONTROL_DECLARATIONS}
   1043 				in mediump float tc_in[];
   1044 				out mediump float tc_out[gl_MaxPatchVertices];
   1045 				void main()
   1046 				{
   1047 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
   1048 					${TESSELLATION_CONTROL_OUTPUT}
   1049 				}
   1050 			""
   1051 			tessellation_evaluation ""
   1052 				#version 320 es
   1053 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1054 				patch in mediump float tc_out[gl_MaxPatchVertices];
   1055 				out mediump float te_out;
   1056 				void main()
   1057 				{
   1058 					te_out = tc_out[2];
   1059 					${TESSELLATION_EVALUATION_OUTPUT}
   1060 				}
   1061 			""
   1062 			fragment ""
   1063 				#version 320 es
   1064 				precision mediump float;
   1065 				${FRAGMENT_DECLARATIONS}
   1066 				in mediump float te_out;
   1067 				void main()
   1068 				{
   1069 					out0 = te_out;
   1070 					${FRAGMENT_OUTPUT}
   1071 				}
   1072 			""
   1073 		end
   1074 
   1075 		case input_block
   1076 			version 320 es
   1077 			desc "Tessellation control shader input block"
   1078 			values { output float out0 = 1.0; }
   1079 			vertex ""
   1080 				#version 320 es
   1081 				${VERTEX_DECLARATIONS}
   1082 				out IOBlockName
   1083 				{
   1084 					mediump float var;
   1085 				} outputInstanceName;
   1086 				void main()
   1087 				{
   1088 					outputInstanceName.var = 1.0;
   1089 					${VERTEX_OUTPUT}
   1090 				}
   1091 			""
   1092 			tessellation_control ""
   1093 				#version 320 es
   1094 				${TESSELLATION_CONTROL_DECLARATIONS}
   1095 				in IOBlockName
   1096 				{
   1097 					mediump float var;
   1098 				} inputInstanceName[];
   1099 				out mediump float tc_out[];
   1100 				void main()
   1101 				{
   1102 					tc_out[gl_InvocationID] = inputInstanceName[gl_InvocationID].var;
   1103 					${TESSELLATION_CONTROL_OUTPUT}
   1104 				}
   1105 			""
   1106 			tessellation_evaluation ""
   1107 				#version 320 es
   1108 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1109 				in mediump float tc_out[];
   1110 				out mediump float te_out;
   1111 				void main()
   1112 				{
   1113 					te_out = tc_out[2];
   1114 					${TESSELLATION_EVALUATION_OUTPUT}
   1115 				}
   1116 			""
   1117 			fragment ""
   1118 				#version 320 es
   1119 				precision mediump float;
   1120 				${FRAGMENT_DECLARATIONS}
   1121 				in mediump float te_out;
   1122 				void main()
   1123 				{
   1124 					out0 = te_out;
   1125 					${FRAGMENT_OUTPUT}
   1126 				}
   1127 			""
   1128 		end
   1129 
   1130 		case input_block_non_array
   1131 			version 320 es
   1132 			desc "Tessellation control shader input block with explicit array"
   1133 			expect compile_or_link_fail
   1134 			values { output float out0 = 1.0; }
   1135 			vertex ""
   1136 				#version 320 es
   1137 				${VERTEX_DECLARATIONS}
   1138 				out IOBlockName
   1139 				{
   1140 					mediump float var;
   1141 				} outputInstanceName;
   1142 				void main()
   1143 				{
   1144 					outputInstanceName.var = 1.0;
   1145 					${VERTEX_OUTPUT}
   1146 				}
   1147 			""
   1148 			tessellation_control ""
   1149 				#version 320 es
   1150 				${TESSELLATION_CONTROL_DECLARATIONS}
   1151 				in IOBlockName
   1152 				{
   1153 					mediump float var;
   1154 				} inputInstanceName;
   1155 				out mediump float tc_out[];
   1156 				void main()
   1157 				{
   1158 					tc_out[gl_InvocationID] = inputInstanceName.var;
   1159 					${TESSELLATION_CONTROL_OUTPUT}
   1160 				}
   1161 			""
   1162 			tessellation_evaluation ""
   1163 				#version 320 es
   1164 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1165 				in mediump float tc_out[];
   1166 				out mediump float te_out;
   1167 				void main()
   1168 				{
   1169 					te_out = tc_out[2];
   1170 					${TESSELLATION_EVALUATION_OUTPUT}
   1171 				}
   1172 			""
   1173 			fragment ""
   1174 				#version 320 es
   1175 				precision mediump float;
   1176 				${FRAGMENT_DECLARATIONS}
   1177 				in mediump float geo_out;
   1178 				void main()
   1179 				{
   1180 					out0 = geo_out;
   1181 					${FRAGMENT_OUTPUT}
   1182 				}
   1183 			""
   1184 		end
   1185 
   1186 		case input_block_array_size_mismatch
   1187 			version 320 es
   1188 			desc "Tessellation control shader input block array, size not gl_MaxPatchVertices"
   1189 			expect compile_or_link_fail
   1190 			values { output float out0 = 1.0; }
   1191 			vertex ""
   1192 				#version 320 es
   1193 				${VERTEX_DECLARATIONS}
   1194 				out IOBlockName
   1195 				{
   1196 					mediump float var;
   1197 				} outputInstanceName;
   1198 				void main()
   1199 				{
   1200 					outputInstanceName.var = 1.0;
   1201 					${VERTEX_OUTPUT}
   1202 				}
   1203 			""
   1204 			tessellation_control ""
   1205 				#version 320 es
   1206 				${TESSELLATION_CONTROL_DECLARATIONS}
   1207 				in IOBlockName
   1208 				{
   1209 					mediump float var;
   1210 				} inputInstanceName[4]; // not gl_MaxPatchVertices
   1211 				out mediump float tc_out[];
   1212 				void main()
   1213 				{
   1214 					tc_out[gl_InvocationID] = inputInstanceName[gl_InvocationID + 1].var;
   1215 					${TESSELLATION_CONTROL_OUTPUT}
   1216 				}
   1217 			""
   1218 			tessellation_evaluation ""
   1219 				#version 320 es
   1220 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1221 				in mediump float tc_out[];
   1222 				out mediump float te_out;
   1223 				void main()
   1224 				{
   1225 					te_out = tc_out[2];
   1226 					${TESSELLATION_EVALUATION_OUTPUT}
   1227 				}
   1228 			""
   1229 			fragment ""
   1230 				#version 320 es
   1231 				precision mediump float;
   1232 				${FRAGMENT_DECLARATIONS}
   1233 				in mediump float geo_out;
   1234 				void main()
   1235 				{
   1236 					out0 = geo_out;
   1237 					${FRAGMENT_OUTPUT}
   1238 				}
   1239 			""
   1240 		end
   1241 
   1242 		case output_block
   1243 			version 320 es
   1244 			desc "Tessellation shader output block"
   1245 			values { output float out0 = 1.0; }
   1246 			vertex ""
   1247 				#version 320 es
   1248 				${VERTEX_DECLARATIONS}
   1249 				void main()
   1250 				{
   1251 					${VERTEX_OUTPUT}
   1252 				}
   1253 			""
   1254 			tessellation_control ""
   1255 				#version 320 es
   1256 				${TESSELLATION_CONTROL_DECLARATIONS}
   1257 				void main()
   1258 				{
   1259 					${TESSELLATION_CONTROL_OUTPUT}
   1260 				}
   1261 			""
   1262 			tessellation_evaluation ""
   1263 				#version 320 es
   1264 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1265 				out IOBlockName
   1266 				{
   1267 					mediump float var;
   1268 				} outputInstanceName;
   1269 				void main()
   1270 				{
   1271 					outputInstanceName.var = 1.0;
   1272 					${TESSELLATION_EVALUATION_OUTPUT}
   1273 				}
   1274 			""
   1275 			fragment ""
   1276 				#version 320 es
   1277 				precision mediump float;
   1278 				${FRAGMENT_DECLARATIONS}
   1279 				in IOBlockName
   1280 				{
   1281 					mediump float var;
   1282 				} inputInstanceName;
   1283 				void main()
   1284 				{
   1285 					out0 = inputInstanceName.var;
   1286 					${FRAGMENT_OUTPUT}
   1287 				}
   1288 			""
   1289 		end
   1290 
   1291 		case output_block_array
   1292 			version 320 es
   1293 			desc "Tessellation shader output block array"
   1294 			values { output float out0 = 1.0; }
   1295 			vertex ""
   1296 				#version 320 es
   1297 				${VERTEX_DECLARATIONS}
   1298 				void main()
   1299 				{
   1300 					${VERTEX_OUTPUT}
   1301 				}
   1302 			""
   1303 			tessellation_control ""
   1304 				#version 320 es
   1305 				${TESSELLATION_CONTROL_DECLARATIONS}
   1306 				void main()
   1307 				{
   1308 					${TESSELLATION_CONTROL_OUTPUT}
   1309 				}
   1310 			""
   1311 			tessellation_evaluation ""
   1312 				#version 320 es
   1313 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1314 				out IOBlockName
   1315 				{
   1316 					mediump float var;
   1317 				} outputInstanceName[2];
   1318 				void main()
   1319 				{
   1320 					outputInstanceName[0].var = 2.0;
   1321 					outputInstanceName[1].var = 1.0;
   1322 					${TESSELLATION_EVALUATION_OUTPUT}
   1323 				}
   1324 			""
   1325 			fragment ""
   1326 				#version 320 es
   1327 				precision mediump float;
   1328 				${FRAGMENT_DECLARATIONS}
   1329 				in IOBlockName
   1330 				{
   1331 					mediump float var;
   1332 				} inputInstanceName[2];
   1333 				void main()
   1334 				{
   1335 					out0 = inputInstanceName[0].var - inputInstanceName[1].var;
   1336 					${FRAGMENT_OUTPUT}
   1337 				}
   1338 			""
   1339 		end
   1340 
   1341 		case unspecified_vertex_count
   1342 			version 320 es
   1343 			desc "Tessellation shader unspecified vertex count"
   1344 			expect compile_or_link_fail
   1345 			vertex ""
   1346 				#version 320 es
   1347 				${VERTEX_DECLARATIONS}
   1348 				void main()
   1349 				{
   1350 					${VERTEX_OUTPUT}
   1351 				}
   1352 			""
   1353 			tessellation_control ""
   1354 				#version 320 es
   1355 				void main()
   1356 				{
   1357 					${TESSELLATION_CONTROL_OUTPUT}
   1358 				}
   1359 			""
   1360 			tessellation_evaluation ""
   1361 				#version 320 es
   1362 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1363 				void main()
   1364 				{
   1365 					${TESSELLATION_EVALUATION_OUTPUT}
   1366 				}
   1367 			""
   1368 			fragment ""
   1369 				#version 320 es
   1370 				precision mediump float;
   1371 				${FRAGMENT_DECLARATIONS}
   1372 				void main()
   1373 				{
   1374 					${FRAGMENT_OUTPUT}
   1375 				}
   1376 			""
   1377 		end
   1378 
   1379 		case unspecified_primitive_mode
   1380 			version 320 es
   1381 			desc "Tessellation shader unspecified vertex count"
   1382 			expect compile_or_link_fail
   1383 			vertex ""
   1384 				#version 320 es
   1385 				${VERTEX_DECLARATIONS}
   1386 				void main()
   1387 				{
   1388 					${VERTEX_OUTPUT}
   1389 				}
   1390 			""
   1391 			tessellation_control ""
   1392 				#version 320 es
   1393 				${TESSELLATION_CONTROL_DECLARATIONS}
   1394 				void main()
   1395 				{
   1396 					${TESSELLATION_CONTROL_OUTPUT}
   1397 				}
   1398 			""
   1399 			tessellation_evaluation ""
   1400 				#version 320 es
   1401 				void main()
   1402 				{
   1403 					${TESSELLATION_EVALUATION_OUTPUT}
   1404 				}
   1405 			""
   1406 			fragment ""
   1407 				#version 320 es
   1408 				precision mediump float;
   1409 				${FRAGMENT_DECLARATIONS}
   1410 				void main()
   1411 				{
   1412 					${FRAGMENT_OUTPUT}
   1413 				}
   1414 			""
   1415 		end
   1416 	end
   1417 
   1418 	group qualifiers "Varying qualifiers"
   1419 		case smooth
   1420 			version 320 es
   1421 			desc "Smooth varying"
   1422 			values
   1423 			{
   1424 				input float in0 = 1.0;
   1425 				output float out0 = 1.0;
   1426 			}
   1427 			vertex ""
   1428 				#version 320 es
   1429 				${VERTEX_DECLARATIONS}
   1430 				smooth out mediump float tc_in;
   1431 				void main()
   1432 				{
   1433 					tc_in = in0;
   1434 					${VERTEX_OUTPUT}
   1435 				}
   1436 			""
   1437 			tessellation_control ""
   1438 				#version 320 es
   1439 				${TESSELLATION_CONTROL_DECLARATIONS}
   1440 				smooth in mediump float tc_in[];
   1441 				smooth out mediump float tc_out[];
   1442 				void main()
   1443 				{
   1444 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
   1445 					${TESSELLATION_CONTROL_OUTPUT}
   1446 				}
   1447 			""
   1448 			tessellation_evaluation ""
   1449 				#version 320 es
   1450 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1451 				smooth in mediump float tc_out[];
   1452 				smooth out mediump float te_out;
   1453 				void main()
   1454 				{
   1455 					te_out = tc_out[2];
   1456 					${TESSELLATION_EVALUATION_OUTPUT}
   1457 				}
   1458 			""
   1459 			fragment ""
   1460 				#version 320 es
   1461 				precision mediump float;
   1462 				${FRAGMENT_DECLARATIONS}
   1463 				smooth in mediump float te_out;
   1464 				void main()
   1465 				{
   1466 					out0 = te_out;
   1467 					${FRAGMENT_OUTPUT}
   1468 				}
   1469 			""
   1470 		end
   1471 
   1472 		case flat
   1473 			version 320 es
   1474 			desc "Flat varying"
   1475 			values
   1476 			{
   1477 				input float in0 = 1.0;
   1478 				output float out0 = 1.0;
   1479 			}
   1480 			vertex ""
   1481 				#version 320 es
   1482 				${VERTEX_DECLARATIONS}
   1483 				flat out mediump float tc_in;
   1484 				void main()
   1485 				{
   1486 					tc_in = in0;
   1487 					${VERTEX_OUTPUT}
   1488 				}
   1489 			""
   1490 			tessellation_control ""
   1491 				#version 320 es
   1492 				${TESSELLATION_CONTROL_DECLARATIONS}
   1493 				flat in mediump float tc_in[];
   1494 				flat out mediump float tc_out[];
   1495 				void main()
   1496 				{
   1497 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
   1498 					${TESSELLATION_CONTROL_OUTPUT}
   1499 				}
   1500 			""
   1501 			tessellation_evaluation ""
   1502 				#version 320 es
   1503 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1504 				flat in mediump float tc_out[];
   1505 				flat out mediump float te_out;
   1506 				void main()
   1507 				{
   1508 					te_out = tc_out[2];
   1509 					${TESSELLATION_EVALUATION_OUTPUT}
   1510 				}
   1511 			""
   1512 			fragment ""
   1513 				#version 320 es
   1514 				precision mediump float;
   1515 				${FRAGMENT_DECLARATIONS}
   1516 				flat in mediump float te_out;
   1517 				void main()
   1518 				{
   1519 					out0 = te_out;
   1520 					${FRAGMENT_OUTPUT}
   1521 				}
   1522 			""
   1523 		end
   1524 
   1525 		case centroid
   1526 			version 320 es
   1527 			desc "Centroid varying"
   1528 			values
   1529 			{
   1530 				input float in0 = 1.0;
   1531 				output float out0 = 1.0;
   1532 			}
   1533 			vertex ""
   1534 				#version 320 es
   1535 				${VERTEX_DECLARATIONS}
   1536 				centroid out mediump float tc_in;
   1537 				void main()
   1538 				{
   1539 					tc_in = in0;
   1540 					${VERTEX_OUTPUT}
   1541 				}
   1542 			""
   1543 			tessellation_control ""
   1544 				#version 320 es
   1545 				${TESSELLATION_CONTROL_DECLARATIONS}
   1546 				centroid in mediump float tc_in[];
   1547 				centroid out mediump float tc_out[];
   1548 				void main()
   1549 				{
   1550 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
   1551 					${TESSELLATION_CONTROL_OUTPUT}
   1552 				}
   1553 			""
   1554 			tessellation_evaluation ""
   1555 				#version 320 es
   1556 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1557 				centroid in mediump float tc_out[];
   1558 				centroid out mediump float te_out;
   1559 				void main()
   1560 				{
   1561 					te_out = tc_out[2];
   1562 					${TESSELLATION_EVALUATION_OUTPUT}
   1563 				}
   1564 			""
   1565 			fragment ""
   1566 				#version 320 es
   1567 				precision mediump float;
   1568 				${FRAGMENT_DECLARATIONS}
   1569 				centroid in mediump float te_out;
   1570 				void main()
   1571 				{
   1572 					out0 = te_out;
   1573 					${FRAGMENT_OUTPUT}
   1574 				}
   1575 			""
   1576 		end
   1577 
   1578 		case sample
   1579 			version 320 es
   1580 			desc "Sample varying"
   1581 			values
   1582 			{
   1583 				input float in0 = 1.0;
   1584 				output float out0 = 1.0;
   1585 			}
   1586 			vertex ""
   1587 				#version 320 es
   1588 				${VERTEX_DECLARATIONS}
   1589 				sample out mediump float tc_in;
   1590 				void main()
   1591 				{
   1592 					tc_in = in0;
   1593 					${VERTEX_OUTPUT}
   1594 				}
   1595 			""
   1596 			tessellation_control ""
   1597 				#version 320 es
   1598 				${TESSELLATION_CONTROL_DECLARATIONS}
   1599 				sample in mediump float tc_in[];
   1600 				sample out mediump float tc_out[];
   1601 				void main()
   1602 				{
   1603 					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
   1604 					${TESSELLATION_CONTROL_OUTPUT}
   1605 				}
   1606 			""
   1607 			tessellation_evaluation ""
   1608 				#version 320 es
   1609 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1610 				sample in mediump float tc_out[];
   1611 				sample out mediump float te_out;
   1612 				void main()
   1613 				{
   1614 					te_out = tc_out[2];
   1615 					${TESSELLATION_EVALUATION_OUTPUT}
   1616 				}
   1617 			""
   1618 			fragment ""
   1619 				#version 320 es
   1620 				precision mediump float;
   1621 				${FRAGMENT_DECLARATIONS}
   1622 				sample in mediump float te_out;
   1623 				void main()
   1624 				{
   1625 					out0 = te_out;
   1626 					${FRAGMENT_OUTPUT}
   1627 				}
   1628 			""
   1629 		end
   1630 
   1631 		case patch
   1632 			version 320 es
   1633 			desc "Pre-patch varying"
   1634 			values
   1635 			{
   1636 				input float in0 = 1.0;
   1637 				output float out0 = 1.0;
   1638 			}
   1639 			vertex ""
   1640 				#version 320 es
   1641 				${VERTEX_DECLARATIONS}
   1642 				out mediump float tc_in;
   1643 				void main()
   1644 				{
   1645 					tc_in = in0;
   1646 					${VERTEX_OUTPUT}
   1647 				}
   1648 			""
   1649 			tessellation_control ""
   1650 				#version 320 es
   1651 				${TESSELLATION_CONTROL_DECLARATIONS}
   1652 				in mediump float tc_in[];
   1653 				patch out mediump float tc_out;
   1654 				void main()
   1655 				{
   1656 					tc_out = tc_in[gl_InvocationID];
   1657 					${TESSELLATION_CONTROL_OUTPUT}
   1658 				}
   1659 			""
   1660 			tessellation_evaluation ""
   1661 				#version 320 es
   1662 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1663 				patch in mediump float tc_out;
   1664 				out mediump float te_out;
   1665 				void main()
   1666 				{
   1667 					te_out = tc_out;
   1668 					${TESSELLATION_EVALUATION_OUTPUT}
   1669 				}
   1670 			""
   1671 			fragment ""
   1672 				#version 320 es
   1673 				precision mediump float;
   1674 				${FRAGMENT_DECLARATIONS}
   1675 				in mediump float te_out;
   1676 				void main()
   1677 				{
   1678 					out0 = te_out;
   1679 					${FRAGMENT_OUTPUT}
   1680 				}
   1681 			""
   1682 		end
   1683 	end
   1684 
   1685 	import "linkage_tessellation_varying_types.test"
   1686 end
   1687 
   1688 group uniform "Uniform"
   1689 	group rules "Rules"
   1690 		case type_mismatch_1
   1691 			version 320 es
   1692 			desc "uniform type mismatch between vertex and tessellation control shaders"
   1693 			expect link_fail
   1694 			vertex ""
   1695 				#version 320 es
   1696 				${VERTEX_DECLARATIONS}
   1697 				uniform mediump float val;
   1698 				out mediump float vtx_out;
   1699 				void main()
   1700 				{
   1701 					vtx_out = val;
   1702 					${VERTEX_OUTPUT}
   1703 				}
   1704 			""
   1705 			tessellation_control ""
   1706 				#version 320 es
   1707 				${TESSELLATION_CONTROL_DECLARATIONS}
   1708 				uniform mediump vec2 val;
   1709 				in mediump float vtx_out[];
   1710 				out mediump float tc_out[];
   1711 				void main()
   1712 				{
   1713 					tc_out[gl_InvocationID] = vtx_out[0] + val.x + val.y;
   1714 					${TESSELLATION_CONTROL_OUTPUT}
   1715 				}
   1716 			""
   1717 			tessellation_evaluation ""
   1718 				#version 320 es
   1719 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1720 				in mediump float tc_out[];
   1721 				out mediump float te_out;
   1722 				void main()
   1723 				{
   1724 					te_out = tc_out[2];
   1725 					${TESSELLATION_EVALUATION_OUTPUT}
   1726 				}
   1727 			""
   1728 			fragment ""
   1729 				#version 320 es
   1730 				precision mediump float;
   1731 				${FRAGMENT_DECLARATIONS}
   1732 				in mediump float te_out;
   1733 				void main()
   1734 				{
   1735 					${FRAG_COLOR} = vec4(te_out);
   1736 				}
   1737 			""
   1738 		end
   1739 
   1740 		case type_mismatch_2
   1741 			version 320 es
   1742 			desc "uniform type mismatch between fragment and tessellation eval shaders"
   1743 			expect link_fail
   1744 			vertex ""
   1745 				#version 320 es
   1746 				${VERTEX_DECLARATIONS}
   1747 				out mediump float vtx_out;
   1748 				void main()
   1749 				{
   1750 					${VERTEX_OUTPUT}
   1751 				}
   1752 			""
   1753 			tessellation_control ""
   1754 				#version 320 es
   1755 				${TESSELLATION_CONTROL_DECLARATIONS}
   1756 				void main()
   1757 				{
   1758 					${TESSELLATION_CONTROL_OUTPUT}
   1759 				}
   1760 			""
   1761 			tessellation_evaluation ""
   1762 				#version 320 es
   1763 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1764 				uniform mediump vec3 val;
   1765 				out mediump float te_out;
   1766 				void main()
   1767 				{
   1768 					te_out = val.x + val.y + val.z;
   1769 					${TESSELLATION_EVALUATION_OUTPUT}
   1770 				}
   1771 			""
   1772 			fragment ""
   1773 				#version 320 es
   1774 				precision mediump float;
   1775 				${FRAGMENT_DECLARATIONS}
   1776 				uniform mediump vec4 val;
   1777 				in mediump float te_out;
   1778 				void main()
   1779 				{
   1780 					${FRAG_COLOR} = vec4(te_out) + val;
   1781 				}
   1782 			""
   1783 		end
   1784 
   1785 		case type_mismatch_3
   1786 			version 320 es
   1787 			desc "uniform type mismatch between tessellation control and eval shaders"
   1788 			expect link_fail
   1789 			vertex ""
   1790 				#version 320 es
   1791 				${VERTEX_DECLARATIONS}
   1792 				out mediump float vtx_out;
   1793 				void main()
   1794 				{
   1795 					${VERTEX_OUTPUT}
   1796 				}
   1797 			""
   1798 			tessellation_control ""
   1799 				#version 320 es
   1800 				${TESSELLATION_CONTROL_DECLARATIONS}
   1801 				uniform mediump vec4 val;
   1802 				out mediump vec4 tc_out[];
   1803 				void main()
   1804 				{
   1805 					tc_out[gl_InvocationID] = val;
   1806 					${TESSELLATION_CONTROL_OUTPUT}
   1807 				}
   1808 			""
   1809 			tessellation_evaluation ""
   1810 				#version 320 es
   1811 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1812 				uniform mediump vec3 val;
   1813 				in mediump vec4 tc_out[];
   1814 				out mediump float te_out;
   1815 				void main()
   1816 				{
   1817 					te_out = tc_out[0].w * val.z;
   1818 					${TESSELLATION_EVALUATION_OUTPUT}
   1819 				}
   1820 			""
   1821 			fragment ""
   1822 				#version 320 es
   1823 				precision mediump float;
   1824 				${FRAGMENT_DECLARATIONS}
   1825 				in mediump float te_out;
   1826 				void main()
   1827 				{
   1828 					${FRAG_COLOR} = vec4(te_out);
   1829 				}
   1830 			""
   1831 		end
   1832 
   1833 		case type_mismatch_4
   1834 			version 320 es
   1835 			desc "uniform type mismatch between vertex and tessellation control shaders"
   1836 			expect link_fail
   1837 			require limit "GL_MAX_VERTEX_ATOMIC_COUNTERS" > 0
   1838 			vertex ""
   1839 				#version 320 es
   1840 				${VERTEX_DECLARATIONS}
   1841 				layout(binding=0) uniform atomic_uint u_var;
   1842 				out mediump float vtx_out;
   1843 				void main()
   1844 				{
   1845 					uint result = atomicCounterIncrement(u_var);
   1846 					vtx_out = float(result);
   1847 					${VERTEX_OUTPUT}
   1848 				}
   1849 			""
   1850 			tessellation_control ""
   1851 				#version 320 es
   1852 				${TESSELLATION_CONTROL_DECLARATIONS}
   1853 				uniform mediump float u_var;
   1854 				in mediump float vtx_out[];
   1855 				out mediump float tc_out[];
   1856 				void main()
   1857 				{
   1858 					tc_out[gl_InvocationID] = vtx_out[0] + u_var;
   1859 					${TESSELLATION_CONTROL_OUTPUT}
   1860 				}
   1861 			""
   1862 			tessellation_evaluation ""
   1863 				#version 320 es
   1864 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1865 				in mediump float tc_out[];
   1866 				out mediump float te_out;
   1867 				void main()
   1868 				{
   1869 					te_out = tc_out[2];
   1870 					${TESSELLATION_EVALUATION_OUTPUT}
   1871 				}
   1872 			""
   1873 			fragment ""
   1874 				#version 320 es
   1875 				precision mediump float;
   1876 				${FRAGMENT_DECLARATIONS}
   1877 				in mediump float te_out;
   1878 				void main()
   1879 				{
   1880 					${FRAG_COLOR} = vec4(te_out);
   1881 				}
   1882 			""
   1883 		end
   1884 
   1885 		case type_mismatch_5
   1886 			version 320 es
   1887 			desc "uniform type mismatch between vertex and tessellation control shaders"
   1888 			expect link_fail
   1889 			require limit "GL_MAX_VERTEX_IMAGE_UNIFORMS" > 0
   1890 			vertex ""
   1891 				#version 320 es
   1892 				${VERTEX_DECLARATIONS}
   1893 				layout(binding=0) layout(rgba8i) uniform readonly highp iimage2D u_var;
   1894 				out mediump float vtx_out;
   1895 				void main()
   1896 				{
   1897 					int result = imageSize(u_var).x;
   1898 					vtx_out = float(result);
   1899 					${VERTEX_OUTPUT}
   1900 				}
   1901 			""
   1902 			tessellation_control ""
   1903 				#version 320 es
   1904 				${TESSELLATION_CONTROL_DECLARATIONS}
   1905 				uniform mediump float u_var;
   1906 				in mediump float vtx_out[];
   1907 				out mediump float tc_out[];
   1908 				void main()
   1909 				{
   1910 					tc_out[gl_InvocationID] = vtx_out[0] + u_var;
   1911 					${TESSELLATION_CONTROL_OUTPUT}
   1912 				}
   1913 			""
   1914 			tessellation_evaluation ""
   1915 				#version 320 es
   1916 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1917 				in mediump float tc_out[];
   1918 				out mediump float te_out;
   1919 				void main()
   1920 				{
   1921 					te_out = tc_out[2];
   1922 					${TESSELLATION_EVALUATION_OUTPUT}
   1923 				}
   1924 			""
   1925 			fragment ""
   1926 				#version 320 es
   1927 				precision mediump float;
   1928 				${FRAGMENT_DECLARATIONS}
   1929 				in mediump float te_out;
   1930 				void main()
   1931 				{
   1932 					${FRAG_COLOR} = vec4(te_out);
   1933 				}
   1934 			""
   1935 		end
   1936 
   1937 		case precision_mismatch_1
   1938 			version 320 es
   1939 			desc "uniform precision mismatch between tessellation control and eval shaders"
   1940 			expect link_fail
   1941 			vertex ""
   1942 				#version 320 es
   1943 				${VERTEX_DECLARATIONS}
   1944 				out mediump float vtx_out;
   1945 				void main()
   1946 				{
   1947 					${VERTEX_OUTPUT}
   1948 				}
   1949 			""
   1950 			tessellation_control ""
   1951 				#version 320 es
   1952 				${TESSELLATION_CONTROL_DECLARATIONS}
   1953 				uniform mediump vec4 val;
   1954 				out mediump vec4 tc_out[];
   1955 				void main()
   1956 				{
   1957 					tc_out[gl_InvocationID] = val;
   1958 					${TESSELLATION_CONTROL_OUTPUT}
   1959 				}
   1960 			""
   1961 			tessellation_evaluation ""
   1962 				#version 320 es
   1963 				${TESSELLATION_EVALUATION_DECLARATIONS}
   1964 				uniform highp vec4 val;
   1965 				in mediump vec4 tc_out[];
   1966 				out mediump float te_out;
   1967 				void main()
   1968 				{
   1969 					te_out = tc_out[0].w * val.z;
   1970 					${TESSELLATION_EVALUATION_OUTPUT}
   1971 				}
   1972 			""
   1973 			fragment ""
   1974 				#version 320 es
   1975 				precision mediump float;
   1976 				${FRAGMENT_DECLARATIONS}
   1977 				in mediump float te_out;
   1978 				void main()
   1979 				{
   1980 					${FRAG_COLOR} = vec4(te_out);
   1981 				}
   1982 			""
   1983 		end
   1984 
   1985 		case precision_mismatch_2
   1986 			version 320 es
   1987 			desc "uniform precision mismatch between vertex and tessellation control shaders"
   1988 			expect link_fail
   1989 			vertex ""
   1990 				#version 320 es
   1991 				${VERTEX_DECLARATIONS}
   1992 				uniform highp float val;
   1993 				out mediump float vtx_out;
   1994 				void main()
   1995 				{
   1996 					vtx_out = val;
   1997 					${VERTEX_OUTPUT}
   1998 				}
   1999 			""
   2000 			tessellation_control ""
   2001 				#version 320 es
   2002 				${TESSELLATION_CONTROL_DECLARATIONS}
   2003 				uniform mediump float val;
   2004 				in mediump float vtx_out[];
   2005 				out mediump float tc_out[];
   2006 				void main()
   2007 				{
   2008 					tc_out[gl_InvocationID] = vtx_out[0] + val;
   2009 					${TESSELLATION_CONTROL_OUTPUT}
   2010 				}
   2011 			""
   2012 			tessellation_evaluation ""
   2013 				#version 320 es
   2014 				${TESSELLATION_EVALUATION_DECLARATIONS}
   2015 				in mediump float tc_out[];
   2016 				out mediump float te_out;
   2017 				void main()
   2018 				{
   2019 					te_out = tc_out[2];
   2020 					${TESSELLATION_EVALUATION_OUTPUT}
   2021 				}
   2022 			""
   2023 			fragment ""
   2024 				#version 320 es
   2025 				precision mediump float;
   2026 				${FRAGMENT_DECLARATIONS}
   2027 				in mediump float te_out;
   2028 				void main()
   2029 				{
   2030 					${FRAG_COLOR} = vec4(te_out);
   2031 				}
   2032 			""
   2033 		end
   2034 
   2035 		case struct_partial_usage
   2036 			version 320 es
   2037 			desc "uniform is partially used in different shader stages"
   2038 			values
   2039 			{
   2040 				uniform float val.vtxVal		= 1.5;
   2041 				uniform float val.tcVal		= 2.5;
   2042 				uniform float val.teVal		= 6.0;
   2043 				uniform float val.fragVal	= 11.0;
   2044 				output float out0			= 68.5;
   2045 			}
   2046 			vertex ""
   2047 				#version 320 es
   2048 				${VERTEX_DECLARATIONS}
   2049 				struct S
   2050 				{
   2051 					mediump float vtxVal;
   2052 					mediump float tcVal;
   2053 					mediump float teVal;
   2054 					mediump float fragVal;
   2055 				};
   2056 				uniform S val;
   2057 				out mediump float vtx_out;
   2058 				void main()
   2059 				{
   2060 					vtx_out = val.vtxVal;
   2061 					${VERTEX_OUTPUT}
   2062 				}
   2063 			""
   2064 			tessellation_control ""
   2065 				#version 320 es
   2066 				${TESSELLATION_CONTROL_DECLARATIONS}
   2067 				struct S
   2068 				{
   2069 					mediump float vtxVal;
   2070 					mediump float tcVal;
   2071 					mediump float teVal;
   2072 					mediump float fragVal;
   2073 				};
   2074 				uniform S val;
   2075 				in mediump float vtx_out[];
   2076 				out mediump float tc_out[];
   2077 				void main()
   2078 				{
   2079 					tc_out[gl_InvocationID] = vtx_out[0] + 2.0 * val.tcVal;
   2080 					${TESSELLATION_CONTROL_OUTPUT}
   2081 				}
   2082 			""
   2083 			tessellation_evaluation ""
   2084 				#version 320 es
   2085 				${TESSELLATION_EVALUATION_DECLARATIONS}
   2086 				struct S
   2087 				{
   2088 					mediump float vtxVal;
   2089 					mediump float tcVal;
   2090 					mediump float teVal;
   2091 					mediump float fragVal;
   2092 				};
   2093 				uniform S val;
   2094 				in mediump float tc_out[];
   2095 				out mediump float te_out;
   2096 				void main()
   2097 				{
   2098 					te_out = tc_out[2] + 3.0 * val.teVal;
   2099 					${TESSELLATION_EVALUATION_OUTPUT}
   2100 				}
   2101 			""
   2102 			fragment ""
   2103 				#version 320 es
   2104 				precision mediump float;
   2105 				${FRAGMENT_DECLARATIONS}
   2106 				struct S
   2107 				{
   2108 					mediump float vtxVal;
   2109 					mediump float tcVal;
   2110 					mediump float teVal;
   2111 					mediump float fragVal;
   2112 				};
   2113 				uniform S val;
   2114 				in mediump float te_out;
   2115 				void main()
   2116 				{
   2117 					out0 = te_out + 4.0 * val.fragVal;
   2118 					${FRAGMENT_OUTPUT};
   2119 				}
   2120 			""
   2121 		end
   2122 	end
   2123 
   2124 	import "linkage_tessellation_uniform_types.test"
   2125 end
   2126