1group if "If Statements"
2
3	case single_statement
4		version 300 es
5		values
6		{
7			input float in0 = [ 0.0 | 1.0 | 2.0 ];
8			output float out0 = [ 0.0 | 1.0 | 1.0 ];
9		}
10
11		both ""
12			#version 300 es
13			precision mediump float;
14			${DECLARATIONS}
15			void main()
16			{
17				out0 = 0.0;
18				if (in0 >= 1.0)
19					out0 = 1.0;
20				${OUTPUT}
21			}
22		""
23	end
24
25	case compound_statement
26		version 300 es
27		values
28		{
29			input float in0 = [ 0.0 | 1.0 | 2.0 ];
30			output float out0 = [ 0.0 | 1.0 | 1.0 ];
31			output float out1 = [ 1.0 | 0.0 | 0.0 ];
32		}
33
34		both ""
35			#version 300 es
36			precision mediump float;
37			${DECLARATIONS}
38			void main()
39			{
40				out0 = 0.0;
41				out1 = 1.0;
42				if (in0 >= 1.0)
43				{
44					out0 = 1.0;
45					out1 = 0.0;
46				}
47				${OUTPUT}
48			}
49		""
50	end
51
52	case sequence_statements
53		version 300 es
54		values
55		{
56			input float in0 = [ 0.0 | 1.0 | 2.0 ];
57			output float out0 = [ 0.0 | 1.0 | 1.0 ];
58			output float out1 = [ 1.0 | 0.0 | 0.0 ];
59		}
60
61		both ""
62			#version 300 es
63			precision mediump float;
64			${DECLARATIONS}
65			void main()
66			{
67				out0 = 0.0;
68				out1 = 1.0;
69				if (in0 >= 1.0)
70					out0 = 1.0, out1 = 0.0;
71				${OUTPUT}
72			}
73		""
74	end
75
76	case sequence_condition
77		version 300 es
78		values
79		{
80			input float in0 = [ 0.0 | 1.0 | 2.0 ];
81			output float out0 = [ 0.0 | 1.0 | 1.0 ];
82			output float out1 = [ 1.0 | 0.0 | 0.0 ];
83		}
84
85		both ""
86			#version 300 es
87			precision mediump float;
88			${DECLARATIONS}
89			void main()
90			{
91				out0 = 0.0;
92				out1 = 1.0;
93				if (false, in0 >= 1.0)
94					out0 = 1.0, out1 = 0.0;
95				${OUTPUT}
96			}
97		""
98	end
99
100	case complex_condition
101		version 300 es
102		values
103		{
104			input float in0 = [ 0.0 | 1.0 | 2.0 ];
105			output float out0 = [ 0.0 | 1.0 | 1.0 ];
106			output float out1 = [ 1.0 | 0.0 | 0.0 ];
107		}
108
109		both ""
110			#version 300 es
111			precision mediump float;
112			${DECLARATIONS}
113			void main()
114			{
115				out0 = 0.0;
116				out1 = 1.0;
117				if (false || (in0 >= 1.0) && (in0 - 2.0*in0 < 0.0))
118					out0 = 1.0, out1 = 0.0;
119				${OUTPUT}
120			}
121		""
122	end
123
124	case if_else
125		version 300 es
126		values
127		{
128			input float in0 = [ 0.0 | 1.0 | 2.0 ];
129			output float out0 = [ 0.0 | 1.0 | 1.0 ];
130		}
131
132		both ""
133			#version 300 es
134			precision mediump float;
135			${DECLARATIONS}
136			void main()
137			{
138				if (in0 >= 1.0)
139					out0 = 1.0;
140				else
141					out0 = 0.0;
142				${OUTPUT}
143			}
144		""
145	end
146
147	case if_elseif
148		version 300 es
149		values
150		{
151			input float in0 = [ 0.0 | 1.0 | 2.0 ];
152			output float out0 = [ 0.0 | 1.0 | 2.0 ];
153		}
154
155		both ""
156			#version 300 es
157			precision mediump float;
158			${DECLARATIONS}
159			void main()
160			{
161				out0 = 0.0;
162				if (in0 >= 2.0)
163					out0 = 2.0;
164				else if (in0 >= 1.0)
165					out0 = 1.0;
166				${OUTPUT}
167			}
168		""
169	end
170
171	case if_elseif_else
172		version 300 es
173		values
174		{
175			input float in0 = [ 0.0 | 1.0 | 2.0 ];
176			output float out0 = [ 0.0 | 1.0 | 2.0 ];
177		}
178
179		both ""
180			#version 300 es
181			precision mediump float;
182			${DECLARATIONS}
183			void main()
184			{
185				if (in0 >= 2.0)
186					out0 = 2.0;
187				else if (in0 >= 1.0)
188					out0 = 1.0;
189				else
190					out0 = 0.0;
191				${OUTPUT}
192			}
193		""
194	end
195
196	case mixed_if_elseif_else
197		version 300 es
198		values
199		{
200			input float in0 = [ 0.0 | 1.0 | 2.0 ];
201			output float out0 = [ 0.0 | 1.0 | 2.0 ];
202		}
203
204		both ""
205			#version 300 es
206			precision mediump float;
207			${DECLARATIONS}
208			void main()
209			{
210				if (in0 >= 2.0)
211				{
212					out0 = 2.0;
213				}
214				else if (in0 >= 1.0)
215					out0 = 2.0, out0 = 1.0;
216				else
217					out0 = 0.0;
218				${OUTPUT}
219			}
220		""
221	end
222
223	case constant_conditional_assignment_to_matrix
224		version 300 es
225		vertex ""
226			#version 300 es
227                        // This variant doesn't provoke the crash seen in the versions below.
228			${VERTEX_DECLARATIONS}
229			out mediump float FragVarying;
230			const float in0 = 0.0;
231			void main()
232			{
233				mat2 projectionMatrix = mat2(0.0, 0.0, 0.0, 0.0);
234				if (in0 == 1.0)
235				{
236					projectionMatrix[0][0] = 1.0;
237				}
238
239				FragVarying = 1.0;
240				gl_Position = dEQP_Position + vec4(projectionMatrix[1][0], 0.0, 0.0, 0.0);
241			}
242		""
243		fragment ""
244			#version 300 es
245			precision mediump float;
246			${FRAGMENT_DECLARATIONS}
247			in mediump float FragVarying;
248			void main()
249			{
250				${FRAG_COLOR} = vec4(FragVarying, 1.0, 1.0, 1.0);
251			}
252		""
253	end
254
255	case input_conditional_assignment_to_matrix
256		version 300 es
257		values
258		{
259			input float in0 = [ 0.0 ];
260		}
261		vertex ""
262			#version 300 es
263			${VERTEX_DECLARATIONS}
264			out mediump float FragVarying;  // Necessary to reproduce.
265			void main()
266			{
267				// Crashes with mat4 as well. Does not crash with vectors.
268				mat2 projectionMatrix = mat2(0.0, 0.0, 0.0, 0.0);
269				// Testing a non-constant variable is necessary.
270				if (in0 == 1.0)
271				{
272					// Using the matrix variable appears necessary.
273					projectionMatrix[0][0] = 1.0;
274				}
275
276				FragVarying = 1.0;
277				// Referencing the matrix is necessary though clearly the compiler
278				// doesn't realize the assignment is useless.
279				gl_Position = dEQP_Position + vec4(projectionMatrix[1][0], 0.0, 0.0, 0.0);
280			}
281		""
282		fragment ""
283			#version 300 es
284			precision mediump float;
285			${FRAGMENT_DECLARATIONS}
286			in mediump float FragVarying;
287			void main()
288			{
289				${FRAG_COLOR} = vec4(FragVarying, 1.0, 1.0, 1.0);
290			}
291		""
292	end
293
294	case uniform_conditional_assignment_to_matrix
295		version 300 es
296		values
297		{
298			uniform float uni0 = [ 0.0 ];
299		}
300		vertex ""
301			#version 300 es
302			precision mediump float;
303			${VERTEX_DECLARATIONS}
304			out mediump float FragVarying;  // Necessary to reproduce.
305			void main()
306			{
307				// Crashes with mat4 as well. Does not crash with vectors.
308				mat2 projectionMatrix = mat2(0.0, 0.0, 0.0, 0.0);
309				// Testing a non-constant variable is necessary.
310				if (uni0 == 1.0)
311				{
312					// Using the matrix variable appears necessary.
313					projectionMatrix[0][0] = 1.0;
314				}
315
316				FragVarying = 1.0;
317				// Referencing the matrix is necessary though clearly the compiler
318				// doesn't realize the assignment is useless.
319				gl_Position = dEQP_Position + vec4(projectionMatrix[1][0], 0.0, 0.0, 0.0);
320			}
321		""
322		fragment ""
323			#version 300 es
324			precision mediump float;
325			${FRAGMENT_DECLARATIONS}
326			in mediump float FragVarying;
327			void main()
328			{
329				${FRAG_COLOR} = vec4(FragVarying, 1.0, 1.0, 1.0);
330			}
331		""
332	end
333
334end # if
335
336group invalid_if "Invalid If Conditionals"
337
338	case missing_parenthesis
339		version 300 es
340		expect compile_fail
341		both ""
342			#version 300 es
343			precision mediump float;
344			${DECLARATIONS}
345			void main()
346			{
347				if true
348					${POSITION_FRAG_COLOR} = vec4(1.0);
349			}
350		""
351	end
352
353	case unclosed_parenthesis
354		version 300 es
355		expect compile_fail
356		both ""
357			#version 300 es
358			precision mediump float;
359			${DECLARATIONS}
360			void main()
361			{
362				if (true
363					${POSITION_FRAG_COLOR} = vec4(1.0);
364			}
365		""
366	end
367
368	case int_condition
369		version 300 es
370		expect compile_fail
371		both ""
372			#version 300 es
373			precision mediump float;
374			${DECLARATIONS}
375			void main()
376			{
377				if (5)
378					${POSITION_FRAG_COLOR} = vec4(1.0);
379			}
380		""
381	end
382
383	case int_zero_condition
384		version 300 es
385		expect compile_fail
386		both ""
387			#version 300 es
388			precision mediump float;
389			${DECLARATIONS}
390			void main()
391			{
392				if (0)
393					${POSITION_FRAG_COLOR} = vec4(1.0);
394			}
395		""
396	end
397
398	case int_one_condition
399		version 300 es
400		expect compile_fail
401		both ""
402			#version 300 es
403			precision mediump float;
404			${DECLARATIONS}
405			void main()
406			{
407				if (1)
408					${POSITION_FRAG_COLOR} = vec4(1.0);
409			}
410		""
411	end
412
413	case int_uniform_condition
414		version 300 es
415		expect compile_fail
416
417		both ""
418			#version 300 es
419			precision mediump float;
420			precision mediump int;
421			uniform int u0;
422			${DECLARATIONS}
423			void main()
424			{
425				if (u0)
426					${POSITION_FRAG_COLOR} = vec4(1.0);
427			}
428		""
429	end
430
431	case float_condition
432		version 300 es
433		expect compile_fail
434		both ""
435			#version 300 es
436			precision mediump float;
437			${DECLARATIONS}
438			void main()
439			{
440				if (5.0)
441					${POSITION_FRAG_COLOR} = vec4(1.0);
442			}
443		""
444	end
445
446	case float_zero_condition
447		version 300 es
448		expect compile_fail
449		both ""
450			#version 300 es
451			precision mediump float;
452			${DECLARATIONS}
453			void main()
454			{
455				if (0.0)
456					${POSITION_FRAG_COLOR} = vec4(1.0);
457			}
458		""
459	end
460
461	case float_one_condition
462		version 300 es
463		expect compile_fail
464		both ""
465			#version 300 es
466			precision mediump float;
467			${DECLARATIONS}
468			void main()
469			{
470				if (1.0)
471					${POSITION_FRAG_COLOR} = vec4(1.0);
472			}
473		""
474	end
475
476	case sampler_condition
477		version 300 es
478		expect compile_fail
479		both ""
480			#version 300 es
481			precision mediump float;
482			uniform sampler2D s0;
483			${DECLARATIONS}
484			void main()
485			{
486				if (s0)
487					${POSITION_FRAG_COLOR} = vec4(1.0);
488			}
489		""
490	end
491
492end # invalid_if
493