1e5c31af7Sopenharmony_ci# -------------------------------------------------
2e5c31af7Sopenharmony_ci# drawElements Quality Program OpenGL ES 3.2 Module
3e5c31af7Sopenharmony_ci# -------------------------------------------------
4e5c31af7Sopenharmony_ci#
5e5c31af7Sopenharmony_ci# Copyright 2016 The Android Open Source Project
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci#
11e5c31af7Sopenharmony_ci#      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci#
13e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci# limitations under the License.
18e5c31af7Sopenharmony_ci
19e5c31af7Sopenharmony_ci
20e5c31af7Sopenharmony_cigroup varying "Varying linkage"
21e5c31af7Sopenharmony_ci	group rules "Rules"
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_ci		case type_mismatch
24e5c31af7Sopenharmony_ci			version 450
25e5c31af7Sopenharmony_ci			desc "Tessellation output and geometry input type mismatch"
26e5c31af7Sopenharmony_ci			expect link_fail
27e5c31af7Sopenharmony_ci			values
28e5c31af7Sopenharmony_ci			{
29e5c31af7Sopenharmony_ci				input float in0 = 1.0;
30e5c31af7Sopenharmony_ci				output float out0 = 1.0;
31e5c31af7Sopenharmony_ci			}
32e5c31af7Sopenharmony_ci			vertex ""
33e5c31af7Sopenharmony_ci				#version 450
34e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
35e5c31af7Sopenharmony_ci				out mediump float vtx_out;
36e5c31af7Sopenharmony_ci				void main()
37e5c31af7Sopenharmony_ci				{
38e5c31af7Sopenharmony_ci					vtx_out = in0;
39e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
40e5c31af7Sopenharmony_ci				}
41e5c31af7Sopenharmony_ci			""
42e5c31af7Sopenharmony_ci			tessellation_control ""
43e5c31af7Sopenharmony_ci				#version 450
44e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
45e5c31af7Sopenharmony_ci				in mediump float vtx_out[];
46e5c31af7Sopenharmony_ci				out mediump float tc_out[];
47e5c31af7Sopenharmony_ci				void main()
48e5c31af7Sopenharmony_ci				{
49e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
50e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
51e5c31af7Sopenharmony_ci				}
52e5c31af7Sopenharmony_ci			""
53e5c31af7Sopenharmony_ci			tessellation_evaluation ""
54e5c31af7Sopenharmony_ci				#version 450
55e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
56e5c31af7Sopenharmony_ci				in mediump float tc_out[];
57e5c31af7Sopenharmony_ci				out mediump float te_out;
58e5c31af7Sopenharmony_ci				void main()
59e5c31af7Sopenharmony_ci				{
60e5c31af7Sopenharmony_ci					te_out = tc_out[2];
61e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
62e5c31af7Sopenharmony_ci				}
63e5c31af7Sopenharmony_ci			""
64e5c31af7Sopenharmony_ci			geometry ""
65e5c31af7Sopenharmony_ci				#version 450
66e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
67e5c31af7Sopenharmony_ci				in mediump vec2 te_out[];
68e5c31af7Sopenharmony_ci				out mediump float geo_out;
69e5c31af7Sopenharmony_ci				void main()
70e5c31af7Sopenharmony_ci				{
71e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
72e5c31af7Sopenharmony_ci					{
73e5c31af7Sopenharmony_ci						geo_out = te_out[ndx].y;
74e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
75e5c31af7Sopenharmony_ci						EmitVertex();
76e5c31af7Sopenharmony_ci					}
77e5c31af7Sopenharmony_ci				}
78e5c31af7Sopenharmony_ci			""
79e5c31af7Sopenharmony_ci			fragment ""
80e5c31af7Sopenharmony_ci				#version 450
81e5c31af7Sopenharmony_ci				precision mediump float;
82e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
83e5c31af7Sopenharmony_ci				in mediump float geo_out;
84e5c31af7Sopenharmony_ci				void main()
85e5c31af7Sopenharmony_ci				{
86e5c31af7Sopenharmony_ci					out0 = geo_out;
87e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
88e5c31af7Sopenharmony_ci				}
89e5c31af7Sopenharmony_ci			""
90e5c31af7Sopenharmony_ci		end
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_ci		case different_precision
93e5c31af7Sopenharmony_ci			version 450
94e5c31af7Sopenharmony_ci			desc "Tessellation output and geometry input precisions are different"
95e5c31af7Sopenharmony_ci			values
96e5c31af7Sopenharmony_ci			{
97e5c31af7Sopenharmony_ci				input float in0 = 1.0;
98e5c31af7Sopenharmony_ci				output float out0 = 1.0;
99e5c31af7Sopenharmony_ci			}
100e5c31af7Sopenharmony_ci			vertex ""
101e5c31af7Sopenharmony_ci				#version 450
102e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
103e5c31af7Sopenharmony_ci				out mediump float vtx_out;
104e5c31af7Sopenharmony_ci				void main()
105e5c31af7Sopenharmony_ci				{
106e5c31af7Sopenharmony_ci					vtx_out = in0;
107e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
108e5c31af7Sopenharmony_ci				}
109e5c31af7Sopenharmony_ci			""
110e5c31af7Sopenharmony_ci			tessellation_control ""
111e5c31af7Sopenharmony_ci				#version 450
112e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
113e5c31af7Sopenharmony_ci				in mediump float vtx_out[];
114e5c31af7Sopenharmony_ci				out mediump float tc_out[];
115e5c31af7Sopenharmony_ci				void main()
116e5c31af7Sopenharmony_ci				{
117e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
118e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
119e5c31af7Sopenharmony_ci				}
120e5c31af7Sopenharmony_ci			""
121e5c31af7Sopenharmony_ci			tessellation_evaluation ""
122e5c31af7Sopenharmony_ci				#version 450
123e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
124e5c31af7Sopenharmony_ci				in mediump float tc_out[];
125e5c31af7Sopenharmony_ci				out mediump float te_out;
126e5c31af7Sopenharmony_ci				void main()
127e5c31af7Sopenharmony_ci				{
128e5c31af7Sopenharmony_ci					te_out = tc_out[2];
129e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
130e5c31af7Sopenharmony_ci				}
131e5c31af7Sopenharmony_ci			""
132e5c31af7Sopenharmony_ci			geometry ""
133e5c31af7Sopenharmony_ci				#version 450
134e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
135e5c31af7Sopenharmony_ci				in highp float te_out[];
136e5c31af7Sopenharmony_ci				out mediump float geo_out;
137e5c31af7Sopenharmony_ci				void main()
138e5c31af7Sopenharmony_ci				{
139e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
140e5c31af7Sopenharmony_ci					{
141e5c31af7Sopenharmony_ci						geo_out = te_out[ndx];
142e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
143e5c31af7Sopenharmony_ci						EmitVertex();
144e5c31af7Sopenharmony_ci					}
145e5c31af7Sopenharmony_ci				}
146e5c31af7Sopenharmony_ci			""
147e5c31af7Sopenharmony_ci			fragment ""
148e5c31af7Sopenharmony_ci				#version 450
149e5c31af7Sopenharmony_ci				precision mediump float;
150e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
151e5c31af7Sopenharmony_ci				in mediump float geo_out;
152e5c31af7Sopenharmony_ci				void main()
153e5c31af7Sopenharmony_ci				{
154e5c31af7Sopenharmony_ci					out0 = geo_out;
155e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
156e5c31af7Sopenharmony_ci				}
157e5c31af7Sopenharmony_ci			""
158e5c31af7Sopenharmony_ci		end
159e5c31af7Sopenharmony_ci
160e5c31af7Sopenharmony_ci		case superfluous_output_declaration
161e5c31af7Sopenharmony_ci			version 450
162e5c31af7Sopenharmony_ci			desc "Tessellation shader output is never used"
163e5c31af7Sopenharmony_ci			values
164e5c31af7Sopenharmony_ci			{
165e5c31af7Sopenharmony_ci				input float in0 = 1.0;
166e5c31af7Sopenharmony_ci				output float out0 = 1.0;
167e5c31af7Sopenharmony_ci			}
168e5c31af7Sopenharmony_ci			vertex ""
169e5c31af7Sopenharmony_ci				#version 450
170e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
171e5c31af7Sopenharmony_ci				out mediump float vtx_out;
172e5c31af7Sopenharmony_ci				void main()
173e5c31af7Sopenharmony_ci				{
174e5c31af7Sopenharmony_ci					vtx_out = in0;
175e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
176e5c31af7Sopenharmony_ci				}
177e5c31af7Sopenharmony_ci			""
178e5c31af7Sopenharmony_ci			tessellation_control ""
179e5c31af7Sopenharmony_ci				#version 450
180e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
181e5c31af7Sopenharmony_ci				in mediump float vtx_out[];
182e5c31af7Sopenharmony_ci				out mediump float tc_out[];
183e5c31af7Sopenharmony_ci				void main()
184e5c31af7Sopenharmony_ci				{
185e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
186e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
187e5c31af7Sopenharmony_ci				}
188e5c31af7Sopenharmony_ci			""
189e5c31af7Sopenharmony_ci			tessellation_evaluation ""
190e5c31af7Sopenharmony_ci				#version 450
191e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
192e5c31af7Sopenharmony_ci				in mediump float tc_out[];
193e5c31af7Sopenharmony_ci				out mediump float te_out;
194e5c31af7Sopenharmony_ci				out mediump float te_out_nonexistent;
195e5c31af7Sopenharmony_ci				void main()
196e5c31af7Sopenharmony_ci				{
197e5c31af7Sopenharmony_ci					te_out = tc_out[2];
198e5c31af7Sopenharmony_ci					te_out_nonexistent = tc_out[0];
199e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
200e5c31af7Sopenharmony_ci				}
201e5c31af7Sopenharmony_ci			""
202e5c31af7Sopenharmony_ci			geometry ""
203e5c31af7Sopenharmony_ci				#version 450
204e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
205e5c31af7Sopenharmony_ci				in mediump float te_out[];
206e5c31af7Sopenharmony_ci				out mediump float geo_out;
207e5c31af7Sopenharmony_ci				void main()
208e5c31af7Sopenharmony_ci				{
209e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
210e5c31af7Sopenharmony_ci					{
211e5c31af7Sopenharmony_ci						geo_out = te_out[ndx];
212e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
213e5c31af7Sopenharmony_ci						EmitVertex();
214e5c31af7Sopenharmony_ci					}
215e5c31af7Sopenharmony_ci				}
216e5c31af7Sopenharmony_ci			""
217e5c31af7Sopenharmony_ci			fragment ""
218e5c31af7Sopenharmony_ci				#version 450
219e5c31af7Sopenharmony_ci				precision mediump float;
220e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
221e5c31af7Sopenharmony_ci				in mediump float geo_out;
222e5c31af7Sopenharmony_ci				void main()
223e5c31af7Sopenharmony_ci				{
224e5c31af7Sopenharmony_ci					out0 = geo_out;
225e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
226e5c31af7Sopenharmony_ci				}
227e5c31af7Sopenharmony_ci			""
228e5c31af7Sopenharmony_ci		end
229e5c31af7Sopenharmony_ci
230e5c31af7Sopenharmony_ci		case vertex_geometry_same_varying_name_1
231e5c31af7Sopenharmony_ci			version 450
232e5c31af7Sopenharmony_ci			desc "Vertex output and geometry input share the same name"
233e5c31af7Sopenharmony_ci			values
234e5c31af7Sopenharmony_ci			{
235e5c31af7Sopenharmony_ci				input float in0 = 1.0;
236e5c31af7Sopenharmony_ci				output float out0 = 1.0;
237e5c31af7Sopenharmony_ci			}
238e5c31af7Sopenharmony_ci			vertex ""
239e5c31af7Sopenharmony_ci				#version 450
240e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
241e5c31af7Sopenharmony_ci				out mediump float sharedVaringName;
242e5c31af7Sopenharmony_ci				void main()
243e5c31af7Sopenharmony_ci				{
244e5c31af7Sopenharmony_ci					sharedVaringName = in0;
245e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
246e5c31af7Sopenharmony_ci				}
247e5c31af7Sopenharmony_ci			""
248e5c31af7Sopenharmony_ci			tessellation_control ""
249e5c31af7Sopenharmony_ci				#version 450
250e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
251e5c31af7Sopenharmony_ci				in mediump float sharedVaringName[];
252e5c31af7Sopenharmony_ci				out mediump float tc_out[];
253e5c31af7Sopenharmony_ci				void main()
254e5c31af7Sopenharmony_ci				{
255e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID];
256e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
257e5c31af7Sopenharmony_ci				}
258e5c31af7Sopenharmony_ci			""
259e5c31af7Sopenharmony_ci			tessellation_evaluation ""
260e5c31af7Sopenharmony_ci				#version 450
261e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
262e5c31af7Sopenharmony_ci				in mediump float tc_out[];
263e5c31af7Sopenharmony_ci				out mediump float sharedVaringName;
264e5c31af7Sopenharmony_ci				void main()
265e5c31af7Sopenharmony_ci				{
266e5c31af7Sopenharmony_ci					sharedVaringName = tc_out[2];
267e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
268e5c31af7Sopenharmony_ci				}
269e5c31af7Sopenharmony_ci			""
270e5c31af7Sopenharmony_ci			geometry ""
271e5c31af7Sopenharmony_ci				#version 450
272e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
273e5c31af7Sopenharmony_ci				in mediump float sharedVaringName[];
274e5c31af7Sopenharmony_ci				out mediump float geo_out;
275e5c31af7Sopenharmony_ci				void main()
276e5c31af7Sopenharmony_ci				{
277e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
278e5c31af7Sopenharmony_ci					{
279e5c31af7Sopenharmony_ci						geo_out = sharedVaringName[ndx];
280e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
281e5c31af7Sopenharmony_ci						EmitVertex();
282e5c31af7Sopenharmony_ci					}
283e5c31af7Sopenharmony_ci				}
284e5c31af7Sopenharmony_ci			""
285e5c31af7Sopenharmony_ci			fragment ""
286e5c31af7Sopenharmony_ci				#version 450
287e5c31af7Sopenharmony_ci				precision mediump float;
288e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
289e5c31af7Sopenharmony_ci				in mediump float geo_out;
290e5c31af7Sopenharmony_ci				void main()
291e5c31af7Sopenharmony_ci				{
292e5c31af7Sopenharmony_ci					out0 = geo_out;
293e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
294e5c31af7Sopenharmony_ci				}
295e5c31af7Sopenharmony_ci			""
296e5c31af7Sopenharmony_ci		end
297e5c31af7Sopenharmony_ci
298e5c31af7Sopenharmony_ci		case vertex_geometry_same_varying_name_2
299e5c31af7Sopenharmony_ci			version 450
300e5c31af7Sopenharmony_ci			desc "Vertex output and geometry input share the same name"
301e5c31af7Sopenharmony_ci			values
302e5c31af7Sopenharmony_ci			{
303e5c31af7Sopenharmony_ci				input vec2 in0 = vec2(1.0, 1.0);
304e5c31af7Sopenharmony_ci				output float out0 = 1.0;
305e5c31af7Sopenharmony_ci			}
306e5c31af7Sopenharmony_ci			vertex ""
307e5c31af7Sopenharmony_ci				#version 450
308e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
309e5c31af7Sopenharmony_ci				out mediump vec2 sharedVaringName;
310e5c31af7Sopenharmony_ci				void main()
311e5c31af7Sopenharmony_ci				{
312e5c31af7Sopenharmony_ci					sharedVaringName = in0;
313e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
314e5c31af7Sopenharmony_ci				}
315e5c31af7Sopenharmony_ci			""
316e5c31af7Sopenharmony_ci			tessellation_control ""
317e5c31af7Sopenharmony_ci				#version 450
318e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
319e5c31af7Sopenharmony_ci				in mediump vec2 sharedVaringName[];
320e5c31af7Sopenharmony_ci				out mediump float tc_out[];
321e5c31af7Sopenharmony_ci				void main()
322e5c31af7Sopenharmony_ci				{
323e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = 2.0 * sharedVaringName[gl_InvocationID].x - sharedVaringName[gl_InvocationID].y;
324e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
325e5c31af7Sopenharmony_ci				}
326e5c31af7Sopenharmony_ci			""
327e5c31af7Sopenharmony_ci			tessellation_evaluation ""
328e5c31af7Sopenharmony_ci				#version 450
329e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
330e5c31af7Sopenharmony_ci				in mediump float tc_out[];
331e5c31af7Sopenharmony_ci				out mediump float sharedVaringName;
332e5c31af7Sopenharmony_ci				void main()
333e5c31af7Sopenharmony_ci				{
334e5c31af7Sopenharmony_ci					sharedVaringName = tc_out[2];
335e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
336e5c31af7Sopenharmony_ci				}
337e5c31af7Sopenharmony_ci			""
338e5c31af7Sopenharmony_ci			geometry ""
339e5c31af7Sopenharmony_ci				#version 450
340e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
341e5c31af7Sopenharmony_ci				in mediump float sharedVaringName[];
342e5c31af7Sopenharmony_ci				out mediump float geo_out;
343e5c31af7Sopenharmony_ci				void main()
344e5c31af7Sopenharmony_ci				{
345e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
346e5c31af7Sopenharmony_ci					{
347e5c31af7Sopenharmony_ci						geo_out = sharedVaringName[ndx];
348e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
349e5c31af7Sopenharmony_ci						EmitVertex();
350e5c31af7Sopenharmony_ci					}
351e5c31af7Sopenharmony_ci				}
352e5c31af7Sopenharmony_ci			""
353e5c31af7Sopenharmony_ci			fragment ""
354e5c31af7Sopenharmony_ci				#version 450
355e5c31af7Sopenharmony_ci				precision mediump float;
356e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
357e5c31af7Sopenharmony_ci				in mediump float geo_out;
358e5c31af7Sopenharmony_ci				void main()
359e5c31af7Sopenharmony_ci				{
360e5c31af7Sopenharmony_ci					out0 = geo_out;
361e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
362e5c31af7Sopenharmony_ci				}
363e5c31af7Sopenharmony_ci			""
364e5c31af7Sopenharmony_ci		end
365e5c31af7Sopenharmony_ci
366e5c31af7Sopenharmony_ci		case io_block
367e5c31af7Sopenharmony_ci			version 450
368e5c31af7Sopenharmony_ci			desc "Use of io block between tessellation and geometry shaders"
369e5c31af7Sopenharmony_ci			values
370e5c31af7Sopenharmony_ci			{
371e5c31af7Sopenharmony_ci				input float in0 = 1.0;
372e5c31af7Sopenharmony_ci				output float out0 = 1.0;
373e5c31af7Sopenharmony_ci			}
374e5c31af7Sopenharmony_ci			vertex ""
375e5c31af7Sopenharmony_ci				#version 450
376e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
377e5c31af7Sopenharmony_ci				out mediump float vtx_out;
378e5c31af7Sopenharmony_ci				void main()
379e5c31af7Sopenharmony_ci				{
380e5c31af7Sopenharmony_ci					vtx_out = in0;
381e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
382e5c31af7Sopenharmony_ci				}
383e5c31af7Sopenharmony_ci			""
384e5c31af7Sopenharmony_ci			tessellation_control ""
385e5c31af7Sopenharmony_ci				#version 450
386e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
387e5c31af7Sopenharmony_ci				in mediump float vtx_out[];
388e5c31af7Sopenharmony_ci				out mediump float tc_out[];
389e5c31af7Sopenharmony_ci				void main()
390e5c31af7Sopenharmony_ci				{
391e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
392e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
393e5c31af7Sopenharmony_ci				}
394e5c31af7Sopenharmony_ci			""
395e5c31af7Sopenharmony_ci			tessellation_evaluation ""
396e5c31af7Sopenharmony_ci				#version 450
397e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
398e5c31af7Sopenharmony_ci				in mediump float tc_out[];
399e5c31af7Sopenharmony_ci				out IOBlockName { mediump float val; } instanceName;
400e5c31af7Sopenharmony_ci				void main()
401e5c31af7Sopenharmony_ci				{
402e5c31af7Sopenharmony_ci					instanceName.val = tc_out[2];
403e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
404e5c31af7Sopenharmony_ci				}
405e5c31af7Sopenharmony_ci			""
406e5c31af7Sopenharmony_ci			geometry ""
407e5c31af7Sopenharmony_ci				#version 450
408e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
409e5c31af7Sopenharmony_ci				in IOBlockName { mediump float val; } instanceName[];
410e5c31af7Sopenharmony_ci				out mediump float geo_out;
411e5c31af7Sopenharmony_ci				void main()
412e5c31af7Sopenharmony_ci				{
413e5c31af7Sopenharmony_ci					geo_out = instanceName[0].val;
414e5c31af7Sopenharmony_ci					gl_Position = gl_in[0].gl_Position;
415e5c31af7Sopenharmony_ci					EmitVertex();
416e5c31af7Sopenharmony_ci
417e5c31af7Sopenharmony_ci					geo_out = instanceName[1].val;
418e5c31af7Sopenharmony_ci					gl_Position = gl_in[1].gl_Position;
419e5c31af7Sopenharmony_ci					EmitVertex();
420e5c31af7Sopenharmony_ci
421e5c31af7Sopenharmony_ci					geo_out = instanceName[2].val;
422e5c31af7Sopenharmony_ci					gl_Position = gl_in[2].gl_Position;
423e5c31af7Sopenharmony_ci					EmitVertex();
424e5c31af7Sopenharmony_ci				}
425e5c31af7Sopenharmony_ci			""
426e5c31af7Sopenharmony_ci			fragment ""
427e5c31af7Sopenharmony_ci				#version 450
428e5c31af7Sopenharmony_ci				precision mediump float;
429e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
430e5c31af7Sopenharmony_ci				in mediump float geo_out;
431e5c31af7Sopenharmony_ci				void main()
432e5c31af7Sopenharmony_ci				{
433e5c31af7Sopenharmony_ci					out0 = geo_out;
434e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
435e5c31af7Sopenharmony_ci				}
436e5c31af7Sopenharmony_ci			""
437e5c31af7Sopenharmony_ci		end
438e5c31af7Sopenharmony_ci
439e5c31af7Sopenharmony_ci		case array_in_io_block
440e5c31af7Sopenharmony_ci			version 450
441e5c31af7Sopenharmony_ci			desc "Float array in a io block between tessellation and geometry shaders"
442e5c31af7Sopenharmony_ci			values
443e5c31af7Sopenharmony_ci			{
444e5c31af7Sopenharmony_ci				input float in0 = 1.0;
445e5c31af7Sopenharmony_ci				output float out0 = 1.0;
446e5c31af7Sopenharmony_ci			}
447e5c31af7Sopenharmony_ci			vertex ""
448e5c31af7Sopenharmony_ci				#version 450
449e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
450e5c31af7Sopenharmony_ci				out mediump float vtx_out;
451e5c31af7Sopenharmony_ci				void main()
452e5c31af7Sopenharmony_ci				{
453e5c31af7Sopenharmony_ci					vtx_out = in0;
454e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
455e5c31af7Sopenharmony_ci				}
456e5c31af7Sopenharmony_ci			""
457e5c31af7Sopenharmony_ci			tessellation_control ""
458e5c31af7Sopenharmony_ci				#version 450
459e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
460e5c31af7Sopenharmony_ci				in mediump float vtx_out[];
461e5c31af7Sopenharmony_ci				out mediump float tc_out[];
462e5c31af7Sopenharmony_ci				void main()
463e5c31af7Sopenharmony_ci				{
464e5c31af7Sopenharmony_ci					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
465e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
466e5c31af7Sopenharmony_ci				}
467e5c31af7Sopenharmony_ci			""
468e5c31af7Sopenharmony_ci			tessellation_evaluation ""
469e5c31af7Sopenharmony_ci				#version 450
470e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
471e5c31af7Sopenharmony_ci				in mediump float tc_out[];
472e5c31af7Sopenharmony_ci				out IOBlockName { mediump float val[2]; } instanceName;
473e5c31af7Sopenharmony_ci				void main()
474e5c31af7Sopenharmony_ci				{
475e5c31af7Sopenharmony_ci					instanceName.val[0] = tc_out[2] + 1.0;
476e5c31af7Sopenharmony_ci					instanceName.val[1] = -1.0;
477e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
478e5c31af7Sopenharmony_ci				}
479e5c31af7Sopenharmony_ci			""
480e5c31af7Sopenharmony_ci			geometry ""
481e5c31af7Sopenharmony_ci				#version 450
482e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
483e5c31af7Sopenharmony_ci				in IOBlockName { mediump float val[2]; } instanceName[];
484e5c31af7Sopenharmony_ci				out mediump float geo_out;
485e5c31af7Sopenharmony_ci				void main()
486e5c31af7Sopenharmony_ci				{
487e5c31af7Sopenharmony_ci					geo_out = instanceName[0].val[0] + instanceName[0].val[1];
488e5c31af7Sopenharmony_ci					gl_Position = gl_in[0].gl_Position;
489e5c31af7Sopenharmony_ci					EmitVertex();
490e5c31af7Sopenharmony_ci
491e5c31af7Sopenharmony_ci					geo_out = instanceName[1].val[0] + instanceName[1].val[1];
492e5c31af7Sopenharmony_ci					gl_Position = gl_in[1].gl_Position;
493e5c31af7Sopenharmony_ci					EmitVertex();
494e5c31af7Sopenharmony_ci
495e5c31af7Sopenharmony_ci					geo_out = instanceName[2].val[0] + instanceName[2].val[1];
496e5c31af7Sopenharmony_ci					gl_Position = gl_in[2].gl_Position;
497e5c31af7Sopenharmony_ci					EmitVertex();
498e5c31af7Sopenharmony_ci				}
499e5c31af7Sopenharmony_ci			""
500e5c31af7Sopenharmony_ci			fragment ""
501e5c31af7Sopenharmony_ci				#version 450
502e5c31af7Sopenharmony_ci				precision mediump float;
503e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
504e5c31af7Sopenharmony_ci				in mediump float geo_out;
505e5c31af7Sopenharmony_ci				void main()
506e5c31af7Sopenharmony_ci				{
507e5c31af7Sopenharmony_ci					out0 = geo_out;
508e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
509e5c31af7Sopenharmony_ci				}
510e5c31af7Sopenharmony_ci			""
511e5c31af7Sopenharmony_ci		end
512e5c31af7Sopenharmony_ci	end
513e5c31af7Sopenharmony_ci
514e5c31af7Sopenharmony_ci	import "linkage_tessellation_geometry_varying_types.test"
515e5c31af7Sopenharmony_ciend
516e5c31af7Sopenharmony_ci
517e5c31af7Sopenharmony_cigroup uniform "Uniform linkage"
518e5c31af7Sopenharmony_ci	group rules "Rules"
519e5c31af7Sopenharmony_ci		case type_mismatch_1
520e5c31af7Sopenharmony_ci			version 450
521e5c31af7Sopenharmony_ci			desc "Uniform type mismatch"
522e5c31af7Sopenharmony_ci			expect link_fail
523e5c31af7Sopenharmony_ci			vertex ""
524e5c31af7Sopenharmony_ci				#version 450
525e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
526e5c31af7Sopenharmony_ci				void main()
527e5c31af7Sopenharmony_ci				{
528e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
529e5c31af7Sopenharmony_ci				}
530e5c31af7Sopenharmony_ci			""
531e5c31af7Sopenharmony_ci			tessellation_control ""
532e5c31af7Sopenharmony_ci				#version 450
533e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
534e5c31af7Sopenharmony_ci				void main()
535e5c31af7Sopenharmony_ci				{
536e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
537e5c31af7Sopenharmony_ci				}
538e5c31af7Sopenharmony_ci			""
539e5c31af7Sopenharmony_ci			tessellation_evaluation ""
540e5c31af7Sopenharmony_ci				#version 450
541e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
542e5c31af7Sopenharmony_ci				uniform mediump float u_value;
543e5c31af7Sopenharmony_ci				out mediump float te_out;
544e5c31af7Sopenharmony_ci				void main()
545e5c31af7Sopenharmony_ci				{
546e5c31af7Sopenharmony_ci					te_out = u_value;
547e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
548e5c31af7Sopenharmony_ci				}
549e5c31af7Sopenharmony_ci			""
550e5c31af7Sopenharmony_ci			geometry ""
551e5c31af7Sopenharmony_ci				#version 450
552e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
553e5c31af7Sopenharmony_ci				uniform mediump vec2 u_value;
554e5c31af7Sopenharmony_ci				in mediump float te_out[];
555e5c31af7Sopenharmony_ci				out mediump float geo_out;
556e5c31af7Sopenharmony_ci				void main()
557e5c31af7Sopenharmony_ci				{
558e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
559e5c31af7Sopenharmony_ci					{
560e5c31af7Sopenharmony_ci						geo_out = te_out[ndx] + u_value.y;
561e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
562e5c31af7Sopenharmony_ci						EmitVertex();
563e5c31af7Sopenharmony_ci					}
564e5c31af7Sopenharmony_ci				}
565e5c31af7Sopenharmony_ci			""
566e5c31af7Sopenharmony_ci			fragment ""
567e5c31af7Sopenharmony_ci				#version 450
568e5c31af7Sopenharmony_ci				precision mediump float;
569e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
570e5c31af7Sopenharmony_ci				in mediump float geo_out;
571e5c31af7Sopenharmony_ci				void main()
572e5c31af7Sopenharmony_ci				{
573e5c31af7Sopenharmony_ci					${FRAG_COLOR} = vec4(geo_out);
574e5c31af7Sopenharmony_ci				}
575e5c31af7Sopenharmony_ci			""
576e5c31af7Sopenharmony_ci		end
577e5c31af7Sopenharmony_ci
578e5c31af7Sopenharmony_ci		case struct_partial_usage
579e5c31af7Sopenharmony_ci			version 450
580e5c31af7Sopenharmony_ci			desc "Uniform precision mismatch"
581e5c31af7Sopenharmony_ci			values
582e5c31af7Sopenharmony_ci			{
583e5c31af7Sopenharmony_ci				uniform float u_value.teVal = 1.0;
584e5c31af7Sopenharmony_ci				uniform float u_value.geoVal = 2.0;
585e5c31af7Sopenharmony_ci				output float out0 = 5.0;
586e5c31af7Sopenharmony_ci			}
587e5c31af7Sopenharmony_ci			vertex ""
588e5c31af7Sopenharmony_ci				#version 450
589e5c31af7Sopenharmony_ci				${VERTEX_DECLARATIONS}
590e5c31af7Sopenharmony_ci				void main()
591e5c31af7Sopenharmony_ci				{
592e5c31af7Sopenharmony_ci					${VERTEX_OUTPUT}
593e5c31af7Sopenharmony_ci				}
594e5c31af7Sopenharmony_ci			""
595e5c31af7Sopenharmony_ci			tessellation_control ""
596e5c31af7Sopenharmony_ci				#version 450
597e5c31af7Sopenharmony_ci				${TESSELLATION_CONTROL_DECLARATIONS}
598e5c31af7Sopenharmony_ci				void main()
599e5c31af7Sopenharmony_ci				{
600e5c31af7Sopenharmony_ci					${TESSELLATION_CONTROL_OUTPUT}
601e5c31af7Sopenharmony_ci				}
602e5c31af7Sopenharmony_ci			""
603e5c31af7Sopenharmony_ci			tessellation_evaluation ""
604e5c31af7Sopenharmony_ci				#version 450
605e5c31af7Sopenharmony_ci				${TESSELLATION_EVALUATION_DECLARATIONS}
606e5c31af7Sopenharmony_ci				struct S
607e5c31af7Sopenharmony_ci				{
608e5c31af7Sopenharmony_ci					mediump float teVal;
609e5c31af7Sopenharmony_ci					mediump float geoVal;
610e5c31af7Sopenharmony_ci				};
611e5c31af7Sopenharmony_ci				uniform S u_value;
612e5c31af7Sopenharmony_ci				out mediump float te_out;
613e5c31af7Sopenharmony_ci				void main()
614e5c31af7Sopenharmony_ci				{
615e5c31af7Sopenharmony_ci					te_out = u_value.teVal;
616e5c31af7Sopenharmony_ci					${TESSELLATION_EVALUATION_OUTPUT}
617e5c31af7Sopenharmony_ci				}
618e5c31af7Sopenharmony_ci			""
619e5c31af7Sopenharmony_ci			geometry ""
620e5c31af7Sopenharmony_ci				#version 450
621e5c31af7Sopenharmony_ci				${GEOMETRY_DECLARATIONS}
622e5c31af7Sopenharmony_ci				struct S
623e5c31af7Sopenharmony_ci				{
624e5c31af7Sopenharmony_ci					mediump float teVal;
625e5c31af7Sopenharmony_ci					mediump float geoVal;
626e5c31af7Sopenharmony_ci				};
627e5c31af7Sopenharmony_ci				uniform S u_value;
628e5c31af7Sopenharmony_ci				in mediump float te_out[];
629e5c31af7Sopenharmony_ci				out mediump float geo_out;
630e5c31af7Sopenharmony_ci				void main()
631e5c31af7Sopenharmony_ci				{
632e5c31af7Sopenharmony_ci					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
633e5c31af7Sopenharmony_ci					{
634e5c31af7Sopenharmony_ci						geo_out = te_out[ndx] + 2.0 * u_value.geoVal;
635e5c31af7Sopenharmony_ci						gl_Position = gl_in[ndx].gl_Position;
636e5c31af7Sopenharmony_ci						EmitVertex();
637e5c31af7Sopenharmony_ci					}
638e5c31af7Sopenharmony_ci				}
639e5c31af7Sopenharmony_ci			""
640e5c31af7Sopenharmony_ci			fragment ""
641e5c31af7Sopenharmony_ci				#version 450
642e5c31af7Sopenharmony_ci				precision mediump float;
643e5c31af7Sopenharmony_ci				${FRAGMENT_DECLARATIONS}
644e5c31af7Sopenharmony_ci				in mediump float geo_out;
645e5c31af7Sopenharmony_ci				void main()
646e5c31af7Sopenharmony_ci				{
647e5c31af7Sopenharmony_ci					out0 = geo_out;
648e5c31af7Sopenharmony_ci					${FRAGMENT_OUTPUT}
649e5c31af7Sopenharmony_ci				}
650e5c31af7Sopenharmony_ci			""
651e5c31af7Sopenharmony_ci		end
652e5c31af7Sopenharmony_ci	end
653e5c31af7Sopenharmony_ciend
654