1e5c31af7Sopenharmony_ci# https://github.com/KhronosGroup/WebGL/blob/master/sdk/tests/conformance2/glsl3/vector-dynamic-indexing.html
2e5c31af7Sopenharmony_cigroup moredynamic "More dynamic indexing tests"
3e5c31af7Sopenharmony_ci
4e5c31af7Sopenharmony_ci	case matrix_twice
5e5c31af7Sopenharmony_ci		version 300 es
6e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
7e5c31af7Sopenharmony_ci		both ""
8e5c31af7Sopenharmony_ci			#version 300 es
9e5c31af7Sopenharmony_ci			precision mediump float;
10e5c31af7Sopenharmony_ci			${DECLARATIONS}
11e5c31af7Sopenharmony_ci
12e5c31af7Sopenharmony_ci			uniform int u_zero;
13e5c31af7Sopenharmony_ci			void main() {
14e5c31af7Sopenharmony_ci				mat2 m = mat2(0.0, 0.0, 0.0, 1.0);
15e5c31af7Sopenharmony_ci				f = m[u_zero + 1][u_zero + 1];
16e5c31af7Sopenharmony_ci				${OUTPUT}
17e5c31af7Sopenharmony_ci			}
18e5c31af7Sopenharmony_ci		""
19e5c31af7Sopenharmony_ci	end
20e5c31af7Sopenharmony_ci
21e5c31af7Sopenharmony_ci	case with_value_from_indexing_expression
22e5c31af7Sopenharmony_ci		version 300 es
23e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
24e5c31af7Sopenharmony_ci		both ""
25e5c31af7Sopenharmony_ci			#version 300 es
26e5c31af7Sopenharmony_ci			precision mediump float;
27e5c31af7Sopenharmony_ci			${DECLARATIONS}
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_ci			uniform int u_zero;
30e5c31af7Sopenharmony_ci			void main() {
31e5c31af7Sopenharmony_ci				ivec2 i = ivec2(0, 2);
32e5c31af7Sopenharmony_ci				vec4 v = vec4(0.0, 0.2, 1.0, 0.4);
33e5c31af7Sopenharmony_ci				f = v[i[u_zero + 1]];
34e5c31af7Sopenharmony_ci				${OUTPUT}
35e5c31af7Sopenharmony_ci			}
36e5c31af7Sopenharmony_ci		""
37e5c31af7Sopenharmony_ci	end
38e5c31af7Sopenharmony_ci
39e5c31af7Sopenharmony_ci	case lvalue
40e5c31af7Sopenharmony_ci		version 300 es
41e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
42e5c31af7Sopenharmony_ci		both ""
43e5c31af7Sopenharmony_ci			#version 300 es
44e5c31af7Sopenharmony_ci			precision mediump float;
45e5c31af7Sopenharmony_ci			${DECLARATIONS}
46e5c31af7Sopenharmony_ci
47e5c31af7Sopenharmony_ci			uniform int u_zero;
48e5c31af7Sopenharmony_ci			void main() {
49e5c31af7Sopenharmony_ci				vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
50e5c31af7Sopenharmony_ci				v[u_zero + 1] = 5.0;
51e5c31af7Sopenharmony_ci				vec4 expected = vec4(1.0, 5.0, 3.0, 4.0);
52e5c31af7Sopenharmony_ci				f = 1.0 - distance(v, expected);
53e5c31af7Sopenharmony_ci				${OUTPUT}
54e5c31af7Sopenharmony_ci			}
55e5c31af7Sopenharmony_ci		""
56e5c31af7Sopenharmony_ci	end
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci	case lvalue_with_value_from_indexing_expression
59e5c31af7Sopenharmony_ci		version 300 es
60e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
61e5c31af7Sopenharmony_ci		both ""
62e5c31af7Sopenharmony_ci			#version 300 es
63e5c31af7Sopenharmony_ci			precision mediump float;
64e5c31af7Sopenharmony_ci			${DECLARATIONS}
65e5c31af7Sopenharmony_ci
66e5c31af7Sopenharmony_ci			uniform int u_zero;
67e5c31af7Sopenharmony_ci			void main() {
68e5c31af7Sopenharmony_ci				ivec2 i = ivec2(0, 2);
69e5c31af7Sopenharmony_ci				vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
70e5c31af7Sopenharmony_ci				v[i[u_zero + 1]] = 5.0;
71e5c31af7Sopenharmony_ci				vec4 expected = vec4(1.0, 2.0, 5.0, 4.0);
72e5c31af7Sopenharmony_ci				f = 1.0 - distance(v, expected);
73e5c31af7Sopenharmony_ci				${OUTPUT}
74e5c31af7Sopenharmony_ci			}
75e5c31af7Sopenharmony_ci		""
76e5c31af7Sopenharmony_ci	end
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_ci	case builtin_fncall_out_parameter
79e5c31af7Sopenharmony_ci		version 300 es
80e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
81e5c31af7Sopenharmony_ci		both ""
82e5c31af7Sopenharmony_ci			#version 300 es
83e5c31af7Sopenharmony_ci			precision mediump float;
84e5c31af7Sopenharmony_ci			${DECLARATIONS}
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_ci			uniform int u_zero;
87e5c31af7Sopenharmony_ci			void main() {
88e5c31af7Sopenharmony_ci				vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
89e5c31af7Sopenharmony_ci				modf(5.5, v[u_zero + 3]);
90e5c31af7Sopenharmony_ci				vec4 expected = vec4(1.0, 2.0, 3.0, 5.0);
91e5c31af7Sopenharmony_ci				f = 1.0 - distance(v, expected);
92e5c31af7Sopenharmony_ci				${OUTPUT}
93e5c31af7Sopenharmony_ci			}
94e5c31af7Sopenharmony_ci		""
95e5c31af7Sopenharmony_ci	end
96e5c31af7Sopenharmony_ci
97e5c31af7Sopenharmony_ci	case user_defined_fncall_out_parameter
98e5c31af7Sopenharmony_ci		version 300 es
99e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
100e5c31af7Sopenharmony_ci		both ""
101e5c31af7Sopenharmony_ci			#version 300 es
102e5c31af7Sopenharmony_ci			precision mediump float;
103e5c31af7Sopenharmony_ci			${DECLARATIONS}
104e5c31af7Sopenharmony_ci
105e5c31af7Sopenharmony_ci			uniform int u_zero;
106e5c31af7Sopenharmony_ci			void foo(out float f) {
107e5c31af7Sopenharmony_ci				modf(5.5, f);
108e5c31af7Sopenharmony_ci			}
109e5c31af7Sopenharmony_ci			void main() {
110e5c31af7Sopenharmony_ci				vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
111e5c31af7Sopenharmony_ci				foo(v[u_zero + 3]);
112e5c31af7Sopenharmony_ci				vec4 expected = vec4(1.0, 2.0, 3.0, 5.0);
113e5c31af7Sopenharmony_ci				f = 1.0 - distance(v, expected);
114e5c31af7Sopenharmony_ci				${OUTPUT}
115e5c31af7Sopenharmony_ci			}
116e5c31af7Sopenharmony_ci		""
117e5c31af7Sopenharmony_ci	end
118e5c31af7Sopenharmony_ci
119e5c31af7Sopenharmony_ci	case user_defined_fncall_inout_parameter
120e5c31af7Sopenharmony_ci		version 300 es
121e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
122e5c31af7Sopenharmony_ci		both ""
123e5c31af7Sopenharmony_ci			#version 300 es
124e5c31af7Sopenharmony_ci			precision mediump float;
125e5c31af7Sopenharmony_ci			${DECLARATIONS}
126e5c31af7Sopenharmony_ci
127e5c31af7Sopenharmony_ci			uniform int u_zero;
128e5c31af7Sopenharmony_ci			void foo(inout float f) {
129e5c31af7Sopenharmony_ci				float g = f + 2.5;
130e5c31af7Sopenharmony_ci				modf(g, f);
131e5c31af7Sopenharmony_ci			}
132e5c31af7Sopenharmony_ci			void main() {
133e5c31af7Sopenharmony_ci				vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
134e5c31af7Sopenharmony_ci				foo(v[u_zero + 2]);
135e5c31af7Sopenharmony_ci				vec4 expected = vec4(1.0, 2.0, 5.0, 4.0);
136e5c31af7Sopenharmony_ci				f = 1.0 - distance(v, expected);
137e5c31af7Sopenharmony_ci				${OUTPUT}
138e5c31af7Sopenharmony_ci			}
139e5c31af7Sopenharmony_ci		""
140e5c31af7Sopenharmony_ci	end
141e5c31af7Sopenharmony_ci
142e5c31af7Sopenharmony_ci	case with_side_effects
143e5c31af7Sopenharmony_ci		version 300 es
144e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
145e5c31af7Sopenharmony_ci		both ""
146e5c31af7Sopenharmony_ci			#version 300 es
147e5c31af7Sopenharmony_ci			precision mediump float;
148e5c31af7Sopenharmony_ci			${DECLARATIONS}
149e5c31af7Sopenharmony_ci
150e5c31af7Sopenharmony_ci			uniform int u_zero;
151e5c31af7Sopenharmony_ci			int sideEffectCounter = 0;
152e5c31af7Sopenharmony_ci			int funcWithSideEffects() {
153e5c31af7Sopenharmony_ci				sideEffectCounter++;
154e5c31af7Sopenharmony_ci				return 2;
155e5c31af7Sopenharmony_ci			}
156e5c31af7Sopenharmony_ci			void main() {
157e5c31af7Sopenharmony_ci				vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
158e5c31af7Sopenharmony_ci				v[funcWithSideEffects()] = 5.0;
159e5c31af7Sopenharmony_ci				vec4 expected = vec4(1.0, 2.0, 5.0, 4.0);
160e5c31af7Sopenharmony_ci				f = 1.0 - distance(v, expected);
161e5c31af7Sopenharmony_ci				if (sideEffectCounter != 1) {
162e5c31af7Sopenharmony_ci					f = 0.0;
163e5c31af7Sopenharmony_ci				}
164e5c31af7Sopenharmony_ci				${OUTPUT}
165e5c31af7Sopenharmony_ci			}
166e5c31af7Sopenharmony_ci		""
167e5c31af7Sopenharmony_ci	end
168e5c31af7Sopenharmony_ci
169e5c31af7Sopenharmony_ci	case inout_with_side_effects
170e5c31af7Sopenharmony_ci		version 300 es
171e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
172e5c31af7Sopenharmony_ci		both ""
173e5c31af7Sopenharmony_ci			#version 300 es
174e5c31af7Sopenharmony_ci			precision mediump float;
175e5c31af7Sopenharmony_ci			${DECLARATIONS}
176e5c31af7Sopenharmony_ci
177e5c31af7Sopenharmony_ci			uniform int u_zero;
178e5c31af7Sopenharmony_ci			int sideEffectCounter = 0;
179e5c31af7Sopenharmony_ci			int funcWithSideEffects() {
180e5c31af7Sopenharmony_ci				sideEffectCounter++;
181e5c31af7Sopenharmony_ci				return 2;
182e5c31af7Sopenharmony_ci			}
183e5c31af7Sopenharmony_ci			void main() {
184e5c31af7Sopenharmony_ci				vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
185e5c31af7Sopenharmony_ci				v[funcWithSideEffects()]++;
186e5c31af7Sopenharmony_ci				vec4 expected = vec4(1.0, 2.0, 4.0, 4.0);
187e5c31af7Sopenharmony_ci				f = 1.0 - distance(v, expected);
188e5c31af7Sopenharmony_ci				if (sideEffectCounter != 1) {
189e5c31af7Sopenharmony_ci					f = 0.0;
190e5c31af7Sopenharmony_ci				}
191e5c31af7Sopenharmony_ci				${OUTPUT}
192e5c31af7Sopenharmony_ci			}
193e5c31af7Sopenharmony_ci		""
194e5c31af7Sopenharmony_ci	end
195e5c31af7Sopenharmony_ci
196e5c31af7Sopenharmony_ci	case user_defined_fncall_inout_parameter_with_index_with_side_effects
197e5c31af7Sopenharmony_ci		version 300 es
198e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
199e5c31af7Sopenharmony_ci		both ""
200e5c31af7Sopenharmony_ci			#version 300 es
201e5c31af7Sopenharmony_ci			precision mediump float;
202e5c31af7Sopenharmony_ci			${DECLARATIONS}
203e5c31af7Sopenharmony_ci
204e5c31af7Sopenharmony_ci			uniform int u_zero;
205e5c31af7Sopenharmony_ci			int sideEffectCounter = 0;
206e5c31af7Sopenharmony_ci			void foo(inout float f) {
207e5c31af7Sopenharmony_ci				float g = f + 2.5;
208e5c31af7Sopenharmony_ci				modf(g, f);
209e5c31af7Sopenharmony_ci			}
210e5c31af7Sopenharmony_ci			int funcWithSideEffects() {
211e5c31af7Sopenharmony_ci				sideEffectCounter++;
212e5c31af7Sopenharmony_ci				return 2;
213e5c31af7Sopenharmony_ci			}
214e5c31af7Sopenharmony_ci			void main() {
215e5c31af7Sopenharmony_ci				vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
216e5c31af7Sopenharmony_ci				foo(v[funcWithSideEffects()]);
217e5c31af7Sopenharmony_ci				vec4 expected = vec4(1.0, 2.0, 5.0, 4.0);
218e5c31af7Sopenharmony_ci				f = 1.0 - distance(v, expected);
219e5c31af7Sopenharmony_ci				if (sideEffectCounter != 1) {
220e5c31af7Sopenharmony_ci					f = 0.0;
221e5c31af7Sopenharmony_ci				}
222e5c31af7Sopenharmony_ci				${OUTPUT}
223e5c31af7Sopenharmony_ci			}
224e5c31af7Sopenharmony_ci		""
225e5c31af7Sopenharmony_ci	end
226e5c31af7Sopenharmony_ci
227e5c31af7Sopenharmony_ci	case lvalue_with_uint
228e5c31af7Sopenharmony_ci		version 300 es
229e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
230e5c31af7Sopenharmony_ci		both ""
231e5c31af7Sopenharmony_ci			#version 300 es
232e5c31af7Sopenharmony_ci			precision mediump float;
233e5c31af7Sopenharmony_ci			${DECLARATIONS}
234e5c31af7Sopenharmony_ci
235e5c31af7Sopenharmony_ci			uniform int u_zero;
236e5c31af7Sopenharmony_ci			void main() {
237e5c31af7Sopenharmony_ci				vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
238e5c31af7Sopenharmony_ci				v[u_zero] = 5.0;
239e5c31af7Sopenharmony_ci				vec4 expected = vec4(5.0, 2.0, 3.0, 4.0);
240e5c31af7Sopenharmony_ci				f = 1.0 - distance(v, expected);
241e5c31af7Sopenharmony_ci				${OUTPUT}
242e5c31af7Sopenharmony_ci			}
243e5c31af7Sopenharmony_ci		""
244e5c31af7Sopenharmony_ci	end
245e5c31af7Sopenharmony_ci
246e5c31af7Sopenharmony_ci	case uniform
247e5c31af7Sopenharmony_ci		version 300 es
248e5c31af7Sopenharmony_ci		values { output float f = 0.0; }
249e5c31af7Sopenharmony_ci		both ""
250e5c31af7Sopenharmony_ci			#version 300 es
251e5c31af7Sopenharmony_ci			precision mediump float;
252e5c31af7Sopenharmony_ci			${DECLARATIONS}
253e5c31af7Sopenharmony_ci
254e5c31af7Sopenharmony_ci			uniform vec4 u_zeroVec;
255e5c31af7Sopenharmony_ci			uniform int u_zero;
256e5c31af7Sopenharmony_ci			void main() {
257e5c31af7Sopenharmony_ci				f = u_zeroVec[u_zero];
258e5c31af7Sopenharmony_ci				${OUTPUT}
259e5c31af7Sopenharmony_ci			}
260e5c31af7Sopenharmony_ci		""
261e5c31af7Sopenharmony_ci	end
262e5c31af7Sopenharmony_ci
263e5c31af7Sopenharmony_ci	case sequence_vector_lvalue
264e5c31af7Sopenharmony_ci		version 300 es
265e5c31af7Sopenharmony_ci		values { output bool success = true; }
266e5c31af7Sopenharmony_ci		both ""
267e5c31af7Sopenharmony_ci			#version 300 es
268e5c31af7Sopenharmony_ci			precision mediump float;
269e5c31af7Sopenharmony_ci			${DECLARATIONS}
270e5c31af7Sopenharmony_ci
271e5c31af7Sopenharmony_ci			uniform int u_zero;
272e5c31af7Sopenharmony_ci			int sideEffectCounter = 0;
273e5c31af7Sopenharmony_ci			float func() {
274e5c31af7Sopenharmony_ci				++sideEffectCounter;
275e5c31af7Sopenharmony_ci				return -1.0;
276e5c31af7Sopenharmony_ci			}
277e5c31af7Sopenharmony_ci			void main() {
278e5c31af7Sopenharmony_ci				vec4 v = vec4(0.0, 2.0, 4.0, 6.0);
279e5c31af7Sopenharmony_ci				float f = (func(), (++v[u_zero + sideEffectCounter]));
280e5c31af7Sopenharmony_ci				success = (abs(f - 3.0) < 0.01 && abs(v[1] - 3.0) < 0.01 && sideEffectCounter == 1);
281e5c31af7Sopenharmony_ci				${OUTPUT}
282e5c31af7Sopenharmony_ci			}
283e5c31af7Sopenharmony_ci		""
284e5c31af7Sopenharmony_ci	end
285e5c31af7Sopenharmony_ci
286e5c31af7Sopenharmony_ci	case matrix_twice_in_lvalue
287e5c31af7Sopenharmony_ci		version 300 es
288e5c31af7Sopenharmony_ci		values { output float f = 1.0; }
289e5c31af7Sopenharmony_ci		both ""
290e5c31af7Sopenharmony_ci			#version 300 es
291e5c31af7Sopenharmony_ci			precision mediump float;
292e5c31af7Sopenharmony_ci			${DECLARATIONS}
293e5c31af7Sopenharmony_ci
294e5c31af7Sopenharmony_ci			uniform int u_zero;
295e5c31af7Sopenharmony_ci			void main() {
296e5c31af7Sopenharmony_ci				mat2 m = mat2(0.0, 0.0, 0.0, 0.0);
297e5c31af7Sopenharmony_ci				m[u_zero + 1][u_zero + 1] = float(u_zero + 1);
298e5c31af7Sopenharmony_ci				f = m[1][1];
299e5c31af7Sopenharmony_ci				${OUTPUT}
300e5c31af7Sopenharmony_ci			}
301e5c31af7Sopenharmony_ci		""
302e5c31af7Sopenharmony_ci	end
303e5c31af7Sopenharmony_ci
304e5c31af7Sopenharmony_ciend # moredynamic
305