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