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