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