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