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