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