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