xref: /aosp_15_r20/external/deqp/data/gles31/shaders/es31/linkage_tessellation.test (revision 35238bce31c2a825756842865a792f8cf7f89930)
1
2group 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 output_non_array
858            version 310 es
859            desc "Tessellation control output out not an array"
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[];
881                out mediump float tc_out; // not an array
882                void main()
883                {
884                    tc_out = 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 input_array_size_mismatch
913            version 310 es
914            desc "Tessellation control input array size is not gl_MaxPatchVertices"
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[2]; // not gl_MaxPatchVertices
936                out mediump float tc_out[];
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[];
947                out mediump float te_out;
948                void main()
949                {
950                    te_out = tc_out[2];
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 internal_array_size_mismatch
968            version 310 es
969            desc "Tessellation control output array size is not consistent with layout qualifier"
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                out mediump float tc_out[2]; // does not match output layout qualifier
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[2];
1002                out mediump float te_out;
1003                void main()
1004                {
1005                    te_out = tc_out[1];
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 invalid_patch_in_usage
1023            version 310 es
1024            desc "Invalid use of the patch_in qualifier in a non-tessellation shader"
1025            expect compile_or_link_fail
1026            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
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 frag_in;
1036                out mediump float var;
1037                void main()
1038                {
1039                    frag_in = in0;
1040                    var = 2.0;
1041                    ${VERTEX_OUTPUT}
1042                }
1043            ""
1044            fragment ""
1045                #version 310 es
1046                precision mediump float;
1047                ${FRAGMENT_DECLARATIONS}
1048                patch in mediump float var; // invalid use of patch_in
1049                in mediump float frag_in;
1050                void main()
1051                {
1052                    out0 = frag_in * var;
1053                    ${FRAGMENT_OUTPUT}
1054                }
1055            ""
1056        end
1057
1058        case invalid_patch_out_usage
1059            version 310 es
1060            desc "Invalid use of the patch_out qualifier in a non-tessellation shader"
1061            expect compile_or_link_fail
1062            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1063            values
1064            {
1065                input float in0 = 1.0;
1066                output float out0 = 1.0;
1067            }
1068            vertex ""
1069                #version 310 es
1070                ${VERTEX_DECLARATIONS}
1071                out mediump float frag_in;
1072                patch out mediump float var;
1073                void main()
1074                {
1075                    frag_in = in0;
1076                    var = 2.0;
1077                    ${VERTEX_OUTPUT}
1078                }
1079            ""
1080            fragment ""
1081                #version 310 es
1082                precision mediump float;
1083                ${FRAGMENT_DECLARATIONS}
1084                in mediump float var; // invalid use of patch_out
1085                in mediump float frag_in;
1086                void main()
1087                {
1088                    out0 = frag_in * var;
1089                    ${FRAGMENT_OUTPUT}
1090                }
1091            ""
1092        end
1093
1094        case invalid_per_patch_qualifier_usage
1095            version 310 es
1096            desc "Invalid use of per-patch qualifier on input variable in tessellation control shader"
1097            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1098            expect compile_or_link_fail
1099            values
1100            {
1101                input float in0 = 1.0;
1102                output float out0 = 1.0;
1103            }
1104            vertex ""
1105                #version 310 es
1106                ${VERTEX_DECLARATIONS}
1107                out mediump float tc_in;
1108                void main()
1109                {
1110                    tc_in = in0;
1111                    ${VERTEX_OUTPUT}
1112                }
1113            ""
1114            tessellation_control ""
1115                #version 310 es
1116                ${TESSELLATION_CONTROL_DECLARATIONS}
1117                patch in mediump float tc_in; // patch in not allowed in TCS
1118                patch out mediump float tc_out;
1119                void main()
1120                {
1121                    tc_out = tc_in;
1122                    ${TESSELLATION_CONTROL_OUTPUT}
1123                }
1124            ""
1125            tessellation_evaluation ""
1126                #version 310 es
1127                ${TESSELLATION_EVALUATION_DECLARATIONS}
1128                patch in mediump float tc_out;
1129                out mediump float te_out;
1130                void main()
1131                {
1132                    te_out = tc_out;
1133                    ${TESSELLATION_EVALUATION_OUTPUT}
1134                }
1135            ""
1136            fragment ""
1137                #version 310 es
1138                precision mediump float;
1139                ${FRAGMENT_DECLARATIONS}
1140                in mediump float te_out;
1141                void main()
1142                {
1143                    out0 = te_out;
1144                    ${FRAGMENT_OUTPUT}
1145                }
1146            ""
1147        end
1148
1149        case per_patch_qualifier_mismatch_1
1150            version 310 es
1151            desc "Tessellation control output is per-patch qualified, evaluation input is not"
1152            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1153            expect compile_or_link_fail
1154            values
1155            {
1156                input float in0 = 1.0;
1157                output float out0 = 1.0;
1158            }
1159            vertex ""
1160                #version 310 es
1161                ${VERTEX_DECLARATIONS}
1162                out mediump float tc_in;
1163                void main()
1164                {
1165                    tc_in = in0;
1166                    ${VERTEX_OUTPUT}
1167                }
1168            ""
1169            tessellation_control ""
1170                #version 310 es
1171                ${TESSELLATION_CONTROL_DECLARATIONS}
1172                in mediump float tc_in[];
1173                patch out mediump float tc_out[gl_MaxPatchVertices];
1174                void main()
1175                {
1176                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1177                    ${TESSELLATION_CONTROL_OUTPUT}
1178                }
1179            ""
1180            tessellation_evaluation ""
1181                #version 310 es
1182                ${TESSELLATION_EVALUATION_DECLARATIONS}
1183                in mediump float tc_out[gl_MaxPatchVertices];
1184                out mediump float te_out;
1185                void main()
1186                {
1187                    te_out = tc_out[2];
1188                    ${TESSELLATION_EVALUATION_OUTPUT}
1189                }
1190            ""
1191            fragment ""
1192                #version 310 es
1193                precision mediump float;
1194                ${FRAGMENT_DECLARATIONS}
1195                in mediump float te_out;
1196                void main()
1197                {
1198                    out0 = te_out;
1199                    ${FRAGMENT_OUTPUT}
1200                }
1201            ""
1202        end
1203
1204        case per_patch_qualifier_mismatch_2
1205            version 310 es
1206            desc "Tessellation control output is not per-patch qualified, evaluation input is"
1207            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1208            expect compile_or_link_fail
1209            values
1210            {
1211                input float in0 = 1.0;
1212                output float out0 = 1.0;
1213            }
1214            vertex ""
1215                #version 310 es
1216                ${VERTEX_DECLARATIONS}
1217                out mediump float tc_in;
1218                void main()
1219                {
1220                    tc_in = in0;
1221                    ${VERTEX_OUTPUT}
1222                }
1223            ""
1224            tessellation_control ""
1225                #version 310 es
1226                ${TESSELLATION_CONTROL_DECLARATIONS}
1227                in mediump float tc_in[];
1228                out mediump float tc_out[gl_MaxPatchVertices];
1229                void main()
1230                {
1231                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1232                    ${TESSELLATION_CONTROL_OUTPUT}
1233                }
1234            ""
1235            tessellation_evaluation ""
1236                #version 310 es
1237                ${TESSELLATION_EVALUATION_DECLARATIONS}
1238                patch in mediump float tc_out[gl_MaxPatchVertices];
1239                out mediump float te_out;
1240                void main()
1241                {
1242                    te_out = tc_out[2];
1243                    ${TESSELLATION_EVALUATION_OUTPUT}
1244                }
1245            ""
1246            fragment ""
1247                #version 310 es
1248                precision mediump float;
1249                ${FRAGMENT_DECLARATIONS}
1250                in mediump float te_out;
1251                void main()
1252                {
1253                    out0 = te_out;
1254                    ${FRAGMENT_OUTPUT}
1255                }
1256            ""
1257        end
1258
1259        case input_block
1260            version 310 es
1261            desc "Tessellation control shader input block"
1262            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1263            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1264            values { output float out0 = 1.0; }
1265            vertex ""
1266                #version 310 es
1267                ${VERTEX_DECLARATIONS}
1268                out IOBlockName
1269                {
1270                    mediump float var;
1271                } outputInstanceName;
1272                void main()
1273                {
1274                    outputInstanceName.var = 1.0;
1275                    ${VERTEX_OUTPUT}
1276                }
1277            ""
1278            tessellation_control ""
1279                #version 310 es
1280                ${TESSELLATION_CONTROL_DECLARATIONS}
1281                in IOBlockName
1282                {
1283                    mediump float var;
1284                } inputInstanceName[];
1285                out mediump float tc_out[];
1286                void main()
1287                {
1288                    tc_out[gl_InvocationID] = inputInstanceName[gl_InvocationID].var;
1289                    ${TESSELLATION_CONTROL_OUTPUT}
1290                }
1291            ""
1292            tessellation_evaluation ""
1293                #version 310 es
1294                ${TESSELLATION_EVALUATION_DECLARATIONS}
1295                in mediump float tc_out[];
1296                out mediump float te_out;
1297                void main()
1298                {
1299                    te_out = tc_out[2];
1300                    ${TESSELLATION_EVALUATION_OUTPUT}
1301                }
1302            ""
1303            fragment ""
1304                #version 310 es
1305                precision mediump float;
1306                ${FRAGMENT_DECLARATIONS}
1307                in mediump float te_out;
1308                void main()
1309                {
1310                    out0 = te_out;
1311                    ${FRAGMENT_OUTPUT}
1312                }
1313            ""
1314        end
1315
1316        case input_block_non_array
1317            version 310 es
1318            desc "Tessellation control shader input block without explicit array"
1319            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1320            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1321            expect compile_or_link_fail
1322            values { output float out0 = 1.0; }
1323            vertex ""
1324                #version 310 es
1325                ${VERTEX_DECLARATIONS}
1326                out IOBlockName
1327                {
1328                    mediump float var;
1329                } outputInstanceName;
1330                void main()
1331                {
1332                    outputInstanceName.var = 1.0;
1333                    ${VERTEX_OUTPUT}
1334                }
1335            ""
1336            tessellation_control ""
1337                #version 310 es
1338                ${TESSELLATION_CONTROL_DECLARATIONS}
1339                in IOBlockName
1340                {
1341                    mediump float var;
1342                } inputInstanceName;
1343                out mediump float tc_out[];
1344                void main()
1345                {
1346                    tc_out[gl_InvocationID] = inputInstanceName.var;
1347                    ${TESSELLATION_CONTROL_OUTPUT}
1348                }
1349            ""
1350            tessellation_evaluation ""
1351                #version 310 es
1352                ${TESSELLATION_EVALUATION_DECLARATIONS}
1353                in mediump float tc_out[];
1354                out mediump float te_out;
1355                void main()
1356                {
1357                    te_out = tc_out[2];
1358                    ${TESSELLATION_EVALUATION_OUTPUT}
1359                }
1360            ""
1361            fragment ""
1362                #version 310 es
1363                precision mediump float;
1364                ${FRAGMENT_DECLARATIONS}
1365                in mediump float geo_out;
1366                void main()
1367                {
1368                    out0 = geo_out;
1369                    ${FRAGMENT_OUTPUT}
1370                }
1371            ""
1372        end
1373
1374        case output_block_non_array
1375            version 310 es
1376            desc "Tessellation control shader output block without explicit array"
1377            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1378            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1379            expect compile_or_link_fail
1380            values { output float out0 = 1.0; }
1381            vertex ""
1382                #version 310 es
1383                ${VERTEX_DECLARATIONS}
1384                out mediump float tc_in;
1385                void main()
1386                {
1387                    tc_in = 1.0;
1388                    ${VERTEX_OUTPUT}
1389                }
1390            ""
1391            tessellation_control ""
1392                #version 310 es
1393                ${TESSELLATION_CONTROL_DECLARATIONS}
1394                in mediump float tc_in[];
1395                out IOBlockName
1396                {
1397                    mediump float var;
1398                } outputInstanceName; // not an array
1399                void main()
1400                {
1401                    outputInstanceName.var = tc_in[gl_InvocationID];
1402                    ${TESSELLATION_CONTROL_OUTPUT}
1403                }
1404            ""
1405            tessellation_evaluation ""
1406                #version 310 es
1407                ${TESSELLATION_EVALUATION_DECLARATIONS}
1408                in IOBlockName
1409                {
1410                    mediump float var;
1411                } outputInstanceName[];
1412                out mediump float te_out;
1413                void main()
1414                {
1415                    te_out = outputInstanceName[2].var;
1416                    ${TESSELLATION_EVALUATION_OUTPUT}
1417                }
1418            ""
1419            fragment ""
1420                #version 310 es
1421                precision mediump float;
1422                ${FRAGMENT_DECLARATIONS}
1423                in mediump float te_out;
1424                void main()
1425                {
1426                    out0 = te_out;
1427                    ${FRAGMENT_OUTPUT}
1428                }
1429            ""
1430        end
1431
1432        case input_block_array_size_mismatch
1433            version 310 es
1434            desc "Tessellation control shader input block array, size not gl_MaxPatchVertices"
1435            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1436            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1437            expect compile_or_link_fail
1438            values { output float out0 = 1.0; }
1439            vertex ""
1440                #version 310 es
1441                ${VERTEX_DECLARATIONS}
1442                out IOBlockName
1443                {
1444                    mediump float var;
1445                } outputInstanceName;
1446                void main()
1447                {
1448                    outputInstanceName.var = 1.0;
1449                    ${VERTEX_OUTPUT}
1450                }
1451            ""
1452            tessellation_control ""
1453                #version 310 es
1454                ${TESSELLATION_CONTROL_DECLARATIONS}
1455                in IOBlockName
1456                {
1457                    mediump float var;
1458                } inputInstanceName[4]; // not gl_MaxPatchVertices
1459                out mediump float tc_out[];
1460                void main()
1461                {
1462                    tc_out[gl_InvocationID] = inputInstanceName[gl_InvocationID + 1].var;
1463                    ${TESSELLATION_CONTROL_OUTPUT}
1464                }
1465            ""
1466            tessellation_evaluation ""
1467                #version 310 es
1468                ${TESSELLATION_EVALUATION_DECLARATIONS}
1469                in mediump float tc_out[];
1470                out mediump float te_out;
1471                void main()
1472                {
1473                    te_out = tc_out[2];
1474                    ${TESSELLATION_EVALUATION_OUTPUT}
1475                }
1476            ""
1477            fragment ""
1478                #version 310 es
1479                precision mediump float;
1480                ${FRAGMENT_DECLARATIONS}
1481                in mediump float geo_out;
1482                void main()
1483                {
1484                    out0 = geo_out;
1485                    ${FRAGMENT_OUTPUT}
1486                }
1487            ""
1488        end
1489
1490        case output_block
1491            version 310 es
1492            desc "Tessellation shader output block"
1493            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1494            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1495            values { output float out0 = 1.0; }
1496            vertex ""
1497                #version 310 es
1498                ${VERTEX_DECLARATIONS}
1499                void main()
1500                {
1501                    ${VERTEX_OUTPUT}
1502                }
1503            ""
1504            tessellation_control ""
1505                #version 310 es
1506                ${TESSELLATION_CONTROL_DECLARATIONS}
1507                void main()
1508                {
1509                    ${TESSELLATION_CONTROL_OUTPUT}
1510                }
1511            ""
1512            tessellation_evaluation ""
1513                #version 310 es
1514                ${TESSELLATION_EVALUATION_DECLARATIONS}
1515                out IOBlockName
1516                {
1517                    mediump float var;
1518                } outputInstanceName;
1519                void main()
1520                {
1521                    outputInstanceName.var = 1.0;
1522                    ${TESSELLATION_EVALUATION_OUTPUT}
1523                }
1524            ""
1525            fragment ""
1526                #version 310 es
1527                precision mediump float;
1528                ${FRAGMENT_DECLARATIONS}
1529                in IOBlockName
1530                {
1531                    mediump float var;
1532                } inputInstanceName;
1533                void main()
1534                {
1535                    out0 = inputInstanceName.var;
1536                    ${FRAGMENT_OUTPUT}
1537                }
1538            ""
1539        end
1540
1541        case output_block_array
1542            version 310 es
1543            desc "Tessellation shader output block array"
1544            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1545            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1546            values { output float out0 = 1.0; }
1547            vertex ""
1548                #version 310 es
1549                ${VERTEX_DECLARATIONS}
1550                void main()
1551                {
1552                    ${VERTEX_OUTPUT}
1553                }
1554            ""
1555            tessellation_control ""
1556                #version 310 es
1557                ${TESSELLATION_CONTROL_DECLARATIONS}
1558                void main()
1559                {
1560                    ${TESSELLATION_CONTROL_OUTPUT}
1561                }
1562            ""
1563            tessellation_evaluation ""
1564                #version 310 es
1565                ${TESSELLATION_EVALUATION_DECLARATIONS}
1566                out IOBlockName
1567                {
1568                    mediump float var;
1569                } outputInstanceName[2];
1570                void main()
1571                {
1572                    outputInstanceName[0].var = 2.0;
1573                    outputInstanceName[1].var = 1.0;
1574                    ${TESSELLATION_EVALUATION_OUTPUT}
1575                }
1576            ""
1577            fragment ""
1578                #version 310 es
1579                precision mediump float;
1580                ${FRAGMENT_DECLARATIONS}
1581                in IOBlockName
1582                {
1583                    mediump float var;
1584                } inputInstanceName[2];
1585                void main()
1586                {
1587                    out0 = inputInstanceName[0].var - inputInstanceName[1].var;
1588                    ${FRAGMENT_OUTPUT}
1589                }
1590            ""
1591        end
1592
1593        case unspecified_vertex_count
1594            version 310 es
1595            desc "Tessellation shader unspecified vertex count"
1596            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1597            expect compile_or_link_fail
1598            vertex ""
1599                #version 310 es
1600                ${VERTEX_DECLARATIONS}
1601                void main()
1602                {
1603                    ${VERTEX_OUTPUT}
1604                }
1605            ""
1606            tessellation_control ""
1607                #version 310 es
1608                void main()
1609                {
1610                    ${TESSELLATION_CONTROL_OUTPUT}
1611                }
1612            ""
1613            tessellation_evaluation ""
1614                #version 310 es
1615                ${TESSELLATION_EVALUATION_DECLARATIONS}
1616                void main()
1617                {
1618                    ${TESSELLATION_EVALUATION_OUTPUT}
1619                }
1620            ""
1621            fragment ""
1622                #version 310 es
1623                precision mediump float;
1624                ${FRAGMENT_DECLARATIONS}
1625                void main()
1626                {
1627                    ${FRAGMENT_OUTPUT}
1628                }
1629            ""
1630        end
1631
1632        case unspecified_primitive_mode
1633            version 310 es
1634            desc "Tessellation shader unspecified vertex count"
1635            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1636            expect compile_or_link_fail
1637            vertex ""
1638                #version 310 es
1639                ${VERTEX_DECLARATIONS}
1640                void main()
1641                {
1642                    ${VERTEX_OUTPUT}
1643                }
1644            ""
1645            tessellation_control ""
1646                #version 310 es
1647                ${TESSELLATION_CONTROL_DECLARATIONS}
1648                void main()
1649                {
1650                    ${TESSELLATION_CONTROL_OUTPUT}
1651                }
1652            ""
1653            tessellation_evaluation ""
1654                #version 310 es
1655                void main()
1656                {
1657                    ${TESSELLATION_EVALUATION_OUTPUT}
1658                }
1659            ""
1660            fragment ""
1661                #version 310 es
1662                precision mediump float;
1663                ${FRAGMENT_DECLARATIONS}
1664                void main()
1665                {
1666                    ${FRAGMENT_OUTPUT}
1667                }
1668            ""
1669        end
1670    end
1671
1672    group qualifiers "Varying qualifiers"
1673        case smooth
1674            version 310 es
1675            desc "Smooth varying"
1676            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1677            values
1678            {
1679                input float in0 = 1.0;
1680                output float out0 = 1.0;
1681            }
1682            vertex ""
1683                #version 310 es
1684                ${VERTEX_DECLARATIONS}
1685                smooth out mediump float tc_in;
1686                void main()
1687                {
1688                    tc_in = in0;
1689                    ${VERTEX_OUTPUT}
1690                }
1691            ""
1692            tessellation_control ""
1693                #version 310 es
1694                ${TESSELLATION_CONTROL_DECLARATIONS}
1695                smooth in mediump float tc_in[];
1696                smooth out mediump float tc_out[];
1697                void main()
1698                {
1699                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1700                    ${TESSELLATION_CONTROL_OUTPUT}
1701                }
1702            ""
1703            tessellation_evaluation ""
1704                #version 310 es
1705                ${TESSELLATION_EVALUATION_DECLARATIONS}
1706                smooth in mediump float tc_out[];
1707                smooth out mediump float te_out;
1708                void main()
1709                {
1710                    te_out = tc_out[2];
1711                    ${TESSELLATION_EVALUATION_OUTPUT}
1712                }
1713            ""
1714            fragment ""
1715                #version 310 es
1716                precision mediump float;
1717                ${FRAGMENT_DECLARATIONS}
1718                smooth in mediump float te_out;
1719                void main()
1720                {
1721                    out0 = te_out;
1722                    ${FRAGMENT_OUTPUT}
1723                }
1724            ""
1725        end
1726
1727        case flat
1728            version 310 es
1729            desc "Flat varying"
1730            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1731            values
1732            {
1733                input float in0 = 1.0;
1734                output float out0 = 1.0;
1735            }
1736            vertex ""
1737                #version 310 es
1738                ${VERTEX_DECLARATIONS}
1739                flat out mediump float tc_in;
1740                void main()
1741                {
1742                    tc_in = in0;
1743                    ${VERTEX_OUTPUT}
1744                }
1745            ""
1746            tessellation_control ""
1747                #version 310 es
1748                ${TESSELLATION_CONTROL_DECLARATIONS}
1749                flat in mediump float tc_in[];
1750                flat out mediump float tc_out[];
1751                void main()
1752                {
1753                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1754                    ${TESSELLATION_CONTROL_OUTPUT}
1755                }
1756            ""
1757            tessellation_evaluation ""
1758                #version 310 es
1759                ${TESSELLATION_EVALUATION_DECLARATIONS}
1760                flat in mediump float tc_out[];
1761                flat out mediump float te_out;
1762                void main()
1763                {
1764                    te_out = tc_out[2];
1765                    ${TESSELLATION_EVALUATION_OUTPUT}
1766                }
1767            ""
1768            fragment ""
1769                #version 310 es
1770                precision mediump float;
1771                ${FRAGMENT_DECLARATIONS}
1772                flat in mediump float te_out;
1773                void main()
1774                {
1775                    out0 = te_out;
1776                    ${FRAGMENT_OUTPUT}
1777                }
1778            ""
1779        end
1780
1781        case centroid
1782            version 310 es
1783            desc "Centroid varying"
1784            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1785            values
1786            {
1787                input float in0 = 1.0;
1788                output float out0 = 1.0;
1789            }
1790            vertex ""
1791                #version 310 es
1792                ${VERTEX_DECLARATIONS}
1793                centroid out mediump float tc_in;
1794                void main()
1795                {
1796                    tc_in = in0;
1797                    ${VERTEX_OUTPUT}
1798                }
1799            ""
1800            tessellation_control ""
1801                #version 310 es
1802                ${TESSELLATION_CONTROL_DECLARATIONS}
1803                centroid in mediump float tc_in[];
1804                centroid out mediump float tc_out[];
1805                void main()
1806                {
1807                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1808                    ${TESSELLATION_CONTROL_OUTPUT}
1809                }
1810            ""
1811            tessellation_evaluation ""
1812                #version 310 es
1813                ${TESSELLATION_EVALUATION_DECLARATIONS}
1814                centroid in mediump float tc_out[];
1815                centroid out mediump float te_out;
1816                void main()
1817                {
1818                    te_out = tc_out[2];
1819                    ${TESSELLATION_EVALUATION_OUTPUT}
1820                }
1821            ""
1822            fragment ""
1823                #version 310 es
1824                precision mediump float;
1825                ${FRAGMENT_DECLARATIONS}
1826                centroid in mediump float te_out;
1827                void main()
1828                {
1829                    out0 = te_out;
1830                    ${FRAGMENT_OUTPUT}
1831                }
1832            ""
1833        end
1834
1835        case sample
1836            version 310 es
1837            desc "Sample varying"
1838            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1839            require extension { "GL_OES_shader_multisample_interpolation" }
1840            values
1841            {
1842                input float in0 = 1.0;
1843                output float out0 = 1.0;
1844            }
1845            vertex ""
1846                #version 310 es
1847                ${VERTEX_DECLARATIONS}
1848                sample out mediump float tc_in;
1849                void main()
1850                {
1851                    tc_in = in0;
1852                    ${VERTEX_OUTPUT}
1853                }
1854            ""
1855            tessellation_control ""
1856                #version 310 es
1857                ${TESSELLATION_CONTROL_DECLARATIONS}
1858                sample in mediump float tc_in[];
1859                sample out mediump float tc_out[];
1860                void main()
1861                {
1862                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1863                    ${TESSELLATION_CONTROL_OUTPUT}
1864                }
1865            ""
1866            tessellation_evaluation ""
1867                #version 310 es
1868                ${TESSELLATION_EVALUATION_DECLARATIONS}
1869                sample in mediump float tc_out[];
1870                sample out mediump float te_out;
1871                void main()
1872                {
1873                    te_out = tc_out[2];
1874                    ${TESSELLATION_EVALUATION_OUTPUT}
1875                }
1876            ""
1877            fragment ""
1878                #version 310 es
1879                precision mediump float;
1880                ${FRAGMENT_DECLARATIONS}
1881                sample in mediump float te_out;
1882                void main()
1883                {
1884                    out0 = te_out;
1885                    ${FRAGMENT_OUTPUT}
1886                }
1887            ""
1888        end
1889
1890        case patch
1891            version 310 es
1892            desc "Pre-patch varying"
1893            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1894            values
1895            {
1896                input float in0 = 1.0;
1897                output float out0 = 1.0;
1898            }
1899            vertex ""
1900                #version 310 es
1901                ${VERTEX_DECLARATIONS}
1902                out mediump float tc_in;
1903                void main()
1904                {
1905                    tc_in = in0;
1906                    ${VERTEX_OUTPUT}
1907                }
1908            ""
1909            tessellation_control ""
1910                #version 310 es
1911                ${TESSELLATION_CONTROL_DECLARATIONS}
1912                in mediump float tc_in[];
1913                patch out mediump float tc_out;
1914                void main()
1915                {
1916                    tc_out = tc_in[gl_InvocationID];
1917                    ${TESSELLATION_CONTROL_OUTPUT}
1918                }
1919            ""
1920            tessellation_evaluation ""
1921                #version 310 es
1922                ${TESSELLATION_EVALUATION_DECLARATIONS}
1923                patch in mediump float tc_out;
1924                out mediump float te_out;
1925                void main()
1926                {
1927                    te_out = tc_out;
1928                    ${TESSELLATION_EVALUATION_OUTPUT}
1929                }
1930            ""
1931            fragment ""
1932                #version 310 es
1933                precision mediump float;
1934                ${FRAGMENT_DECLARATIONS}
1935                in mediump float te_out;
1936                void main()
1937                {
1938                    out0 = te_out;
1939                    ${FRAGMENT_OUTPUT}
1940                }
1941            ""
1942        end
1943    end
1944
1945    import "linkage_tessellation_varying_types.test"
1946end
1947
1948group uniform "Uniform"
1949    group rules "Rules"
1950        case type_mismatch_1
1951            version 310 es
1952            desc "uniform type mismatch between vertex and tessellation control shaders"
1953            expect link_fail
1954            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1955            vertex ""
1956                #version 310 es
1957                ${VERTEX_DECLARATIONS}
1958                uniform mediump float val;
1959                out mediump float vtx_out;
1960                void main()
1961                {
1962                    vtx_out = val;
1963                    ${VERTEX_OUTPUT}
1964                }
1965            ""
1966            tessellation_control ""
1967                #version 310 es
1968                ${TESSELLATION_CONTROL_DECLARATIONS}
1969                uniform mediump vec2 val;
1970                in mediump float vtx_out[];
1971                out mediump float tc_out[];
1972                void main()
1973                {
1974                    tc_out[gl_InvocationID] = vtx_out[0] + val.x + val.y;
1975                    ${TESSELLATION_CONTROL_OUTPUT}
1976                }
1977            ""
1978            tessellation_evaluation ""
1979                #version 310 es
1980                ${TESSELLATION_EVALUATION_DECLARATIONS}
1981                in mediump float tc_out[];
1982                out mediump float te_out;
1983                void main()
1984                {
1985                    te_out = tc_out[2];
1986                    ${TESSELLATION_EVALUATION_OUTPUT}
1987                }
1988            ""
1989            fragment ""
1990                #version 310 es
1991                precision mediump float;
1992                ${FRAGMENT_DECLARATIONS}
1993                in mediump float te_out;
1994                void main()
1995                {
1996                    ${FRAG_COLOR} = vec4(te_out);
1997                }
1998            ""
1999        end
2000
2001        case type_mismatch_2
2002            version 310 es
2003            desc "uniform type mismatch between fragment and tessellation eval shaders"
2004            expect link_fail
2005            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2006            vertex ""
2007                #version 310 es
2008                ${VERTEX_DECLARATIONS}
2009                out mediump float vtx_out;
2010                void main()
2011                {
2012                    ${VERTEX_OUTPUT}
2013                }
2014            ""
2015            tessellation_control ""
2016                #version 310 es
2017                ${TESSELLATION_CONTROL_DECLARATIONS}
2018                void main()
2019                {
2020                    ${TESSELLATION_CONTROL_OUTPUT}
2021                }
2022            ""
2023            tessellation_evaluation ""
2024                #version 310 es
2025                ${TESSELLATION_EVALUATION_DECLARATIONS}
2026                uniform mediump vec3 val;
2027                out mediump float te_out;
2028                void main()
2029                {
2030                    te_out = val.x + val.y + val.z;
2031                    ${TESSELLATION_EVALUATION_OUTPUT}
2032                }
2033            ""
2034            fragment ""
2035                #version 310 es
2036                precision mediump float;
2037                ${FRAGMENT_DECLARATIONS}
2038                uniform mediump vec4 val;
2039                in mediump float te_out;
2040                void main()
2041                {
2042                    ${FRAG_COLOR} = vec4(te_out) + val;
2043                }
2044            ""
2045        end
2046
2047        case type_mismatch_3
2048            version 310 es
2049            desc "uniform type mismatch between tessellation control and eval shaders"
2050            expect link_fail
2051            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2052            vertex ""
2053                #version 310 es
2054                ${VERTEX_DECLARATIONS}
2055                out mediump float vtx_out;
2056                void main()
2057                {
2058                    ${VERTEX_OUTPUT}
2059                }
2060            ""
2061            tessellation_control ""
2062                #version 310 es
2063                ${TESSELLATION_CONTROL_DECLARATIONS}
2064                uniform mediump vec4 val;
2065                out mediump vec4 tc_out[];
2066                void main()
2067                {
2068                    tc_out[gl_InvocationID] = val;
2069                    ${TESSELLATION_CONTROL_OUTPUT}
2070                }
2071            ""
2072            tessellation_evaluation ""
2073                #version 310 es
2074                ${TESSELLATION_EVALUATION_DECLARATIONS}
2075                uniform mediump vec3 val;
2076                in mediump vec4 tc_out[];
2077                out mediump float te_out;
2078                void main()
2079                {
2080                    te_out = tc_out[0].w * val.z;
2081                    ${TESSELLATION_EVALUATION_OUTPUT}
2082                }
2083            ""
2084            fragment ""
2085                #version 310 es
2086                precision mediump float;
2087                ${FRAGMENT_DECLARATIONS}
2088                in mediump float te_out;
2089                void main()
2090                {
2091                    ${FRAG_COLOR} = vec4(te_out);
2092                }
2093            ""
2094        end
2095
2096        case type_mismatch_4
2097            version 310 es
2098            desc "uniform type mismatch between vertex and tessellation control shaders"
2099            expect link_fail
2100            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2101            require limit "GL_MAX_VERTEX_ATOMIC_COUNTERS" > 0
2102            vertex ""
2103                #version 310 es
2104                ${VERTEX_DECLARATIONS}
2105                layout(binding=0) uniform atomic_uint u_var;
2106                out mediump float vtx_out;
2107                void main()
2108                {
2109                    uint result = atomicCounterIncrement(u_var);
2110                    vtx_out = float(result);
2111                    ${VERTEX_OUTPUT}
2112                }
2113            ""
2114            tessellation_control ""
2115                #version 310 es
2116                ${TESSELLATION_CONTROL_DECLARATIONS}
2117                uniform mediump float u_var;
2118                in mediump float vtx_out[];
2119                out mediump float tc_out[];
2120                void main()
2121                {
2122                    tc_out[gl_InvocationID] = vtx_out[0] + u_var;
2123                    ${TESSELLATION_CONTROL_OUTPUT}
2124                }
2125            ""
2126            tessellation_evaluation ""
2127                #version 310 es
2128                ${TESSELLATION_EVALUATION_DECLARATIONS}
2129                in mediump float tc_out[];
2130                out mediump float te_out;
2131                void main()
2132                {
2133                    te_out = tc_out[2];
2134                    ${TESSELLATION_EVALUATION_OUTPUT}
2135                }
2136            ""
2137            fragment ""
2138                #version 310 es
2139                precision mediump float;
2140                ${FRAGMENT_DECLARATIONS}
2141                in mediump float te_out;
2142                void main()
2143                {
2144                    ${FRAG_COLOR} = vec4(te_out);
2145                }
2146            ""
2147        end
2148
2149        case type_mismatch_5
2150            version 310 es
2151            desc "uniform type mismatch between vertex and tessellation control shaders"
2152            expect link_fail
2153            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2154            require limit "GL_MAX_VERTEX_IMAGE_UNIFORMS" > 0
2155            vertex ""
2156                #version 310 es
2157                ${VERTEX_DECLARATIONS}
2158                layout(binding=0) layout(rgba8i) uniform readonly highp iimage2D u_var;
2159                out mediump float vtx_out;
2160                void main()
2161                {
2162                    int result = imageSize(u_var).x;
2163                    vtx_out = float(result);
2164                    ${VERTEX_OUTPUT}
2165                }
2166            ""
2167            tessellation_control ""
2168                #version 310 es
2169                ${TESSELLATION_CONTROL_DECLARATIONS}
2170                uniform mediump float u_var;
2171                in mediump float vtx_out[];
2172                out mediump float tc_out[];
2173                void main()
2174                {
2175                    tc_out[gl_InvocationID] = vtx_out[0] + u_var;
2176                    ${TESSELLATION_CONTROL_OUTPUT}
2177                }
2178            ""
2179            tessellation_evaluation ""
2180                #version 310 es
2181                ${TESSELLATION_EVALUATION_DECLARATIONS}
2182                in mediump float tc_out[];
2183                out mediump float te_out;
2184                void main()
2185                {
2186                    te_out = tc_out[2];
2187                    ${TESSELLATION_EVALUATION_OUTPUT}
2188                }
2189            ""
2190            fragment ""
2191                #version 310 es
2192                precision mediump float;
2193                ${FRAGMENT_DECLARATIONS}
2194                in mediump float te_out;
2195                void main()
2196                {
2197                    ${FRAG_COLOR} = vec4(te_out);
2198                }
2199            ""
2200        end
2201
2202        case precision_mismatch_1
2203            version 310 es
2204            desc "uniform precision mismatch between tessellation control and eval shaders"
2205            expect link_fail
2206            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2207            vertex ""
2208                #version 310 es
2209                ${VERTEX_DECLARATIONS}
2210                out mediump float vtx_out;
2211                void main()
2212                {
2213                    ${VERTEX_OUTPUT}
2214                }
2215            ""
2216            tessellation_control ""
2217                #version 310 es
2218                ${TESSELLATION_CONTROL_DECLARATIONS}
2219                uniform mediump vec4 val;
2220                out mediump vec4 tc_out[];
2221                void main()
2222                {
2223                    tc_out[gl_InvocationID] = val;
2224                    ${TESSELLATION_CONTROL_OUTPUT}
2225                }
2226            ""
2227            tessellation_evaluation ""
2228                #version 310 es
2229                ${TESSELLATION_EVALUATION_DECLARATIONS}
2230                uniform highp vec4 val;
2231                in mediump vec4 tc_out[];
2232                out mediump float te_out;
2233                void main()
2234                {
2235                    te_out = tc_out[0].w * val.z;
2236                    ${TESSELLATION_EVALUATION_OUTPUT}
2237                }
2238            ""
2239            fragment ""
2240                #version 310 es
2241                precision mediump float;
2242                ${FRAGMENT_DECLARATIONS}
2243                in mediump float te_out;
2244                void main()
2245                {
2246                    ${FRAG_COLOR} = vec4(te_out);
2247                }
2248            ""
2249        end
2250
2251        case precision_mismatch_2
2252            version 310 es
2253            desc "uniform precision mismatch between vertex and tessellation control shaders"
2254            expect link_fail
2255            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2256            vertex ""
2257                #version 310 es
2258                ${VERTEX_DECLARATIONS}
2259                uniform highp float val;
2260                out mediump float vtx_out;
2261                void main()
2262                {
2263                    vtx_out = val;
2264                    ${VERTEX_OUTPUT}
2265                }
2266            ""
2267            tessellation_control ""
2268                #version 310 es
2269                ${TESSELLATION_CONTROL_DECLARATIONS}
2270                uniform mediump float val;
2271                in mediump float vtx_out[];
2272                out mediump float tc_out[];
2273                void main()
2274                {
2275                    tc_out[gl_InvocationID] = vtx_out[0] + val;
2276                    ${TESSELLATION_CONTROL_OUTPUT}
2277                }
2278            ""
2279            tessellation_evaluation ""
2280                #version 310 es
2281                ${TESSELLATION_EVALUATION_DECLARATIONS}
2282                in mediump float tc_out[];
2283                out mediump float te_out;
2284                void main()
2285                {
2286                    te_out = tc_out[2];
2287                    ${TESSELLATION_EVALUATION_OUTPUT}
2288                }
2289            ""
2290            fragment ""
2291                #version 310 es
2292                precision mediump float;
2293                ${FRAGMENT_DECLARATIONS}
2294                in mediump float te_out;
2295                void main()
2296                {
2297                    ${FRAG_COLOR} = vec4(te_out);
2298                }
2299            ""
2300        end
2301
2302        case struct_partial_usage
2303            version 310 es
2304            desc "uniform is partially used in different shader stages"
2305            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2306            values
2307            {
2308                uniform float val.vtxVal = 1.5;
2309                uniform float val.tcVal = 2.5;
2310                uniform float val.teVal = 6.0;
2311                uniform float val.fragVal = 11.0;
2312                output float out0 = 68.5;
2313            }
2314            vertex ""
2315                #version 310 es
2316                ${VERTEX_DECLARATIONS}
2317                struct S
2318                {
2319                    mediump float vtxVal;
2320                    mediump float tcVal;
2321                    mediump float teVal;
2322                    mediump float fragVal;
2323                };
2324                uniform S val;
2325                out mediump float vtx_out;
2326                void main()
2327                {
2328                    vtx_out = val.vtxVal;
2329                    ${VERTEX_OUTPUT}
2330                }
2331            ""
2332            tessellation_control ""
2333                #version 310 es
2334                ${TESSELLATION_CONTROL_DECLARATIONS}
2335                struct S
2336                {
2337                    mediump float vtxVal;
2338                    mediump float tcVal;
2339                    mediump float teVal;
2340                    mediump float fragVal;
2341                };
2342                uniform S val;
2343                in mediump float vtx_out[];
2344                out mediump float tc_out[];
2345                void main()
2346                {
2347                    tc_out[gl_InvocationID] = vtx_out[0] + 2.0 * val.tcVal;
2348                    ${TESSELLATION_CONTROL_OUTPUT}
2349                }
2350            ""
2351            tessellation_evaluation ""
2352                #version 310 es
2353                ${TESSELLATION_EVALUATION_DECLARATIONS}
2354                struct S
2355                {
2356                    mediump float vtxVal;
2357                    mediump float tcVal;
2358                    mediump float teVal;
2359                    mediump float fragVal;
2360                };
2361                uniform S val;
2362                in mediump float tc_out[];
2363                out mediump float te_out;
2364                void main()
2365                {
2366                    te_out = tc_out[2] + 3.0 * val.teVal;
2367                    ${TESSELLATION_EVALUATION_OUTPUT}
2368                }
2369            ""
2370            fragment ""
2371                #version 310 es
2372                precision mediump float;
2373                ${FRAGMENT_DECLARATIONS}
2374                struct S
2375                {
2376                    mediump float vtxVal;
2377                    mediump float tcVal;
2378                    mediump float teVal;
2379                    mediump float fragVal;
2380                };
2381                uniform S val;
2382                in mediump float te_out;
2383                void main()
2384                {
2385                    out0 = te_out + 4.0 * val.fragVal;
2386                    ${FRAGMENT_OUTPUT};
2387                }
2388            ""
2389        end
2390    end
2391
2392    import "linkage_tessellation_uniform_types.test"
2393end
2394
2395group layout_declarations "Layout linkage"
2396    group rules "Rules"
2397
2398        case primitive_mode_mismatch
2399            version 310 es
2400            desc "Tessellation evaluation shader primitive mode mismatch"
2401            expect compile_or_link_fail
2402            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2403            values
2404            {
2405                input float in0 = 1.0;
2406                output float out0 = 1.0;
2407            }
2408            vertex ""
2409                #version 310 es
2410                ${VERTEX_DECLARATIONS}
2411                out mediump float tc_in;
2412                void main()
2413                {
2414                    tc_in = in0;
2415                    ${VERTEX_OUTPUT}
2416                }
2417            ""
2418            tessellation_control ""
2419                #version 310 es
2420                ${TESSELLATION_CONTROL_DECLARATIONS}
2421                in mediump float tc_in[];
2422                out mediump float tc_out[];
2423                void main()
2424                {
2425                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2426                    ${TESSELLATION_CONTROL_OUTPUT}
2427                }
2428            ""
2429            tessellation_evaluation ""
2430                #version 310 es
2431                layout (triangles) in;
2432                layout (isolines) in;
2433                in mediump float tc_out[];
2434                out mediump float te_out;
2435                void main()
2436                {
2437                    te_out = tc_out[2];
2438                    ${TESSELLATION_EVALUATION_OUTPUT}
2439                }
2440            ""
2441            fragment ""
2442                #version 310 es
2443                precision mediump float;
2444                ${FRAGMENT_DECLARATIONS}
2445                in mediump float te_out;
2446                void main()
2447                {
2448                    out0 = te_out;
2449                    ${FRAGMENT_OUTPUT}
2450                }
2451            ""
2452        end
2453
2454        case spacing_mode_mismatch
2455            version 310 es
2456            desc "Tessellation evaluation shader spacing mode mismatch"
2457            expect compile_or_link_fail
2458            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2459            values
2460            {
2461                input float in0 = 1.0;
2462                output float out0 = 1.0;
2463            }
2464            vertex ""
2465                #version 310 es
2466                ${VERTEX_DECLARATIONS}
2467                out mediump float tc_in;
2468                void main()
2469                {
2470                    tc_in = in0;
2471                    ${VERTEX_OUTPUT}
2472                }
2473            ""
2474            tessellation_control ""
2475                #version 310 es
2476                ${TESSELLATION_CONTROL_DECLARATIONS}
2477                in mediump float tc_in[];
2478                out mediump float tc_out[];
2479                void main()
2480                {
2481                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2482                    ${TESSELLATION_CONTROL_OUTPUT}
2483                }
2484            ""
2485            tessellation_evaluation ""
2486                #version 310 es
2487                layout (triangles, equal_spacing) in;
2488                layout (triangles, fractional_odd_spacing) in;
2489                in mediump float tc_out[];
2490                out mediump float te_out;
2491                void main()
2492                {
2493                    te_out = tc_out[2];
2494                    ${TESSELLATION_EVALUATION_OUTPUT}
2495                }
2496            ""
2497            fragment ""
2498                #version 310 es
2499                precision mediump float;
2500                ${FRAGMENT_DECLARATIONS}
2501                in mediump float te_out;
2502                void main()
2503                {
2504                    out0 = te_out;
2505                    ${FRAGMENT_OUTPUT}
2506                }
2507            ""
2508        end
2509
2510        case vertex_order_mismatch
2511            version 310 es
2512            desc "Tessellation evaluation shader vertex order mismatch"
2513            expect compile_or_link_fail
2514            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2515            values
2516            {
2517                input float in0 = 1.0;
2518                output float out0 = 1.0;
2519            }
2520            vertex ""
2521                #version 310 es
2522                ${VERTEX_DECLARATIONS}
2523                out mediump float tc_in;
2524                void main()
2525                {
2526                    tc_in = in0;
2527                    ${VERTEX_OUTPUT}
2528                }
2529            ""
2530            tessellation_control ""
2531                #version 310 es
2532                ${TESSELLATION_CONTROL_DECLARATIONS}
2533                in mediump float tc_in[];
2534                out mediump float tc_out[];
2535                void main()
2536                {
2537                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2538                    ${TESSELLATION_CONTROL_OUTPUT}
2539                }
2540            ""
2541            tessellation_evaluation ""
2542                #version 310 es
2543                layout (triangles, cw) in;
2544                layout (triangles, ccw) in;
2545                    in mediump float tc_out[];
2546                out mediump float te_out;
2547                void main()
2548                {
2549                    te_out = tc_out[2];
2550                    ${TESSELLATION_EVALUATION_OUTPUT}
2551                }
2552            ""
2553            fragment ""
2554                #version 310 es
2555                precision mediump float;
2556                ${FRAGMENT_DECLARATIONS}
2557                in mediump float te_out;
2558                void main()
2559                {
2560                    out0 = te_out;
2561                    ${FRAGMENT_OUTPUT}
2562                }
2563            ""
2564        end
2565
2566        case vertex_count_mismatch
2567            version 310 es
2568            desc "Tessellation control shader vertex count mismatch"
2569            expect compile_or_link_fail
2570            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2571            values
2572            {
2573                input float in0 = 1.0;
2574                output float out0 = 1.0;
2575            }
2576            vertex ""
2577                #version 310 es
2578                ${VERTEX_DECLARATIONS}
2579                out mediump float tc_in;
2580                void main()
2581                {
2582                    tc_in = in0;
2583                    ${VERTEX_OUTPUT}
2584                }
2585            ""
2586            tessellation_control ""
2587                #version 310 es
2588                layout (vertices=3) out;
2589                layout (vertices=4) out;
2590                in mediump float tc_in[];
2591                out mediump float tc_out[];
2592                void main()
2593                {
2594                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2595                    ${TESSELLATION_CONTROL_OUTPUT}
2596                }
2597            ""
2598            tessellation_evaluation ""
2599                #version 310 es
2600                ${TESSELLATION_EVALUATION_DECLARATIONS}
2601                in mediump float tc_out[];
2602                out mediump float te_out;
2603                void main()
2604                {
2605                    te_out = tc_out[2];
2606                    ${TESSELLATION_EVALUATION_OUTPUT}
2607                }
2608            ""
2609            fragment ""
2610                #version 310 es
2611                precision mediump float;
2612                ${FRAGMENT_DECLARATIONS}
2613                in mediump float te_out;
2614                void main()
2615                {
2616                    out0 = te_out;
2617                    ${FRAGMENT_OUTPUT}
2618                }
2619            ""
2620        end
2621    end
2622end
2623
2624group barriers "Barriers"
2625    group rules "Rules"
2626
2627        case invalid_barrier_usage_within_control_flow
2628            version 310 es
2629            desc "Tessellation control shader invalid barrier usage within control flow statement"
2630            expect compile_or_link_fail
2631            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2632            values
2633            {
2634                input float in0 = 1.0;
2635                output float out0 = 1.0;
2636            }
2637            vertex ""
2638                #version 310 es
2639                ${VERTEX_DECLARATIONS}
2640                out mediump float tc_in;
2641                void main()
2642                {
2643                    tc_in = in0;
2644                    ${VERTEX_OUTPUT}
2645                }
2646            ""
2647            tessellation_control ""
2648                #version 310 es
2649                ${TESSELLATION_CONTROL_DECLARATIONS}
2650                in mediump float tc_in[];
2651                out mediump float tc_out[];
2652
2653                void main()
2654                {
2655                    if (gl_InvocationID == 0)
2656                        barrier(); // error: within control flow
2657
2658                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2659                    ${TESSELLATION_CONTROL_OUTPUT}
2660                }
2661            ""
2662            tessellation_evaluation ""
2663                #version 310 es
2664                ${TESSELLATION_EVALUATION_DECLARATIONS}
2665                in mediump float tc_out[];
2666                out mediump float te_out;
2667                void main()
2668                {
2669                    te_out = tc_out[2];
2670                    ${TESSELLATION_EVALUATION_OUTPUT}
2671                }
2672            ""
2673            fragment ""
2674                #version 310 es
2675                precision mediump float;
2676                ${FRAGMENT_DECLARATIONS}
2677                in mediump float te_out;
2678                void main()
2679                {
2680                    out0 = te_out;
2681                    ${FRAGMENT_OUTPUT}
2682                }
2683            ""
2684        end
2685
2686        case invalid_barrier_usage_after_return
2687            version 310 es
2688            desc "Tessellation control shader invalid barrier usage after main() returns"
2689            expect compile_or_link_fail
2690            require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2691            values
2692            {
2693                input float in0 = 1.0;
2694                output float out0 = 1.0;
2695            }
2696            vertex ""
2697                #version 310 es
2698                ${VERTEX_DECLARATIONS}
2699                out mediump float tc_in;
2700                void main()
2701                {
2702                    tc_in = in0;
2703                    ${VERTEX_OUTPUT}
2704                }
2705            ""
2706            tessellation_control ""
2707                #version 310 es
2708                ${TESSELLATION_CONTROL_DECLARATIONS}
2709                in mediump float tc_in[];
2710                out mediump float tc_out[];
2711
2712                void main()
2713                {
2714                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2715                    ${TESSELLATION_CONTROL_OUTPUT}
2716
2717                    return;
2718                    barrier(); // error: barrier() after return
2719                }
2720            ""
2721            tessellation_evaluation ""
2722                #version 310 es
2723                ${TESSELLATION_EVALUATION_DECLARATIONS}
2724                in mediump float tc_out[];
2725                out mediump float te_out;
2726                void main()
2727                {
2728                    te_out = tc_out[2];
2729                    ${TESSELLATION_EVALUATION_OUTPUT}
2730                }
2731            ""
2732            fragment ""
2733                #version 310 es
2734                precision mediump float;
2735                ${FRAGMENT_DECLARATIONS}
2736                in mediump float te_out;
2737                void main()
2738                {
2739                    out0 = te_out;
2740                    ${FRAGMENT_OUTPUT}
2741                }
2742            ""
2743        end
2744    end
2745end
2746