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