• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 3.0 Module
3  * -------------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Negative Fragment Pipe API tests.
22  *//*--------------------------------------------------------------------*/
23 
24 #include "es3fNegativeFragmentApiTests.hpp"
25 #include "es3fApiCase.hpp"
26 
27 #include "gluContextInfo.hpp"
28 #include "glwDefs.hpp"
29 #include "glwEnums.hpp"
30 
31 using namespace glw; // GL types
32 
33 namespace deqp
34 {
35 namespace gles3
36 {
37 namespace Functional
38 {
39 
40 using tcu::TestLog;
41 
checkDrawBuffersIndexedSupport(Context & ctx)42 static bool checkDrawBuffersIndexedSupport(Context& ctx)
43 {
44 	return contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
45 		   contextSupports(ctx.getRenderContext().getType(), glu::ApiType::core(4, 5)) ||
46 		   ctx.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed");
47 }
48 
NegativeFragmentApiTests(Context & context)49 NegativeFragmentApiTests::NegativeFragmentApiTests (Context& context)
50 	: TestCaseGroup(context, "fragment", "Negative Fragment API Cases")
51 {
52 }
53 
~NegativeFragmentApiTests(void)54 NegativeFragmentApiTests::~NegativeFragmentApiTests (void)
55 {
56 }
57 
init(void)58 void NegativeFragmentApiTests::init (void)
59 {
60 	ES3F_ADD_API_CASE(scissor, "Invalid glScissor() usage",
61 		{
62 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if either width or height is negative.");
63 			glScissor(0, 0, -1, 0);
64 			expectError(GL_INVALID_VALUE);
65 			glScissor(0, 0, 0, -1);
66 			expectError(GL_INVALID_VALUE);
67 			glScissor(0, 0, -1, -1);
68 			expectError(GL_INVALID_VALUE);
69 			m_log << TestLog::EndSection;
70 		});
71 	ES3F_ADD_API_CASE(depth_func, "Invalid glDepthFunc() usage",
72 		{
73 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if func is not an accepted value.");
74 			glDepthFunc(-1);
75 			expectError(GL_INVALID_ENUM);
76 			m_log << TestLog::EndSection;
77 		});
78 	ES3F_ADD_API_CASE(viewport, "Invalid glViewport() usage",
79 		{
80 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if either width or height is negative.");
81 			glViewport(0, 0, -1, 1);
82 			expectError(GL_INVALID_VALUE);
83 			glViewport(0, 0, 1, -1);
84 			expectError(GL_INVALID_VALUE);
85 			glViewport(0, 0, -1, -1);
86 			expectError(GL_INVALID_VALUE);
87 			m_log << TestLog::EndSection;
88 		});
89 
90 	// Stencil functions
91 
92 	ES3F_ADD_API_CASE(stencil_func, "Invalid glStencilFunc() usage",
93 		{
94 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if func is not one of the eight accepted values.");
95 			glStencilFunc(-1, 0, 1);
96 			expectError(GL_INVALID_ENUM);
97 			m_log << TestLog::EndSection;
98 		});
99 	ES3F_ADD_API_CASE(stencil_func_separate, "Invalid glStencilFuncSeparate() usage",
100 		{
101 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if face is not GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.");
102 			glStencilFuncSeparate(-1, GL_NEVER, 0, 1);
103 			expectError(GL_INVALID_ENUM);
104 			m_log << TestLog::EndSection;
105 
106 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if func is not one of the eight accepted values.");
107 			glStencilFuncSeparate(GL_FRONT, -1, 0, 1);
108 			expectError(GL_INVALID_ENUM);
109 			m_log << TestLog::EndSection;
110 		});
111 	ES3F_ADD_API_CASE(stencil_op, "Invalid glStencilOp() usage",
112 		{
113 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if sfail, dpfail, or dppass is any value other than the defined symbolic constant values.");
114 			glStencilOp(-1, GL_ZERO, GL_REPLACE);
115 			expectError(GL_INVALID_ENUM);
116 			glStencilOp(GL_KEEP, -1, GL_REPLACE);
117 			expectError(GL_INVALID_ENUM);
118 			glStencilOp(GL_KEEP, GL_ZERO, -1);
119 			expectError(GL_INVALID_ENUM);
120 			m_log << TestLog::EndSection;
121 		});
122 	ES3F_ADD_API_CASE(stencil_op_separate, "Invalid glStencilOpSeparate() usage",
123 		{
124 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if face is any value other than GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.");
125 			glStencilOpSeparate(-1, GL_KEEP, GL_ZERO, GL_REPLACE);
126 			expectError(GL_INVALID_ENUM);
127 			m_log << TestLog::EndSection;
128 
129 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if sfail, dpfail, or dppass is any value other than the eight defined symbolic constant values.");
130 			glStencilOpSeparate(GL_FRONT, -1, GL_ZERO, GL_REPLACE);
131 			expectError(GL_INVALID_ENUM);
132 			glStencilOpSeparate(GL_FRONT, GL_KEEP, -1, GL_REPLACE);
133 			expectError(GL_INVALID_ENUM);
134 			glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_ZERO, -1);
135 			expectError(GL_INVALID_ENUM);
136 			m_log << TestLog::EndSection;
137 		});
138 	ES3F_ADD_API_CASE(stencil_mask_separate, "Invalid glStencilMaskSeparate() usage",
139 		{
140 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if face is not GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.");
141 			glStencilMaskSeparate(-1, 0);
142 			expectError(GL_INVALID_ENUM);
143 			m_log << TestLog::EndSection;
144 		});
145 
146 	// Blend functions
147 
148 	ES3F_ADD_API_CASE(blend_equation, "Invalid glBlendEquation() usage",
149 		{
150 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
151 			glBlendEquation(-1);
152 			expectError(GL_INVALID_ENUM);
153 			m_log << TestLog::EndSection;
154 		});
155 	ES3F_ADD_API_CASE(blend_equation_separate, "Invalid glBlendEquationSeparate() usage",
156 		{
157 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if modeRGB is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
158 			glBlendEquationSeparate(-1, GL_FUNC_ADD);
159 			expectError(GL_INVALID_ENUM);
160 			m_log << TestLog::EndSection;
161 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if modeAlpha is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
162 			glBlendEquationSeparate(GL_FUNC_ADD, -1);
163 			expectError(GL_INVALID_ENUM);
164 			m_log << TestLog::EndSection;
165 		});
166 	ES3F_ADD_API_CASE(blend_func, "Invalid glBlendFunc() usage",
167 		{
168 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if either sfactor or dfactor is not an accepted value.");
169 			glBlendFunc(-1, GL_ONE);
170 			expectError(GL_INVALID_ENUM);
171 			glBlendFunc(GL_ONE, -1);
172 			expectError(GL_INVALID_ENUM);
173 			m_log << TestLog::EndSection;
174 		});
175 	ES3F_ADD_API_CASE(blend_func_separate, "Invalid glBlendFuncSeparate() usage",
176 		{
177 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if srcRGB, dstRGB, srcAlpha, or dstAlpha is not an accepted value.");
178 			glBlendFuncSeparate(-1, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
179 			expectError(GL_INVALID_ENUM);
180 			glBlendFuncSeparate(GL_ZERO, -1, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
181 			expectError(GL_INVALID_ENUM);
182 			glBlendFuncSeparate(GL_ZERO, GL_ONE, -1, GL_ONE_MINUS_SRC_COLOR);
183 			expectError(GL_INVALID_ENUM);
184 			glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, -1);
185 			expectError(GL_INVALID_ENUM);
186 			m_log << TestLog::EndSection;
187 		});
188 	ES3F_ADD_API_CASE(blend_equationi, "Invalid glBlendEquationi() usage",
189 		{
190 			glw::GLint maxDrawBuffers = -1;
191 			glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
192 			if (!checkDrawBuffersIndexedSupport(m_context))
193 				throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
194 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
195 			glBlendEquationi(0, -1);
196 			expectError(GL_INVALID_ENUM);
197 			m_log << TestLog::EndSection;
198 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if buf is not in the range zero to the value of MAX_DRAW_BUFFERS minus one.");
199 			glBlendEquationi(-1, GL_FUNC_ADD);
200 			expectError(GL_INVALID_VALUE);
201 			glBlendEquationi(maxDrawBuffers, GL_FUNC_ADD);
202 			expectError(GL_INVALID_VALUE);
203 			m_log << TestLog::EndSection;
204 		});
205 	ES3F_ADD_API_CASE(blend_equation_separatei, "Invalid glBlendEquationSeparatei() usage",
206 		{
207 			glw::GLint maxDrawBuffers = -1;
208 			glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
209 			if (!checkDrawBuffersIndexedSupport(m_context))
210 				throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
211 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if modeRGB is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
212 			glBlendEquationSeparatei(0, -1, GL_FUNC_ADD);
213 			expectError(GL_INVALID_ENUM);
214 			m_log << TestLog::EndSection;
215 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if modeAlpha is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
216 			glBlendEquationSeparatei(0, GL_FUNC_ADD, -1);
217 			expectError(GL_INVALID_ENUM);
218 			m_log << TestLog::EndSection;
219 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if buf is not in the range zero to the value of MAX_DRAW_BUFFERS minus one.");
220 			glBlendEquationSeparatei(-1, GL_FUNC_ADD, GL_FUNC_ADD);
221 			expectError(GL_INVALID_VALUE);
222 			glBlendEquationSeparatei(maxDrawBuffers, GL_FUNC_ADD, GL_FUNC_ADD);
223 			expectError(GL_INVALID_VALUE);
224 			m_log << TestLog::EndSection;
225 		});
226 	ES3F_ADD_API_CASE(blend_funci, "Invalid glBlendFunci() usage",
227 		{
228 			glw::GLint maxDrawBuffers = -1;
229 			glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
230 			if (!checkDrawBuffersIndexedSupport(m_context))
231 				  throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
232 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if either sfactor or dfactor is not an accepted value.");
233 			glBlendFunci(0, -1, GL_ONE);
234 			expectError(GL_INVALID_ENUM);
235 			glBlendFunci(0, GL_ONE, -1);
236 			expectError(GL_INVALID_ENUM);
237 			m_log << TestLog::EndSection;
238 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if buf is not in the range zero to the value of MAX_DRAW_BUFFERS minus one.");
239 			glBlendFunci(-1, GL_ONE, GL_ONE);
240 			expectError(GL_INVALID_VALUE);
241 			glBlendFunci(maxDrawBuffers, GL_ONE, GL_ONE);
242 			expectError(GL_INVALID_VALUE);
243 			m_log << TestLog::EndSection;
244 		});
245 	ES3F_ADD_API_CASE(blend_func_separatei, "Invalid glBlendFuncSeparatei() usage",
246 		{
247 			glw::GLint maxDrawBuffers = -1;
248 			glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
249 			if (!checkDrawBuffersIndexedSupport(m_context))
250 				throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
251 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if srcRGB, dstRGB, srcAlpha, or dstAlpha is not an accepted value.");
252 			glBlendFuncSeparatei(0, -1, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
253 			expectError(GL_INVALID_ENUM);
254 			glBlendFuncSeparatei(0, GL_ZERO, -1, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
255 			expectError(GL_INVALID_ENUM);
256 			glBlendFuncSeparatei(0, GL_ZERO, GL_ONE, -1, GL_ONE_MINUS_SRC_COLOR);
257 			expectError(GL_INVALID_ENUM);
258 			glBlendFuncSeparatei(0, GL_ZERO, GL_ONE, GL_SRC_COLOR, -1);
259 			expectError(GL_INVALID_ENUM);
260 			m_log << TestLog::EndSection;
261 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if buf is not in the range zero to the value of MAX_DRAW_BUFFERS minus one.");
262 			glBlendFuncSeparatei(-1, GL_ONE, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
263 			expectError(GL_INVALID_VALUE);
264 			glBlendFuncSeparatei(maxDrawBuffers, GL_ONE, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
265 			expectError(GL_INVALID_VALUE);
266 			m_log << TestLog::EndSection;
267 	});
268 
269 	// Rasterization API functions
270 
271 	ES3F_ADD_API_CASE(cull_face, "Invalid glCullFace() usage",
272 		{
273 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
274 			glCullFace(-1);
275 			expectError(GL_INVALID_ENUM);
276 			m_log << TestLog::EndSection;
277 		});
278 	ES3F_ADD_API_CASE(front_face, "Invalid glFrontFace() usage",
279 		{
280 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
281 			glFrontFace(-1);
282 			expectError(GL_INVALID_ENUM);
283 			m_log << TestLog::EndSection;
284 		});
285 	ES3F_ADD_API_CASE(line_width, "Invalid glLineWidth() usage",
286 		{
287 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width is less than or equal to 0.");
288 			glLineWidth(0);
289 			expectError(GL_INVALID_VALUE);
290 			glLineWidth(-1);
291 			expectError(GL_INVALID_VALUE);
292 			m_log << TestLog::EndSection;
293 		});
294 
295 	// Asynchronous queries
296 
297 	ES3F_ADD_API_CASE(gen_queries, "Invalid glGenQueries() usage",
298 		{
299 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
300 			GLuint ids;
301 			glGenQueries	(-1, &ids);
302 			expectError		(GL_INVALID_VALUE);
303 			m_log << TestLog::EndSection;
304 		});
305 	ES3F_ADD_API_CASE(begin_query, "Invalid glBeginQuery() usage",
306 		{
307 			GLuint ids[3];
308 			glGenQueries	(3, ids);
309 
310 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
311 			glBeginQuery	(-1, ids[0]);
312 			expectError		(GL_INVALID_ENUM);
313 			m_log << TestLog::EndSection;
314 
315 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if glBeginQuery is executed while a query object of the same target is already active.");
316 			glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[0]);
317 			expectError		(GL_NO_ERROR);
318 			glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[1]);
319 			expectError		(GL_INVALID_OPERATION);
320 			// \note GL_ANY_SAMPLES_PASSED and GL_ANY_SAMPLES_PASSED_CONSERVATIVE alias to the same target for the purposes of this error.
321 			glBeginQuery	(GL_ANY_SAMPLES_PASSED_CONSERVATIVE, ids[1]);
322 			expectError		(GL_INVALID_OPERATION);
323 			glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[1]);
324 			expectError		(GL_NO_ERROR);
325 			glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[2]);
326 			expectError		(GL_INVALID_OPERATION);
327 			glEndQuery		(GL_ANY_SAMPLES_PASSED);
328 			glEndQuery		(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
329 			expectError		(GL_NO_ERROR);
330 			m_log << TestLog::EndSection;
331 
332 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id is 0.");
333 			glBeginQuery	(GL_ANY_SAMPLES_PASSED, 0);
334 			expectError		(GL_INVALID_OPERATION);
335 			m_log << TestLog::EndSection;
336 
337 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id not a name returned from a previous call to glGenQueries, or if such a name has since been deleted with glDeleteQueries.");
338 			glBeginQuery	(GL_ANY_SAMPLES_PASSED, -1);
339 			expectError		(GL_INVALID_OPERATION);
340 			glDeleteQueries	(1, &ids[2]);
341 			expectError		(GL_NO_ERROR);
342 			glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[2]);
343 			expectError		(GL_INVALID_OPERATION);
344 			m_log << TestLog::EndSection;
345 
346 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id is the name of an already active query object.");
347 			glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[0]);
348 			expectError		(GL_NO_ERROR);
349 			glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[0]);
350 			expectError		(GL_INVALID_OPERATION);
351 			m_log << TestLog::EndSection;
352 
353 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id refers to an existing query object whose type does not does not match target.");
354 			glEndQuery		(GL_ANY_SAMPLES_PASSED);
355 			expectError		(GL_NO_ERROR);
356 			glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[0]);
357 			expectError		(GL_INVALID_OPERATION);
358 			m_log << TestLog::EndSection;
359 
360 			glDeleteQueries	(2, &ids[0]);
361 			expectError		(GL_NO_ERROR);
362 		});
363 	ES3F_ADD_API_CASE(end_query, "Invalid glEndQuery() usage",
364 		{
365 			GLuint id;
366 			glGenQueries	(1, &id);
367 
368 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
369 			glEndQuery		(-1);
370 			expectError		(GL_INVALID_ENUM);
371 			m_log << TestLog::EndSection;
372 
373 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if glEndQuery is executed when a query object of the same target is not active.");
374 			glEndQuery		(GL_ANY_SAMPLES_PASSED);
375 			expectError		(GL_INVALID_OPERATION);
376 			glBeginQuery	(GL_ANY_SAMPLES_PASSED, id);
377 			expectError		(GL_NO_ERROR);
378 			glEndQuery		(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
379 			expectError		(GL_INVALID_OPERATION);
380 			glEndQuery		(GL_ANY_SAMPLES_PASSED);
381 			expectError		(GL_NO_ERROR);
382 			m_log << TestLog::EndSection;
383 
384 			glDeleteQueries	(1, &id);
385 			expectError		(GL_NO_ERROR);
386 		});
387 	ES3F_ADD_API_CASE(delete_queries, "Invalid glDeleteQueries() usage",
388 		{
389 			GLuint id;
390 			glGenQueries	(1, &id);
391 
392 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
393 			glDeleteQueries	(-1, &id);
394 			expectError		(GL_INVALID_VALUE);
395 			m_log << TestLog::EndSection;
396 
397 			glDeleteQueries	(1, &id);
398 		});
399 
400 	// Sync objects
401 
402 	ES3F_ADD_API_CASE(fence_sync, "Invalid glFenceSync() usage",
403 		{
404 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if condition is not GL_SYNC_GPU_COMMANDS_COMPLETE.");
405 			glFenceSync(-1, 0);
406 			expectError(GL_INVALID_ENUM);
407 			m_log << TestLog::EndSection;
408 
409 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if flags is not zero.");
410 			glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0x0010);
411 			expectError(GL_INVALID_VALUE);
412 			m_log << TestLog::EndSection;
413 		});
414 	ES3F_ADD_API_CASE(wait_sync, "Invalid glWaitSync() usage",
415 		{
416 			GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
417 
418 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if sync is not the name of a sync object.");
419 			glWaitSync(0, 0, GL_TIMEOUT_IGNORED);
420 			expectError(GL_INVALID_VALUE);
421 			m_log << TestLog::EndSection;
422 
423 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if flags is not zero.");
424 			glWaitSync(sync, 0x0010, GL_TIMEOUT_IGNORED);
425 			expectError(GL_INVALID_VALUE);
426 			m_log << TestLog::EndSection;
427 
428 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if timeout is not GL_TIMEOUT_IGNORED.");
429 			glWaitSync(sync, 0, 0);
430 			expectError(GL_INVALID_VALUE);
431 			m_log << TestLog::EndSection;
432 
433 			glDeleteSync(sync);
434 		});
435 	ES3F_ADD_API_CASE(client_wait_sync, "Invalid glClientWaitSync() usage",
436 		{
437 			GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
438 
439 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if sync is not the name of an existing sync object.");
440 			glClientWaitSync (0, 0, 10000);
441 			expectError(GL_INVALID_VALUE);
442 			m_log << TestLog::EndSection;
443 
444 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if flags contains any unsupported flag.");
445 			glClientWaitSync(sync, 0x00000004, 10000);
446 			expectError(GL_INVALID_VALUE);
447 			m_log << TestLog::EndSection;
448 
449 			glDeleteSync(sync);
450 		});
451 	ES3F_ADD_API_CASE(delete_sync, "Invalid glDeleteSync() usage",
452 		{
453 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if sync is neither zero or the name of a sync object.");
454 			glDeleteSync((GLsync)1);
455 			expectError(GL_INVALID_VALUE);
456 			glDeleteSync(0);
457 			expectError(GL_NO_ERROR);
458 			m_log << TestLog::EndSection;
459 		});
460 }
461 
462 
463 } // Functional
464 } // gles3
465 } // deqp
466