1e5c31af7Sopenharmony_ci
2e5c31af7Sopenharmony_cigroup varying "Varying linkage"
3e5c31af7Sopenharmony_ci	group rules "Rules"
4e5c31af7Sopenharmony_ci
5e5c31af7Sopenharmony_ci		case input_type_mismatch
6e5c31af7Sopenharmony_ci			version 310 es
7e5c31af7Sopenharmony_ci			desc "Tessellation control shader input type mismatch"
8e5c31af7Sopenharmony_ci			expect link_fail
9e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
10e5c31af7Sopenharmony_ci			values
11e5c31af7Sopenharmony_ci			{
12e5c31af7Sopenharmony_ci				input float in0 = 1.0;
13e5c31af7Sopenharmony_ci				output float out0 = 1.0;
14e5c31af7Sopenharmony_ci			}
15e5c31af7Sopenharmony_ci			vertex ""
16e5c31af7Sopenharmony_ci				#version 310 es
17e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
18e5c31af7Sopenharmony_ci				out mediump float tc_in;
19e5c31af7Sopenharmony_ci				void main()
20e5c31af7Sopenharmony_ci				{
21e5c31af7Sopenharmony_ci					tc_in = in0;
22e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
23e5c31af7Sopenharmony_ci				}
24e5c31af7Sopenharmony_ci			""
25e5c31af7Sopenharmony_ci			tessellation_control ""
26e5c31af7Sopenharmony_ci				#version 310 es
27e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
28e5c31af7Sopenharmony_ci				in mediump vec2 tc_in[];
29e5c31af7Sopenharmony_ci				out mediump float tc_out[];
30e5c31af7Sopenharmony_ci				void main()
31e5c31af7Sopenharmony_ci				{
32e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID].x;
33e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
34e5c31af7Sopenharmony_ci				}
35e5c31af7Sopenharmony_ci			""
36e5c31af7Sopenharmony_ci			tessellation_evaluation ""
37e5c31af7Sopenharmony_ci				#version 310 es
38e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
39e5c31af7Sopenharmony_ci				in mediump float tc_out[];
40e5c31af7Sopenharmony_ci				out mediump float te_out;
41e5c31af7Sopenharmony_ci				void main()
42e5c31af7Sopenharmony_ci				{
43e5c31af7Sopenharmony_ci					te_out = tc_out[2];
44e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
45e5c31af7Sopenharmony_ci				}
46e5c31af7Sopenharmony_ci			""
47e5c31af7Sopenharmony_ci			fragment ""
48e5c31af7Sopenharmony_ci				#version 310 es
49e5c31af7Sopenharmony_ci				precision mediump float;
50e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
51e5c31af7Sopenharmony_ci				in mediump float te_out;
52e5c31af7Sopenharmony_ci				void main()
53e5c31af7Sopenharmony_ci				{
54e5c31af7Sopenharmony_ci					out0 = te_out;
55e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
56e5c31af7Sopenharmony_ci				}
57e5c31af7Sopenharmony_ci			""
58e5c31af7Sopenharmony_ci		end
59e5c31af7Sopenharmony_ci
60e5c31af7Sopenharmony_ci		case output_type_mismatch
61e5c31af7Sopenharmony_ci			version 310 es
62e5c31af7Sopenharmony_ci			desc "Tessellation evaluation shader output type mismatch"
63e5c31af7Sopenharmony_ci			expect link_fail
64e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
65e5c31af7Sopenharmony_ci			values
66e5c31af7Sopenharmony_ci			{
67e5c31af7Sopenharmony_ci				input float in0 = 1.0;
68e5c31af7Sopenharmony_ci				output float out0 = 1.0;
69e5c31af7Sopenharmony_ci			}
70e5c31af7Sopenharmony_ci			vertex ""
71e5c31af7Sopenharmony_ci				#version 310 es
72e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
73e5c31af7Sopenharmony_ci				out mediump float tc_in;
74e5c31af7Sopenharmony_ci				void main()
75e5c31af7Sopenharmony_ci				{
76e5c31af7Sopenharmony_ci					tc_in = in0;
77e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
78e5c31af7Sopenharmony_ci				}
79e5c31af7Sopenharmony_ci			""
80e5c31af7Sopenharmony_ci			tessellation_control ""
81e5c31af7Sopenharmony_ci				#version 310 es
82e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
83e5c31af7Sopenharmony_ci				in mediump float tc_in[];
84e5c31af7Sopenharmony_ci				out mediump float tc_out[];
85e5c31af7Sopenharmony_ci				void main()
86e5c31af7Sopenharmony_ci				{
87e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
88e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
89e5c31af7Sopenharmony_ci				}
90e5c31af7Sopenharmony_ci			""
91e5c31af7Sopenharmony_ci			tessellation_evaluation ""
92e5c31af7Sopenharmony_ci				#version 310 es
93e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
94e5c31af7Sopenharmony_ci				in mediump float tc_out[];
95e5c31af7Sopenharmony_ci				out mediump float te_out;
96e5c31af7Sopenharmony_ci				void main()
97e5c31af7Sopenharmony_ci				{
98e5c31af7Sopenharmony_ci					te_out = tc_out[2];
99e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
100e5c31af7Sopenharmony_ci				}
101e5c31af7Sopenharmony_ci			""
102e5c31af7Sopenharmony_ci			fragment ""
103e5c31af7Sopenharmony_ci				#version 310 es
104e5c31af7Sopenharmony_ci				precision mediump float;
105e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
106e5c31af7Sopenharmony_ci				in mediump vec2 te_out;
107e5c31af7Sopenharmony_ci				void main()
108e5c31af7Sopenharmony_ci				{
109e5c31af7Sopenharmony_ci					out0 = te_out.x + te_out.y;
110e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
111e5c31af7Sopenharmony_ci				}
112e5c31af7Sopenharmony_ci			""
113e5c31af7Sopenharmony_ci		end
114e5c31af7Sopenharmony_ci
115e5c31af7Sopenharmony_ci		case internal_type_mismatch
116e5c31af7Sopenharmony_ci			version 310 es
117e5c31af7Sopenharmony_ci			desc "Tessellation control and evaluation shader varying type mismatch"
118e5c31af7Sopenharmony_ci			expect link_fail
119e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
120e5c31af7Sopenharmony_ci			values
121e5c31af7Sopenharmony_ci			{
122e5c31af7Sopenharmony_ci				input float in0 = 1.0;
123e5c31af7Sopenharmony_ci				output float out0 = 1.0;
124e5c31af7Sopenharmony_ci			}
125e5c31af7Sopenharmony_ci			vertex ""
126e5c31af7Sopenharmony_ci				#version 310 es
127e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
128e5c31af7Sopenharmony_ci				out mediump float tc_in;
129e5c31af7Sopenharmony_ci				void main()
130e5c31af7Sopenharmony_ci				{
131e5c31af7Sopenharmony_ci					tc_in = in0;
132e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
133e5c31af7Sopenharmony_ci				}
134e5c31af7Sopenharmony_ci			""
135e5c31af7Sopenharmony_ci			tessellation_control ""
136e5c31af7Sopenharmony_ci				#version 310 es
137e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
138e5c31af7Sopenharmony_ci				in mediump float tc_in[];
139e5c31af7Sopenharmony_ci				out mediump float tc_out[];
140e5c31af7Sopenharmony_ci				void main()
141e5c31af7Sopenharmony_ci				{
142e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
143e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
144e5c31af7Sopenharmony_ci				}
145e5c31af7Sopenharmony_ci			""
146e5c31af7Sopenharmony_ci			tessellation_evaluation ""
147e5c31af7Sopenharmony_ci				#version 310 es
148e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
149e5c31af7Sopenharmony_ci				in mediump vec2 tc_out[];
150e5c31af7Sopenharmony_ci				out mediump float te_out;
151e5c31af7Sopenharmony_ci				void main()
152e5c31af7Sopenharmony_ci				{
153e5c31af7Sopenharmony_ci					te_out = tc_out[2].x + tc_out[0].y;
154e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
155e5c31af7Sopenharmony_ci				}
156e5c31af7Sopenharmony_ci			""
157e5c31af7Sopenharmony_ci			fragment ""
158e5c31af7Sopenharmony_ci				#version 310 es
159e5c31af7Sopenharmony_ci				precision mediump float;
160e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
161e5c31af7Sopenharmony_ci				in mediump float te_out;
162e5c31af7Sopenharmony_ci				void main()
163e5c31af7Sopenharmony_ci				{
164e5c31af7Sopenharmony_ci					out0 = te_out;
165e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
166e5c31af7Sopenharmony_ci				}
167e5c31af7Sopenharmony_ci			""
168e5c31af7Sopenharmony_ci		end
169e5c31af7Sopenharmony_ci
170e5c31af7Sopenharmony_ci		case input_different_precision
171e5c31af7Sopenharmony_ci			version 310 es
172e5c31af7Sopenharmony_ci			desc "Tessellation control shader input precisions different"
173e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
174e5c31af7Sopenharmony_ci			values
175e5c31af7Sopenharmony_ci			{
176e5c31af7Sopenharmony_ci				input float in0 = 1.0;
177e5c31af7Sopenharmony_ci				output float out0 = 1.0;
178e5c31af7Sopenharmony_ci			}
179e5c31af7Sopenharmony_ci			vertex ""
180e5c31af7Sopenharmony_ci				#version 310 es
181e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
182e5c31af7Sopenharmony_ci				out highp float tc_in;
183e5c31af7Sopenharmony_ci				void main()
184e5c31af7Sopenharmony_ci				{
185e5c31af7Sopenharmony_ci					tc_in = in0;
186e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
187e5c31af7Sopenharmony_ci				}
188e5c31af7Sopenharmony_ci			""
189e5c31af7Sopenharmony_ci			tessellation_control ""
190e5c31af7Sopenharmony_ci				#version 310 es
191e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
192e5c31af7Sopenharmony_ci				in lowp float tc_in[];
193e5c31af7Sopenharmony_ci				out mediump float tc_out[];
194e5c31af7Sopenharmony_ci				void main()
195e5c31af7Sopenharmony_ci				{
196e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
197e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
198e5c31af7Sopenharmony_ci				}
199e5c31af7Sopenharmony_ci			""
200e5c31af7Sopenharmony_ci			tessellation_evaluation ""
201e5c31af7Sopenharmony_ci				#version 310 es
202e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
203e5c31af7Sopenharmony_ci				in mediump float tc_out[];
204e5c31af7Sopenharmony_ci				out mediump float te_out;
205e5c31af7Sopenharmony_ci				void main()
206e5c31af7Sopenharmony_ci				{
207e5c31af7Sopenharmony_ci					te_out = tc_out[2];
208e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
209e5c31af7Sopenharmony_ci				}
210e5c31af7Sopenharmony_ci			""
211e5c31af7Sopenharmony_ci			fragment ""
212e5c31af7Sopenharmony_ci				#version 310 es
213e5c31af7Sopenharmony_ci				precision mediump float;
214e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
215e5c31af7Sopenharmony_ci				in mediump float te_out;
216e5c31af7Sopenharmony_ci				void main()
217e5c31af7Sopenharmony_ci				{
218e5c31af7Sopenharmony_ci					out0 = te_out;
219e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
220e5c31af7Sopenharmony_ci				}
221e5c31af7Sopenharmony_ci			""
222e5c31af7Sopenharmony_ci		end
223e5c31af7Sopenharmony_ci
224e5c31af7Sopenharmony_ci		case output_different_precision
225e5c31af7Sopenharmony_ci			version 310 es
226e5c31af7Sopenharmony_ci			desc "Tessellation evaluation shader output precisions different"
227e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
228e5c31af7Sopenharmony_ci			values
229e5c31af7Sopenharmony_ci			{
230e5c31af7Sopenharmony_ci				input float in0 = 1.0;
231e5c31af7Sopenharmony_ci				output float out0 = 1.0;
232e5c31af7Sopenharmony_ci			}
233e5c31af7Sopenharmony_ci			vertex ""
234e5c31af7Sopenharmony_ci				#version 310 es
235e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
236e5c31af7Sopenharmony_ci				out mediump float tc_in;
237e5c31af7Sopenharmony_ci				void main()
238e5c31af7Sopenharmony_ci				{
239e5c31af7Sopenharmony_ci					tc_in = in0;
240e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
241e5c31af7Sopenharmony_ci				}
242e5c31af7Sopenharmony_ci			""
243e5c31af7Sopenharmony_ci			tessellation_control ""
244e5c31af7Sopenharmony_ci				#version 310 es
245e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
246e5c31af7Sopenharmony_ci				in mediump float tc_in[];
247e5c31af7Sopenharmony_ci				out mediump float tc_out[];
248e5c31af7Sopenharmony_ci				void main()
249e5c31af7Sopenharmony_ci				{
250e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
251e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
252e5c31af7Sopenharmony_ci				}
253e5c31af7Sopenharmony_ci			""
254e5c31af7Sopenharmony_ci			tessellation_evaluation ""
255e5c31af7Sopenharmony_ci				#version 310 es
256e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
257e5c31af7Sopenharmony_ci				in mediump float tc_out[];
258e5c31af7Sopenharmony_ci				out highp float te_out;
259e5c31af7Sopenharmony_ci				void main()
260e5c31af7Sopenharmony_ci				{
261e5c31af7Sopenharmony_ci					te_out = tc_out[2];
262e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
263e5c31af7Sopenharmony_ci				}
264e5c31af7Sopenharmony_ci			""
265e5c31af7Sopenharmony_ci			fragment ""
266e5c31af7Sopenharmony_ci				#version 310 es
267e5c31af7Sopenharmony_ci				precision mediump float;
268e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
269e5c31af7Sopenharmony_ci				in lowp float te_out;
270e5c31af7Sopenharmony_ci				void main()
271e5c31af7Sopenharmony_ci				{
272e5c31af7Sopenharmony_ci					out0 = te_out;
273e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
274e5c31af7Sopenharmony_ci				}
275e5c31af7Sopenharmony_ci			""
276e5c31af7Sopenharmony_ci		end
277e5c31af7Sopenharmony_ci
278e5c31af7Sopenharmony_ci		case internal_different_precision
279e5c31af7Sopenharmony_ci			version 310 es
280e5c31af7Sopenharmony_ci			desc "Tessellation control and evaluation shader varying precisions different"
281e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
282e5c31af7Sopenharmony_ci			values
283e5c31af7Sopenharmony_ci			{
284e5c31af7Sopenharmony_ci				input float in0 = 1.0;
285e5c31af7Sopenharmony_ci				output float out0 = 1.0;
286e5c31af7Sopenharmony_ci			}
287e5c31af7Sopenharmony_ci			vertex ""
288e5c31af7Sopenharmony_ci				#version 310 es
289e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
290e5c31af7Sopenharmony_ci				out mediump float tc_in;
291e5c31af7Sopenharmony_ci				void main()
292e5c31af7Sopenharmony_ci				{
293e5c31af7Sopenharmony_ci					tc_in = in0;
294e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
295e5c31af7Sopenharmony_ci				}
296e5c31af7Sopenharmony_ci			""
297e5c31af7Sopenharmony_ci			tessellation_control ""
298e5c31af7Sopenharmony_ci				#version 310 es
299e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
300e5c31af7Sopenharmony_ci				in mediump float tc_in[];
301e5c31af7Sopenharmony_ci				out highp float tc_out[];
302e5c31af7Sopenharmony_ci				void main()
303e5c31af7Sopenharmony_ci				{
304e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
305e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
306e5c31af7Sopenharmony_ci				}
307e5c31af7Sopenharmony_ci			""
308e5c31af7Sopenharmony_ci			tessellation_evaluation ""
309e5c31af7Sopenharmony_ci				#version 310 es
310e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
311e5c31af7Sopenharmony_ci				in lowp float tc_out[];
312e5c31af7Sopenharmony_ci				out mediump float te_out;
313e5c31af7Sopenharmony_ci				void main()
314e5c31af7Sopenharmony_ci				{
315e5c31af7Sopenharmony_ci					te_out = tc_out[2];
316e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
317e5c31af7Sopenharmony_ci				}
318e5c31af7Sopenharmony_ci			""
319e5c31af7Sopenharmony_ci			fragment ""
320e5c31af7Sopenharmony_ci				#version 310 es
321e5c31af7Sopenharmony_ci				precision mediump float;
322e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
323e5c31af7Sopenharmony_ci				in mediump float te_out;
324e5c31af7Sopenharmony_ci				void main()
325e5c31af7Sopenharmony_ci				{
326e5c31af7Sopenharmony_ci					out0 = te_out;
327e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
328e5c31af7Sopenharmony_ci				}
329e5c31af7Sopenharmony_ci			""
330e5c31af7Sopenharmony_ci		end
331e5c31af7Sopenharmony_ci
332e5c31af7Sopenharmony_ci		case input_no_declaration
333e5c31af7Sopenharmony_ci			version 310 es
334e5c31af7Sopenharmony_ci			desc "Tessellation control shader input with no matching output"
335e5c31af7Sopenharmony_ci			expect link_fail
336e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
337e5c31af7Sopenharmony_ci			values
338e5c31af7Sopenharmony_ci			{
339e5c31af7Sopenharmony_ci				input float in0 = 1.0;
340e5c31af7Sopenharmony_ci				output float out0 = 1.0;
341e5c31af7Sopenharmony_ci			}
342e5c31af7Sopenharmony_ci			vertex ""
343e5c31af7Sopenharmony_ci				#version 310 es
344e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
345e5c31af7Sopenharmony_ci				void main()
346e5c31af7Sopenharmony_ci				{
347e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
348e5c31af7Sopenharmony_ci				}
349e5c31af7Sopenharmony_ci			""
350e5c31af7Sopenharmony_ci			tessellation_control ""
351e5c31af7Sopenharmony_ci				#version 310 es
352e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
353e5c31af7Sopenharmony_ci				in mediump float tc_in[];
354e5c31af7Sopenharmony_ci				out mediump float tc_out[];
355e5c31af7Sopenharmony_ci				void main()
356e5c31af7Sopenharmony_ci				{
357e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
358e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
359e5c31af7Sopenharmony_ci				}
360e5c31af7Sopenharmony_ci			""
361e5c31af7Sopenharmony_ci			tessellation_evaluation ""
362e5c31af7Sopenharmony_ci				#version 310 es
363e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
364e5c31af7Sopenharmony_ci				in mediump float tc_out[];
365e5c31af7Sopenharmony_ci				out mediump float te_out;
366e5c31af7Sopenharmony_ci				void main()
367e5c31af7Sopenharmony_ci				{
368e5c31af7Sopenharmony_ci					te_out = tc_out[2];
369e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
370e5c31af7Sopenharmony_ci				}
371e5c31af7Sopenharmony_ci			""
372e5c31af7Sopenharmony_ci			fragment ""
373e5c31af7Sopenharmony_ci				#version 310 es
374e5c31af7Sopenharmony_ci				precision mediump float;
375e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
376e5c31af7Sopenharmony_ci				in mediump float te_out;
377e5c31af7Sopenharmony_ci				void main()
378e5c31af7Sopenharmony_ci				{
379e5c31af7Sopenharmony_ci					out0 = te_out;
380e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
381e5c31af7Sopenharmony_ci				}
382e5c31af7Sopenharmony_ci			""
383e5c31af7Sopenharmony_ci		end
384e5c31af7Sopenharmony_ci
385e5c31af7Sopenharmony_ci		case output_no_declaration
386e5c31af7Sopenharmony_ci			version 310 es
387e5c31af7Sopenharmony_ci			desc "Tessellation evaluation shader without output for an fragment shader input"
388e5c31af7Sopenharmony_ci			expect link_fail
389e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
390e5c31af7Sopenharmony_ci			values
391e5c31af7Sopenharmony_ci			{
392e5c31af7Sopenharmony_ci				output float out0 = 1.0;
393e5c31af7Sopenharmony_ci			}
394e5c31af7Sopenharmony_ci			vertex ""
395e5c31af7Sopenharmony_ci				#version 310 es
396e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
397e5c31af7Sopenharmony_ci				void main()
398e5c31af7Sopenharmony_ci				{
399e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
400e5c31af7Sopenharmony_ci				}
401e5c31af7Sopenharmony_ci			""
402e5c31af7Sopenharmony_ci			tessellation_control ""
403e5c31af7Sopenharmony_ci				#version 310 es
404e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
405e5c31af7Sopenharmony_ci				void main()
406e5c31af7Sopenharmony_ci				{
407e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
408e5c31af7Sopenharmony_ci				}
409e5c31af7Sopenharmony_ci			""
410e5c31af7Sopenharmony_ci			tessellation_evaluation ""
411e5c31af7Sopenharmony_ci				#version 310 es
412e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
413e5c31af7Sopenharmony_ci				void main()
414e5c31af7Sopenharmony_ci				{
415e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
416e5c31af7Sopenharmony_ci				}
417e5c31af7Sopenharmony_ci			""
418e5c31af7Sopenharmony_ci			fragment ""
419e5c31af7Sopenharmony_ci				#version 310 es
420e5c31af7Sopenharmony_ci				precision mediump float;
421e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
422e5c31af7Sopenharmony_ci				in mediump float te_out;
423e5c31af7Sopenharmony_ci				void main()
424e5c31af7Sopenharmony_ci				{
425e5c31af7Sopenharmony_ci					out0 = te_out;
426e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
427e5c31af7Sopenharmony_ci				}
428e5c31af7Sopenharmony_ci			""
429e5c31af7Sopenharmony_ci		end
430e5c31af7Sopenharmony_ci
431e5c31af7Sopenharmony_ci		case internal_no_declaration
432e5c31af7Sopenharmony_ci			version 310 es
433e5c31af7Sopenharmony_ci			desc "Tessellation evaluation shader input without matching output"
434e5c31af7Sopenharmony_ci			expect link_fail
435e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
436e5c31af7Sopenharmony_ci			values
437e5c31af7Sopenharmony_ci			{
438e5c31af7Sopenharmony_ci				output float out0 = 1.0;
439e5c31af7Sopenharmony_ci			}
440e5c31af7Sopenharmony_ci			vertex ""
441e5c31af7Sopenharmony_ci				#version 310 es
442e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
443e5c31af7Sopenharmony_ci				void main()
444e5c31af7Sopenharmony_ci				{
445e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
446e5c31af7Sopenharmony_ci				}
447e5c31af7Sopenharmony_ci			""
448e5c31af7Sopenharmony_ci			tessellation_control ""
449e5c31af7Sopenharmony_ci				#version 310 es
450e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
451e5c31af7Sopenharmony_ci				void main()
452e5c31af7Sopenharmony_ci				{
453e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
454e5c31af7Sopenharmony_ci				}
455e5c31af7Sopenharmony_ci			""
456e5c31af7Sopenharmony_ci			tessellation_evaluation ""
457e5c31af7Sopenharmony_ci				#version 310 es
458e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
459e5c31af7Sopenharmony_ci				in mediump float tc_out[];
460e5c31af7Sopenharmony_ci				out mediump float te_out;
461e5c31af7Sopenharmony_ci				void main()
462e5c31af7Sopenharmony_ci				{
463e5c31af7Sopenharmony_ci					te_out = tc_out[2];
464e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
465e5c31af7Sopenharmony_ci				}
466e5c31af7Sopenharmony_ci			""
467e5c31af7Sopenharmony_ci			fragment ""
468e5c31af7Sopenharmony_ci				#version 310 es
469e5c31af7Sopenharmony_ci				precision mediump float;
470e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
471e5c31af7Sopenharmony_ci				in mediump float te_out;
472e5c31af7Sopenharmony_ci				void main()
473e5c31af7Sopenharmony_ci				{
474e5c31af7Sopenharmony_ci					out0 = te_out;
475e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
476e5c31af7Sopenharmony_ci				}
477e5c31af7Sopenharmony_ci			""
478e5c31af7Sopenharmony_ci		end
479e5c31af7Sopenharmony_ci
480e5c31af7Sopenharmony_ci		case input_superfluous_declaration
481e5c31af7Sopenharmony_ci			version 310 es
482e5c31af7Sopenharmony_ci			desc "Tessellation control has no input for an output"
483e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
484e5c31af7Sopenharmony_ci			values
485e5c31af7Sopenharmony_ci			{
486e5c31af7Sopenharmony_ci				input float in0 = 1.0;
487e5c31af7Sopenharmony_ci				output float out0 = 1.0;
488e5c31af7Sopenharmony_ci			}
489e5c31af7Sopenharmony_ci			vertex ""
490e5c31af7Sopenharmony_ci				#version 310 es
491e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
492e5c31af7Sopenharmony_ci				out mediump float tc_in;
493e5c31af7Sopenharmony_ci				out mediump float tc_in_unused;
494e5c31af7Sopenharmony_ci				void main()
495e5c31af7Sopenharmony_ci				{
496e5c31af7Sopenharmony_ci					tc_in = in0;
497e5c31af7Sopenharmony_ci					tc_in_unused = in0 + 1.0;
498e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
499e5c31af7Sopenharmony_ci				}
500e5c31af7Sopenharmony_ci			""
501e5c31af7Sopenharmony_ci			tessellation_control ""
502e5c31af7Sopenharmony_ci				#version 310 es
503e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
504e5c31af7Sopenharmony_ci				in mediump float tc_in[];
505e5c31af7Sopenharmony_ci				out mediump float tc_out[];
506e5c31af7Sopenharmony_ci				void main()
507e5c31af7Sopenharmony_ci				{
508e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
509e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
510e5c31af7Sopenharmony_ci				}
511e5c31af7Sopenharmony_ci			""
512e5c31af7Sopenharmony_ci			tessellation_evaluation ""
513e5c31af7Sopenharmony_ci				#version 310 es
514e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
515e5c31af7Sopenharmony_ci				in mediump float tc_out[];
516e5c31af7Sopenharmony_ci				out mediump float te_out;
517e5c31af7Sopenharmony_ci				void main()
518e5c31af7Sopenharmony_ci				{
519e5c31af7Sopenharmony_ci					te_out = tc_out[2];
520e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
521e5c31af7Sopenharmony_ci				}
522e5c31af7Sopenharmony_ci			""
523e5c31af7Sopenharmony_ci			fragment ""
524e5c31af7Sopenharmony_ci				#version 310 es
525e5c31af7Sopenharmony_ci				precision mediump float;
526e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
527e5c31af7Sopenharmony_ci				in mediump float te_out;
528e5c31af7Sopenharmony_ci				void main()
529e5c31af7Sopenharmony_ci				{
530e5c31af7Sopenharmony_ci					out0 = te_out;
531e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
532e5c31af7Sopenharmony_ci				}
533e5c31af7Sopenharmony_ci			""
534e5c31af7Sopenharmony_ci		end
535e5c31af7Sopenharmony_ci
536e5c31af7Sopenharmony_ci		case output_superfluous_declaration
537e5c31af7Sopenharmony_ci			version 310 es
538e5c31af7Sopenharmony_ci			desc "Tessellation has an output without a matching input"
539e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
540e5c31af7Sopenharmony_ci			values
541e5c31af7Sopenharmony_ci			{
542e5c31af7Sopenharmony_ci				input float in0 = 1.0;
543e5c31af7Sopenharmony_ci				output float out0 = 1.0;
544e5c31af7Sopenharmony_ci			}
545e5c31af7Sopenharmony_ci			vertex ""
546e5c31af7Sopenharmony_ci				#version 310 es
547e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
548e5c31af7Sopenharmony_ci				out mediump float tc_in;
549e5c31af7Sopenharmony_ci				void main()
550e5c31af7Sopenharmony_ci				{
551e5c31af7Sopenharmony_ci					tc_in = in0;
552e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
553e5c31af7Sopenharmony_ci				}
554e5c31af7Sopenharmony_ci			""
555e5c31af7Sopenharmony_ci			tessellation_control ""
556e5c31af7Sopenharmony_ci				#version 310 es
557e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
558e5c31af7Sopenharmony_ci				in mediump float tc_in[];
559e5c31af7Sopenharmony_ci				out mediump float tc_out[];
560e5c31af7Sopenharmony_ci				void main()
561e5c31af7Sopenharmony_ci				{
562e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
563e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
564e5c31af7Sopenharmony_ci				}
565e5c31af7Sopenharmony_ci			""
566e5c31af7Sopenharmony_ci			tessellation_evaluation ""
567e5c31af7Sopenharmony_ci				#version 310 es
568e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
569e5c31af7Sopenharmony_ci				in mediump float tc_out[];
570e5c31af7Sopenharmony_ci				out mediump float te_out;
571e5c31af7Sopenharmony_ci				out mediump float te_out_unused;
572e5c31af7Sopenharmony_ci				void main()
573e5c31af7Sopenharmony_ci				{
574e5c31af7Sopenharmony_ci					te_out = tc_out[2];
575e5c31af7Sopenharmony_ci					te_out_unused = tc_out[0];
576e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
577e5c31af7Sopenharmony_ci				}
578e5c31af7Sopenharmony_ci			""
579e5c31af7Sopenharmony_ci			fragment ""
580e5c31af7Sopenharmony_ci				#version 310 es
581e5c31af7Sopenharmony_ci				precision mediump float;
582e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
583e5c31af7Sopenharmony_ci				in mediump float te_out;
584e5c31af7Sopenharmony_ci				void main()
585e5c31af7Sopenharmony_ci				{
586e5c31af7Sopenharmony_ci					out0 = te_out;
587e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
588e5c31af7Sopenharmony_ci				}
589e5c31af7Sopenharmony_ci			""
590e5c31af7Sopenharmony_ci		end
591e5c31af7Sopenharmony_ci
592e5c31af7Sopenharmony_ci		case internal_superfluous_declaration
593e5c31af7Sopenharmony_ci			version 310 es
594e5c31af7Sopenharmony_ci			desc "Tessellation control has an output without a matching input"
595e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
596e5c31af7Sopenharmony_ci			values
597e5c31af7Sopenharmony_ci			{
598e5c31af7Sopenharmony_ci				input float in0 = 1.0;
599e5c31af7Sopenharmony_ci				output float out0 = 1.0;
600e5c31af7Sopenharmony_ci			}
601e5c31af7Sopenharmony_ci			vertex ""
602e5c31af7Sopenharmony_ci				#version 310 es
603e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
604e5c31af7Sopenharmony_ci				out mediump float tc_in;
605e5c31af7Sopenharmony_ci				void main()
606e5c31af7Sopenharmony_ci				{
607e5c31af7Sopenharmony_ci					tc_in = in0;
608e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
609e5c31af7Sopenharmony_ci				}
610e5c31af7Sopenharmony_ci			""
611e5c31af7Sopenharmony_ci			tessellation_control ""
612e5c31af7Sopenharmony_ci				#version 310 es
613e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
614e5c31af7Sopenharmony_ci				in mediump float tc_in[];
615e5c31af7Sopenharmony_ci				out mediump float tc_out[];
616e5c31af7Sopenharmony_ci				out mediump float tc_out_unused[];
617e5c31af7Sopenharmony_ci				void main()
618e5c31af7Sopenharmony_ci				{
619e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
620e5c31af7Sopenharmony_ci					tc_out_unused[gl_InvocationID] = tc_in[gl_InvocationID] + 1.0;
621e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
622e5c31af7Sopenharmony_ci				}
623e5c31af7Sopenharmony_ci			""
624e5c31af7Sopenharmony_ci			tessellation_evaluation ""
625e5c31af7Sopenharmony_ci				#version 310 es
626e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
627e5c31af7Sopenharmony_ci				in mediump float tc_out[];
628e5c31af7Sopenharmony_ci				out mediump float te_out;
629e5c31af7Sopenharmony_ci				void main()
630e5c31af7Sopenharmony_ci				{
631e5c31af7Sopenharmony_ci					te_out = tc_out[2];
632e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
633e5c31af7Sopenharmony_ci				}
634e5c31af7Sopenharmony_ci			""
635e5c31af7Sopenharmony_ci			fragment ""
636e5c31af7Sopenharmony_ci				#version 310 es
637e5c31af7Sopenharmony_ci				precision mediump float;
638e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
639e5c31af7Sopenharmony_ci				in mediump float te_out;
640e5c31af7Sopenharmony_ci				void main()
641e5c31af7Sopenharmony_ci				{
642e5c31af7Sopenharmony_ci					out0 = te_out;
643e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
644e5c31af7Sopenharmony_ci				}
645e5c31af7Sopenharmony_ci			""
646e5c31af7Sopenharmony_ci		end
647e5c31af7Sopenharmony_ci
648e5c31af7Sopenharmony_ci		case vertex_fragment_same_varying_name_1
649e5c31af7Sopenharmony_ci			version 310 es
650e5c31af7Sopenharmony_ci			desc "Tessellation control has an output without a matching input"
651e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
652e5c31af7Sopenharmony_ci			values
653e5c31af7Sopenharmony_ci			{
654e5c31af7Sopenharmony_ci				input float in0 = 1.0;
655e5c31af7Sopenharmony_ci				output float out0 = 2.0;
656e5c31af7Sopenharmony_ci			}
657e5c31af7Sopenharmony_ci			vertex ""
658e5c31af7Sopenharmony_ci				#version 310 es
659e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
660e5c31af7Sopenharmony_ci				out mediump float sharedVaringName;
661e5c31af7Sopenharmony_ci				void main()
662e5c31af7Sopenharmony_ci				{
663e5c31af7Sopenharmony_ci					sharedVaringName = in0;
664e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
665e5c31af7Sopenharmony_ci				}
666e5c31af7Sopenharmony_ci			""
667e5c31af7Sopenharmony_ci			tessellation_control ""
668e5c31af7Sopenharmony_ci				#version 310 es
669e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
670e5c31af7Sopenharmony_ci				in mediump float sharedVaringName[];
671e5c31af7Sopenharmony_ci				out mediump float tc_out[];
672e5c31af7Sopenharmony_ci				void main()
673e5c31af7Sopenharmony_ci				{
674e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID];
675e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
676e5c31af7Sopenharmony_ci				}
677e5c31af7Sopenharmony_ci			""
678e5c31af7Sopenharmony_ci			tessellation_evaluation ""
679e5c31af7Sopenharmony_ci				#version 310 es
680e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
681e5c31af7Sopenharmony_ci				in mediump float tc_out[];
682e5c31af7Sopenharmony_ci				out mediump float sharedVaringName;
683e5c31af7Sopenharmony_ci				void main()
684e5c31af7Sopenharmony_ci				{
685e5c31af7Sopenharmony_ci					sharedVaringName = 2.0 * tc_out[2];
686e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
687e5c31af7Sopenharmony_ci				}
688e5c31af7Sopenharmony_ci			""
689e5c31af7Sopenharmony_ci			fragment ""
690e5c31af7Sopenharmony_ci				#version 310 es
691e5c31af7Sopenharmony_ci				precision mediump float;
692e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
693e5c31af7Sopenharmony_ci				in mediump float sharedVaringName;
694e5c31af7Sopenharmony_ci				void main()
695e5c31af7Sopenharmony_ci				{
696e5c31af7Sopenharmony_ci					out0 = sharedVaringName;
697e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
698e5c31af7Sopenharmony_ci				}
699e5c31af7Sopenharmony_ci			""
700e5c31af7Sopenharmony_ci		end
701e5c31af7Sopenharmony_ci
702e5c31af7Sopenharmony_ci		case vertex_fragment_same_varying_name_2
703e5c31af7Sopenharmony_ci			version 310 es
704e5c31af7Sopenharmony_ci			desc "Tessellation control has an output without a matching input"
705e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
706e5c31af7Sopenharmony_ci			values
707e5c31af7Sopenharmony_ci			{
708e5c31af7Sopenharmony_ci				input vec2 in0 = vec2(1.0, 3.0);
709e5c31af7Sopenharmony_ci				output float out0 = 4.0;
710e5c31af7Sopenharmony_ci			}
711e5c31af7Sopenharmony_ci			vertex ""
712e5c31af7Sopenharmony_ci				#version 310 es
713e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
714e5c31af7Sopenharmony_ci				out mediump vec2 sharedVaringName;
715e5c31af7Sopenharmony_ci				void main()
716e5c31af7Sopenharmony_ci				{
717e5c31af7Sopenharmony_ci					sharedVaringName = in0;
718e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
719e5c31af7Sopenharmony_ci				}
720e5c31af7Sopenharmony_ci			""
721e5c31af7Sopenharmony_ci			tessellation_control ""
722e5c31af7Sopenharmony_ci				#version 310 es
723e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
724e5c31af7Sopenharmony_ci				in mediump vec2 sharedVaringName[];
725e5c31af7Sopenharmony_ci				out mediump float tc_out[];
726e5c31af7Sopenharmony_ci				void main()
727e5c31af7Sopenharmony_ci				{
728e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID].x + sharedVaringName[gl_InvocationID].y;
729e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
730e5c31af7Sopenharmony_ci				}
731e5c31af7Sopenharmony_ci			""
732e5c31af7Sopenharmony_ci			tessellation_evaluation ""
733e5c31af7Sopenharmony_ci				#version 310 es
734e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
735e5c31af7Sopenharmony_ci				in mediump float tc_out[];
736e5c31af7Sopenharmony_ci				out mediump float sharedVaringName;
737e5c31af7Sopenharmony_ci				void main()
738e5c31af7Sopenharmony_ci				{
739e5c31af7Sopenharmony_ci					sharedVaringName = tc_out[2];
740e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
741e5c31af7Sopenharmony_ci				}
742e5c31af7Sopenharmony_ci			""
743e5c31af7Sopenharmony_ci			fragment ""
744e5c31af7Sopenharmony_ci				#version 310 es
745e5c31af7Sopenharmony_ci				precision mediump float;
746e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
747e5c31af7Sopenharmony_ci				in mediump float sharedVaringName;
748e5c31af7Sopenharmony_ci				void main()
749e5c31af7Sopenharmony_ci				{
750e5c31af7Sopenharmony_ci					out0 = sharedVaringName;
751e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
752e5c31af7Sopenharmony_ci				}
753e5c31af7Sopenharmony_ci			""
754e5c31af7Sopenharmony_ci		end
755e5c31af7Sopenharmony_ci
756e5c31af7Sopenharmony_ci		case invalid_vertex_index
757e5c31af7Sopenharmony_ci			version 310 es
758e5c31af7Sopenharmony_ci			desc "Tessellation control output not indexed with gl_InvocationID"
759e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
760e5c31af7Sopenharmony_ci			expect compile_or_link_fail
761e5c31af7Sopenharmony_ci			vertex ""
762e5c31af7Sopenharmony_ci				#version 310 es
763e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
764e5c31af7Sopenharmony_ci				void main()
765e5c31af7Sopenharmony_ci				{
766e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
767e5c31af7Sopenharmony_ci				}
768e5c31af7Sopenharmony_ci			""
769e5c31af7Sopenharmony_ci			tessellation_control ""
770e5c31af7Sopenharmony_ci				#version 310 es
771e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
772e5c31af7Sopenharmony_ci				out mediump float tc_out[];
773e5c31af7Sopenharmony_ci				void main()
774e5c31af7Sopenharmony_ci				{
775e5c31af7Sopenharmony_ci					tc_out[2 - gl_InvocationID] = float(gl_InvocationID);
776e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
777e5c31af7Sopenharmony_ci				}
778e5c31af7Sopenharmony_ci			""
779e5c31af7Sopenharmony_ci			tessellation_evaluation ""
780e5c31af7Sopenharmony_ci				#version 310 es
781e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
782e5c31af7Sopenharmony_ci				in mediump float tc_out[];
783e5c31af7Sopenharmony_ci				out mediump float te_out;
784e5c31af7Sopenharmony_ci				void main()
785e5c31af7Sopenharmony_ci				{
786e5c31af7Sopenharmony_ci					te_out = tc_out[2];
787e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
788e5c31af7Sopenharmony_ci				}
789e5c31af7Sopenharmony_ci			""
790e5c31af7Sopenharmony_ci			fragment ""
791e5c31af7Sopenharmony_ci				#version 310 es
792e5c31af7Sopenharmony_ci				precision mediump float;
793e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
794e5c31af7Sopenharmony_ci				in mediump float te_out;
795e5c31af7Sopenharmony_ci				void main()
796e5c31af7Sopenharmony_ci				{
797e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(te_out);
798e5c31af7Sopenharmony_ci				}
799e5c31af7Sopenharmony_ci			""
800e5c31af7Sopenharmony_ci		end
801e5c31af7Sopenharmony_ci
802e5c31af7Sopenharmony_ci		case input_non_array
803e5c31af7Sopenharmony_ci			version 310 es
804e5c31af7Sopenharmony_ci			desc "Tessellation control input in not an array"
805e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
806e5c31af7Sopenharmony_ci			expect compile_or_link_fail
807e5c31af7Sopenharmony_ci			values
808e5c31af7Sopenharmony_ci			{
809e5c31af7Sopenharmony_ci				input float in0 = 1.0;
810e5c31af7Sopenharmony_ci				output float out0 = 1.0;
811e5c31af7Sopenharmony_ci			}
812e5c31af7Sopenharmony_ci			vertex ""
813e5c31af7Sopenharmony_ci				#version 310 es
814e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
815e5c31af7Sopenharmony_ci				out mediump float tc_in;
816e5c31af7Sopenharmony_ci				void main()
817e5c31af7Sopenharmony_ci				{
818e5c31af7Sopenharmony_ci					tc_in = in0;
819e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
820e5c31af7Sopenharmony_ci				}
821e5c31af7Sopenharmony_ci			""
822e5c31af7Sopenharmony_ci			tessellation_control ""
823e5c31af7Sopenharmony_ci				#version 310 es
824e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
825e5c31af7Sopenharmony_ci				in mediump float tc_in;
826e5c31af7Sopenharmony_ci				out mediump float tc_out[];
827e5c31af7Sopenharmony_ci				void main()
828e5c31af7Sopenharmony_ci				{
829e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in;
830e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
831e5c31af7Sopenharmony_ci				}
832e5c31af7Sopenharmony_ci			""
833e5c31af7Sopenharmony_ci			tessellation_evaluation ""
834e5c31af7Sopenharmony_ci				#version 310 es
835e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
836e5c31af7Sopenharmony_ci				in mediump float tc_out[];
837e5c31af7Sopenharmony_ci				out mediump float te_out;
838e5c31af7Sopenharmony_ci				void main()
839e5c31af7Sopenharmony_ci				{
840e5c31af7Sopenharmony_ci					te_out = tc_out[2];
841e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
842e5c31af7Sopenharmony_ci				}
843e5c31af7Sopenharmony_ci			""
844e5c31af7Sopenharmony_ci			fragment ""
845e5c31af7Sopenharmony_ci				#version 310 es
846e5c31af7Sopenharmony_ci				precision mediump float;
847e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
848e5c31af7Sopenharmony_ci				in mediump float te_out;
849e5c31af7Sopenharmony_ci				void main()
850e5c31af7Sopenharmony_ci				{
851e5c31af7Sopenharmony_ci					out0 = te_out;
852e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
853e5c31af7Sopenharmony_ci				}
854e5c31af7Sopenharmony_ci			""
855e5c31af7Sopenharmony_ci		end
856e5c31af7Sopenharmony_ci
857e5c31af7Sopenharmony_ci		case output_non_array
858e5c31af7Sopenharmony_ci			version 310 es
859e5c31af7Sopenharmony_ci			desc "Tessellation control output out not an array"
860e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
861e5c31af7Sopenharmony_ci			expect compile_or_link_fail
862e5c31af7Sopenharmony_ci			values
863e5c31af7Sopenharmony_ci			{
864e5c31af7Sopenharmony_ci				input float in0 = 1.0;
865e5c31af7Sopenharmony_ci				output float out0 = 1.0;
866e5c31af7Sopenharmony_ci			}
867e5c31af7Sopenharmony_ci			vertex ""
868e5c31af7Sopenharmony_ci				#version 310 es
869e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
870e5c31af7Sopenharmony_ci				out mediump float tc_in;
871e5c31af7Sopenharmony_ci				void main()
872e5c31af7Sopenharmony_ci				{
873e5c31af7Sopenharmony_ci					tc_in = in0;
874e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
875e5c31af7Sopenharmony_ci				}
876e5c31af7Sopenharmony_ci			""
877e5c31af7Sopenharmony_ci			tessellation_control ""
878e5c31af7Sopenharmony_ci				#version 310 es
879e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
880e5c31af7Sopenharmony_ci				in mediump float tc_in[];
881e5c31af7Sopenharmony_ci				out mediump float tc_out; // not an array
882e5c31af7Sopenharmony_ci				void main()
883e5c31af7Sopenharmony_ci				{
884e5c31af7Sopenharmony_ci					tc_out = tc_in[gl_InvocationID];
885e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
886e5c31af7Sopenharmony_ci				}
887e5c31af7Sopenharmony_ci			""
888e5c31af7Sopenharmony_ci			tessellation_evaluation ""
889e5c31af7Sopenharmony_ci				#version 310 es
890e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
891e5c31af7Sopenharmony_ci				in mediump float tc_out[];
892e5c31af7Sopenharmony_ci				out mediump float te_out;
893e5c31af7Sopenharmony_ci				void main()
894e5c31af7Sopenharmony_ci				{
895e5c31af7Sopenharmony_ci					te_out = tc_out[2];
896e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
897e5c31af7Sopenharmony_ci				}
898e5c31af7Sopenharmony_ci			""
899e5c31af7Sopenharmony_ci			fragment ""
900e5c31af7Sopenharmony_ci				#version 310 es
901e5c31af7Sopenharmony_ci				precision mediump float;
902e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
903e5c31af7Sopenharmony_ci				in mediump float te_out;
904e5c31af7Sopenharmony_ci				void main()
905e5c31af7Sopenharmony_ci				{
906e5c31af7Sopenharmony_ci					out0 = te_out;
907e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
908e5c31af7Sopenharmony_ci				}
909e5c31af7Sopenharmony_ci			""
910e5c31af7Sopenharmony_ci		end
911e5c31af7Sopenharmony_ci
912e5c31af7Sopenharmony_ci		case input_array_size_mismatch
913e5c31af7Sopenharmony_ci			version 310 es
914e5c31af7Sopenharmony_ci			desc "Tessellation control input array size is not gl_MaxPatchVertices"
915e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
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 310 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 310 es
934e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
935e5c31af7Sopenharmony_ci				in mediump float tc_in[2]; // not gl_MaxPatchVertices
936e5c31af7Sopenharmony_ci				out mediump float tc_out[];
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 310 es
945e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
946e5c31af7Sopenharmony_ci				in mediump float tc_out[];
947e5c31af7Sopenharmony_ci				out mediump float te_out;
948e5c31af7Sopenharmony_ci				void main()
949e5c31af7Sopenharmony_ci				{
950e5c31af7Sopenharmony_ci					te_out = tc_out[2];
951e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
952e5c31af7Sopenharmony_ci				}
953e5c31af7Sopenharmony_ci			""
954e5c31af7Sopenharmony_ci			fragment ""
955e5c31af7Sopenharmony_ci				#version 310 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 internal_array_size_mismatch
968e5c31af7Sopenharmony_ci			version 310 es
969e5c31af7Sopenharmony_ci			desc "Tessellation control output array size is not consistent with layout qualifier"
970e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
971e5c31af7Sopenharmony_ci			expect compile_or_link_fail
972e5c31af7Sopenharmony_ci			values
973e5c31af7Sopenharmony_ci			{
974e5c31af7Sopenharmony_ci				input float in0 = 1.0;
975e5c31af7Sopenharmony_ci				output float out0 = 1.0;
976e5c31af7Sopenharmony_ci			}
977e5c31af7Sopenharmony_ci			vertex ""
978e5c31af7Sopenharmony_ci				#version 310 es
979e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
980e5c31af7Sopenharmony_ci				out mediump float tc_in;
981e5c31af7Sopenharmony_ci				void main()
982e5c31af7Sopenharmony_ci				{
983e5c31af7Sopenharmony_ci					tc_in = in0;
984e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
985e5c31af7Sopenharmony_ci				}
986e5c31af7Sopenharmony_ci			""
987e5c31af7Sopenharmony_ci			tessellation_control ""
988e5c31af7Sopenharmony_ci				#version 310 es
989e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
990e5c31af7Sopenharmony_ci				in mediump float tc_in[];
991e5c31af7Sopenharmony_ci				out mediump float tc_out[2]; // does not match output layout qualifier
992e5c31af7Sopenharmony_ci				void main()
993e5c31af7Sopenharmony_ci				{
994e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
995e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
996e5c31af7Sopenharmony_ci				}
997e5c31af7Sopenharmony_ci			""
998e5c31af7Sopenharmony_ci			tessellation_evaluation ""
999e5c31af7Sopenharmony_ci				#version 310 es
1000e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1001e5c31af7Sopenharmony_ci				in mediump float tc_out[2];
1002e5c31af7Sopenharmony_ci				out mediump float te_out;
1003e5c31af7Sopenharmony_ci				void main()
1004e5c31af7Sopenharmony_ci				{
1005e5c31af7Sopenharmony_ci					te_out = tc_out[1];
1006e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1007e5c31af7Sopenharmony_ci				}
1008e5c31af7Sopenharmony_ci			""
1009e5c31af7Sopenharmony_ci			fragment ""
1010e5c31af7Sopenharmony_ci				#version 310 es
1011e5c31af7Sopenharmony_ci				precision mediump float;
1012e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1013e5c31af7Sopenharmony_ci				in mediump float te_out;
1014e5c31af7Sopenharmony_ci				void main()
1015e5c31af7Sopenharmony_ci				{
1016e5c31af7Sopenharmony_ci					out0 = te_out;
1017e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1018e5c31af7Sopenharmony_ci				}
1019e5c31af7Sopenharmony_ci			""
1020e5c31af7Sopenharmony_ci		end
1021e5c31af7Sopenharmony_ci
1022e5c31af7Sopenharmony_ci		case invalid_patch_in_usage
1023e5c31af7Sopenharmony_ci			version 310 es
1024e5c31af7Sopenharmony_ci			desc "Invalid use of the patch_in qualifier in a non-tessellation shader"
1025e5c31af7Sopenharmony_ci			expect compile_or_link_fail
1026e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1027e5c31af7Sopenharmony_ci			values
1028e5c31af7Sopenharmony_ci			{
1029e5c31af7Sopenharmony_ci				input float in0 = 1.0;
1030e5c31af7Sopenharmony_ci				output float out0 = 1.0;
1031e5c31af7Sopenharmony_ci			}
1032e5c31af7Sopenharmony_ci			vertex ""
1033e5c31af7Sopenharmony_ci				#version 310 es
1034e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1035e5c31af7Sopenharmony_ci				out mediump float frag_in;
1036e5c31af7Sopenharmony_ci				out mediump float var;
1037e5c31af7Sopenharmony_ci				void main()
1038e5c31af7Sopenharmony_ci				{
1039e5c31af7Sopenharmony_ci					frag_in = in0;
1040e5c31af7Sopenharmony_ci					var = 2.0;
1041e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1042e5c31af7Sopenharmony_ci				}
1043e5c31af7Sopenharmony_ci			""
1044e5c31af7Sopenharmony_ci			fragment ""
1045e5c31af7Sopenharmony_ci				#version 310 es
1046e5c31af7Sopenharmony_ci				precision mediump float;
1047e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1048e5c31af7Sopenharmony_ci				patch in mediump float var; // invalid use of patch_in
1049e5c31af7Sopenharmony_ci				in mediump float frag_in;
1050e5c31af7Sopenharmony_ci				void main()
1051e5c31af7Sopenharmony_ci				{
1052e5c31af7Sopenharmony_ci					out0 = frag_in * var;
1053e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1054e5c31af7Sopenharmony_ci				}
1055e5c31af7Sopenharmony_ci			""
1056e5c31af7Sopenharmony_ci		end
1057e5c31af7Sopenharmony_ci
1058e5c31af7Sopenharmony_ci		case invalid_patch_out_usage
1059e5c31af7Sopenharmony_ci			version 310 es
1060e5c31af7Sopenharmony_ci			desc "Invalid use of the patch_out qualifier in a non-tessellation shader"
1061e5c31af7Sopenharmony_ci			expect compile_or_link_fail
1062e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1063e5c31af7Sopenharmony_ci			values
1064e5c31af7Sopenharmony_ci			{
1065e5c31af7Sopenharmony_ci				input float in0 = 1.0;
1066e5c31af7Sopenharmony_ci				output float out0 = 1.0;
1067e5c31af7Sopenharmony_ci			}
1068e5c31af7Sopenharmony_ci			vertex ""
1069e5c31af7Sopenharmony_ci				#version 310 es
1070e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1071e5c31af7Sopenharmony_ci				out mediump float frag_in;
1072e5c31af7Sopenharmony_ci				patch out mediump float var;
1073e5c31af7Sopenharmony_ci				void main()
1074e5c31af7Sopenharmony_ci				{
1075e5c31af7Sopenharmony_ci					frag_in = in0;
1076e5c31af7Sopenharmony_ci					var = 2.0;
1077e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1078e5c31af7Sopenharmony_ci				}
1079e5c31af7Sopenharmony_ci			""
1080e5c31af7Sopenharmony_ci			fragment ""
1081e5c31af7Sopenharmony_ci				#version 310 es
1082e5c31af7Sopenharmony_ci				precision mediump float;
1083e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1084e5c31af7Sopenharmony_ci				in mediump float var; // invalid use of patch_out
1085e5c31af7Sopenharmony_ci				in mediump float frag_in;
1086e5c31af7Sopenharmony_ci				void main()
1087e5c31af7Sopenharmony_ci				{
1088e5c31af7Sopenharmony_ci					out0 = frag_in * var;
1089e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1090e5c31af7Sopenharmony_ci				}
1091e5c31af7Sopenharmony_ci			""
1092e5c31af7Sopenharmony_ci		end
1093e5c31af7Sopenharmony_ci
1094e5c31af7Sopenharmony_ci		case invalid_per_patch_qualifier_usage
1095e5c31af7Sopenharmony_ci			version 310 es
1096e5c31af7Sopenharmony_ci			desc "Invalid use of per-patch qualifier on input variable in tessellation control shader"
1097e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1098e5c31af7Sopenharmony_ci			expect compile_or_link_fail
1099e5c31af7Sopenharmony_ci			values
1100e5c31af7Sopenharmony_ci			{
1101e5c31af7Sopenharmony_ci				input float in0 = 1.0;
1102e5c31af7Sopenharmony_ci				output float out0 = 1.0;
1103e5c31af7Sopenharmony_ci			}
1104e5c31af7Sopenharmony_ci			vertex ""
1105e5c31af7Sopenharmony_ci				#version 310 es
1106e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1107e5c31af7Sopenharmony_ci				out mediump float tc_in;
1108e5c31af7Sopenharmony_ci				void main()
1109e5c31af7Sopenharmony_ci				{
1110e5c31af7Sopenharmony_ci					tc_in = in0;
1111e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1112e5c31af7Sopenharmony_ci				}
1113e5c31af7Sopenharmony_ci			""
1114e5c31af7Sopenharmony_ci			tessellation_control ""
1115e5c31af7Sopenharmony_ci				#version 310 es
1116e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1117e5c31af7Sopenharmony_ci				patch in mediump float tc_in; // patch in not allowed in TCS
1118e5c31af7Sopenharmony_ci				patch out mediump float tc_out;
1119e5c31af7Sopenharmony_ci				void main()
1120e5c31af7Sopenharmony_ci				{
1121e5c31af7Sopenharmony_ci					tc_out = tc_in;
1122e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1123e5c31af7Sopenharmony_ci				}
1124e5c31af7Sopenharmony_ci			""
1125e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1126e5c31af7Sopenharmony_ci				#version 310 es
1127e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1128e5c31af7Sopenharmony_ci				patch in mediump float tc_out;
1129e5c31af7Sopenharmony_ci				out mediump float te_out;
1130e5c31af7Sopenharmony_ci				void main()
1131e5c31af7Sopenharmony_ci				{
1132e5c31af7Sopenharmony_ci					te_out = tc_out;
1133e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1134e5c31af7Sopenharmony_ci				}
1135e5c31af7Sopenharmony_ci			""
1136e5c31af7Sopenharmony_ci			fragment ""
1137e5c31af7Sopenharmony_ci				#version 310 es
1138e5c31af7Sopenharmony_ci				precision mediump float;
1139e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1140e5c31af7Sopenharmony_ci				in mediump float te_out;
1141e5c31af7Sopenharmony_ci				void main()
1142e5c31af7Sopenharmony_ci				{
1143e5c31af7Sopenharmony_ci					out0 = te_out;
1144e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1145e5c31af7Sopenharmony_ci				}
1146e5c31af7Sopenharmony_ci			""
1147e5c31af7Sopenharmony_ci		end
1148e5c31af7Sopenharmony_ci
1149e5c31af7Sopenharmony_ci		case per_patch_qualifier_mismatch_1
1150e5c31af7Sopenharmony_ci			version 310 es
1151e5c31af7Sopenharmony_ci			desc "Tessellation control output is per-patch qualified, evaluation input is not"
1152e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1153e5c31af7Sopenharmony_ci			expect compile_or_link_fail
1154e5c31af7Sopenharmony_ci			values
1155e5c31af7Sopenharmony_ci			{
1156e5c31af7Sopenharmony_ci				input float in0 = 1.0;
1157e5c31af7Sopenharmony_ci				output float out0 = 1.0;
1158e5c31af7Sopenharmony_ci			}
1159e5c31af7Sopenharmony_ci			vertex ""
1160e5c31af7Sopenharmony_ci				#version 310 es
1161e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1162e5c31af7Sopenharmony_ci				out mediump float tc_in;
1163e5c31af7Sopenharmony_ci				void main()
1164e5c31af7Sopenharmony_ci				{
1165e5c31af7Sopenharmony_ci					tc_in = in0;
1166e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1167e5c31af7Sopenharmony_ci				}
1168e5c31af7Sopenharmony_ci			""
1169e5c31af7Sopenharmony_ci			tessellation_control ""
1170e5c31af7Sopenharmony_ci				#version 310 es
1171e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1172e5c31af7Sopenharmony_ci				in mediump float tc_in[];
1173e5c31af7Sopenharmony_ci				patch out mediump float tc_out[gl_MaxPatchVertices];
1174e5c31af7Sopenharmony_ci				void main()
1175e5c31af7Sopenharmony_ci				{
1176e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1177e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1178e5c31af7Sopenharmony_ci				}
1179e5c31af7Sopenharmony_ci			""
1180e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1181e5c31af7Sopenharmony_ci				#version 310 es
1182e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1183e5c31af7Sopenharmony_ci				in mediump float tc_out[gl_MaxPatchVertices];
1184e5c31af7Sopenharmony_ci				out mediump float te_out;
1185e5c31af7Sopenharmony_ci				void main()
1186e5c31af7Sopenharmony_ci				{
1187e5c31af7Sopenharmony_ci					te_out = tc_out[2];
1188e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1189e5c31af7Sopenharmony_ci				}
1190e5c31af7Sopenharmony_ci			""
1191e5c31af7Sopenharmony_ci			fragment ""
1192e5c31af7Sopenharmony_ci				#version 310 es
1193e5c31af7Sopenharmony_ci				precision mediump float;
1194e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1195e5c31af7Sopenharmony_ci				in mediump float te_out;
1196e5c31af7Sopenharmony_ci				void main()
1197e5c31af7Sopenharmony_ci				{
1198e5c31af7Sopenharmony_ci					out0 = te_out;
1199e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1200e5c31af7Sopenharmony_ci				}
1201e5c31af7Sopenharmony_ci			""
1202e5c31af7Sopenharmony_ci		end
1203e5c31af7Sopenharmony_ci
1204e5c31af7Sopenharmony_ci		case per_patch_qualifier_mismatch_2
1205e5c31af7Sopenharmony_ci			version 310 es
1206e5c31af7Sopenharmony_ci			desc "Tessellation control output is not per-patch qualified, evaluation input is"
1207e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1208e5c31af7Sopenharmony_ci			expect compile_or_link_fail
1209e5c31af7Sopenharmony_ci			values
1210e5c31af7Sopenharmony_ci			{
1211e5c31af7Sopenharmony_ci				input float in0 = 1.0;
1212e5c31af7Sopenharmony_ci				output float out0 = 1.0;
1213e5c31af7Sopenharmony_ci			}
1214e5c31af7Sopenharmony_ci			vertex ""
1215e5c31af7Sopenharmony_ci				#version 310 es
1216e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1217e5c31af7Sopenharmony_ci				out mediump float tc_in;
1218e5c31af7Sopenharmony_ci				void main()
1219e5c31af7Sopenharmony_ci				{
1220e5c31af7Sopenharmony_ci					tc_in = in0;
1221e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1222e5c31af7Sopenharmony_ci				}
1223e5c31af7Sopenharmony_ci			""
1224e5c31af7Sopenharmony_ci			tessellation_control ""
1225e5c31af7Sopenharmony_ci				#version 310 es
1226e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1227e5c31af7Sopenharmony_ci				in mediump float tc_in[];
1228e5c31af7Sopenharmony_ci				out mediump float tc_out[gl_MaxPatchVertices];
1229e5c31af7Sopenharmony_ci				void main()
1230e5c31af7Sopenharmony_ci				{
1231e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1232e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1233e5c31af7Sopenharmony_ci				}
1234e5c31af7Sopenharmony_ci			""
1235e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1236e5c31af7Sopenharmony_ci				#version 310 es
1237e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1238e5c31af7Sopenharmony_ci				patch in mediump float tc_out[gl_MaxPatchVertices];
1239e5c31af7Sopenharmony_ci				out mediump float te_out;
1240e5c31af7Sopenharmony_ci				void main()
1241e5c31af7Sopenharmony_ci				{
1242e5c31af7Sopenharmony_ci					te_out = tc_out[2];
1243e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1244e5c31af7Sopenharmony_ci				}
1245e5c31af7Sopenharmony_ci			""
1246e5c31af7Sopenharmony_ci			fragment ""
1247e5c31af7Sopenharmony_ci				#version 310 es
1248e5c31af7Sopenharmony_ci				precision mediump float;
1249e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1250e5c31af7Sopenharmony_ci				in mediump float te_out;
1251e5c31af7Sopenharmony_ci				void main()
1252e5c31af7Sopenharmony_ci				{
1253e5c31af7Sopenharmony_ci					out0 = te_out;
1254e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1255e5c31af7Sopenharmony_ci				}
1256e5c31af7Sopenharmony_ci			""
1257e5c31af7Sopenharmony_ci		end
1258e5c31af7Sopenharmony_ci
1259e5c31af7Sopenharmony_ci		case input_block
1260e5c31af7Sopenharmony_ci			version 310 es
1261e5c31af7Sopenharmony_ci			desc "Tessellation control shader input block"
1262e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1263e5c31af7Sopenharmony_ci			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1264e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
1265e5c31af7Sopenharmony_ci			vertex ""
1266e5c31af7Sopenharmony_ci				#version 310 es
1267e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1268e5c31af7Sopenharmony_ci				out IOBlockName
1269e5c31af7Sopenharmony_ci				{
1270e5c31af7Sopenharmony_ci					mediump float var;
1271e5c31af7Sopenharmony_ci				} outputInstanceName;
1272e5c31af7Sopenharmony_ci				void main()
1273e5c31af7Sopenharmony_ci				{
1274e5c31af7Sopenharmony_ci					outputInstanceName.var = 1.0;
1275e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1276e5c31af7Sopenharmony_ci				}
1277e5c31af7Sopenharmony_ci			""
1278e5c31af7Sopenharmony_ci			tessellation_control ""
1279e5c31af7Sopenharmony_ci				#version 310 es
1280e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1281e5c31af7Sopenharmony_ci				in IOBlockName
1282e5c31af7Sopenharmony_ci				{
1283e5c31af7Sopenharmony_ci					mediump float var;
1284e5c31af7Sopenharmony_ci				} inputInstanceName[];
1285e5c31af7Sopenharmony_ci				out mediump float tc_out[];
1286e5c31af7Sopenharmony_ci				void main()
1287e5c31af7Sopenharmony_ci				{
1288e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = inputInstanceName[gl_InvocationID].var;
1289e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1290e5c31af7Sopenharmony_ci				}
1291e5c31af7Sopenharmony_ci			""
1292e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1293e5c31af7Sopenharmony_ci				#version 310 es
1294e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1295e5c31af7Sopenharmony_ci				in mediump float tc_out[];
1296e5c31af7Sopenharmony_ci				out mediump float te_out;
1297e5c31af7Sopenharmony_ci				void main()
1298e5c31af7Sopenharmony_ci				{
1299e5c31af7Sopenharmony_ci					te_out = tc_out[2];
1300e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1301e5c31af7Sopenharmony_ci				}
1302e5c31af7Sopenharmony_ci			""
1303e5c31af7Sopenharmony_ci			fragment ""
1304e5c31af7Sopenharmony_ci				#version 310 es
1305e5c31af7Sopenharmony_ci				precision mediump float;
1306e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1307e5c31af7Sopenharmony_ci				in mediump float te_out;
1308e5c31af7Sopenharmony_ci				void main()
1309e5c31af7Sopenharmony_ci				{
1310e5c31af7Sopenharmony_ci					out0 = te_out;
1311e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1312e5c31af7Sopenharmony_ci				}
1313e5c31af7Sopenharmony_ci			""
1314e5c31af7Sopenharmony_ci		end
1315e5c31af7Sopenharmony_ci
1316e5c31af7Sopenharmony_ci		case input_block_non_array
1317e5c31af7Sopenharmony_ci			version 310 es
1318e5c31af7Sopenharmony_ci			desc "Tessellation control shader input block without explicit array"
1319e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1320e5c31af7Sopenharmony_ci			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1321e5c31af7Sopenharmony_ci			expect compile_or_link_fail
1322e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
1323e5c31af7Sopenharmony_ci			vertex ""
1324e5c31af7Sopenharmony_ci				#version 310 es
1325e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1326e5c31af7Sopenharmony_ci				out IOBlockName
1327e5c31af7Sopenharmony_ci				{
1328e5c31af7Sopenharmony_ci					mediump float var;
1329e5c31af7Sopenharmony_ci				} outputInstanceName;
1330e5c31af7Sopenharmony_ci				void main()
1331e5c31af7Sopenharmony_ci				{
1332e5c31af7Sopenharmony_ci					outputInstanceName.var = 1.0;
1333e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1334e5c31af7Sopenharmony_ci				}
1335e5c31af7Sopenharmony_ci			""
1336e5c31af7Sopenharmony_ci			tessellation_control ""
1337e5c31af7Sopenharmony_ci				#version 310 es
1338e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1339e5c31af7Sopenharmony_ci				in IOBlockName
1340e5c31af7Sopenharmony_ci				{
1341e5c31af7Sopenharmony_ci					mediump float var;
1342e5c31af7Sopenharmony_ci				} inputInstanceName;
1343e5c31af7Sopenharmony_ci				out mediump float tc_out[];
1344e5c31af7Sopenharmony_ci				void main()
1345e5c31af7Sopenharmony_ci				{
1346e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = inputInstanceName.var;
1347e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1348e5c31af7Sopenharmony_ci				}
1349e5c31af7Sopenharmony_ci			""
1350e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1351e5c31af7Sopenharmony_ci				#version 310 es
1352e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1353e5c31af7Sopenharmony_ci				in mediump float tc_out[];
1354e5c31af7Sopenharmony_ci				out mediump float te_out;
1355e5c31af7Sopenharmony_ci				void main()
1356e5c31af7Sopenharmony_ci				{
1357e5c31af7Sopenharmony_ci					te_out = tc_out[2];
1358e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1359e5c31af7Sopenharmony_ci				}
1360e5c31af7Sopenharmony_ci			""
1361e5c31af7Sopenharmony_ci			fragment ""
1362e5c31af7Sopenharmony_ci				#version 310 es
1363e5c31af7Sopenharmony_ci				precision mediump float;
1364e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1365e5c31af7Sopenharmony_ci				in mediump float geo_out;
1366e5c31af7Sopenharmony_ci				void main()
1367e5c31af7Sopenharmony_ci				{
1368e5c31af7Sopenharmony_ci					out0 = geo_out;
1369e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1370e5c31af7Sopenharmony_ci				}
1371e5c31af7Sopenharmony_ci			""
1372e5c31af7Sopenharmony_ci		end
1373e5c31af7Sopenharmony_ci
1374e5c31af7Sopenharmony_ci		case output_block_non_array
1375e5c31af7Sopenharmony_ci			version 310 es
1376e5c31af7Sopenharmony_ci			desc "Tessellation control shader output block without explicit array"
1377e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1378e5c31af7Sopenharmony_ci			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1379e5c31af7Sopenharmony_ci			expect compile_or_link_fail
1380e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
1381e5c31af7Sopenharmony_ci			vertex ""
1382e5c31af7Sopenharmony_ci				#version 310 es
1383e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1384e5c31af7Sopenharmony_ci				out mediump float tc_in;
1385e5c31af7Sopenharmony_ci				void main()
1386e5c31af7Sopenharmony_ci				{
1387e5c31af7Sopenharmony_ci					tc_in = 1.0;
1388e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1389e5c31af7Sopenharmony_ci				}
1390e5c31af7Sopenharmony_ci			""
1391e5c31af7Sopenharmony_ci			tessellation_control ""
1392e5c31af7Sopenharmony_ci				#version 310 es
1393e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1394e5c31af7Sopenharmony_ci				in mediump float tc_in[];
1395e5c31af7Sopenharmony_ci				out IOBlockName
1396e5c31af7Sopenharmony_ci				{
1397e5c31af7Sopenharmony_ci					mediump float var;
1398e5c31af7Sopenharmony_ci				} outputInstanceName; // not an array
1399e5c31af7Sopenharmony_ci				void main()
1400e5c31af7Sopenharmony_ci				{
1401e5c31af7Sopenharmony_ci					outputInstanceName.var = tc_in[gl_InvocationID];
1402e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1403e5c31af7Sopenharmony_ci				}
1404e5c31af7Sopenharmony_ci			""
1405e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1406e5c31af7Sopenharmony_ci				#version 310 es
1407e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1408e5c31af7Sopenharmony_ci				in IOBlockName
1409e5c31af7Sopenharmony_ci				{
1410e5c31af7Sopenharmony_ci					mediump float var;
1411e5c31af7Sopenharmony_ci				} outputInstanceName[];
1412e5c31af7Sopenharmony_ci				out mediump float te_out;
1413e5c31af7Sopenharmony_ci				void main()
1414e5c31af7Sopenharmony_ci				{
1415e5c31af7Sopenharmony_ci					te_out = outputInstanceName[2].var;
1416e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1417e5c31af7Sopenharmony_ci				}
1418e5c31af7Sopenharmony_ci			""
1419e5c31af7Sopenharmony_ci			fragment ""
1420e5c31af7Sopenharmony_ci				#version 310 es
1421e5c31af7Sopenharmony_ci				precision mediump float;
1422e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1423e5c31af7Sopenharmony_ci				in mediump float te_out;
1424e5c31af7Sopenharmony_ci				void main()
1425e5c31af7Sopenharmony_ci				{
1426e5c31af7Sopenharmony_ci					out0 = te_out;
1427e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1428e5c31af7Sopenharmony_ci				}
1429e5c31af7Sopenharmony_ci			""
1430e5c31af7Sopenharmony_ci		end
1431e5c31af7Sopenharmony_ci
1432e5c31af7Sopenharmony_ci		case input_block_array_size_mismatch
1433e5c31af7Sopenharmony_ci			version 310 es
1434e5c31af7Sopenharmony_ci			desc "Tessellation control shader input block array, size not gl_MaxPatchVertices"
1435e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1436e5c31af7Sopenharmony_ci			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1437e5c31af7Sopenharmony_ci			expect compile_or_link_fail
1438e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
1439e5c31af7Sopenharmony_ci			vertex ""
1440e5c31af7Sopenharmony_ci				#version 310 es
1441e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1442e5c31af7Sopenharmony_ci				out IOBlockName
1443e5c31af7Sopenharmony_ci				{
1444e5c31af7Sopenharmony_ci					mediump float var;
1445e5c31af7Sopenharmony_ci				} outputInstanceName;
1446e5c31af7Sopenharmony_ci				void main()
1447e5c31af7Sopenharmony_ci				{
1448e5c31af7Sopenharmony_ci					outputInstanceName.var = 1.0;
1449e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1450e5c31af7Sopenharmony_ci				}
1451e5c31af7Sopenharmony_ci			""
1452e5c31af7Sopenharmony_ci			tessellation_control ""
1453e5c31af7Sopenharmony_ci				#version 310 es
1454e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1455e5c31af7Sopenharmony_ci				in IOBlockName
1456e5c31af7Sopenharmony_ci				{
1457e5c31af7Sopenharmony_ci					mediump float var;
1458e5c31af7Sopenharmony_ci				} inputInstanceName[4]; // not gl_MaxPatchVertices
1459e5c31af7Sopenharmony_ci				out mediump float tc_out[];
1460e5c31af7Sopenharmony_ci				void main()
1461e5c31af7Sopenharmony_ci				{
1462e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = inputInstanceName[gl_InvocationID + 1].var;
1463e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1464e5c31af7Sopenharmony_ci				}
1465e5c31af7Sopenharmony_ci			""
1466e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1467e5c31af7Sopenharmony_ci				#version 310 es
1468e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1469e5c31af7Sopenharmony_ci				in mediump float tc_out[];
1470e5c31af7Sopenharmony_ci				out mediump float te_out;
1471e5c31af7Sopenharmony_ci				void main()
1472e5c31af7Sopenharmony_ci				{
1473e5c31af7Sopenharmony_ci					te_out = tc_out[2];
1474e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1475e5c31af7Sopenharmony_ci				}
1476e5c31af7Sopenharmony_ci			""
1477e5c31af7Sopenharmony_ci			fragment ""
1478e5c31af7Sopenharmony_ci				#version 310 es
1479e5c31af7Sopenharmony_ci				precision mediump float;
1480e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1481e5c31af7Sopenharmony_ci				in mediump float geo_out;
1482e5c31af7Sopenharmony_ci				void main()
1483e5c31af7Sopenharmony_ci				{
1484e5c31af7Sopenharmony_ci					out0 = geo_out;
1485e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1486e5c31af7Sopenharmony_ci				}
1487e5c31af7Sopenharmony_ci			""
1488e5c31af7Sopenharmony_ci		end
1489e5c31af7Sopenharmony_ci
1490e5c31af7Sopenharmony_ci		case output_block
1491e5c31af7Sopenharmony_ci			version 310 es
1492e5c31af7Sopenharmony_ci			desc "Tessellation shader output block"
1493e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1494e5c31af7Sopenharmony_ci			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1495e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
1496e5c31af7Sopenharmony_ci			vertex ""
1497e5c31af7Sopenharmony_ci				#version 310 es
1498e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1499e5c31af7Sopenharmony_ci				void main()
1500e5c31af7Sopenharmony_ci				{
1501e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1502e5c31af7Sopenharmony_ci				}
1503e5c31af7Sopenharmony_ci			""
1504e5c31af7Sopenharmony_ci			tessellation_control ""
1505e5c31af7Sopenharmony_ci				#version 310 es
1506e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1507e5c31af7Sopenharmony_ci				void main()
1508e5c31af7Sopenharmony_ci				{
1509e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1510e5c31af7Sopenharmony_ci				}
1511e5c31af7Sopenharmony_ci			""
1512e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1513e5c31af7Sopenharmony_ci				#version 310 es
1514e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1515e5c31af7Sopenharmony_ci				out IOBlockName
1516e5c31af7Sopenharmony_ci				{
1517e5c31af7Sopenharmony_ci					mediump float var;
1518e5c31af7Sopenharmony_ci				} outputInstanceName;
1519e5c31af7Sopenharmony_ci				void main()
1520e5c31af7Sopenharmony_ci				{
1521e5c31af7Sopenharmony_ci					outputInstanceName.var = 1.0;
1522e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1523e5c31af7Sopenharmony_ci				}
1524e5c31af7Sopenharmony_ci			""
1525e5c31af7Sopenharmony_ci			fragment ""
1526e5c31af7Sopenharmony_ci				#version 310 es
1527e5c31af7Sopenharmony_ci				precision mediump float;
1528e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1529e5c31af7Sopenharmony_ci				in IOBlockName
1530e5c31af7Sopenharmony_ci				{
1531e5c31af7Sopenharmony_ci					mediump float var;
1532e5c31af7Sopenharmony_ci				} inputInstanceName;
1533e5c31af7Sopenharmony_ci				void main()
1534e5c31af7Sopenharmony_ci				{
1535e5c31af7Sopenharmony_ci					out0 = inputInstanceName.var;
1536e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1537e5c31af7Sopenharmony_ci				}
1538e5c31af7Sopenharmony_ci			""
1539e5c31af7Sopenharmony_ci		end
1540e5c31af7Sopenharmony_ci
1541e5c31af7Sopenharmony_ci		case output_block_array
1542e5c31af7Sopenharmony_ci			version 310 es
1543e5c31af7Sopenharmony_ci			desc "Tessellation shader output block array"
1544e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1545e5c31af7Sopenharmony_ci			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1546e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
1547e5c31af7Sopenharmony_ci			vertex ""
1548e5c31af7Sopenharmony_ci				#version 310 es
1549e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1550e5c31af7Sopenharmony_ci				void main()
1551e5c31af7Sopenharmony_ci				{
1552e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1553e5c31af7Sopenharmony_ci				}
1554e5c31af7Sopenharmony_ci			""
1555e5c31af7Sopenharmony_ci			tessellation_control ""
1556e5c31af7Sopenharmony_ci				#version 310 es
1557e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1558e5c31af7Sopenharmony_ci				void main()
1559e5c31af7Sopenharmony_ci				{
1560e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1561e5c31af7Sopenharmony_ci				}
1562e5c31af7Sopenharmony_ci			""
1563e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1564e5c31af7Sopenharmony_ci				#version 310 es
1565e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1566e5c31af7Sopenharmony_ci				out IOBlockName
1567e5c31af7Sopenharmony_ci				{
1568e5c31af7Sopenharmony_ci					mediump float var;
1569e5c31af7Sopenharmony_ci				} outputInstanceName[2];
1570e5c31af7Sopenharmony_ci				void main()
1571e5c31af7Sopenharmony_ci				{
1572e5c31af7Sopenharmony_ci					outputInstanceName[0].var = 2.0;
1573e5c31af7Sopenharmony_ci					outputInstanceName[1].var = 1.0;
1574e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1575e5c31af7Sopenharmony_ci				}
1576e5c31af7Sopenharmony_ci			""
1577e5c31af7Sopenharmony_ci			fragment ""
1578e5c31af7Sopenharmony_ci				#version 310 es
1579e5c31af7Sopenharmony_ci				precision mediump float;
1580e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1581e5c31af7Sopenharmony_ci				in IOBlockName
1582e5c31af7Sopenharmony_ci				{
1583e5c31af7Sopenharmony_ci					mediump float var;
1584e5c31af7Sopenharmony_ci				} inputInstanceName[2];
1585e5c31af7Sopenharmony_ci				void main()
1586e5c31af7Sopenharmony_ci				{
1587e5c31af7Sopenharmony_ci					out0 = inputInstanceName[0].var - inputInstanceName[1].var;
1588e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1589e5c31af7Sopenharmony_ci				}
1590e5c31af7Sopenharmony_ci			""
1591e5c31af7Sopenharmony_ci		end
1592e5c31af7Sopenharmony_ci
1593e5c31af7Sopenharmony_ci		case unspecified_vertex_count
1594e5c31af7Sopenharmony_ci			version 310 es
1595e5c31af7Sopenharmony_ci			desc "Tessellation shader unspecified vertex count"
1596e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1597e5c31af7Sopenharmony_ci			expect compile_or_link_fail
1598e5c31af7Sopenharmony_ci			vertex ""
1599e5c31af7Sopenharmony_ci				#version 310 es
1600e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1601e5c31af7Sopenharmony_ci				void main()
1602e5c31af7Sopenharmony_ci				{
1603e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1604e5c31af7Sopenharmony_ci				}
1605e5c31af7Sopenharmony_ci			""
1606e5c31af7Sopenharmony_ci			tessellation_control ""
1607e5c31af7Sopenharmony_ci				#version 310 es
1608e5c31af7Sopenharmony_ci				void main()
1609e5c31af7Sopenharmony_ci				{
1610e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1611e5c31af7Sopenharmony_ci				}
1612e5c31af7Sopenharmony_ci			""
1613e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1614e5c31af7Sopenharmony_ci				#version 310 es
1615e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1616e5c31af7Sopenharmony_ci				void main()
1617e5c31af7Sopenharmony_ci				{
1618e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1619e5c31af7Sopenharmony_ci				}
1620e5c31af7Sopenharmony_ci			""
1621e5c31af7Sopenharmony_ci			fragment ""
1622e5c31af7Sopenharmony_ci				#version 310 es
1623e5c31af7Sopenharmony_ci				precision mediump float;
1624e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1625e5c31af7Sopenharmony_ci				void main()
1626e5c31af7Sopenharmony_ci				{
1627e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1628e5c31af7Sopenharmony_ci				}
1629e5c31af7Sopenharmony_ci			""
1630e5c31af7Sopenharmony_ci		end
1631e5c31af7Sopenharmony_ci
1632e5c31af7Sopenharmony_ci		case unspecified_primitive_mode
1633e5c31af7Sopenharmony_ci			version 310 es
1634e5c31af7Sopenharmony_ci			desc "Tessellation shader unspecified vertex count"
1635e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1636e5c31af7Sopenharmony_ci			expect compile_or_link_fail
1637e5c31af7Sopenharmony_ci			vertex ""
1638e5c31af7Sopenharmony_ci				#version 310 es
1639e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1640e5c31af7Sopenharmony_ci				void main()
1641e5c31af7Sopenharmony_ci				{
1642e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1643e5c31af7Sopenharmony_ci				}
1644e5c31af7Sopenharmony_ci			""
1645e5c31af7Sopenharmony_ci			tessellation_control ""
1646e5c31af7Sopenharmony_ci				#version 310 es
1647e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1648e5c31af7Sopenharmony_ci				void main()
1649e5c31af7Sopenharmony_ci				{
1650e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1651e5c31af7Sopenharmony_ci				}
1652e5c31af7Sopenharmony_ci			""
1653e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1654e5c31af7Sopenharmony_ci				#version 310 es
1655e5c31af7Sopenharmony_ci				void main()
1656e5c31af7Sopenharmony_ci				{
1657e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1658e5c31af7Sopenharmony_ci				}
1659e5c31af7Sopenharmony_ci			""
1660e5c31af7Sopenharmony_ci			fragment ""
1661e5c31af7Sopenharmony_ci				#version 310 es
1662e5c31af7Sopenharmony_ci				precision mediump float;
1663e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1664e5c31af7Sopenharmony_ci				void main()
1665e5c31af7Sopenharmony_ci				{
1666e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1667e5c31af7Sopenharmony_ci				}
1668e5c31af7Sopenharmony_ci			""
1669e5c31af7Sopenharmony_ci		end
1670e5c31af7Sopenharmony_ci	end
1671e5c31af7Sopenharmony_ci
1672e5c31af7Sopenharmony_ci	group qualifiers "Varying qualifiers"
1673e5c31af7Sopenharmony_ci		case smooth
1674e5c31af7Sopenharmony_ci			version 310 es
1675e5c31af7Sopenharmony_ci			desc "Smooth varying"
1676e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1677e5c31af7Sopenharmony_ci			values
1678e5c31af7Sopenharmony_ci			{
1679e5c31af7Sopenharmony_ci				input float in0 = 1.0;
1680e5c31af7Sopenharmony_ci				output float out0 = 1.0;
1681e5c31af7Sopenharmony_ci			}
1682e5c31af7Sopenharmony_ci			vertex ""
1683e5c31af7Sopenharmony_ci				#version 310 es
1684e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1685e5c31af7Sopenharmony_ci				smooth out mediump float tc_in;
1686e5c31af7Sopenharmony_ci				void main()
1687e5c31af7Sopenharmony_ci				{
1688e5c31af7Sopenharmony_ci					tc_in = in0;
1689e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1690e5c31af7Sopenharmony_ci				}
1691e5c31af7Sopenharmony_ci			""
1692e5c31af7Sopenharmony_ci			tessellation_control ""
1693e5c31af7Sopenharmony_ci				#version 310 es
1694e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1695e5c31af7Sopenharmony_ci				smooth in mediump float tc_in[];
1696e5c31af7Sopenharmony_ci				smooth out mediump float tc_out[];
1697e5c31af7Sopenharmony_ci				void main()
1698e5c31af7Sopenharmony_ci				{
1699e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1700e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1701e5c31af7Sopenharmony_ci				}
1702e5c31af7Sopenharmony_ci			""
1703e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1704e5c31af7Sopenharmony_ci				#version 310 es
1705e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1706e5c31af7Sopenharmony_ci				smooth in mediump float tc_out[];
1707e5c31af7Sopenharmony_ci				smooth out mediump float te_out;
1708e5c31af7Sopenharmony_ci				void main()
1709e5c31af7Sopenharmony_ci				{
1710e5c31af7Sopenharmony_ci					te_out = tc_out[2];
1711e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1712e5c31af7Sopenharmony_ci				}
1713e5c31af7Sopenharmony_ci			""
1714e5c31af7Sopenharmony_ci			fragment ""
1715e5c31af7Sopenharmony_ci				#version 310 es
1716e5c31af7Sopenharmony_ci				precision mediump float;
1717e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1718e5c31af7Sopenharmony_ci				smooth in mediump float te_out;
1719e5c31af7Sopenharmony_ci				void main()
1720e5c31af7Sopenharmony_ci				{
1721e5c31af7Sopenharmony_ci					out0 = te_out;
1722e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1723e5c31af7Sopenharmony_ci				}
1724e5c31af7Sopenharmony_ci			""
1725e5c31af7Sopenharmony_ci		end
1726e5c31af7Sopenharmony_ci
1727e5c31af7Sopenharmony_ci		case flat
1728e5c31af7Sopenharmony_ci			version 310 es
1729e5c31af7Sopenharmony_ci			desc "Flat varying"
1730e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1731e5c31af7Sopenharmony_ci			values
1732e5c31af7Sopenharmony_ci			{
1733e5c31af7Sopenharmony_ci				input float in0 = 1.0;
1734e5c31af7Sopenharmony_ci				output float out0 = 1.0;
1735e5c31af7Sopenharmony_ci			}
1736e5c31af7Sopenharmony_ci			vertex ""
1737e5c31af7Sopenharmony_ci				#version 310 es
1738e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1739e5c31af7Sopenharmony_ci				flat out mediump float tc_in;
1740e5c31af7Sopenharmony_ci				void main()
1741e5c31af7Sopenharmony_ci				{
1742e5c31af7Sopenharmony_ci					tc_in = in0;
1743e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1744e5c31af7Sopenharmony_ci				}
1745e5c31af7Sopenharmony_ci			""
1746e5c31af7Sopenharmony_ci			tessellation_control ""
1747e5c31af7Sopenharmony_ci				#version 310 es
1748e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1749e5c31af7Sopenharmony_ci				flat in mediump float tc_in[];
1750e5c31af7Sopenharmony_ci				flat out mediump float tc_out[];
1751e5c31af7Sopenharmony_ci				void main()
1752e5c31af7Sopenharmony_ci				{
1753e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1754e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1755e5c31af7Sopenharmony_ci				}
1756e5c31af7Sopenharmony_ci			""
1757e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1758e5c31af7Sopenharmony_ci				#version 310 es
1759e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1760e5c31af7Sopenharmony_ci				flat in mediump float tc_out[];
1761e5c31af7Sopenharmony_ci				flat out mediump float te_out;
1762e5c31af7Sopenharmony_ci				void main()
1763e5c31af7Sopenharmony_ci				{
1764e5c31af7Sopenharmony_ci					te_out = tc_out[2];
1765e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1766e5c31af7Sopenharmony_ci				}
1767e5c31af7Sopenharmony_ci			""
1768e5c31af7Sopenharmony_ci			fragment ""
1769e5c31af7Sopenharmony_ci				#version 310 es
1770e5c31af7Sopenharmony_ci				precision mediump float;
1771e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1772e5c31af7Sopenharmony_ci				flat in mediump float te_out;
1773e5c31af7Sopenharmony_ci				void main()
1774e5c31af7Sopenharmony_ci				{
1775e5c31af7Sopenharmony_ci					out0 = te_out;
1776e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1777e5c31af7Sopenharmony_ci				}
1778e5c31af7Sopenharmony_ci			""
1779e5c31af7Sopenharmony_ci		end
1780e5c31af7Sopenharmony_ci
1781e5c31af7Sopenharmony_ci		case centroid
1782e5c31af7Sopenharmony_ci			version 310 es
1783e5c31af7Sopenharmony_ci			desc "Centroid varying"
1784e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1785e5c31af7Sopenharmony_ci			values
1786e5c31af7Sopenharmony_ci			{
1787e5c31af7Sopenharmony_ci				input float in0 = 1.0;
1788e5c31af7Sopenharmony_ci				output float out0 = 1.0;
1789e5c31af7Sopenharmony_ci			}
1790e5c31af7Sopenharmony_ci			vertex ""
1791e5c31af7Sopenharmony_ci				#version 310 es
1792e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1793e5c31af7Sopenharmony_ci				centroid out mediump float tc_in;
1794e5c31af7Sopenharmony_ci				void main()
1795e5c31af7Sopenharmony_ci				{
1796e5c31af7Sopenharmony_ci					tc_in = in0;
1797e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1798e5c31af7Sopenharmony_ci				}
1799e5c31af7Sopenharmony_ci			""
1800e5c31af7Sopenharmony_ci			tessellation_control ""
1801e5c31af7Sopenharmony_ci				#version 310 es
1802e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1803e5c31af7Sopenharmony_ci				centroid in mediump float tc_in[];
1804e5c31af7Sopenharmony_ci				centroid out mediump float tc_out[];
1805e5c31af7Sopenharmony_ci				void main()
1806e5c31af7Sopenharmony_ci				{
1807e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1808e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1809e5c31af7Sopenharmony_ci				}
1810e5c31af7Sopenharmony_ci			""
1811e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1812e5c31af7Sopenharmony_ci				#version 310 es
1813e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1814e5c31af7Sopenharmony_ci				centroid in mediump float tc_out[];
1815e5c31af7Sopenharmony_ci				centroid out mediump float te_out;
1816e5c31af7Sopenharmony_ci				void main()
1817e5c31af7Sopenharmony_ci				{
1818e5c31af7Sopenharmony_ci					te_out = tc_out[2];
1819e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1820e5c31af7Sopenharmony_ci				}
1821e5c31af7Sopenharmony_ci			""
1822e5c31af7Sopenharmony_ci			fragment ""
1823e5c31af7Sopenharmony_ci				#version 310 es
1824e5c31af7Sopenharmony_ci				precision mediump float;
1825e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1826e5c31af7Sopenharmony_ci				centroid in mediump float te_out;
1827e5c31af7Sopenharmony_ci				void main()
1828e5c31af7Sopenharmony_ci				{
1829e5c31af7Sopenharmony_ci					out0 = te_out;
1830e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1831e5c31af7Sopenharmony_ci				}
1832e5c31af7Sopenharmony_ci			""
1833e5c31af7Sopenharmony_ci		end
1834e5c31af7Sopenharmony_ci
1835e5c31af7Sopenharmony_ci		case sample
1836e5c31af7Sopenharmony_ci			version 310 es
1837e5c31af7Sopenharmony_ci			desc "Sample varying"
1838e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1839e5c31af7Sopenharmony_ci			require extension { "GL_OES_shader_multisample_interpolation" }
1840e5c31af7Sopenharmony_ci			values
1841e5c31af7Sopenharmony_ci			{
1842e5c31af7Sopenharmony_ci				input float in0 = 1.0;
1843e5c31af7Sopenharmony_ci				output float out0 = 1.0;
1844e5c31af7Sopenharmony_ci			}
1845e5c31af7Sopenharmony_ci			vertex ""
1846e5c31af7Sopenharmony_ci				#version 310 es
1847e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1848e5c31af7Sopenharmony_ci				sample out mediump float tc_in;
1849e5c31af7Sopenharmony_ci				void main()
1850e5c31af7Sopenharmony_ci				{
1851e5c31af7Sopenharmony_ci					tc_in = in0;
1852e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1853e5c31af7Sopenharmony_ci				}
1854e5c31af7Sopenharmony_ci			""
1855e5c31af7Sopenharmony_ci			tessellation_control ""
1856e5c31af7Sopenharmony_ci				#version 310 es
1857e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1858e5c31af7Sopenharmony_ci				sample in mediump float tc_in[];
1859e5c31af7Sopenharmony_ci				sample out mediump float tc_out[];
1860e5c31af7Sopenharmony_ci				void main()
1861e5c31af7Sopenharmony_ci				{
1862e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1863e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1864e5c31af7Sopenharmony_ci				}
1865e5c31af7Sopenharmony_ci			""
1866e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1867e5c31af7Sopenharmony_ci				#version 310 es
1868e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1869e5c31af7Sopenharmony_ci				sample in mediump float tc_out[];
1870e5c31af7Sopenharmony_ci				sample out mediump float te_out;
1871e5c31af7Sopenharmony_ci				void main()
1872e5c31af7Sopenharmony_ci				{
1873e5c31af7Sopenharmony_ci					te_out = tc_out[2];
1874e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1875e5c31af7Sopenharmony_ci				}
1876e5c31af7Sopenharmony_ci			""
1877e5c31af7Sopenharmony_ci			fragment ""
1878e5c31af7Sopenharmony_ci				#version 310 es
1879e5c31af7Sopenharmony_ci				precision mediump float;
1880e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1881e5c31af7Sopenharmony_ci				sample in mediump float te_out;
1882e5c31af7Sopenharmony_ci				void main()
1883e5c31af7Sopenharmony_ci				{
1884e5c31af7Sopenharmony_ci					out0 = te_out;
1885e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1886e5c31af7Sopenharmony_ci				}
1887e5c31af7Sopenharmony_ci			""
1888e5c31af7Sopenharmony_ci		end
1889e5c31af7Sopenharmony_ci
1890e5c31af7Sopenharmony_ci		case patch
1891e5c31af7Sopenharmony_ci			version 310 es
1892e5c31af7Sopenharmony_ci			desc "Pre-patch varying"
1893e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1894e5c31af7Sopenharmony_ci			values
1895e5c31af7Sopenharmony_ci			{
1896e5c31af7Sopenharmony_ci				input float in0 = 1.0;
1897e5c31af7Sopenharmony_ci				output float out0 = 1.0;
1898e5c31af7Sopenharmony_ci			}
1899e5c31af7Sopenharmony_ci			vertex ""
1900e5c31af7Sopenharmony_ci				#version 310 es
1901e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1902e5c31af7Sopenharmony_ci				out mediump float tc_in;
1903e5c31af7Sopenharmony_ci				void main()
1904e5c31af7Sopenharmony_ci				{
1905e5c31af7Sopenharmony_ci					tc_in = in0;
1906e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1907e5c31af7Sopenharmony_ci				}
1908e5c31af7Sopenharmony_ci			""
1909e5c31af7Sopenharmony_ci			tessellation_control ""
1910e5c31af7Sopenharmony_ci				#version 310 es
1911e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1912e5c31af7Sopenharmony_ci				in mediump float tc_in[];
1913e5c31af7Sopenharmony_ci				patch out mediump float tc_out;
1914e5c31af7Sopenharmony_ci				void main()
1915e5c31af7Sopenharmony_ci				{
1916e5c31af7Sopenharmony_ci					tc_out = tc_in[gl_InvocationID];
1917e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1918e5c31af7Sopenharmony_ci				}
1919e5c31af7Sopenharmony_ci			""
1920e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1921e5c31af7Sopenharmony_ci				#version 310 es
1922e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1923e5c31af7Sopenharmony_ci				patch in mediump float tc_out;
1924e5c31af7Sopenharmony_ci				out mediump float te_out;
1925e5c31af7Sopenharmony_ci				void main()
1926e5c31af7Sopenharmony_ci				{
1927e5c31af7Sopenharmony_ci					te_out = tc_out;
1928e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1929e5c31af7Sopenharmony_ci				}
1930e5c31af7Sopenharmony_ci			""
1931e5c31af7Sopenharmony_ci			fragment ""
1932e5c31af7Sopenharmony_ci				#version 310 es
1933e5c31af7Sopenharmony_ci				precision mediump float;
1934e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1935e5c31af7Sopenharmony_ci				in mediump float te_out;
1936e5c31af7Sopenharmony_ci				void main()
1937e5c31af7Sopenharmony_ci				{
1938e5c31af7Sopenharmony_ci					out0 = te_out;
1939e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
1940e5c31af7Sopenharmony_ci				}
1941e5c31af7Sopenharmony_ci			""
1942e5c31af7Sopenharmony_ci		end
1943e5c31af7Sopenharmony_ci	end
1944e5c31af7Sopenharmony_ci
1945e5c31af7Sopenharmony_ci	import "linkage_tessellation_varying_types.test"
1946e5c31af7Sopenharmony_ciend
1947e5c31af7Sopenharmony_ci
1948e5c31af7Sopenharmony_cigroup uniform "Uniform"
1949e5c31af7Sopenharmony_ci	group rules "Rules"
1950e5c31af7Sopenharmony_ci		case type_mismatch_1
1951e5c31af7Sopenharmony_ci			version 310 es
1952e5c31af7Sopenharmony_ci			desc "uniform type mismatch between vertex and tessellation control shaders"
1953e5c31af7Sopenharmony_ci			expect link_fail
1954e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
1955e5c31af7Sopenharmony_ci			vertex ""
1956e5c31af7Sopenharmony_ci				#version 310 es
1957e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1958e5c31af7Sopenharmony_ci				uniform mediump float val;
1959e5c31af7Sopenharmony_ci				out mediump float vtx_out;
1960e5c31af7Sopenharmony_ci				void main()
1961e5c31af7Sopenharmony_ci				{
1962e5c31af7Sopenharmony_ci					vtx_out = val;
1963e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1964e5c31af7Sopenharmony_ci				}
1965e5c31af7Sopenharmony_ci			""
1966e5c31af7Sopenharmony_ci			tessellation_control ""
1967e5c31af7Sopenharmony_ci				#version 310 es
1968e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
1969e5c31af7Sopenharmony_ci				uniform mediump vec2 val;
1970e5c31af7Sopenharmony_ci				in mediump float vtx_out[];
1971e5c31af7Sopenharmony_ci				out mediump float tc_out[];
1972e5c31af7Sopenharmony_ci				void main()
1973e5c31af7Sopenharmony_ci				{
1974e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = vtx_out[0] + val.x + val.y;
1975e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
1976e5c31af7Sopenharmony_ci				}
1977e5c31af7Sopenharmony_ci			""
1978e5c31af7Sopenharmony_ci			tessellation_evaluation ""
1979e5c31af7Sopenharmony_ci				#version 310 es
1980e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
1981e5c31af7Sopenharmony_ci				in mediump float tc_out[];
1982e5c31af7Sopenharmony_ci				out mediump float te_out;
1983e5c31af7Sopenharmony_ci				void main()
1984e5c31af7Sopenharmony_ci				{
1985e5c31af7Sopenharmony_ci					te_out = tc_out[2];
1986e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
1987e5c31af7Sopenharmony_ci				}
1988e5c31af7Sopenharmony_ci			""
1989e5c31af7Sopenharmony_ci			fragment ""
1990e5c31af7Sopenharmony_ci				#version 310 es
1991e5c31af7Sopenharmony_ci				precision mediump float;
1992e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1993e5c31af7Sopenharmony_ci				in mediump float te_out;
1994e5c31af7Sopenharmony_ci				void main()
1995e5c31af7Sopenharmony_ci				{
1996e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(te_out);
1997e5c31af7Sopenharmony_ci				}
1998e5c31af7Sopenharmony_ci			""
1999e5c31af7Sopenharmony_ci		end
2000e5c31af7Sopenharmony_ci
2001e5c31af7Sopenharmony_ci		case type_mismatch_2
2002e5c31af7Sopenharmony_ci			version 310 es
2003e5c31af7Sopenharmony_ci			desc "uniform type mismatch between fragment and tessellation eval shaders"
2004e5c31af7Sopenharmony_ci			expect link_fail
2005e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2006e5c31af7Sopenharmony_ci			vertex ""
2007e5c31af7Sopenharmony_ci				#version 310 es
2008e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2009e5c31af7Sopenharmony_ci				out mediump float vtx_out;
2010e5c31af7Sopenharmony_ci				void main()
2011e5c31af7Sopenharmony_ci				{
2012e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2013e5c31af7Sopenharmony_ci				}
2014e5c31af7Sopenharmony_ci			""
2015e5c31af7Sopenharmony_ci			tessellation_control ""
2016e5c31af7Sopenharmony_ci				#version 310 es
2017e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2018e5c31af7Sopenharmony_ci				void main()
2019e5c31af7Sopenharmony_ci				{
2020e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2021e5c31af7Sopenharmony_ci				}
2022e5c31af7Sopenharmony_ci			""
2023e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2024e5c31af7Sopenharmony_ci				#version 310 es
2025e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
2026e5c31af7Sopenharmony_ci				uniform mediump vec3 val;
2027e5c31af7Sopenharmony_ci				out mediump float te_out;
2028e5c31af7Sopenharmony_ci				void main()
2029e5c31af7Sopenharmony_ci				{
2030e5c31af7Sopenharmony_ci					te_out = val.x + val.y + val.z;
2031e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2032e5c31af7Sopenharmony_ci				}
2033e5c31af7Sopenharmony_ci			""
2034e5c31af7Sopenharmony_ci			fragment ""
2035e5c31af7Sopenharmony_ci				#version 310 es
2036e5c31af7Sopenharmony_ci				precision mediump float;
2037e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2038e5c31af7Sopenharmony_ci				uniform mediump vec4 val;
2039e5c31af7Sopenharmony_ci				in mediump float te_out;
2040e5c31af7Sopenharmony_ci				void main()
2041e5c31af7Sopenharmony_ci				{
2042e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(te_out) + val;
2043e5c31af7Sopenharmony_ci				}
2044e5c31af7Sopenharmony_ci			""
2045e5c31af7Sopenharmony_ci		end
2046e5c31af7Sopenharmony_ci
2047e5c31af7Sopenharmony_ci		case type_mismatch_3
2048e5c31af7Sopenharmony_ci			version 310 es
2049e5c31af7Sopenharmony_ci			desc "uniform type mismatch between tessellation control and eval shaders"
2050e5c31af7Sopenharmony_ci			expect link_fail
2051e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2052e5c31af7Sopenharmony_ci			vertex ""
2053e5c31af7Sopenharmony_ci				#version 310 es
2054e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2055e5c31af7Sopenharmony_ci				out mediump float vtx_out;
2056e5c31af7Sopenharmony_ci				void main()
2057e5c31af7Sopenharmony_ci				{
2058e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2059e5c31af7Sopenharmony_ci				}
2060e5c31af7Sopenharmony_ci			""
2061e5c31af7Sopenharmony_ci			tessellation_control ""
2062e5c31af7Sopenharmony_ci				#version 310 es
2063e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2064e5c31af7Sopenharmony_ci				uniform mediump vec4 val;
2065e5c31af7Sopenharmony_ci				out mediump vec4 tc_out[];
2066e5c31af7Sopenharmony_ci				void main()
2067e5c31af7Sopenharmony_ci				{
2068e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = val;
2069e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2070e5c31af7Sopenharmony_ci				}
2071e5c31af7Sopenharmony_ci			""
2072e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2073e5c31af7Sopenharmony_ci				#version 310 es
2074e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
2075e5c31af7Sopenharmony_ci				uniform mediump vec3 val;
2076e5c31af7Sopenharmony_ci				in mediump vec4 tc_out[];
2077e5c31af7Sopenharmony_ci				out mediump float te_out;
2078e5c31af7Sopenharmony_ci				void main()
2079e5c31af7Sopenharmony_ci				{
2080e5c31af7Sopenharmony_ci					te_out = tc_out[0].w * val.z;
2081e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2082e5c31af7Sopenharmony_ci				}
2083e5c31af7Sopenharmony_ci			""
2084e5c31af7Sopenharmony_ci			fragment ""
2085e5c31af7Sopenharmony_ci				#version 310 es
2086e5c31af7Sopenharmony_ci				precision mediump float;
2087e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2088e5c31af7Sopenharmony_ci				in mediump float te_out;
2089e5c31af7Sopenharmony_ci				void main()
2090e5c31af7Sopenharmony_ci				{
2091e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(te_out);
2092e5c31af7Sopenharmony_ci				}
2093e5c31af7Sopenharmony_ci			""
2094e5c31af7Sopenharmony_ci		end
2095e5c31af7Sopenharmony_ci
2096e5c31af7Sopenharmony_ci		case type_mismatch_4
2097e5c31af7Sopenharmony_ci			version 310 es
2098e5c31af7Sopenharmony_ci			desc "uniform type mismatch between vertex and tessellation control shaders"
2099e5c31af7Sopenharmony_ci			expect link_fail
2100e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2101e5c31af7Sopenharmony_ci			require limit "GL_MAX_VERTEX_ATOMIC_COUNTERS" > 0
2102e5c31af7Sopenharmony_ci			vertex ""
2103e5c31af7Sopenharmony_ci				#version 310 es
2104e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2105e5c31af7Sopenharmony_ci				layout(binding=0) uniform atomic_uint u_var;
2106e5c31af7Sopenharmony_ci				out mediump float vtx_out;
2107e5c31af7Sopenharmony_ci				void main()
2108e5c31af7Sopenharmony_ci				{
2109e5c31af7Sopenharmony_ci					uint result = atomicCounterIncrement(u_var);
2110e5c31af7Sopenharmony_ci					vtx_out = float(result);
2111e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2112e5c31af7Sopenharmony_ci				}
2113e5c31af7Sopenharmony_ci			""
2114e5c31af7Sopenharmony_ci			tessellation_control ""
2115e5c31af7Sopenharmony_ci				#version 310 es
2116e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2117e5c31af7Sopenharmony_ci				uniform mediump float u_var;
2118e5c31af7Sopenharmony_ci				in mediump float vtx_out[];
2119e5c31af7Sopenharmony_ci				out mediump float tc_out[];
2120e5c31af7Sopenharmony_ci				void main()
2121e5c31af7Sopenharmony_ci				{
2122e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = vtx_out[0] + u_var;
2123e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2124e5c31af7Sopenharmony_ci				}
2125e5c31af7Sopenharmony_ci			""
2126e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2127e5c31af7Sopenharmony_ci				#version 310 es
2128e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
2129e5c31af7Sopenharmony_ci				in mediump float tc_out[];
2130e5c31af7Sopenharmony_ci				out mediump float te_out;
2131e5c31af7Sopenharmony_ci				void main()
2132e5c31af7Sopenharmony_ci				{
2133e5c31af7Sopenharmony_ci					te_out = tc_out[2];
2134e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2135e5c31af7Sopenharmony_ci				}
2136e5c31af7Sopenharmony_ci			""
2137e5c31af7Sopenharmony_ci			fragment ""
2138e5c31af7Sopenharmony_ci				#version 310 es
2139e5c31af7Sopenharmony_ci				precision mediump float;
2140e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2141e5c31af7Sopenharmony_ci				in mediump float te_out;
2142e5c31af7Sopenharmony_ci				void main()
2143e5c31af7Sopenharmony_ci				{
2144e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(te_out);
2145e5c31af7Sopenharmony_ci				}
2146e5c31af7Sopenharmony_ci			""
2147e5c31af7Sopenharmony_ci		end
2148e5c31af7Sopenharmony_ci
2149e5c31af7Sopenharmony_ci		case type_mismatch_5
2150e5c31af7Sopenharmony_ci			version 310 es
2151e5c31af7Sopenharmony_ci			desc "uniform type mismatch between vertex and tessellation control shaders"
2152e5c31af7Sopenharmony_ci			expect link_fail
2153e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2154e5c31af7Sopenharmony_ci			require limit "GL_MAX_VERTEX_IMAGE_UNIFORMS" > 0
2155e5c31af7Sopenharmony_ci			vertex ""
2156e5c31af7Sopenharmony_ci				#version 310 es
2157e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2158e5c31af7Sopenharmony_ci				layout(binding=0) layout(rgba8i) uniform readonly highp iimage2D u_var;
2159e5c31af7Sopenharmony_ci				out mediump float vtx_out;
2160e5c31af7Sopenharmony_ci				void main()
2161e5c31af7Sopenharmony_ci				{
2162e5c31af7Sopenharmony_ci					int result = imageSize(u_var).x;
2163e5c31af7Sopenharmony_ci					vtx_out = float(result);
2164e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2165e5c31af7Sopenharmony_ci				}
2166e5c31af7Sopenharmony_ci			""
2167e5c31af7Sopenharmony_ci			tessellation_control ""
2168e5c31af7Sopenharmony_ci				#version 310 es
2169e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2170e5c31af7Sopenharmony_ci				uniform mediump float u_var;
2171e5c31af7Sopenharmony_ci				in mediump float vtx_out[];
2172e5c31af7Sopenharmony_ci				out mediump float tc_out[];
2173e5c31af7Sopenharmony_ci				void main()
2174e5c31af7Sopenharmony_ci				{
2175e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = vtx_out[0] + u_var;
2176e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2177e5c31af7Sopenharmony_ci				}
2178e5c31af7Sopenharmony_ci			""
2179e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2180e5c31af7Sopenharmony_ci				#version 310 es
2181e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
2182e5c31af7Sopenharmony_ci				in mediump float tc_out[];
2183e5c31af7Sopenharmony_ci				out mediump float te_out;
2184e5c31af7Sopenharmony_ci				void main()
2185e5c31af7Sopenharmony_ci				{
2186e5c31af7Sopenharmony_ci					te_out = tc_out[2];
2187e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2188e5c31af7Sopenharmony_ci				}
2189e5c31af7Sopenharmony_ci			""
2190e5c31af7Sopenharmony_ci			fragment ""
2191e5c31af7Sopenharmony_ci				#version 310 es
2192e5c31af7Sopenharmony_ci				precision mediump float;
2193e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2194e5c31af7Sopenharmony_ci				in mediump float te_out;
2195e5c31af7Sopenharmony_ci				void main()
2196e5c31af7Sopenharmony_ci				{
2197e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(te_out);
2198e5c31af7Sopenharmony_ci				}
2199e5c31af7Sopenharmony_ci			""
2200e5c31af7Sopenharmony_ci		end
2201e5c31af7Sopenharmony_ci
2202e5c31af7Sopenharmony_ci		case precision_mismatch_1
2203e5c31af7Sopenharmony_ci			version 310 es
2204e5c31af7Sopenharmony_ci			desc "uniform precision mismatch between tessellation control and eval shaders"
2205e5c31af7Sopenharmony_ci			expect link_fail
2206e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2207e5c31af7Sopenharmony_ci			vertex ""
2208e5c31af7Sopenharmony_ci				#version 310 es
2209e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2210e5c31af7Sopenharmony_ci				out mediump float vtx_out;
2211e5c31af7Sopenharmony_ci				void main()
2212e5c31af7Sopenharmony_ci				{
2213e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2214e5c31af7Sopenharmony_ci				}
2215e5c31af7Sopenharmony_ci			""
2216e5c31af7Sopenharmony_ci			tessellation_control ""
2217e5c31af7Sopenharmony_ci				#version 310 es
2218e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2219e5c31af7Sopenharmony_ci				uniform mediump vec4 val;
2220e5c31af7Sopenharmony_ci				out mediump vec4 tc_out[];
2221e5c31af7Sopenharmony_ci				void main()
2222e5c31af7Sopenharmony_ci				{
2223e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = val;
2224e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2225e5c31af7Sopenharmony_ci				}
2226e5c31af7Sopenharmony_ci			""
2227e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2228e5c31af7Sopenharmony_ci				#version 310 es
2229e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
2230e5c31af7Sopenharmony_ci				uniform highp vec4 val;
2231e5c31af7Sopenharmony_ci				in mediump vec4 tc_out[];
2232e5c31af7Sopenharmony_ci				out mediump float te_out;
2233e5c31af7Sopenharmony_ci				void main()
2234e5c31af7Sopenharmony_ci				{
2235e5c31af7Sopenharmony_ci					te_out = tc_out[0].w * val.z;
2236e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2237e5c31af7Sopenharmony_ci				}
2238e5c31af7Sopenharmony_ci			""
2239e5c31af7Sopenharmony_ci			fragment ""
2240e5c31af7Sopenharmony_ci				#version 310 es
2241e5c31af7Sopenharmony_ci				precision mediump float;
2242e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2243e5c31af7Sopenharmony_ci				in mediump float te_out;
2244e5c31af7Sopenharmony_ci				void main()
2245e5c31af7Sopenharmony_ci				{
2246e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(te_out);
2247e5c31af7Sopenharmony_ci				}
2248e5c31af7Sopenharmony_ci			""
2249e5c31af7Sopenharmony_ci		end
2250e5c31af7Sopenharmony_ci
2251e5c31af7Sopenharmony_ci		case precision_mismatch_2
2252e5c31af7Sopenharmony_ci			version 310 es
2253e5c31af7Sopenharmony_ci			desc "uniform precision mismatch between vertex and tessellation control shaders"
2254e5c31af7Sopenharmony_ci			expect link_fail
2255e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2256e5c31af7Sopenharmony_ci			vertex ""
2257e5c31af7Sopenharmony_ci				#version 310 es
2258e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2259e5c31af7Sopenharmony_ci				uniform highp float val;
2260e5c31af7Sopenharmony_ci				out mediump float vtx_out;
2261e5c31af7Sopenharmony_ci				void main()
2262e5c31af7Sopenharmony_ci				{
2263e5c31af7Sopenharmony_ci					vtx_out = val;
2264e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2265e5c31af7Sopenharmony_ci				}
2266e5c31af7Sopenharmony_ci			""
2267e5c31af7Sopenharmony_ci			tessellation_control ""
2268e5c31af7Sopenharmony_ci				#version 310 es
2269e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2270e5c31af7Sopenharmony_ci				uniform mediump float val;
2271e5c31af7Sopenharmony_ci				in mediump float vtx_out[];
2272e5c31af7Sopenharmony_ci				out mediump float tc_out[];
2273e5c31af7Sopenharmony_ci				void main()
2274e5c31af7Sopenharmony_ci				{
2275e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = vtx_out[0] + val;
2276e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2277e5c31af7Sopenharmony_ci				}
2278e5c31af7Sopenharmony_ci			""
2279e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2280e5c31af7Sopenharmony_ci				#version 310 es
2281e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
2282e5c31af7Sopenharmony_ci				in mediump float tc_out[];
2283e5c31af7Sopenharmony_ci				out mediump float te_out;
2284e5c31af7Sopenharmony_ci				void main()
2285e5c31af7Sopenharmony_ci				{
2286e5c31af7Sopenharmony_ci					te_out = tc_out[2];
2287e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2288e5c31af7Sopenharmony_ci				}
2289e5c31af7Sopenharmony_ci			""
2290e5c31af7Sopenharmony_ci			fragment ""
2291e5c31af7Sopenharmony_ci				#version 310 es
2292e5c31af7Sopenharmony_ci				precision mediump float;
2293e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2294e5c31af7Sopenharmony_ci				in mediump float te_out;
2295e5c31af7Sopenharmony_ci				void main()
2296e5c31af7Sopenharmony_ci				{
2297e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(te_out);
2298e5c31af7Sopenharmony_ci				}
2299e5c31af7Sopenharmony_ci			""
2300e5c31af7Sopenharmony_ci		end
2301e5c31af7Sopenharmony_ci
2302e5c31af7Sopenharmony_ci		case struct_partial_usage
2303e5c31af7Sopenharmony_ci			version 310 es
2304e5c31af7Sopenharmony_ci			desc "uniform is partially used in different shader stages"
2305e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2306e5c31af7Sopenharmony_ci			values
2307e5c31af7Sopenharmony_ci			{
2308e5c31af7Sopenharmony_ci				uniform float val.vtxVal	= 1.5;
2309e5c31af7Sopenharmony_ci				uniform float val.tcVal		= 2.5;
2310e5c31af7Sopenharmony_ci				uniform float val.teVal		= 6.0;
2311e5c31af7Sopenharmony_ci				uniform float val.fragVal	= 11.0;
2312e5c31af7Sopenharmony_ci				output float out0			= 68.5;
2313e5c31af7Sopenharmony_ci			}
2314e5c31af7Sopenharmony_ci			vertex ""
2315e5c31af7Sopenharmony_ci				#version 310 es
2316e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2317e5c31af7Sopenharmony_ci				struct S
2318e5c31af7Sopenharmony_ci				{
2319e5c31af7Sopenharmony_ci					mediump float vtxVal;
2320e5c31af7Sopenharmony_ci					mediump float tcVal;
2321e5c31af7Sopenharmony_ci					mediump float teVal;
2322e5c31af7Sopenharmony_ci					mediump float fragVal;
2323e5c31af7Sopenharmony_ci				};
2324e5c31af7Sopenharmony_ci				uniform S val;
2325e5c31af7Sopenharmony_ci				out mediump float vtx_out;
2326e5c31af7Sopenharmony_ci				void main()
2327e5c31af7Sopenharmony_ci				{
2328e5c31af7Sopenharmony_ci					vtx_out = val.vtxVal;
2329e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2330e5c31af7Sopenharmony_ci				}
2331e5c31af7Sopenharmony_ci			""
2332e5c31af7Sopenharmony_ci			tessellation_control ""
2333e5c31af7Sopenharmony_ci				#version 310 es
2334e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2335e5c31af7Sopenharmony_ci				struct S
2336e5c31af7Sopenharmony_ci				{
2337e5c31af7Sopenharmony_ci					mediump float vtxVal;
2338e5c31af7Sopenharmony_ci					mediump float tcVal;
2339e5c31af7Sopenharmony_ci					mediump float teVal;
2340e5c31af7Sopenharmony_ci					mediump float fragVal;
2341e5c31af7Sopenharmony_ci				};
2342e5c31af7Sopenharmony_ci				uniform S val;
2343e5c31af7Sopenharmony_ci				in mediump float vtx_out[];
2344e5c31af7Sopenharmony_ci				out mediump float tc_out[];
2345e5c31af7Sopenharmony_ci				void main()
2346e5c31af7Sopenharmony_ci				{
2347e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = vtx_out[0] + 2.0 * val.tcVal;
2348e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2349e5c31af7Sopenharmony_ci				}
2350e5c31af7Sopenharmony_ci			""
2351e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2352e5c31af7Sopenharmony_ci				#version 310 es
2353e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
2354e5c31af7Sopenharmony_ci				struct S
2355e5c31af7Sopenharmony_ci				{
2356e5c31af7Sopenharmony_ci					mediump float vtxVal;
2357e5c31af7Sopenharmony_ci					mediump float tcVal;
2358e5c31af7Sopenharmony_ci					mediump float teVal;
2359e5c31af7Sopenharmony_ci					mediump float fragVal;
2360e5c31af7Sopenharmony_ci				};
2361e5c31af7Sopenharmony_ci				uniform S val;
2362e5c31af7Sopenharmony_ci				in mediump float tc_out[];
2363e5c31af7Sopenharmony_ci				out mediump float te_out;
2364e5c31af7Sopenharmony_ci				void main()
2365e5c31af7Sopenharmony_ci				{
2366e5c31af7Sopenharmony_ci					te_out = tc_out[2] + 3.0 * val.teVal;
2367e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2368e5c31af7Sopenharmony_ci				}
2369e5c31af7Sopenharmony_ci			""
2370e5c31af7Sopenharmony_ci			fragment ""
2371e5c31af7Sopenharmony_ci				#version 310 es
2372e5c31af7Sopenharmony_ci				precision mediump float;
2373e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2374e5c31af7Sopenharmony_ci				struct S
2375e5c31af7Sopenharmony_ci				{
2376e5c31af7Sopenharmony_ci					mediump float vtxVal;
2377e5c31af7Sopenharmony_ci					mediump float tcVal;
2378e5c31af7Sopenharmony_ci					mediump float teVal;
2379e5c31af7Sopenharmony_ci					mediump float fragVal;
2380e5c31af7Sopenharmony_ci				};
2381e5c31af7Sopenharmony_ci				uniform S val;
2382e5c31af7Sopenharmony_ci				in mediump float te_out;
2383e5c31af7Sopenharmony_ci				void main()
2384e5c31af7Sopenharmony_ci				{
2385e5c31af7Sopenharmony_ci					out0 = te_out + 4.0 * val.fragVal;
2386e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT};
2387e5c31af7Sopenharmony_ci				}
2388e5c31af7Sopenharmony_ci			""
2389e5c31af7Sopenharmony_ci		end
2390e5c31af7Sopenharmony_ci	end
2391e5c31af7Sopenharmony_ci
2392e5c31af7Sopenharmony_ci	import "linkage_tessellation_uniform_types.test"
2393e5c31af7Sopenharmony_ciend
2394e5c31af7Sopenharmony_ci
2395e5c31af7Sopenharmony_cigroup layout_declarations "Layout linkage"
2396e5c31af7Sopenharmony_ci	group rules "Rules"
2397e5c31af7Sopenharmony_ci
2398e5c31af7Sopenharmony_ci		case primitive_mode_mismatch
2399e5c31af7Sopenharmony_ci			version 310 es
2400e5c31af7Sopenharmony_ci			desc "Tessellation evaluation shader primitive mode mismatch"
2401e5c31af7Sopenharmony_ci			expect compile_or_link_fail
2402e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2403e5c31af7Sopenharmony_ci			values
2404e5c31af7Sopenharmony_ci			{
2405e5c31af7Sopenharmony_ci				input float in0 = 1.0;
2406e5c31af7Sopenharmony_ci				output float out0 = 1.0;
2407e5c31af7Sopenharmony_ci			}
2408e5c31af7Sopenharmony_ci			vertex ""
2409e5c31af7Sopenharmony_ci				#version 310 es
2410e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2411e5c31af7Sopenharmony_ci				out mediump float tc_in;
2412e5c31af7Sopenharmony_ci				void main()
2413e5c31af7Sopenharmony_ci				{
2414e5c31af7Sopenharmony_ci					tc_in = in0;
2415e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2416e5c31af7Sopenharmony_ci				}
2417e5c31af7Sopenharmony_ci			""
2418e5c31af7Sopenharmony_ci			tessellation_control ""
2419e5c31af7Sopenharmony_ci				#version 310 es
2420e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2421e5c31af7Sopenharmony_ci				in mediump float tc_in[];
2422e5c31af7Sopenharmony_ci				out mediump float tc_out[];
2423e5c31af7Sopenharmony_ci				void main()
2424e5c31af7Sopenharmony_ci				{
2425e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2426e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2427e5c31af7Sopenharmony_ci				}
2428e5c31af7Sopenharmony_ci			""
2429e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2430e5c31af7Sopenharmony_ci				#version 310 es
2431e5c31af7Sopenharmony_ci				layout (triangles) in;
2432e5c31af7Sopenharmony_ci				layout (isolines) in;
2433e5c31af7Sopenharmony_ci				in mediump float tc_out[];
2434e5c31af7Sopenharmony_ci				out mediump float te_out;
2435e5c31af7Sopenharmony_ci				void main()
2436e5c31af7Sopenharmony_ci				{
2437e5c31af7Sopenharmony_ci					te_out = tc_out[2];
2438e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2439e5c31af7Sopenharmony_ci				}
2440e5c31af7Sopenharmony_ci			""
2441e5c31af7Sopenharmony_ci			fragment ""
2442e5c31af7Sopenharmony_ci				#version 310 es
2443e5c31af7Sopenharmony_ci				precision mediump float;
2444e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2445e5c31af7Sopenharmony_ci				in mediump float te_out;
2446e5c31af7Sopenharmony_ci				void main()
2447e5c31af7Sopenharmony_ci				{
2448e5c31af7Sopenharmony_ci					out0 = te_out;
2449e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
2450e5c31af7Sopenharmony_ci				}
2451e5c31af7Sopenharmony_ci			""
2452e5c31af7Sopenharmony_ci		end
2453e5c31af7Sopenharmony_ci
2454e5c31af7Sopenharmony_ci		case spacing_mode_mismatch
2455e5c31af7Sopenharmony_ci			version 310 es
2456e5c31af7Sopenharmony_ci			desc "Tessellation evaluation shader spacing mode mismatch"
2457e5c31af7Sopenharmony_ci			expect compile_or_link_fail
2458e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2459e5c31af7Sopenharmony_ci			values
2460e5c31af7Sopenharmony_ci			{
2461e5c31af7Sopenharmony_ci				input float in0 = 1.0;
2462e5c31af7Sopenharmony_ci				output float out0 = 1.0;
2463e5c31af7Sopenharmony_ci			}
2464e5c31af7Sopenharmony_ci			vertex ""
2465e5c31af7Sopenharmony_ci				#version 310 es
2466e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2467e5c31af7Sopenharmony_ci				out mediump float tc_in;
2468e5c31af7Sopenharmony_ci				void main()
2469e5c31af7Sopenharmony_ci				{
2470e5c31af7Sopenharmony_ci					tc_in = in0;
2471e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2472e5c31af7Sopenharmony_ci				}
2473e5c31af7Sopenharmony_ci			""
2474e5c31af7Sopenharmony_ci			tessellation_control ""
2475e5c31af7Sopenharmony_ci				#version 310 es
2476e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2477e5c31af7Sopenharmony_ci				in mediump float tc_in[];
2478e5c31af7Sopenharmony_ci				out mediump float tc_out[];
2479e5c31af7Sopenharmony_ci				void main()
2480e5c31af7Sopenharmony_ci				{
2481e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2482e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2483e5c31af7Sopenharmony_ci				}
2484e5c31af7Sopenharmony_ci			""
2485e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2486e5c31af7Sopenharmony_ci				#version 310 es
2487e5c31af7Sopenharmony_ci				layout (triangles, equal_spacing) in;
2488e5c31af7Sopenharmony_ci				layout (triangles, fractional_odd_spacing) in;
2489e5c31af7Sopenharmony_ci				in mediump float tc_out[];
2490e5c31af7Sopenharmony_ci				out mediump float te_out;
2491e5c31af7Sopenharmony_ci				void main()
2492e5c31af7Sopenharmony_ci				{
2493e5c31af7Sopenharmony_ci					te_out = tc_out[2];
2494e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2495e5c31af7Sopenharmony_ci				}
2496e5c31af7Sopenharmony_ci			""
2497e5c31af7Sopenharmony_ci			fragment ""
2498e5c31af7Sopenharmony_ci				#version 310 es
2499e5c31af7Sopenharmony_ci				precision mediump float;
2500e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2501e5c31af7Sopenharmony_ci				in mediump float te_out;
2502e5c31af7Sopenharmony_ci				void main()
2503e5c31af7Sopenharmony_ci				{
2504e5c31af7Sopenharmony_ci					out0 = te_out;
2505e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
2506e5c31af7Sopenharmony_ci				}
2507e5c31af7Sopenharmony_ci			""
2508e5c31af7Sopenharmony_ci		end
2509e5c31af7Sopenharmony_ci
2510e5c31af7Sopenharmony_ci		case vertex_order_mismatch
2511e5c31af7Sopenharmony_ci			version 310 es
2512e5c31af7Sopenharmony_ci			desc "Tessellation evaluation shader vertex order mismatch"
2513e5c31af7Sopenharmony_ci			expect compile_or_link_fail
2514e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2515e5c31af7Sopenharmony_ci			values
2516e5c31af7Sopenharmony_ci			{
2517e5c31af7Sopenharmony_ci				input float in0 = 1.0;
2518e5c31af7Sopenharmony_ci				output float out0 = 1.0;
2519e5c31af7Sopenharmony_ci			}
2520e5c31af7Sopenharmony_ci			vertex ""
2521e5c31af7Sopenharmony_ci				#version 310 es
2522e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2523e5c31af7Sopenharmony_ci				out mediump float tc_in;
2524e5c31af7Sopenharmony_ci				void main()
2525e5c31af7Sopenharmony_ci				{
2526e5c31af7Sopenharmony_ci					tc_in = in0;
2527e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2528e5c31af7Sopenharmony_ci				}
2529e5c31af7Sopenharmony_ci			""
2530e5c31af7Sopenharmony_ci			tessellation_control ""
2531e5c31af7Sopenharmony_ci				#version 310 es
2532e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2533e5c31af7Sopenharmony_ci				in mediump float tc_in[];
2534e5c31af7Sopenharmony_ci				out mediump float tc_out[];
2535e5c31af7Sopenharmony_ci				void main()
2536e5c31af7Sopenharmony_ci				{
2537e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2538e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2539e5c31af7Sopenharmony_ci				}
2540e5c31af7Sopenharmony_ci			""
2541e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2542e5c31af7Sopenharmony_ci				#version 310 es
2543e5c31af7Sopenharmony_ci				layout (triangles, cw) in;
2544e5c31af7Sopenharmony_ci				layout (triangles, ccw) in;
2545e5c31af7Sopenharmony_ci				    in mediump float tc_out[];
2546e5c31af7Sopenharmony_ci				out mediump float te_out;
2547e5c31af7Sopenharmony_ci				void main()
2548e5c31af7Sopenharmony_ci				{
2549e5c31af7Sopenharmony_ci					te_out = tc_out[2];
2550e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2551e5c31af7Sopenharmony_ci				}
2552e5c31af7Sopenharmony_ci			""
2553e5c31af7Sopenharmony_ci			fragment ""
2554e5c31af7Sopenharmony_ci				#version 310 es
2555e5c31af7Sopenharmony_ci				precision mediump float;
2556e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2557e5c31af7Sopenharmony_ci				in mediump float te_out;
2558e5c31af7Sopenharmony_ci				void main()
2559e5c31af7Sopenharmony_ci				{
2560e5c31af7Sopenharmony_ci					out0 = te_out;
2561e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
2562e5c31af7Sopenharmony_ci				}
2563e5c31af7Sopenharmony_ci			""
2564e5c31af7Sopenharmony_ci		end
2565e5c31af7Sopenharmony_ci
2566e5c31af7Sopenharmony_ci		case vertex_count_mismatch
2567e5c31af7Sopenharmony_ci			version 310 es
2568e5c31af7Sopenharmony_ci			desc "Tessellation control shader vertex count mismatch"
2569e5c31af7Sopenharmony_ci			expect compile_or_link_fail
2570e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2571e5c31af7Sopenharmony_ci			values
2572e5c31af7Sopenharmony_ci			{
2573e5c31af7Sopenharmony_ci				input float in0 = 1.0;
2574e5c31af7Sopenharmony_ci				output float out0 = 1.0;
2575e5c31af7Sopenharmony_ci			}
2576e5c31af7Sopenharmony_ci			vertex ""
2577e5c31af7Sopenharmony_ci				#version 310 es
2578e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2579e5c31af7Sopenharmony_ci				out mediump float tc_in;
2580e5c31af7Sopenharmony_ci				void main()
2581e5c31af7Sopenharmony_ci				{
2582e5c31af7Sopenharmony_ci					tc_in = in0;
2583e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2584e5c31af7Sopenharmony_ci				}
2585e5c31af7Sopenharmony_ci			""
2586e5c31af7Sopenharmony_ci			tessellation_control ""
2587e5c31af7Sopenharmony_ci				#version 310 es
2588e5c31af7Sopenharmony_ci				layout (vertices=3) out;
2589e5c31af7Sopenharmony_ci				layout (vertices=4) out;
2590e5c31af7Sopenharmony_ci				in mediump float tc_in[];
2591e5c31af7Sopenharmony_ci				out mediump float tc_out[];
2592e5c31af7Sopenharmony_ci				void main()
2593e5c31af7Sopenharmony_ci				{
2594e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2595e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2596e5c31af7Sopenharmony_ci				}
2597e5c31af7Sopenharmony_ci			""
2598e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2599e5c31af7Sopenharmony_ci				#version 310 es
2600e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
2601e5c31af7Sopenharmony_ci				in mediump float tc_out[];
2602e5c31af7Sopenharmony_ci				out mediump float te_out;
2603e5c31af7Sopenharmony_ci				void main()
2604e5c31af7Sopenharmony_ci				{
2605e5c31af7Sopenharmony_ci					te_out = tc_out[2];
2606e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2607e5c31af7Sopenharmony_ci				}
2608e5c31af7Sopenharmony_ci			""
2609e5c31af7Sopenharmony_ci			fragment ""
2610e5c31af7Sopenharmony_ci				#version 310 es
2611e5c31af7Sopenharmony_ci				precision mediump float;
2612e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2613e5c31af7Sopenharmony_ci				in mediump float te_out;
2614e5c31af7Sopenharmony_ci				void main()
2615e5c31af7Sopenharmony_ci				{
2616e5c31af7Sopenharmony_ci					out0 = te_out;
2617e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
2618e5c31af7Sopenharmony_ci				}
2619e5c31af7Sopenharmony_ci			""
2620e5c31af7Sopenharmony_ci		end
2621e5c31af7Sopenharmony_ci	end
2622e5c31af7Sopenharmony_ciend
2623e5c31af7Sopenharmony_ci
2624e5c31af7Sopenharmony_cigroup barriers "Barriers"
2625e5c31af7Sopenharmony_ci	group rules "Rules"
2626e5c31af7Sopenharmony_ci
2627e5c31af7Sopenharmony_ci		case invalid_barrier_usage_within_control_flow
2628e5c31af7Sopenharmony_ci			version 310 es
2629e5c31af7Sopenharmony_ci			desc "Tessellation control shader invalid barrier usage within control flow statement"
2630e5c31af7Sopenharmony_ci			expect compile_or_link_fail
2631e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2632e5c31af7Sopenharmony_ci			values
2633e5c31af7Sopenharmony_ci			{
2634e5c31af7Sopenharmony_ci				input float in0 = 1.0;
2635e5c31af7Sopenharmony_ci				output float out0 = 1.0;
2636e5c31af7Sopenharmony_ci			}
2637e5c31af7Sopenharmony_ci			vertex ""
2638e5c31af7Sopenharmony_ci				#version 310 es
2639e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2640e5c31af7Sopenharmony_ci				out mediump float tc_in;
2641e5c31af7Sopenharmony_ci				void main()
2642e5c31af7Sopenharmony_ci				{
2643e5c31af7Sopenharmony_ci					tc_in = in0;
2644e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2645e5c31af7Sopenharmony_ci				}
2646e5c31af7Sopenharmony_ci			""
2647e5c31af7Sopenharmony_ci			tessellation_control ""
2648e5c31af7Sopenharmony_ci				#version 310 es
2649e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2650e5c31af7Sopenharmony_ci				in mediump float tc_in[];
2651e5c31af7Sopenharmony_ci				out mediump float tc_out[];
2652e5c31af7Sopenharmony_ci
2653e5c31af7Sopenharmony_ci				void main()
2654e5c31af7Sopenharmony_ci				{
2655e5c31af7Sopenharmony_ci					if (gl_InvocationID == 0)
2656e5c31af7Sopenharmony_ci						barrier(); // error: within control flow
2657e5c31af7Sopenharmony_ci
2658e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2659e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2660e5c31af7Sopenharmony_ci				}
2661e5c31af7Sopenharmony_ci			""
2662e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2663e5c31af7Sopenharmony_ci				#version 310 es
2664e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
2665e5c31af7Sopenharmony_ci				in mediump float tc_out[];
2666e5c31af7Sopenharmony_ci				out mediump float te_out;
2667e5c31af7Sopenharmony_ci				void main()
2668e5c31af7Sopenharmony_ci				{
2669e5c31af7Sopenharmony_ci					te_out = tc_out[2];
2670e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2671e5c31af7Sopenharmony_ci				}
2672e5c31af7Sopenharmony_ci			""
2673e5c31af7Sopenharmony_ci			fragment ""
2674e5c31af7Sopenharmony_ci				#version 310 es
2675e5c31af7Sopenharmony_ci				precision mediump float;
2676e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2677e5c31af7Sopenharmony_ci				in mediump float te_out;
2678e5c31af7Sopenharmony_ci				void main()
2679e5c31af7Sopenharmony_ci				{
2680e5c31af7Sopenharmony_ci					out0 = te_out;
2681e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
2682e5c31af7Sopenharmony_ci				}
2683e5c31af7Sopenharmony_ci			""
2684e5c31af7Sopenharmony_ci		end
2685e5c31af7Sopenharmony_ci
2686e5c31af7Sopenharmony_ci		case invalid_barrier_usage_after_return
2687e5c31af7Sopenharmony_ci			version 310 es
2688e5c31af7Sopenharmony_ci			desc "Tessellation control shader invalid barrier usage after main() returns"
2689e5c31af7Sopenharmony_ci			expect compile_or_link_fail
2690e5c31af7Sopenharmony_ci			require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
2691e5c31af7Sopenharmony_ci			values
2692e5c31af7Sopenharmony_ci			{
2693e5c31af7Sopenharmony_ci				input float in0 = 1.0;
2694e5c31af7Sopenharmony_ci				output float out0 = 1.0;
2695e5c31af7Sopenharmony_ci			}
2696e5c31af7Sopenharmony_ci			vertex ""
2697e5c31af7Sopenharmony_ci				#version 310 es
2698e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
2699e5c31af7Sopenharmony_ci				out mediump float tc_in;
2700e5c31af7Sopenharmony_ci				void main()
2701e5c31af7Sopenharmony_ci				{
2702e5c31af7Sopenharmony_ci					tc_in = in0;
2703e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
2704e5c31af7Sopenharmony_ci				}
2705e5c31af7Sopenharmony_ci			""
2706e5c31af7Sopenharmony_ci			tessellation_control ""
2707e5c31af7Sopenharmony_ci				#version 310 es
2708e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
2709e5c31af7Sopenharmony_ci				in mediump float tc_in[];
2710e5c31af7Sopenharmony_ci				out mediump float tc_out[];
2711e5c31af7Sopenharmony_ci
2712e5c31af7Sopenharmony_ci				void main()
2713e5c31af7Sopenharmony_ci				{
2714e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
2715e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
2716e5c31af7Sopenharmony_ci
2717e5c31af7Sopenharmony_ci					return;
2718e5c31af7Sopenharmony_ci					barrier(); // error: barrier() after return
2719e5c31af7Sopenharmony_ci				}
2720e5c31af7Sopenharmony_ci			""
2721e5c31af7Sopenharmony_ci			tessellation_evaluation ""
2722e5c31af7Sopenharmony_ci				#version 310 es
2723e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
2724e5c31af7Sopenharmony_ci				in mediump float tc_out[];
2725e5c31af7Sopenharmony_ci				out mediump float te_out;
2726e5c31af7Sopenharmony_ci				void main()
2727e5c31af7Sopenharmony_ci				{
2728e5c31af7Sopenharmony_ci					te_out = tc_out[2];
2729e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
2730e5c31af7Sopenharmony_ci				}
2731e5c31af7Sopenharmony_ci			""
2732e5c31af7Sopenharmony_ci			fragment ""
2733e5c31af7Sopenharmony_ci				#version 310 es
2734e5c31af7Sopenharmony_ci				precision mediump float;
2735e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
2736e5c31af7Sopenharmony_ci				in mediump float te_out;
2737e5c31af7Sopenharmony_ci				void main()
2738e5c31af7Sopenharmony_ci				{
2739e5c31af7Sopenharmony_ci					out0 = te_out;
2740e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
2741e5c31af7Sopenharmony_ci				}
2742e5c31af7Sopenharmony_ci			""
2743e5c31af7Sopenharmony_ci		end
2744e5c31af7Sopenharmony_ci	end
2745e5c31af7Sopenharmony_ciend
2746