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