Home | History | Annotate | Download | only in shaders
      1 
      2 group varying "Varying linkage"
      3 	group rules "Rules"
      4 
      5 		case type_mismatch
      6 			version 310 es
      7 			desc "Tessellation output and geometry input type mismatch"
      8 			expect link_fail
      9 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
     10 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
     11 			values
     12 			{
     13 				input float in0 = 1.0;
     14 				output float out0 = 1.0;
     15 			}
     16 			vertex ""
     17 				#version 310 es
     18 				${VERTEX_DECLARATIONS}
     19 				out mediump float vtx_out;
     20 				void main()
     21 				{
     22 					vtx_out = in0;
     23 					${VERTEX_OUTPUT}
     24 				}
     25 			""
     26 			tessellation_control ""
     27 				#version 310 es
     28 				${TESSELLATION_CONTROL_DECLARATIONS}
     29 				in mediump float vtx_out[];
     30 				out mediump float tc_out[];
     31 				void main()
     32 				{
     33 					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
     34 					${TESSELLATION_CONTROL_OUTPUT}
     35 				}
     36 			""
     37 			tessellation_evaluation ""
     38 				#version 310 es
     39 				${TESSELLATION_EVALUATION_DECLARATIONS}
     40 				in mediump float tc_out[];
     41 				out mediump float te_out;
     42 				void main()
     43 				{
     44 					te_out = tc_out[2];
     45 					${TESSELLATION_EVALUATION_OUTPUT}
     46 				}
     47 			""
     48 			geometry ""
     49 				#version 310 es
     50 				${GEOMETRY_DECLARATIONS}
     51 				in mediump vec2 te_out[];
     52 				out mediump float geo_out;
     53 				void main()
     54 				{
     55 					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
     56 					{
     57 						geo_out = te_out[ndx].y;
     58 						gl_Position = gl_in[ndx].gl_Position;
     59 						EmitVertex();
     60 					}
     61 				}
     62 			""
     63 			fragment ""
     64 				#version 310 es
     65 				precision mediump float;
     66 				${FRAGMENT_DECLARATIONS}
     67 				in mediump float geo_out;
     68 				void main()
     69 				{
     70 					out0 = geo_out;
     71 					${FRAGMENT_OUTPUT}
     72 				}
     73 			""
     74 		end
     75 
     76 		case different_precision
     77 			version 310 es
     78 			desc "Tessellation output and geometry input precisions are different"
     79 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
     80 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
     81 			values
     82 			{
     83 				input float in0 = 1.0;
     84 				output float out0 = 1.0;
     85 			}
     86 			vertex ""
     87 				#version 310 es
     88 				${VERTEX_DECLARATIONS}
     89 				out mediump float vtx_out;
     90 				void main()
     91 				{
     92 					vtx_out = in0;
     93 					${VERTEX_OUTPUT}
     94 				}
     95 			""
     96 			tessellation_control ""
     97 				#version 310 es
     98 				${TESSELLATION_CONTROL_DECLARATIONS}
     99 				in mediump float vtx_out[];
    100 				out mediump float tc_out[];
    101 				void main()
    102 				{
    103 					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
    104 					${TESSELLATION_CONTROL_OUTPUT}
    105 				}
    106 			""
    107 			tessellation_evaluation ""
    108 				#version 310 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 			geometry ""
    119 				#version 310 es
    120 				${GEOMETRY_DECLARATIONS}
    121 				in highp float te_out[];
    122 				out mediump float geo_out;
    123 				void main()
    124 				{
    125 					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
    126 					{
    127 						geo_out = te_out[ndx];
    128 						gl_Position = gl_in[ndx].gl_Position;
    129 						EmitVertex();
    130 					}
    131 				}
    132 			""
    133 			fragment ""
    134 				#version 310 es
    135 				precision mediump float;
    136 				${FRAGMENT_DECLARATIONS}
    137 				in mediump float geo_out;
    138 				void main()
    139 				{
    140 					out0 = geo_out;
    141 					${FRAGMENT_OUTPUT}
    142 				}
    143 			""
    144 		end
    145 
    146 		case no_output_declaration
    147 			version 310 es
    148 			desc "Geometry input has no matching output"
    149 			expect link_fail
    150 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
    151 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
    152 			values
    153 			{
    154 				input float in0 = 1.0;
    155 				output float out0 = 1.0;
    156 			}
    157 			vertex ""
    158 				#version 310 es
    159 				${VERTEX_DECLARATIONS}
    160 				out mediump float vtx_out;
    161 				void main()
    162 				{
    163 					vtx_out = in0;
    164 					${VERTEX_OUTPUT}
    165 				}
    166 			""
    167 			tessellation_control ""
    168 				#version 310 es
    169 				${TESSELLATION_CONTROL_DECLARATIONS}
    170 				in mediump float vtx_out[];
    171 				out mediump float tc_out[];
    172 				void main()
    173 				{
    174 					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
    175 					${TESSELLATION_CONTROL_OUTPUT}
    176 				}
    177 			""
    178 			tessellation_evaluation ""
    179 				#version 310 es
    180 				${TESSELLATION_EVALUATION_DECLARATIONS}
    181 				in mediump float tc_out[];
    182 				out mediump float te_out;
    183 				void main()
    184 				{
    185 					te_out = tc_out[2];
    186 					${TESSELLATION_EVALUATION_OUTPUT}
    187 				}
    188 			""
    189 			geometry ""
    190 				#version 310 es
    191 				${GEOMETRY_DECLARATIONS}
    192 				in mediump float te_out[];
    193 				in mediump float te_out_nonexistent[];
    194 				out mediump float geo_out;
    195 				void main()
    196 				{
    197 					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
    198 					{
    199 						geo_out = te_out[ndx] + te_out_nonexistent[ndx];
    200 						gl_Position = gl_in[ndx].gl_Position;
    201 						EmitVertex();
    202 					}
    203 				}
    204 			""
    205 			fragment ""
    206 				#version 310 es
    207 				precision mediump float;
    208 				${FRAGMENT_DECLARATIONS}
    209 				in mediump float geo_out;
    210 				void main()
    211 				{
    212 					out0 = geo_out;
    213 					${FRAGMENT_OUTPUT}
    214 				}
    215 			""
    216 		end
    217 
    218 		case superfluous_output_declaration
    219 			version 310 es
    220 			desc "Tessellation shader output is never used"
    221 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
    222 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
    223 			values
    224 			{
    225 				input float in0 = 1.0;
    226 				output float out0 = 1.0;
    227 			}
    228 			vertex ""
    229 				#version 310 es
    230 				${VERTEX_DECLARATIONS}
    231 				out mediump float vtx_out;
    232 				void main()
    233 				{
    234 					vtx_out = in0;
    235 					${VERTEX_OUTPUT}
    236 				}
    237 			""
    238 			tessellation_control ""
    239 				#version 310 es
    240 				${TESSELLATION_CONTROL_DECLARATIONS}
    241 				in mediump float vtx_out[];
    242 				out mediump float tc_out[];
    243 				void main()
    244 				{
    245 					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
    246 					${TESSELLATION_CONTROL_OUTPUT}
    247 				}
    248 			""
    249 			tessellation_evaluation ""
    250 				#version 310 es
    251 				${TESSELLATION_EVALUATION_DECLARATIONS}
    252 				in mediump float tc_out[];
    253 				out mediump float te_out;
    254 				out mediump float te_out_nonexistent;
    255 				void main()
    256 				{
    257 					te_out = tc_out[2];
    258 					te_out_nonexistent = tc_out[0];
    259 					${TESSELLATION_EVALUATION_OUTPUT}
    260 				}
    261 			""
    262 			geometry ""
    263 				#version 310 es
    264 				${GEOMETRY_DECLARATIONS}
    265 				in mediump float te_out[];
    266 				out mediump float geo_out;
    267 				void main()
    268 				{
    269 					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
    270 					{
    271 						geo_out = te_out[ndx];
    272 						gl_Position = gl_in[ndx].gl_Position;
    273 						EmitVertex();
    274 					}
    275 				}
    276 			""
    277 			fragment ""
    278 				#version 310 es
    279 				precision mediump float;
    280 				${FRAGMENT_DECLARATIONS}
    281 				in mediump float geo_out;
    282 				void main()
    283 				{
    284 					out0 = geo_out;
    285 					${FRAGMENT_OUTPUT}
    286 				}
    287 			""
    288 		end
    289 
    290 		case vertex_geometry_same_varying_name_1
    291 			version 310 es
    292 			desc "Vertex output and geometry input share the same name"
    293 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
    294 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
    295 			values
    296 			{
    297 				input float in0 = 1.0;
    298 				output float out0 = 1.0;
    299 			}
    300 			vertex ""
    301 				#version 310 es
    302 				${VERTEX_DECLARATIONS}
    303 				out mediump float sharedVaringName;
    304 				void main()
    305 				{
    306 					sharedVaringName = in0;
    307 					${VERTEX_OUTPUT}
    308 				}
    309 			""
    310 			tessellation_control ""
    311 				#version 310 es
    312 				${TESSELLATION_CONTROL_DECLARATIONS}
    313 				in mediump float sharedVaringName[];
    314 				out mediump float tc_out[];
    315 				void main()
    316 				{
    317 					tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID];
    318 					${TESSELLATION_CONTROL_OUTPUT}
    319 				}
    320 			""
    321 			tessellation_evaluation ""
    322 				#version 310 es
    323 				${TESSELLATION_EVALUATION_DECLARATIONS}
    324 				in mediump float tc_out[];
    325 				out mediump float sharedVaringName;
    326 				void main()
    327 				{
    328 					sharedVaringName = tc_out[2];
    329 					${TESSELLATION_EVALUATION_OUTPUT}
    330 				}
    331 			""
    332 			geometry ""
    333 				#version 310 es
    334 				${GEOMETRY_DECLARATIONS}
    335 				in mediump float sharedVaringName[];
    336 				out mediump float geo_out;
    337 				void main()
    338 				{
    339 					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
    340 					{
    341 						geo_out = sharedVaringName[ndx];
    342 						gl_Position = gl_in[ndx].gl_Position;
    343 						EmitVertex();
    344 					}
    345 				}
    346 			""
    347 			fragment ""
    348 				#version 310 es
    349 				precision mediump float;
    350 				${FRAGMENT_DECLARATIONS}
    351 				in mediump float geo_out;
    352 				void main()
    353 				{
    354 					out0 = geo_out;
    355 					${FRAGMENT_OUTPUT}
    356 				}
    357 			""
    358 		end
    359 
    360 		case vertex_geometry_same_varying_name_2
    361 			version 310 es
    362 			desc "Vertex output and geometry input share the same name"
    363 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
    364 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
    365 			values
    366 			{
    367 				input vec2 in0 = vec2(1.0, 1.0);
    368 				output float out0 = 1.0;
    369 			}
    370 			vertex ""
    371 				#version 310 es
    372 				${VERTEX_DECLARATIONS}
    373 				out mediump vec2 sharedVaringName;
    374 				void main()
    375 				{
    376 					sharedVaringName = in0;
    377 					${VERTEX_OUTPUT}
    378 				}
    379 			""
    380 			tessellation_control ""
    381 				#version 310 es
    382 				${TESSELLATION_CONTROL_DECLARATIONS}
    383 				in mediump vec2 sharedVaringName[];
    384 				out mediump float tc_out[];
    385 				void main()
    386 				{
    387 					tc_out[gl_InvocationID] = 2.0 * sharedVaringName[gl_InvocationID].x - sharedVaringName[gl_InvocationID].y;
    388 					${TESSELLATION_CONTROL_OUTPUT}
    389 				}
    390 			""
    391 			tessellation_evaluation ""
    392 				#version 310 es
    393 				${TESSELLATION_EVALUATION_DECLARATIONS}
    394 				in mediump float tc_out[];
    395 				out mediump float sharedVaringName;
    396 				void main()
    397 				{
    398 					sharedVaringName = tc_out[2];
    399 					${TESSELLATION_EVALUATION_OUTPUT}
    400 				}
    401 			""
    402 			geometry ""
    403 				#version 310 es
    404 				${GEOMETRY_DECLARATIONS}
    405 				in mediump float sharedVaringName[];
    406 				out mediump float geo_out;
    407 				void main()
    408 				{
    409 					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
    410 					{
    411 						geo_out = sharedVaringName[ndx];
    412 						gl_Position = gl_in[ndx].gl_Position;
    413 						EmitVertex();
    414 					}
    415 				}
    416 			""
    417 			fragment ""
    418 				#version 310 es
    419 				precision mediump float;
    420 				${FRAGMENT_DECLARATIONS}
    421 				in mediump float geo_out;
    422 				void main()
    423 				{
    424 					out0 = geo_out;
    425 					${FRAGMENT_OUTPUT}
    426 				}
    427 			""
    428 		end
    429 
    430 		case io_block
    431 			version 310 es
    432 			desc "Use of io block between tessellation and geometry shaders"
    433 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
    434 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
    435 			values
    436 			{
    437 				input float in0 = 1.0;
    438 				output float out0 = 1.0;
    439 			}
    440 			vertex ""
    441 				#version 310 es
    442 				${VERTEX_DECLARATIONS}
    443 				out mediump float vtx_out;
    444 				void main()
    445 				{
    446 					vtx_out = in0;
    447 					${VERTEX_OUTPUT}
    448 				}
    449 			""
    450 			tessellation_control ""
    451 				#version 310 es
    452 				${TESSELLATION_CONTROL_DECLARATIONS}
    453 				in mediump float vtx_out[];
    454 				out mediump float tc_out[];
    455 				void main()
    456 				{
    457 					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
    458 					${TESSELLATION_CONTROL_OUTPUT}
    459 				}
    460 			""
    461 			tessellation_evaluation ""
    462 				#version 310 es
    463 				${TESSELLATION_EVALUATION_DECLARATIONS}
    464 				in mediump float tc_out[];
    465 				out IOBlockName { mediump float val; } instanceName;
    466 				void main()
    467 				{
    468 					instanceName.val = tc_out[2];
    469 					${TESSELLATION_EVALUATION_OUTPUT}
    470 				}
    471 			""
    472 			geometry ""
    473 				#version 310 es
    474 				${GEOMETRY_DECLARATIONS}
    475 				in IOBlockName { mediump float val; } instanceName[];
    476 				out mediump float geo_out;
    477 				void main()
    478 				{
    479 					geo_out = instanceName[0].val;
    480 					gl_Position = gl_in[0].gl_Position;
    481 					EmitVertex();
    482 
    483 					geo_out = instanceName[1].val;
    484 					gl_Position = gl_in[1].gl_Position;
    485 					EmitVertex();
    486 
    487 					geo_out = instanceName[2].val;
    488 					gl_Position = gl_in[2].gl_Position;
    489 					EmitVertex();
    490 				}
    491 			""
    492 			fragment ""
    493 				#version 310 es
    494 				precision mediump float;
    495 				${FRAGMENT_DECLARATIONS}
    496 				in mediump float geo_out;
    497 				void main()
    498 				{
    499 					out0 = geo_out;
    500 					${FRAGMENT_OUTPUT}
    501 				}
    502 			""
    503 		end
    504 
    505 		case array_in_io_block
    506 			version 310 es
    507 			desc "Float array in a io block between tessellation and geometry shaders"
    508 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
    509 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
    510 			values
    511 			{
    512 				input float in0 = 1.0;
    513 				output float out0 = 1.0;
    514 			}
    515 			vertex ""
    516 				#version 310 es
    517 				${VERTEX_DECLARATIONS}
    518 				out mediump float vtx_out;
    519 				void main()
    520 				{
    521 					vtx_out = in0;
    522 					${VERTEX_OUTPUT}
    523 				}
    524 			""
    525 			tessellation_control ""
    526 				#version 310 es
    527 				${TESSELLATION_CONTROL_DECLARATIONS}
    528 				in mediump float vtx_out[];
    529 				out mediump float tc_out[];
    530 				void main()
    531 				{
    532 					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
    533 					${TESSELLATION_CONTROL_OUTPUT}
    534 				}
    535 			""
    536 			tessellation_evaluation ""
    537 				#version 310 es
    538 				${TESSELLATION_EVALUATION_DECLARATIONS}
    539 				in mediump float tc_out[];
    540 				out IOBlockName { mediump float val[2]; } instanceName;
    541 				void main()
    542 				{
    543 					instanceName.val[0] = tc_out[2] + 1.0;
    544 					instanceName.val[1] = -1.0;
    545 					${TESSELLATION_EVALUATION_OUTPUT}
    546 				}
    547 			""
    548 			geometry ""
    549 				#version 310 es
    550 				${GEOMETRY_DECLARATIONS}
    551 				in IOBlockName { mediump float val[2]; } instanceName[];
    552 				out mediump float geo_out;
    553 				void main()
    554 				{
    555 					geo_out = instanceName[0].val[0] + instanceName[0].val[1];
    556 					gl_Position = gl_in[0].gl_Position;
    557 					EmitVertex();
    558 
    559 					geo_out = instanceName[1].val[0] + instanceName[1].val[1];
    560 					gl_Position = gl_in[1].gl_Position;
    561 					EmitVertex();
    562 
    563 					geo_out = instanceName[2].val[0] + instanceName[2].val[1];
    564 					gl_Position = gl_in[2].gl_Position;
    565 					EmitVertex();
    566 				}
    567 			""
    568 			fragment ""
    569 				#version 310 es
    570 				precision mediump float;
    571 				${FRAGMENT_DECLARATIONS}
    572 				in mediump float geo_out;
    573 				void main()
    574 				{
    575 					out0 = geo_out;
    576 					${FRAGMENT_OUTPUT}
    577 				}
    578 			""
    579 		end
    580 	end
    581 
    582 	import "linkage_tessellation_geometry_varying_types.test"
    583 end
    584 
    585 group uniform "Uniform linkage"
    586 	group rules "Rules"
    587 		case type_mismatch_1
    588 			version 310 es
    589 			desc "Uniform type mismatch"
    590 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
    591 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
    592 			expect link_fail
    593 			vertex ""
    594 				#version 310 es
    595 				${VERTEX_DECLARATIONS}
    596 				void main()
    597 				{
    598 					${VERTEX_OUTPUT}
    599 				}
    600 			""
    601 			tessellation_control ""
    602 				#version 310 es
    603 				${TESSELLATION_CONTROL_DECLARATIONS}
    604 				void main()
    605 				{
    606 					${TESSELLATION_CONTROL_OUTPUT}
    607 				}
    608 			""
    609 			tessellation_evaluation ""
    610 				#version 310 es
    611 				${TESSELLATION_EVALUATION_DECLARATIONS}
    612 				uniform mediump float u_value;
    613 				out mediump float te_out;
    614 				void main()
    615 				{
    616 					te_out = u_value;
    617 					${TESSELLATION_EVALUATION_OUTPUT}
    618 				}
    619 			""
    620 			geometry ""
    621 				#version 310 es
    622 				${GEOMETRY_DECLARATIONS}
    623 				uniform mediump vec2 u_value;
    624 				in mediump float te_out[];
    625 				out mediump float geo_out;
    626 				void main()
    627 				{
    628 					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
    629 					{
    630 						geo_out = te_out[ndx] + u_value.y;
    631 						gl_Position = gl_in[ndx].gl_Position;
    632 						EmitVertex();
    633 					}
    634 				}
    635 			""
    636 			fragment ""
    637 				#version 310 es
    638 				precision mediump float;
    639 				${FRAGMENT_DECLARATIONS}
    640 				in mediump float geo_out;
    641 				void main()
    642 				{
    643 					${FRAG_COLOR} = vec4(geo_out);
    644 				}
    645 			""
    646 		end
    647 
    648 		case precision_mismatch_1
    649 			version 310 es
    650 			desc "Uniform precision mismatch"
    651 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
    652 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
    653 			expect link_fail
    654 			vertex ""
    655 				#version 310 es
    656 				${VERTEX_DECLARATIONS}
    657 				void main()
    658 				{
    659 					${VERTEX_OUTPUT}
    660 				}
    661 			""
    662 			tessellation_control ""
    663 				#version 310 es
    664 				${TESSELLATION_CONTROL_DECLARATIONS}
    665 				void main()
    666 				{
    667 					${TESSELLATION_CONTROL_OUTPUT}
    668 				}
    669 			""
    670 			tessellation_evaluation ""
    671 				#version 310 es
    672 				${TESSELLATION_EVALUATION_DECLARATIONS}
    673 				uniform mediump float u_value;
    674 				out mediump float te_out;
    675 				void main()
    676 				{
    677 					te_out = u_value;
    678 					${TESSELLATION_EVALUATION_OUTPUT}
    679 				}
    680 			""
    681 			geometry ""
    682 				#version 310 es
    683 				${GEOMETRY_DECLARATIONS}
    684 				uniform highp float u_value;
    685 				in mediump float te_out[];
    686 				out mediump float geo_out;
    687 				void main()
    688 				{
    689 					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
    690 					{
    691 						geo_out = te_out[ndx] + u_value;
    692 						gl_Position = gl_in[ndx].gl_Position;
    693 						EmitVertex();
    694 					}
    695 				}
    696 			""
    697 			fragment ""
    698 				#version 310 es
    699 				precision mediump float;
    700 				${FRAGMENT_DECLARATIONS}
    701 				in mediump float geo_out;
    702 				void main()
    703 				{
    704 					${FRAG_COLOR} = vec4(geo_out);
    705 				}
    706 			""
    707 		end
    708 
    709 		case struct_partial_usage
    710 			version 310 es
    711 			desc "Uniform precision mismatch"
    712 			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
    713 			require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
    714 			values
    715 			{
    716 				uniform float u_value.teVal = 1.0;
    717 				uniform float u_value.geoVal = 2.0;
    718 				output float out0 = 5.0;
    719 			}
    720 			vertex ""
    721 				#version 310 es
    722 				${VERTEX_DECLARATIONS}
    723 				void main()
    724 				{
    725 					${VERTEX_OUTPUT}
    726 				}
    727 			""
    728 			tessellation_control ""
    729 				#version 310 es
    730 				${TESSELLATION_CONTROL_DECLARATIONS}
    731 				void main()
    732 				{
    733 					${TESSELLATION_CONTROL_OUTPUT}
    734 				}
    735 			""
    736 			tessellation_evaluation ""
    737 				#version 310 es
    738 				${TESSELLATION_EVALUATION_DECLARATIONS}
    739 				struct S
    740 				{
    741 					mediump float teVal;
    742 					mediump float geoVal;
    743 				};
    744 				uniform S u_value;
    745 				out mediump float te_out;
    746 				void main()
    747 				{
    748 					te_out = u_value.teVal;
    749 					${TESSELLATION_EVALUATION_OUTPUT}
    750 				}
    751 			""
    752 			geometry ""
    753 				#version 310 es
    754 				${GEOMETRY_DECLARATIONS}
    755 				struct S
    756 				{
    757 					mediump float teVal;
    758 					mediump float geoVal;
    759 				};
    760 				uniform S u_value;
    761 				in mediump float te_out[];
    762 				out mediump float geo_out;
    763 				void main()
    764 				{
    765 					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
    766 					{
    767 						geo_out = te_out[ndx] + 2.0 * u_value.geoVal;
    768 						gl_Position = gl_in[ndx].gl_Position;
    769 						EmitVertex();
    770 					}
    771 				}
    772 			""
    773 			fragment ""
    774 				#version 310 es
    775 				precision mediump float;
    776 				${FRAGMENT_DECLARATIONS}
    777 				in mediump float geo_out;
    778 				void main()
    779 				{
    780 					out0 = geo_out;
    781 					${FRAGMENT_OUTPUT}
    782 				}
    783 			""
    784 		end
    785 	end
    786 end
    787