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		case input_type_mismatch
23e5c31af7Sopenharmony_ci			version 450
24e5c31af7Sopenharmony_ci			desc "Geometry shader input type mismatch"
25e5c31af7Sopenharmony_ci			expect link_fail
26e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
27e5c31af7Sopenharmony_ci			vertex ""
28e5c31af7Sopenharmony_ci				#version 450
29e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
30e5c31af7Sopenharmony_ci				out mediump float geo_in;
31e5c31af7Sopenharmony_ci				void main()
32e5c31af7Sopenharmony_ci				{
33e5c31af7Sopenharmony_ci					geo_in = 1.0;
34e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
35e5c31af7Sopenharmony_ci				}
36e5c31af7Sopenharmony_ci			""
37e5c31af7Sopenharmony_ci			geometry ""
38e5c31af7Sopenharmony_ci				#version 450
39e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
40e5c31af7Sopenharmony_ci				in mediump vec2 geo_in[];
41e5c31af7Sopenharmony_ci				out mediump float geo_out;
42e5c31af7Sopenharmony_ci				void main()
43e5c31af7Sopenharmony_ci				{
44e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
45e5c31af7Sopenharmony_ci					{
46e5c31af7Sopenharmony_ci						geo_out = geo_in[ndx].x + geo_in[ndx].y;
47e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
48e5c31af7Sopenharmony_ci						EmitVertex();
49e5c31af7Sopenharmony_ci					}
50e5c31af7Sopenharmony_ci				}
51e5c31af7Sopenharmony_ci			""
52e5c31af7Sopenharmony_ci			fragment ""
53e5c31af7Sopenharmony_ci				#version 450
54e5c31af7Sopenharmony_ci				precision mediump float;
55e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
56e5c31af7Sopenharmony_ci				in mediump float geo_out;
57e5c31af7Sopenharmony_ci				void main()
58e5c31af7Sopenharmony_ci				{
59e5c31af7Sopenharmony_ci					out0 = geo_out;
60e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
61e5c31af7Sopenharmony_ci				}
62e5c31af7Sopenharmony_ci			""
63e5c31af7Sopenharmony_ci		end
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_ci		case input_different_precision
66e5c31af7Sopenharmony_ci			version 450
67e5c31af7Sopenharmony_ci			desc "Geometry shader input precision mismatch"
68e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
69e5c31af7Sopenharmony_ci			vertex ""
70e5c31af7Sopenharmony_ci				#version 450
71e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
72e5c31af7Sopenharmony_ci				out highp float geo_in;
73e5c31af7Sopenharmony_ci				void main()
74e5c31af7Sopenharmony_ci				{
75e5c31af7Sopenharmony_ci					geo_in = 1.0;
76e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
77e5c31af7Sopenharmony_ci				}
78e5c31af7Sopenharmony_ci			""
79e5c31af7Sopenharmony_ci			geometry ""
80e5c31af7Sopenharmony_ci				#version 450
81e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
82e5c31af7Sopenharmony_ci				in lowp float geo_in[];
83e5c31af7Sopenharmony_ci				out mediump float geo_out;
84e5c31af7Sopenharmony_ci				void main()
85e5c31af7Sopenharmony_ci				{
86e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
87e5c31af7Sopenharmony_ci					{
88e5c31af7Sopenharmony_ci						geo_out = geo_in[ndx];
89e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
90e5c31af7Sopenharmony_ci						EmitVertex();
91e5c31af7Sopenharmony_ci					}
92e5c31af7Sopenharmony_ci				}
93e5c31af7Sopenharmony_ci			""
94e5c31af7Sopenharmony_ci			fragment ""
95e5c31af7Sopenharmony_ci				#version 450
96e5c31af7Sopenharmony_ci				precision mediump float;
97e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
98e5c31af7Sopenharmony_ci				in mediump float geo_out;
99e5c31af7Sopenharmony_ci				void main()
100e5c31af7Sopenharmony_ci				{
101e5c31af7Sopenharmony_ci					out0 = geo_out;
102e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
103e5c31af7Sopenharmony_ci				}
104e5c31af7Sopenharmony_ci			""
105e5c31af7Sopenharmony_ci		end
106e5c31af7Sopenharmony_ci
107e5c31af7Sopenharmony_ci		case output_different_precision
108e5c31af7Sopenharmony_ci			version 450
109e5c31af7Sopenharmony_ci			desc "Geometry shader output precision mismatch"
110e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
111e5c31af7Sopenharmony_ci			vertex ""
112e5c31af7Sopenharmony_ci				#version 450
113e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
114e5c31af7Sopenharmony_ci				void main()
115e5c31af7Sopenharmony_ci				{
116e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
117e5c31af7Sopenharmony_ci				}
118e5c31af7Sopenharmony_ci			""
119e5c31af7Sopenharmony_ci			geometry ""
120e5c31af7Sopenharmony_ci				#version 450
121e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
122e5c31af7Sopenharmony_ci				out highp 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 = 1.0;
128e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
129e5c31af7Sopenharmony_ci						EmitVertex();
130e5c31af7Sopenharmony_ci					}
131e5c31af7Sopenharmony_ci				}
132e5c31af7Sopenharmony_ci			""
133e5c31af7Sopenharmony_ci			fragment ""
134e5c31af7Sopenharmony_ci				#version 450
135e5c31af7Sopenharmony_ci				precision mediump float;
136e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
137e5c31af7Sopenharmony_ci				in lowp 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 input_superfluous_declaration
147e5c31af7Sopenharmony_ci			version 450
148e5c31af7Sopenharmony_ci			desc "Geometry shader has no input for an output"
149e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
150e5c31af7Sopenharmony_ci			vertex ""
151e5c31af7Sopenharmony_ci				#version 450
152e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
153e5c31af7Sopenharmony_ci				out mediump float geo_in;
154e5c31af7Sopenharmony_ci				void main()
155e5c31af7Sopenharmony_ci				{
156e5c31af7Sopenharmony_ci					geo_in = 1.0;
157e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
158e5c31af7Sopenharmony_ci				}
159e5c31af7Sopenharmony_ci			""
160e5c31af7Sopenharmony_ci			geometry ""
161e5c31af7Sopenharmony_ci				#version 450
162e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
163e5c31af7Sopenharmony_ci				out mediump float geo_out;
164e5c31af7Sopenharmony_ci				void main()
165e5c31af7Sopenharmony_ci				{
166e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
167e5c31af7Sopenharmony_ci					{
168e5c31af7Sopenharmony_ci						geo_out = 1.0;
169e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
170e5c31af7Sopenharmony_ci						EmitVertex();
171e5c31af7Sopenharmony_ci					}
172e5c31af7Sopenharmony_ci				}
173e5c31af7Sopenharmony_ci			""
174e5c31af7Sopenharmony_ci			fragment ""
175e5c31af7Sopenharmony_ci				#version 450
176e5c31af7Sopenharmony_ci				precision mediump float;
177e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
178e5c31af7Sopenharmony_ci				in mediump float geo_out;
179e5c31af7Sopenharmony_ci				void main()
180e5c31af7Sopenharmony_ci				{
181e5c31af7Sopenharmony_ci					out0 = geo_out;
182e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
183e5c31af7Sopenharmony_ci				}
184e5c31af7Sopenharmony_ci			""
185e5c31af7Sopenharmony_ci		end
186e5c31af7Sopenharmony_ci
187e5c31af7Sopenharmony_ci		case output_superfluous_declaration
188e5c31af7Sopenharmony_ci			version 450
189e5c31af7Sopenharmony_ci			desc "Geometry shader has output without an matching input"
190e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
191e5c31af7Sopenharmony_ci			vertex ""
192e5c31af7Sopenharmony_ci				#version 450
193e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
194e5c31af7Sopenharmony_ci				void main()
195e5c31af7Sopenharmony_ci				{
196e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
197e5c31af7Sopenharmony_ci				}
198e5c31af7Sopenharmony_ci			""
199e5c31af7Sopenharmony_ci			geometry ""
200e5c31af7Sopenharmony_ci				#version 450
201e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
202e5c31af7Sopenharmony_ci				out mediump float geo_out;
203e5c31af7Sopenharmony_ci				void main()
204e5c31af7Sopenharmony_ci				{
205e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
206e5c31af7Sopenharmony_ci					{
207e5c31af7Sopenharmony_ci						geo_out = 1.0;
208e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
209e5c31af7Sopenharmony_ci						EmitVertex();
210e5c31af7Sopenharmony_ci					}
211e5c31af7Sopenharmony_ci				}
212e5c31af7Sopenharmony_ci			""
213e5c31af7Sopenharmony_ci			fragment ""
214e5c31af7Sopenharmony_ci				#version 450
215e5c31af7Sopenharmony_ci				precision mediump float;
216e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
217e5c31af7Sopenharmony_ci				void main()
218e5c31af7Sopenharmony_ci				{
219e5c31af7Sopenharmony_ci					out0 = 1.0;
220e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
221e5c31af7Sopenharmony_ci				}
222e5c31af7Sopenharmony_ci			""
223e5c31af7Sopenharmony_ci		end
224e5c31af7Sopenharmony_ci
225e5c31af7Sopenharmony_ci		case input_array_explicit_size
226e5c31af7Sopenharmony_ci			version 450
227e5c31af7Sopenharmony_ci			desc "Geometry shader input is explicitly sized array"
228e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
229e5c31af7Sopenharmony_ci			vertex ""
230e5c31af7Sopenharmony_ci				#version 450
231e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
232e5c31af7Sopenharmony_ci				out mediump float geo_in;
233e5c31af7Sopenharmony_ci				void main()
234e5c31af7Sopenharmony_ci				{
235e5c31af7Sopenharmony_ci					geo_in = 1.0;
236e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
237e5c31af7Sopenharmony_ci				}
238e5c31af7Sopenharmony_ci			""
239e5c31af7Sopenharmony_ci			geometry ""
240e5c31af7Sopenharmony_ci				#version 450
241e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
242e5c31af7Sopenharmony_ci				in mediump float geo_in[3];
243e5c31af7Sopenharmony_ci				out mediump float geo_out;
244e5c31af7Sopenharmony_ci				void main()
245e5c31af7Sopenharmony_ci				{
246e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
247e5c31af7Sopenharmony_ci					{
248e5c31af7Sopenharmony_ci						geo_out = geo_in[ndx];
249e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
250e5c31af7Sopenharmony_ci						EmitVertex();
251e5c31af7Sopenharmony_ci					}
252e5c31af7Sopenharmony_ci				}
253e5c31af7Sopenharmony_ci			""
254e5c31af7Sopenharmony_ci			fragment ""
255e5c31af7Sopenharmony_ci				#version 450
256e5c31af7Sopenharmony_ci				precision mediump float;
257e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
258e5c31af7Sopenharmony_ci				in mediump float geo_out;
259e5c31af7Sopenharmony_ci				void main()
260e5c31af7Sopenharmony_ci				{
261e5c31af7Sopenharmony_ci					out0 = geo_out;
262e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
263e5c31af7Sopenharmony_ci				}
264e5c31af7Sopenharmony_ci			""
265e5c31af7Sopenharmony_ci		end
266e5c31af7Sopenharmony_ci
267e5c31af7Sopenharmony_ci		case input_non_array
268e5c31af7Sopenharmony_ci			version 450
269e5c31af7Sopenharmony_ci			desc "Geometry shader has no input for an output"
270e5c31af7Sopenharmony_ci			expect compile_or_link_fail
271e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
272e5c31af7Sopenharmony_ci			vertex ""
273e5c31af7Sopenharmony_ci				#version 450
274e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
275e5c31af7Sopenharmony_ci				out mediump float geo_in;
276e5c31af7Sopenharmony_ci				void main()
277e5c31af7Sopenharmony_ci				{
278e5c31af7Sopenharmony_ci					geo_in = 1.0;
279e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
280e5c31af7Sopenharmony_ci				}
281e5c31af7Sopenharmony_ci			""
282e5c31af7Sopenharmony_ci			geometry ""
283e5c31af7Sopenharmony_ci				#version 450
284e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
285e5c31af7Sopenharmony_ci				in mediump float geo_in;
286e5c31af7Sopenharmony_ci				out mediump float geo_out;
287e5c31af7Sopenharmony_ci				void main()
288e5c31af7Sopenharmony_ci				{
289e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
290e5c31af7Sopenharmony_ci					{
291e5c31af7Sopenharmony_ci						geo_out = geo_in;
292e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
293e5c31af7Sopenharmony_ci						EmitVertex();
294e5c31af7Sopenharmony_ci					}
295e5c31af7Sopenharmony_ci				}
296e5c31af7Sopenharmony_ci			""
297e5c31af7Sopenharmony_ci			fragment ""
298e5c31af7Sopenharmony_ci				#version 450
299e5c31af7Sopenharmony_ci				precision mediump float;
300e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
301e5c31af7Sopenharmony_ci				in mediump float geo_out;
302e5c31af7Sopenharmony_ci				void main()
303e5c31af7Sopenharmony_ci				{
304e5c31af7Sopenharmony_ci					out0 = geo_out;
305e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
306e5c31af7Sopenharmony_ci				}
307e5c31af7Sopenharmony_ci			""
308e5c31af7Sopenharmony_ci		end
309e5c31af7Sopenharmony_ci
310e5c31af7Sopenharmony_ci		case input_array_size_mismatch
311e5c31af7Sopenharmony_ci			version 450
312e5c31af7Sopenharmony_ci			desc "Geometry shader input is explicitly sized array, but size does not match input primitive"
313e5c31af7Sopenharmony_ci			expect compile_or_link_fail
314e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
315e5c31af7Sopenharmony_ci			vertex ""
316e5c31af7Sopenharmony_ci				#version 450
317e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
318e5c31af7Sopenharmony_ci				out mediump float geo_in;
319e5c31af7Sopenharmony_ci				void main()
320e5c31af7Sopenharmony_ci				{
321e5c31af7Sopenharmony_ci					geo_in = 1.0;
322e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
323e5c31af7Sopenharmony_ci				}
324e5c31af7Sopenharmony_ci			""
325e5c31af7Sopenharmony_ci			geometry ""
326e5c31af7Sopenharmony_ci				#version 450
327e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
328e5c31af7Sopenharmony_ci				in mediump float geo_in[4];
329e5c31af7Sopenharmony_ci				out mediump float geo_out;
330e5c31af7Sopenharmony_ci				void main()
331e5c31af7Sopenharmony_ci				{
332e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
333e5c31af7Sopenharmony_ci					{
334e5c31af7Sopenharmony_ci						geo_out = geo_in[ndx+1];
335e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
336e5c31af7Sopenharmony_ci						EmitVertex();
337e5c31af7Sopenharmony_ci					}
338e5c31af7Sopenharmony_ci				}
339e5c31af7Sopenharmony_ci			""
340e5c31af7Sopenharmony_ci			fragment ""
341e5c31af7Sopenharmony_ci				#version 450
342e5c31af7Sopenharmony_ci				precision mediump float;
343e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
344e5c31af7Sopenharmony_ci				in mediump float geo_out;
345e5c31af7Sopenharmony_ci				void main()
346e5c31af7Sopenharmony_ci				{
347e5c31af7Sopenharmony_ci					out0 = geo_out;
348e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
349e5c31af7Sopenharmony_ci				}
350e5c31af7Sopenharmony_ci			""
351e5c31af7Sopenharmony_ci		end
352e5c31af7Sopenharmony_ci
353e5c31af7Sopenharmony_ci		case input_block
354e5c31af7Sopenharmony_ci			version 450
355e5c31af7Sopenharmony_ci			desc "Geometry shader input block"
356e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
357e5c31af7Sopenharmony_ci			vertex ""
358e5c31af7Sopenharmony_ci				#version 450
359e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
360e5c31af7Sopenharmony_ci				out IOBlockName
361e5c31af7Sopenharmony_ci				{
362e5c31af7Sopenharmony_ci					mediump float var;
363e5c31af7Sopenharmony_ci				} outputInstanceName;
364e5c31af7Sopenharmony_ci				void main()
365e5c31af7Sopenharmony_ci				{
366e5c31af7Sopenharmony_ci					outputInstanceName.var = 1.0;
367e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
368e5c31af7Sopenharmony_ci				}
369e5c31af7Sopenharmony_ci			""
370e5c31af7Sopenharmony_ci			geometry ""
371e5c31af7Sopenharmony_ci				#version 450
372e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
373e5c31af7Sopenharmony_ci				in IOBlockName
374e5c31af7Sopenharmony_ci				{
375e5c31af7Sopenharmony_ci					mediump float var;
376e5c31af7Sopenharmony_ci				} inputInstanceName[];
377e5c31af7Sopenharmony_ci				out mediump float geo_out;
378e5c31af7Sopenharmony_ci				void main()
379e5c31af7Sopenharmony_ci				{
380e5c31af7Sopenharmony_ci					geo_out = inputInstanceName[0].var;
381e5c31af7Sopenharmony_ci					gl_Position = gl_in[0].gl_Position;
382e5c31af7Sopenharmony_ci					EmitVertex();
383e5c31af7Sopenharmony_ci					geo_out = inputInstanceName[1].var;
384e5c31af7Sopenharmony_ci					gl_Position = gl_in[1].gl_Position;
385e5c31af7Sopenharmony_ci					EmitVertex();
386e5c31af7Sopenharmony_ci					geo_out = inputInstanceName[2].var;
387e5c31af7Sopenharmony_ci					gl_Position = gl_in[2].gl_Position;
388e5c31af7Sopenharmony_ci					EmitVertex();
389e5c31af7Sopenharmony_ci				}
390e5c31af7Sopenharmony_ci			""
391e5c31af7Sopenharmony_ci			fragment ""
392e5c31af7Sopenharmony_ci				#version 450
393e5c31af7Sopenharmony_ci				precision mediump float;
394e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
395e5c31af7Sopenharmony_ci				in mediump float geo_out;
396e5c31af7Sopenharmony_ci				void main()
397e5c31af7Sopenharmony_ci				{
398e5c31af7Sopenharmony_ci					out0 = geo_out;
399e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
400e5c31af7Sopenharmony_ci				}
401e5c31af7Sopenharmony_ci			""
402e5c31af7Sopenharmony_ci		end
403e5c31af7Sopenharmony_ci
404e5c31af7Sopenharmony_ci		case input_block_explicit_size
405e5c31af7Sopenharmony_ci			version 450
406e5c31af7Sopenharmony_ci			desc "Geometry shader input block with explicit size"
407e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
408e5c31af7Sopenharmony_ci			vertex ""
409e5c31af7Sopenharmony_ci				#version 450
410e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
411e5c31af7Sopenharmony_ci				out IOBlockName
412e5c31af7Sopenharmony_ci				{
413e5c31af7Sopenharmony_ci					mediump float var;
414e5c31af7Sopenharmony_ci				} outputInstanceName;
415e5c31af7Sopenharmony_ci				void main()
416e5c31af7Sopenharmony_ci				{
417e5c31af7Sopenharmony_ci					outputInstanceName.var = 1.0;
418e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
419e5c31af7Sopenharmony_ci				}
420e5c31af7Sopenharmony_ci			""
421e5c31af7Sopenharmony_ci			geometry ""
422e5c31af7Sopenharmony_ci				#version 450
423e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
424e5c31af7Sopenharmony_ci				in IOBlockName
425e5c31af7Sopenharmony_ci				{
426e5c31af7Sopenharmony_ci					mediump float var;
427e5c31af7Sopenharmony_ci				} inputInstanceName[3];
428e5c31af7Sopenharmony_ci				out mediump float geo_out;
429e5c31af7Sopenharmony_ci				void main()
430e5c31af7Sopenharmony_ci				{
431e5c31af7Sopenharmony_ci					geo_out = inputInstanceName[0].var;
432e5c31af7Sopenharmony_ci					gl_Position = gl_in[0].gl_Position;
433e5c31af7Sopenharmony_ci					EmitVertex();
434e5c31af7Sopenharmony_ci					geo_out = inputInstanceName[1].var;
435e5c31af7Sopenharmony_ci					gl_Position = gl_in[1].gl_Position;
436e5c31af7Sopenharmony_ci					EmitVertex();
437e5c31af7Sopenharmony_ci					geo_out = inputInstanceName[2].var;
438e5c31af7Sopenharmony_ci					gl_Position = gl_in[2].gl_Position;
439e5c31af7Sopenharmony_ci					EmitVertex();
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 geo_out;
447e5c31af7Sopenharmony_ci				void main()
448e5c31af7Sopenharmony_ci				{
449e5c31af7Sopenharmony_ci					out0 = geo_out;
450e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
451e5c31af7Sopenharmony_ci				}
452e5c31af7Sopenharmony_ci			""
453e5c31af7Sopenharmony_ci		end
454e5c31af7Sopenharmony_ci
455e5c31af7Sopenharmony_ci		case input_block_non_array
456e5c31af7Sopenharmony_ci			version 450
457e5c31af7Sopenharmony_ci			desc "Geometry shader input block is non an array"
458e5c31af7Sopenharmony_ci			expect compile_or_link_fail
459e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
460e5c31af7Sopenharmony_ci			vertex ""
461e5c31af7Sopenharmony_ci				#version 450
462e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
463e5c31af7Sopenharmony_ci				out IOBlockName
464e5c31af7Sopenharmony_ci				{
465e5c31af7Sopenharmony_ci					mediump float var;
466e5c31af7Sopenharmony_ci				} outputInstanceName;
467e5c31af7Sopenharmony_ci				void main()
468e5c31af7Sopenharmony_ci				{
469e5c31af7Sopenharmony_ci					outputInstanceName.var = 1.0;
470e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
471e5c31af7Sopenharmony_ci				}
472e5c31af7Sopenharmony_ci			""
473e5c31af7Sopenharmony_ci			geometry ""
474e5c31af7Sopenharmony_ci				#version 450
475e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
476e5c31af7Sopenharmony_ci				in IOBlockName
477e5c31af7Sopenharmony_ci				{
478e5c31af7Sopenharmony_ci					mediump float var;
479e5c31af7Sopenharmony_ci				} inputInstanceName;
480e5c31af7Sopenharmony_ci				out mediump float geo_out;
481e5c31af7Sopenharmony_ci				void main()
482e5c31af7Sopenharmony_ci				{
483e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
484e5c31af7Sopenharmony_ci					{
485e5c31af7Sopenharmony_ci						geo_out = inputInstanceName.var;
486e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
487e5c31af7Sopenharmony_ci						EmitVertex();
488e5c31af7Sopenharmony_ci					}
489e5c31af7Sopenharmony_ci				}
490e5c31af7Sopenharmony_ci			""
491e5c31af7Sopenharmony_ci			fragment ""
492e5c31af7Sopenharmony_ci				#version 450
493e5c31af7Sopenharmony_ci				precision mediump float;
494e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
495e5c31af7Sopenharmony_ci				in mediump float geo_out;
496e5c31af7Sopenharmony_ci				void main()
497e5c31af7Sopenharmony_ci				{
498e5c31af7Sopenharmony_ci					out0 = geo_out;
499e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
500e5c31af7Sopenharmony_ci				}
501e5c31af7Sopenharmony_ci			""
502e5c31af7Sopenharmony_ci		end
503e5c31af7Sopenharmony_ci
504e5c31af7Sopenharmony_ci		case input_block_array_size_mismatch
505e5c31af7Sopenharmony_ci			version 450
506e5c31af7Sopenharmony_ci			desc "Geometry shader input block invalid array size"
507e5c31af7Sopenharmony_ci			expect compile_or_link_fail
508e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
509e5c31af7Sopenharmony_ci			vertex ""
510e5c31af7Sopenharmony_ci				#version 450
511e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
512e5c31af7Sopenharmony_ci				out IOBlockName
513e5c31af7Sopenharmony_ci				{
514e5c31af7Sopenharmony_ci					mediump float var;
515e5c31af7Sopenharmony_ci				} outputInstanceName;
516e5c31af7Sopenharmony_ci				void main()
517e5c31af7Sopenharmony_ci				{
518e5c31af7Sopenharmony_ci					outputInstanceName.var = 1.0;
519e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
520e5c31af7Sopenharmony_ci				}
521e5c31af7Sopenharmony_ci			""
522e5c31af7Sopenharmony_ci			geometry ""
523e5c31af7Sopenharmony_ci				#version 450
524e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
525e5c31af7Sopenharmony_ci				in IOBlockName
526e5c31af7Sopenharmony_ci				{
527e5c31af7Sopenharmony_ci					mediump float var;
528e5c31af7Sopenharmony_ci				} inputInstanceName[4];
529e5c31af7Sopenharmony_ci				out mediump float geo_out;
530e5c31af7Sopenharmony_ci				void main()
531e5c31af7Sopenharmony_ci				{
532e5c31af7Sopenharmony_ci					geo_out = inputInstanceName[0].var;
533e5c31af7Sopenharmony_ci					gl_Position = gl_in[0].gl_Position;
534e5c31af7Sopenharmony_ci					EmitVertex();
535e5c31af7Sopenharmony_ci					geo_out = inputInstanceName[1].var;
536e5c31af7Sopenharmony_ci					gl_Position = gl_in[1].gl_Position;
537e5c31af7Sopenharmony_ci					EmitVertex();
538e5c31af7Sopenharmony_ci					geo_out = inputInstanceName[2].var + inputInstanceName[3].var;
539e5c31af7Sopenharmony_ci					gl_Position = gl_in[2].gl_Position;
540e5c31af7Sopenharmony_ci					EmitVertex();
541e5c31af7Sopenharmony_ci				}
542e5c31af7Sopenharmony_ci			""
543e5c31af7Sopenharmony_ci			fragment ""
544e5c31af7Sopenharmony_ci				#version 450
545e5c31af7Sopenharmony_ci				precision mediump float;
546e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
547e5c31af7Sopenharmony_ci				in mediump float geo_out;
548e5c31af7Sopenharmony_ci				void main()
549e5c31af7Sopenharmony_ci				{
550e5c31af7Sopenharmony_ci					out0 = geo_out;
551e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
552e5c31af7Sopenharmony_ci				}
553e5c31af7Sopenharmony_ci			""
554e5c31af7Sopenharmony_ci		end
555e5c31af7Sopenharmony_ci
556e5c31af7Sopenharmony_ci		case output_block
557e5c31af7Sopenharmony_ci			version 450
558e5c31af7Sopenharmony_ci			desc "Geometry shader output block"
559e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
560e5c31af7Sopenharmony_ci			vertex ""
561e5c31af7Sopenharmony_ci				#version 450
562e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
563e5c31af7Sopenharmony_ci				void main()
564e5c31af7Sopenharmony_ci				{
565e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
566e5c31af7Sopenharmony_ci				}
567e5c31af7Sopenharmony_ci			""
568e5c31af7Sopenharmony_ci			geometry ""
569e5c31af7Sopenharmony_ci				#version 450
570e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
571e5c31af7Sopenharmony_ci				out IOBlockName
572e5c31af7Sopenharmony_ci				{
573e5c31af7Sopenharmony_ci					mediump float var;
574e5c31af7Sopenharmony_ci				} outputInstanceName;
575e5c31af7Sopenharmony_ci				void main()
576e5c31af7Sopenharmony_ci				{
577e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
578e5c31af7Sopenharmony_ci					{
579e5c31af7Sopenharmony_ci						outputInstanceName.var = 1.0;
580e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
581e5c31af7Sopenharmony_ci						EmitVertex();
582e5c31af7Sopenharmony_ci					}
583e5c31af7Sopenharmony_ci				}
584e5c31af7Sopenharmony_ci			""
585e5c31af7Sopenharmony_ci			fragment ""
586e5c31af7Sopenharmony_ci				#version 450
587e5c31af7Sopenharmony_ci				precision mediump float;
588e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
589e5c31af7Sopenharmony_ci				in IOBlockName
590e5c31af7Sopenharmony_ci				{
591e5c31af7Sopenharmony_ci					mediump float var;
592e5c31af7Sopenharmony_ci				} inputInstanceName;
593e5c31af7Sopenharmony_ci				void main()
594e5c31af7Sopenharmony_ci				{
595e5c31af7Sopenharmony_ci					out0 = inputInstanceName.var;
596e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
597e5c31af7Sopenharmony_ci				}
598e5c31af7Sopenharmony_ci			""
599e5c31af7Sopenharmony_ci		end
600e5c31af7Sopenharmony_ci
601e5c31af7Sopenharmony_ci		case output_block_array
602e5c31af7Sopenharmony_ci			version 450
603e5c31af7Sopenharmony_ci			desc "Geometry shader output block array"
604e5c31af7Sopenharmony_ci			values { output float out0 = 1.0; }
605e5c31af7Sopenharmony_ci			vertex ""
606e5c31af7Sopenharmony_ci				#version 450
607e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
608e5c31af7Sopenharmony_ci				void main()
609e5c31af7Sopenharmony_ci				{
610e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
611e5c31af7Sopenharmony_ci				}
612e5c31af7Sopenharmony_ci			""
613e5c31af7Sopenharmony_ci			geometry ""
614e5c31af7Sopenharmony_ci				#version 450
615e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
616e5c31af7Sopenharmony_ci				out IOBlockName
617e5c31af7Sopenharmony_ci				{
618e5c31af7Sopenharmony_ci					mediump float var;
619e5c31af7Sopenharmony_ci				} outputInstanceName[2];
620e5c31af7Sopenharmony_ci				void main()
621e5c31af7Sopenharmony_ci				{
622e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
623e5c31af7Sopenharmony_ci					{
624e5c31af7Sopenharmony_ci						outputInstanceName[0].var = 2.0;
625e5c31af7Sopenharmony_ci						outputInstanceName[1].var = 1.0;
626e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
627e5c31af7Sopenharmony_ci						EmitVertex();
628e5c31af7Sopenharmony_ci					}
629e5c31af7Sopenharmony_ci				}
630e5c31af7Sopenharmony_ci			""
631e5c31af7Sopenharmony_ci			fragment ""
632e5c31af7Sopenharmony_ci				#version 450
633e5c31af7Sopenharmony_ci				precision mediump float;
634e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
635e5c31af7Sopenharmony_ci				in IOBlockName
636e5c31af7Sopenharmony_ci				{
637e5c31af7Sopenharmony_ci					mediump float var;
638e5c31af7Sopenharmony_ci				} inputInstanceName[2];
639e5c31af7Sopenharmony_ci				void main()
640e5c31af7Sopenharmony_ci				{
641e5c31af7Sopenharmony_ci					out0 = inputInstanceName[0].var - inputInstanceName[1].var;
642e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
643e5c31af7Sopenharmony_ci				}
644e5c31af7Sopenharmony_ci			""
645e5c31af7Sopenharmony_ci		end
646e5c31af7Sopenharmony_ci
647e5c31af7Sopenharmony_ci		case unspecified_input_primitive_type
648e5c31af7Sopenharmony_ci			version 450
649e5c31af7Sopenharmony_ci			desc "Geometry shader input type unspecified"
650e5c31af7Sopenharmony_ci			expect compile_or_link_fail
651e5c31af7Sopenharmony_ci			vertex ""
652e5c31af7Sopenharmony_ci				#version 450
653e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
654e5c31af7Sopenharmony_ci				void main()
655e5c31af7Sopenharmony_ci				{
656e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
657e5c31af7Sopenharmony_ci				}
658e5c31af7Sopenharmony_ci			""
659e5c31af7Sopenharmony_ci			geometry ""
660e5c31af7Sopenharmony_ci				#version 450
661e5c31af7Sopenharmony_ci				layout (triangle_strip, max_vertices=3) out;
662e5c31af7Sopenharmony_ci				void main()
663e5c31af7Sopenharmony_ci				{
664e5c31af7Sopenharmony_ci					gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
665e5c31af7Sopenharmony_ci					EmitVertex();
666e5c31af7Sopenharmony_ci					gl_Position = vec4(0.0, 1.0, 0.0, 1.0);
667e5c31af7Sopenharmony_ci					EmitVertex();
668e5c31af7Sopenharmony_ci					gl_Position = vec4(1.0, 1.0, 0.0, 1.0);
669e5c31af7Sopenharmony_ci					EmitVertex();
670e5c31af7Sopenharmony_ci				}
671e5c31af7Sopenharmony_ci			""
672e5c31af7Sopenharmony_ci			fragment ""
673e5c31af7Sopenharmony_ci				#version 450
674e5c31af7Sopenharmony_ci				precision mediump float;
675e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
676e5c31af7Sopenharmony_ci				void main()
677e5c31af7Sopenharmony_ci				{
678e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
679e5c31af7Sopenharmony_ci				}
680e5c31af7Sopenharmony_ci			""
681e5c31af7Sopenharmony_ci		end
682e5c31af7Sopenharmony_ci
683e5c31af7Sopenharmony_ci		case unspecified_output_primitive_type
684e5c31af7Sopenharmony_ci			version 450
685e5c31af7Sopenharmony_ci			desc "Geometry shader output type unspecified"
686e5c31af7Sopenharmony_ci			expect compile_or_link_fail
687e5c31af7Sopenharmony_ci			vertex ""
688e5c31af7Sopenharmony_ci				#version 450
689e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
690e5c31af7Sopenharmony_ci				void main()
691e5c31af7Sopenharmony_ci				{
692e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
693e5c31af7Sopenharmony_ci				}
694e5c31af7Sopenharmony_ci			""
695e5c31af7Sopenharmony_ci			geometry ""
696e5c31af7Sopenharmony_ci				#version 450
697e5c31af7Sopenharmony_ci				layout (triangles) in;
698e5c31af7Sopenharmony_ci				layout (max_vertices=3) out;
699e5c31af7Sopenharmony_ci				void main()
700e5c31af7Sopenharmony_ci				{
701e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
702e5c31af7Sopenharmony_ci					{
703e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
704e5c31af7Sopenharmony_ci						EmitVertex();
705e5c31af7Sopenharmony_ci					}
706e5c31af7Sopenharmony_ci				}
707e5c31af7Sopenharmony_ci			""
708e5c31af7Sopenharmony_ci			fragment ""
709e5c31af7Sopenharmony_ci				#version 450
710e5c31af7Sopenharmony_ci				precision mediump float;
711e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
712e5c31af7Sopenharmony_ci				void main()
713e5c31af7Sopenharmony_ci				{
714e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
715e5c31af7Sopenharmony_ci				}
716e5c31af7Sopenharmony_ci			""
717e5c31af7Sopenharmony_ci		end
718e5c31af7Sopenharmony_ci
719e5c31af7Sopenharmony_ci		case unspecified_output_primitive_num_vertices
720e5c31af7Sopenharmony_ci			version 450
721e5c31af7Sopenharmony_ci			desc "Geometry shader output type unspecified"
722e5c31af7Sopenharmony_ci			expect compile_or_link_fail
723e5c31af7Sopenharmony_ci			vertex ""
724e5c31af7Sopenharmony_ci				#version 450
725e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
726e5c31af7Sopenharmony_ci				void main()
727e5c31af7Sopenharmony_ci				{
728e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
729e5c31af7Sopenharmony_ci				}
730e5c31af7Sopenharmony_ci			""
731e5c31af7Sopenharmony_ci			geometry ""
732e5c31af7Sopenharmony_ci				#version 450
733e5c31af7Sopenharmony_ci				layout (triangles) in;
734e5c31af7Sopenharmony_ci				layout (triangle_strip) out;
735e5c31af7Sopenharmony_ci				void main()
736e5c31af7Sopenharmony_ci				{
737e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
738e5c31af7Sopenharmony_ci					{
739e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
740e5c31af7Sopenharmony_ci						EmitVertex();
741e5c31af7Sopenharmony_ci					}
742e5c31af7Sopenharmony_ci				}
743e5c31af7Sopenharmony_ci			""
744e5c31af7Sopenharmony_ci			fragment ""
745e5c31af7Sopenharmony_ci				#version 450
746e5c31af7Sopenharmony_ci				precision mediump float;
747e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
748e5c31af7Sopenharmony_ci				void main()
749e5c31af7Sopenharmony_ci				{
750e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
751e5c31af7Sopenharmony_ci				}
752e5c31af7Sopenharmony_ci			""
753e5c31af7Sopenharmony_ci		end
754e5c31af7Sopenharmony_ci
755e5c31af7Sopenharmony_ci		# access_more_than_available_input_vertices
756e5c31af7Sopenharmony_ci		case access_more_than_available_input_vertices
757e5c31af7Sopenharmony_ci			version 450
758e5c31af7Sopenharmony_ci			desc "Geometry shader input block with explicit size"
759e5c31af7Sopenharmony_ci			expect compile_or_link_fail
760e5c31af7Sopenharmony_ci			vertex ""
761e5c31af7Sopenharmony_ci				#version 450
762e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
763e5c31af7Sopenharmony_ci				void main()
764e5c31af7Sopenharmony_ci				{
765e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
766e5c31af7Sopenharmony_ci				}
767e5c31af7Sopenharmony_ci			""
768e5c31af7Sopenharmony_ci			geometry ""
769e5c31af7Sopenharmony_ci				#version 450
770e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
771e5c31af7Sopenharmony_ci				void main()
772e5c31af7Sopenharmony_ci				{
773e5c31af7Sopenharmony_ci					gl_Position = gl_in[0].gl_Position;
774e5c31af7Sopenharmony_ci					EmitVertex();
775e5c31af7Sopenharmony_ci					gl_Position = gl_in[1].gl_Position;
776e5c31af7Sopenharmony_ci					EmitVertex();
777e5c31af7Sopenharmony_ci					gl_Position = gl_in[4].gl_Position; // access more than available
778e5c31af7Sopenharmony_ci					EmitVertex();
779e5c31af7Sopenharmony_ci				}
780e5c31af7Sopenharmony_ci			""
781e5c31af7Sopenharmony_ci			fragment ""
782e5c31af7Sopenharmony_ci				#version 450
783e5c31af7Sopenharmony_ci				precision mediump float;
784e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
785e5c31af7Sopenharmony_ci				void main()
786e5c31af7Sopenharmony_ci				{
787e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
788e5c31af7Sopenharmony_ci				}
789e5c31af7Sopenharmony_ci			""
790e5c31af7Sopenharmony_ci		end
791e5c31af7Sopenharmony_ci	end
792e5c31af7Sopenharmony_ci
793e5c31af7Sopenharmony_ci	import "linkage_geometry_varying_types.test"
794e5c31af7Sopenharmony_ci
795e5c31af7Sopenharmony_ci	group qualifiers "Varying qualifiers"
796e5c31af7Sopenharmony_ci		case smooth
797e5c31af7Sopenharmony_ci			version 450
798e5c31af7Sopenharmony_ci			desc "varying with smooth interpolation"
799e5c31af7Sopenharmony_ci			values
800e5c31af7Sopenharmony_ci			{
801e5c31af7Sopenharmony_ci				input float in0		= 1.0;
802e5c31af7Sopenharmony_ci				output float out0	= 1.0;
803e5c31af7Sopenharmony_ci			}
804e5c31af7Sopenharmony_ci			vertex ""
805e5c31af7Sopenharmony_ci				#version 450
806e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
807e5c31af7Sopenharmony_ci				smooth out mediump float vtx_var;
808e5c31af7Sopenharmony_ci				void main()
809e5c31af7Sopenharmony_ci				{
810e5c31af7Sopenharmony_ci					vtx_var = in0;
811e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
812e5c31af7Sopenharmony_ci				}
813e5c31af7Sopenharmony_ci			""
814e5c31af7Sopenharmony_ci			geometry ""
815e5c31af7Sopenharmony_ci				#version 450
816e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
817e5c31af7Sopenharmony_ci				smooth in mediump float vtx_var[];
818e5c31af7Sopenharmony_ci				smooth out mediump float geo_var;
819e5c31af7Sopenharmony_ci				void main()
820e5c31af7Sopenharmony_ci				{
821e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
822e5c31af7Sopenharmony_ci					{
823e5c31af7Sopenharmony_ci						geo_var = vtx_var[ndx];
824e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
825e5c31af7Sopenharmony_ci						EmitVertex();
826e5c31af7Sopenharmony_ci					}
827e5c31af7Sopenharmony_ci				}
828e5c31af7Sopenharmony_ci			""
829e5c31af7Sopenharmony_ci			fragment ""
830e5c31af7Sopenharmony_ci				#version 450
831e5c31af7Sopenharmony_ci				precision mediump float;
832e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
833e5c31af7Sopenharmony_ci				smooth in float geo_var;
834e5c31af7Sopenharmony_ci				void main()
835e5c31af7Sopenharmony_ci				{
836e5c31af7Sopenharmony_ci					out0 = geo_var;
837e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
838e5c31af7Sopenharmony_ci				}
839e5c31af7Sopenharmony_ci			""
840e5c31af7Sopenharmony_ci		end
841e5c31af7Sopenharmony_ci
842e5c31af7Sopenharmony_ci		case flat
843e5c31af7Sopenharmony_ci			version 450
844e5c31af7Sopenharmony_ci			desc "varying with flat interpolation"
845e5c31af7Sopenharmony_ci			values
846e5c31af7Sopenharmony_ci			{
847e5c31af7Sopenharmony_ci				input float in0		= 1.0;
848e5c31af7Sopenharmony_ci				output float out0	= 1.0;
849e5c31af7Sopenharmony_ci			}
850e5c31af7Sopenharmony_ci			vertex ""
851e5c31af7Sopenharmony_ci				#version 450
852e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
853e5c31af7Sopenharmony_ci				flat out mediump float vtx_var;
854e5c31af7Sopenharmony_ci				void main()
855e5c31af7Sopenharmony_ci				{
856e5c31af7Sopenharmony_ci					vtx_var = in0;
857e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
858e5c31af7Sopenharmony_ci				}
859e5c31af7Sopenharmony_ci			""
860e5c31af7Sopenharmony_ci			geometry ""
861e5c31af7Sopenharmony_ci				#version 450
862e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
863e5c31af7Sopenharmony_ci				flat in mediump float vtx_var[];
864e5c31af7Sopenharmony_ci				flat out mediump float geo_var;
865e5c31af7Sopenharmony_ci				void main()
866e5c31af7Sopenharmony_ci				{
867e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
868e5c31af7Sopenharmony_ci					{
869e5c31af7Sopenharmony_ci						geo_var = vtx_var[ndx];
870e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
871e5c31af7Sopenharmony_ci						EmitVertex();
872e5c31af7Sopenharmony_ci					}
873e5c31af7Sopenharmony_ci				}
874e5c31af7Sopenharmony_ci			""
875e5c31af7Sopenharmony_ci			fragment ""
876e5c31af7Sopenharmony_ci				#version 450
877e5c31af7Sopenharmony_ci				precision mediump float;
878e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
879e5c31af7Sopenharmony_ci				flat in float geo_var;
880e5c31af7Sopenharmony_ci				void main()
881e5c31af7Sopenharmony_ci				{
882e5c31af7Sopenharmony_ci					out0 = geo_var;
883e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
884e5c31af7Sopenharmony_ci				}
885e5c31af7Sopenharmony_ci			""
886e5c31af7Sopenharmony_ci		end
887e5c31af7Sopenharmony_ci
888e5c31af7Sopenharmony_ci		case centroid
889e5c31af7Sopenharmony_ci			version 450
890e5c31af7Sopenharmony_ci			desc "varying declared with centroid qualifier"
891e5c31af7Sopenharmony_ci			values
892e5c31af7Sopenharmony_ci			{
893e5c31af7Sopenharmony_ci				input float in0		= 1.0;
894e5c31af7Sopenharmony_ci				output float out0	= 1.0;
895e5c31af7Sopenharmony_ci			}
896e5c31af7Sopenharmony_ci			vertex ""
897e5c31af7Sopenharmony_ci				#version 450
898e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
899e5c31af7Sopenharmony_ci				centroid out mediump float vtx_var;
900e5c31af7Sopenharmony_ci				void main()
901e5c31af7Sopenharmony_ci				{
902e5c31af7Sopenharmony_ci					vtx_var = in0;
903e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
904e5c31af7Sopenharmony_ci				}
905e5c31af7Sopenharmony_ci			""
906e5c31af7Sopenharmony_ci			geometry ""
907e5c31af7Sopenharmony_ci				#version 450
908e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
909e5c31af7Sopenharmony_ci				centroid in mediump float vtx_var[];
910e5c31af7Sopenharmony_ci				centroid out mediump float geo_var;
911e5c31af7Sopenharmony_ci				void main()
912e5c31af7Sopenharmony_ci				{
913e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
914e5c31af7Sopenharmony_ci					{
915e5c31af7Sopenharmony_ci						geo_var = vtx_var[ndx];
916e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
917e5c31af7Sopenharmony_ci						EmitVertex();
918e5c31af7Sopenharmony_ci					}
919e5c31af7Sopenharmony_ci				}
920e5c31af7Sopenharmony_ci			""
921e5c31af7Sopenharmony_ci			fragment ""
922e5c31af7Sopenharmony_ci				#version 450
923e5c31af7Sopenharmony_ci				precision mediump float;
924e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
925e5c31af7Sopenharmony_ci				centroid in float geo_var;
926e5c31af7Sopenharmony_ci				void main()
927e5c31af7Sopenharmony_ci				{
928e5c31af7Sopenharmony_ci					out0 = geo_var;
929e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
930e5c31af7Sopenharmony_ci				}
931e5c31af7Sopenharmony_ci			""
932e5c31af7Sopenharmony_ci		end
933e5c31af7Sopenharmony_ci
934e5c31af7Sopenharmony_ci		case sample
935e5c31af7Sopenharmony_ci			version 450
936e5c31af7Sopenharmony_ci			desc "varying declared with sample qualifier"
937e5c31af7Sopenharmony_ci			values
938e5c31af7Sopenharmony_ci			{
939e5c31af7Sopenharmony_ci				input float in0		= 1.0;
940e5c31af7Sopenharmony_ci				output float out0	= 1.0;
941e5c31af7Sopenharmony_ci			}
942e5c31af7Sopenharmony_ci			vertex ""
943e5c31af7Sopenharmony_ci				#version 450
944e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
945e5c31af7Sopenharmony_ci				sample out mediump float vtx_var;
946e5c31af7Sopenharmony_ci				void main()
947e5c31af7Sopenharmony_ci				{
948e5c31af7Sopenharmony_ci					vtx_var = in0;
949e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
950e5c31af7Sopenharmony_ci				}
951e5c31af7Sopenharmony_ci			""
952e5c31af7Sopenharmony_ci			geometry ""
953e5c31af7Sopenharmony_ci				#version 450
954e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
955e5c31af7Sopenharmony_ci				sample in mediump float vtx_var[];
956e5c31af7Sopenharmony_ci				sample out mediump float geo_var;
957e5c31af7Sopenharmony_ci				void main()
958e5c31af7Sopenharmony_ci				{
959e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
960e5c31af7Sopenharmony_ci					{
961e5c31af7Sopenharmony_ci						geo_var = vtx_var[ndx];
962e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
963e5c31af7Sopenharmony_ci						EmitVertex();
964e5c31af7Sopenharmony_ci					}
965e5c31af7Sopenharmony_ci				}
966e5c31af7Sopenharmony_ci			""
967e5c31af7Sopenharmony_ci			fragment ""
968e5c31af7Sopenharmony_ci				#version 450
969e5c31af7Sopenharmony_ci				precision mediump float;
970e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
971e5c31af7Sopenharmony_ci				sample in float geo_var;
972e5c31af7Sopenharmony_ci				void main()
973e5c31af7Sopenharmony_ci				{
974e5c31af7Sopenharmony_ci					out0 = geo_var;
975e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
976e5c31af7Sopenharmony_ci				}
977e5c31af7Sopenharmony_ci			""
978e5c31af7Sopenharmony_ci		end
979e5c31af7Sopenharmony_ci	end
980e5c31af7Sopenharmony_ciend
981e5c31af7Sopenharmony_ci
982e5c31af7Sopenharmony_cigroup uniform "Uniform linkage"
983e5c31af7Sopenharmony_ci	group rules "Rules"
984e5c31af7Sopenharmony_ci
985e5c31af7Sopenharmony_ci		case type_mismatch_1
986e5c31af7Sopenharmony_ci			version 450
987e5c31af7Sopenharmony_ci			desc "uniforms declared with different types"
988e5c31af7Sopenharmony_ci			expect link_fail
989e5c31af7Sopenharmony_ci			vertex ""
990e5c31af7Sopenharmony_ci				#version 450
991e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
992e5c31af7Sopenharmony_ci				uniform mediump float u_var;
993e5c31af7Sopenharmony_ci				out mediump float vtx_var;
994e5c31af7Sopenharmony_ci				void main()
995e5c31af7Sopenharmony_ci				{
996e5c31af7Sopenharmony_ci					vtx_var = u_var;
997e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
998e5c31af7Sopenharmony_ci				}
999e5c31af7Sopenharmony_ci			""
1000e5c31af7Sopenharmony_ci			geometry ""
1001e5c31af7Sopenharmony_ci				#version 450
1002e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
1003e5c31af7Sopenharmony_ci				uniform mediump vec4 u_var;
1004e5c31af7Sopenharmony_ci				in mediump float vtx_var[];
1005e5c31af7Sopenharmony_ci				out mediump float geo_var;
1006e5c31af7Sopenharmony_ci				void main()
1007e5c31af7Sopenharmony_ci				{
1008e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1009e5c31af7Sopenharmony_ci					{
1010e5c31af7Sopenharmony_ci						geo_var = vtx_var[ndx];
1011e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position + u_var;
1012e5c31af7Sopenharmony_ci						EmitVertex();
1013e5c31af7Sopenharmony_ci					}
1014e5c31af7Sopenharmony_ci				}
1015e5c31af7Sopenharmony_ci			""
1016e5c31af7Sopenharmony_ci			fragment ""
1017e5c31af7Sopenharmony_ci				#version 450
1018e5c31af7Sopenharmony_ci				precision mediump float;
1019e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1020e5c31af7Sopenharmony_ci				in float geo_var;
1021e5c31af7Sopenharmony_ci				void main()
1022e5c31af7Sopenharmony_ci				{
1023e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(geo_var);
1024e5c31af7Sopenharmony_ci				}
1025e5c31af7Sopenharmony_ci			""
1026e5c31af7Sopenharmony_ci		end
1027e5c31af7Sopenharmony_ci
1028e5c31af7Sopenharmony_ci		case type_mismatch_2
1029e5c31af7Sopenharmony_ci			version 450
1030e5c31af7Sopenharmony_ci			desc "uniforms declared with different types"
1031e5c31af7Sopenharmony_ci			expect link_fail
1032e5c31af7Sopenharmony_ci			require limit "GL_MAX_VERTEX_ATOMIC_COUNTERS" > 0
1033e5c31af7Sopenharmony_ci			vertex ""
1034e5c31af7Sopenharmony_ci				#version 450
1035e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1036e5c31af7Sopenharmony_ci				layout(binding=0) uniform atomic_uint u_var;
1037e5c31af7Sopenharmony_ci				out mediump float vtx_var;
1038e5c31af7Sopenharmony_ci				void main()
1039e5c31af7Sopenharmony_ci				{
1040e5c31af7Sopenharmony_ci					uint result = atomicCounterIncrement(u_var);
1041e5c31af7Sopenharmony_ci					vtx_var = float(result);
1042e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1043e5c31af7Sopenharmony_ci				}
1044e5c31af7Sopenharmony_ci			""
1045e5c31af7Sopenharmony_ci			geometry ""
1046e5c31af7Sopenharmony_ci				#version 450
1047e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
1048e5c31af7Sopenharmony_ci				uniform mediump vec4 u_var;
1049e5c31af7Sopenharmony_ci				in mediump float vtx_var[];
1050e5c31af7Sopenharmony_ci				out mediump float geo_var;
1051e5c31af7Sopenharmony_ci				void main()
1052e5c31af7Sopenharmony_ci				{
1053e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1054e5c31af7Sopenharmony_ci					{
1055e5c31af7Sopenharmony_ci						geo_var = vtx_var[ndx];
1056e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position + u_var;
1057e5c31af7Sopenharmony_ci						EmitVertex();
1058e5c31af7Sopenharmony_ci					}
1059e5c31af7Sopenharmony_ci				}
1060e5c31af7Sopenharmony_ci			""
1061e5c31af7Sopenharmony_ci			fragment ""
1062e5c31af7Sopenharmony_ci				#version 450
1063e5c31af7Sopenharmony_ci				precision mediump float;
1064e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1065e5c31af7Sopenharmony_ci				in float geo_var;
1066e5c31af7Sopenharmony_ci				void main()
1067e5c31af7Sopenharmony_ci				{
1068e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(geo_var);
1069e5c31af7Sopenharmony_ci				}
1070e5c31af7Sopenharmony_ci			""
1071e5c31af7Sopenharmony_ci		end
1072e5c31af7Sopenharmony_ci
1073e5c31af7Sopenharmony_ci		case type_mismatch_3
1074e5c31af7Sopenharmony_ci			version 450
1075e5c31af7Sopenharmony_ci			desc "uniforms declared with different types"
1076e5c31af7Sopenharmony_ci			expect link_fail
1077e5c31af7Sopenharmony_ci			require limit "GL_MAX_VERTEX_IMAGE_UNIFORMS" > 0
1078e5c31af7Sopenharmony_ci			vertex ""
1079e5c31af7Sopenharmony_ci				#version 450
1080e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1081e5c31af7Sopenharmony_ci				layout(binding=0) layout(rgba8i) uniform readonly highp iimage2D u_var;
1082e5c31af7Sopenharmony_ci				out mediump float vtx_var;
1083e5c31af7Sopenharmony_ci				void main()
1084e5c31af7Sopenharmony_ci				{
1085e5c31af7Sopenharmony_ci					int result = imageSize(u_var).x;
1086e5c31af7Sopenharmony_ci					vtx_var = float(result);
1087e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1088e5c31af7Sopenharmony_ci				}
1089e5c31af7Sopenharmony_ci			""
1090e5c31af7Sopenharmony_ci			geometry ""
1091e5c31af7Sopenharmony_ci				#version 450
1092e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
1093e5c31af7Sopenharmony_ci				uniform mediump vec4 u_var;
1094e5c31af7Sopenharmony_ci				in mediump float vtx_var[];
1095e5c31af7Sopenharmony_ci				out mediump float geo_var;
1096e5c31af7Sopenharmony_ci				void main()
1097e5c31af7Sopenharmony_ci				{
1098e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1099e5c31af7Sopenharmony_ci					{
1100e5c31af7Sopenharmony_ci						geo_var = vtx_var[ndx];
1101e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position + u_var;
1102e5c31af7Sopenharmony_ci						EmitVertex();
1103e5c31af7Sopenharmony_ci					}
1104e5c31af7Sopenharmony_ci				}
1105e5c31af7Sopenharmony_ci			""
1106e5c31af7Sopenharmony_ci			fragment ""
1107e5c31af7Sopenharmony_ci				#version 450
1108e5c31af7Sopenharmony_ci				precision mediump float;
1109e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1110e5c31af7Sopenharmony_ci				in float geo_var;
1111e5c31af7Sopenharmony_ci				void main()
1112e5c31af7Sopenharmony_ci				{
1113e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(geo_var);
1114e5c31af7Sopenharmony_ci				}
1115e5c31af7Sopenharmony_ci			""
1116e5c31af7Sopenharmony_ci		end
1117e5c31af7Sopenharmony_ci
1118e5c31af7Sopenharmony_ci		case struct_partial_usage
1119e5c31af7Sopenharmony_ci			version 450
1120e5c31af7Sopenharmony_ci			desc "uniforms struct used partially in different stages"
1121e5c31af7Sopenharmony_ci			values
1122e5c31af7Sopenharmony_ci			{
1123e5c31af7Sopenharmony_ci				uniform float val.vtxValue	= 1.0;
1124e5c31af7Sopenharmony_ci				uniform float val.geoValue	= 1.0;
1125e5c31af7Sopenharmony_ci				uniform float val.frgValue	= 1.0;
1126e5c31af7Sopenharmony_ci			}
1127e5c31af7Sopenharmony_ci			vertex ""
1128e5c31af7Sopenharmony_ci				#version 450
1129e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
1130e5c31af7Sopenharmony_ci				struct S
1131e5c31af7Sopenharmony_ci				{
1132e5c31af7Sopenharmony_ci					mediump float vtxValue;
1133e5c31af7Sopenharmony_ci					mediump float geoValue;
1134e5c31af7Sopenharmony_ci					mediump float frgValue;
1135e5c31af7Sopenharmony_ci				};
1136e5c31af7Sopenharmony_ci				uniform S val;
1137e5c31af7Sopenharmony_ci				out mediump float vtx_var;
1138e5c31af7Sopenharmony_ci				void main()
1139e5c31af7Sopenharmony_ci				{
1140e5c31af7Sopenharmony_ci					vtx_var = val.vtxValue;
1141e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
1142e5c31af7Sopenharmony_ci				}
1143e5c31af7Sopenharmony_ci			""
1144e5c31af7Sopenharmony_ci			geometry ""
1145e5c31af7Sopenharmony_ci				#version 450
1146e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
1147e5c31af7Sopenharmony_ci				struct S
1148e5c31af7Sopenharmony_ci				{
1149e5c31af7Sopenharmony_ci					mediump float vtxValue;
1150e5c31af7Sopenharmony_ci					mediump float geoValue;
1151e5c31af7Sopenharmony_ci					mediump float frgValue;
1152e5c31af7Sopenharmony_ci				};
1153e5c31af7Sopenharmony_ci				uniform S val;
1154e5c31af7Sopenharmony_ci				in mediump float vtx_var[];
1155e5c31af7Sopenharmony_ci				out mediump float geo_var;
1156e5c31af7Sopenharmony_ci				void main()
1157e5c31af7Sopenharmony_ci				{
1158e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1159e5c31af7Sopenharmony_ci					{
1160e5c31af7Sopenharmony_ci						geo_var = vtx_var[ndx] + val.geoValue;
1161e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
1162e5c31af7Sopenharmony_ci						EmitVertex();
1163e5c31af7Sopenharmony_ci					}
1164e5c31af7Sopenharmony_ci				}
1165e5c31af7Sopenharmony_ci			""
1166e5c31af7Sopenharmony_ci			fragment ""
1167e5c31af7Sopenharmony_ci				#version 450
1168e5c31af7Sopenharmony_ci				precision mediump float;
1169e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
1170e5c31af7Sopenharmony_ci				struct S
1171e5c31af7Sopenharmony_ci				{
1172e5c31af7Sopenharmony_ci					mediump float vtxValue;
1173e5c31af7Sopenharmony_ci					mediump float geoValue;
1174e5c31af7Sopenharmony_ci					mediump float frgValue;
1175e5c31af7Sopenharmony_ci				};
1176e5c31af7Sopenharmony_ci				uniform S val;
1177e5c31af7Sopenharmony_ci				in float geo_var;
1178e5c31af7Sopenharmony_ci				void main()
1179e5c31af7Sopenharmony_ci				{
1180e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(geo_var + val.frgValue);
1181e5c31af7Sopenharmony_ci				}
1182e5c31af7Sopenharmony_ci			""
1183e5c31af7Sopenharmony_ci		end
1184e5c31af7Sopenharmony_ci	end
1185e5c31af7Sopenharmony_ci
1186e5c31af7Sopenharmony_ci	import "linkage_geometry_uniform_types.test"
1187e5c31af7Sopenharmony_ciend
1188