1/*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 3.1 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 "es31fNegativeFragmentApiTests.hpp"
25
26#include "gluCallLogWrapper.hpp"
27#include "gluContextInfo.hpp"
28#include "gluRenderContext.hpp"
29
30#include "glwDefs.hpp"
31#include "glwEnums.hpp"
32
33namespace deqp
34{
35namespace gles31
36{
37namespace Functional
38{
39namespace NegativeTestShared
40{
41
42using tcu::TestLog;
43using glu::CallLogWrapper;
44using namespace glw;
45
46using tcu::TestLog;
47
48void scissor (NegativeTestContext& ctx)
49{
50	ctx.beginSection("GL_INVALID_VALUE is generated if either width or height is negative.");
51	ctx.glScissor(0, 0, -1, 0);
52	ctx.expectError(GL_INVALID_VALUE);
53	ctx.glScissor(0, 0, 0, -1);
54	ctx.expectError(GL_INVALID_VALUE);
55	ctx.glScissor(0, 0, -1, -1);
56	ctx.expectError(GL_INVALID_VALUE);
57	ctx.endSection();
58}
59
60void depth_func (NegativeTestContext& ctx)
61{
62	ctx.beginSection("GL_INVALID_ENUM is generated if func is not an accepted value.");
63	ctx.glDepthFunc(-1);
64	ctx.expectError(GL_INVALID_ENUM);
65	ctx.endSection();
66}
67
68void viewport (NegativeTestContext& ctx)
69{
70	ctx.beginSection("GL_INVALID_VALUE is generated if either width or height is negative.");
71	ctx.glViewport(0, 0, -1, 1);
72	ctx.expectError(GL_INVALID_VALUE);
73	ctx.glViewport(0, 0, 1, -1);
74	ctx.expectError(GL_INVALID_VALUE);
75	ctx.glViewport(0, 0, -1, -1);
76	ctx.expectError(GL_INVALID_VALUE);
77	ctx.endSection();
78}
79
80// Stencil functions
81void stencil_func (NegativeTestContext& ctx)
82{
83	ctx.beginSection("GL_INVALID_ENUM is generated if func is not one of the eight accepted values.");
84	ctx.glStencilFunc(-1, 0, 1);
85	ctx.expectError(GL_INVALID_ENUM);
86	ctx.endSection();
87}
88
89void stencil_func_separate (NegativeTestContext& ctx)
90{
91	ctx.beginSection("GL_INVALID_ENUM is generated if face is not GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.");
92	ctx.glStencilFuncSeparate(-1, GL_NEVER, 0, 1);
93	ctx.expectError(GL_INVALID_ENUM);
94	ctx.endSection();
95
96	ctx.beginSection("GL_INVALID_ENUM is generated if func is not one of the eight accepted values.");
97	ctx.glStencilFuncSeparate(GL_FRONT, -1, 0, 1);
98	ctx.expectError(GL_INVALID_ENUM);
99	ctx.endSection();
100}
101
102void stencil_op (NegativeTestContext& ctx)
103{
104	ctx.beginSection("GL_INVALID_ENUM is generated if sfail, dpfail, or dppass is any value other than the defined symbolic constant values.");
105	ctx.glStencilOp(-1, GL_ZERO, GL_REPLACE);
106	ctx.expectError(GL_INVALID_ENUM);
107	ctx.glStencilOp(GL_KEEP, -1, GL_REPLACE);
108	ctx.expectError(GL_INVALID_ENUM);
109	ctx.glStencilOp(GL_KEEP, GL_ZERO, -1);
110	ctx.expectError(GL_INVALID_ENUM);
111	ctx.endSection();
112}
113
114void stencil_op_separate (NegativeTestContext& ctx)
115{
116	ctx.beginSection("GL_INVALID_ENUM is generated if face is any value other than GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.");
117	ctx.glStencilOpSeparate(-1, GL_KEEP, GL_ZERO, GL_REPLACE);
118	ctx.expectError(GL_INVALID_ENUM);
119	ctx.endSection();
120
121	ctx.beginSection("GL_INVALID_ENUM is generated if sfail, dpfail, or dppass is any value other than the eight defined symbolic constant values.");
122	ctx.glStencilOpSeparate(GL_FRONT, -1, GL_ZERO, GL_REPLACE);
123	ctx.expectError(GL_INVALID_ENUM);
124	ctx.glStencilOpSeparate(GL_FRONT, GL_KEEP, -1, GL_REPLACE);
125	ctx.expectError(GL_INVALID_ENUM);
126	ctx.glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_ZERO, -1);
127	ctx.expectError(GL_INVALID_ENUM);
128	ctx.endSection();
129}
130
131void stencil_mask_separate (NegativeTestContext& ctx)
132{
133	ctx.beginSection("GL_INVALID_ENUM is generated if face is not GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.");
134	ctx.glStencilMaskSeparate(-1, 0);
135	ctx.expectError(GL_INVALID_ENUM);
136	ctx.endSection();
137}
138
139// Blend functions
140void blend_equation (NegativeTestContext& ctx)
141{
142	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
143	ctx.glBlendEquation(-1);
144	ctx.expectError(GL_INVALID_ENUM);
145	ctx.endSection();
146}
147
148void blend_equation_separate (NegativeTestContext& ctx)
149{
150	ctx.beginSection("GL_INVALID_ENUM is generated if modeRGB is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
151	ctx.glBlendEquationSeparate(-1, GL_FUNC_ADD);
152	ctx.expectError(GL_INVALID_ENUM);
153	ctx.endSection();
154	ctx.beginSection("GL_INVALID_ENUM is generated if modeAlpha is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
155	ctx.glBlendEquationSeparate(GL_FUNC_ADD, -1);
156	ctx.expectError(GL_INVALID_ENUM);
157	ctx.endSection();
158}
159
160void blend_equationi (NegativeTestContext& ctx)
161{
162	glw::GLint maxDrawBuffers = -1;
163
164	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !ctx.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
165		throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
166
167	ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
168	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
169	ctx.glBlendEquationi(0, -1);
170	ctx.expectError(GL_INVALID_ENUM);
171	ctx.endSection();
172	ctx.beginSection("GL_INVALID_VALUE is generated if buf is not in the range zero to the value of MAX_DRAW_BUFFERS minus one.");
173	ctx.glBlendEquationi(-1, GL_FUNC_ADD);
174	ctx.expectError(GL_INVALID_VALUE);
175	ctx.glBlendEquationi(maxDrawBuffers, GL_FUNC_ADD);
176	ctx.expectError(GL_INVALID_VALUE);
177	ctx.endSection();
178}
179
180void blend_equation_separatei (NegativeTestContext& ctx)
181{
182	glw::GLint maxDrawBuffers = -1;
183
184	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !ctx.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
185		throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
186
187	ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
188	ctx.beginSection("GL_INVALID_ENUM is generated if modeRGB is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
189	ctx.glBlendEquationSeparatei(0, -1, GL_FUNC_ADD);
190	ctx.expectError(GL_INVALID_ENUM);
191	ctx.endSection();
192	ctx.beginSection("GL_INVALID_ENUM is generated if modeAlpha is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
193	ctx.glBlendEquationSeparatei(0, GL_FUNC_ADD, -1);
194	ctx.expectError(GL_INVALID_ENUM);
195	ctx.endSection();
196	ctx.beginSection("GL_INVALID_VALUE is generated if buf is not in the range zero to the value of MAX_DRAW_BUFFERS minus one.");
197	ctx.glBlendEquationSeparatei(-1, GL_FUNC_ADD, GL_FUNC_ADD);
198	ctx.expectError(GL_INVALID_VALUE);
199	ctx.glBlendEquationSeparatei(maxDrawBuffers, GL_FUNC_ADD, GL_FUNC_ADD);
200	ctx.expectError(GL_INVALID_VALUE);
201	ctx.endSection();
202}
203
204void blend_func (NegativeTestContext& ctx)
205{
206	ctx.beginSection("GL_INVALID_ENUM is generated if either sfactor or dfactor is not an accepted value.");
207	ctx.glBlendFunc(-1, GL_ONE);
208	ctx.expectError(GL_INVALID_ENUM);
209	ctx.glBlendFunc(GL_ONE, -1);
210	ctx.expectError(GL_INVALID_ENUM);
211	ctx.endSection();
212}
213
214void blend_func_separate (NegativeTestContext& ctx)
215{
216	ctx.beginSection("GL_INVALID_ENUM is generated if srcRGB, dstRGB, srcAlpha, or dstAlpha is not an accepted value.");
217	ctx.glBlendFuncSeparate(-1, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
218	ctx.expectError(GL_INVALID_ENUM);
219	ctx.glBlendFuncSeparate(GL_ZERO, -1, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
220	ctx.expectError(GL_INVALID_ENUM);
221	ctx.glBlendFuncSeparate(GL_ZERO, GL_ONE, -1, GL_ONE_MINUS_SRC_COLOR);
222	ctx.expectError(GL_INVALID_ENUM);
223	ctx.glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, -1);
224	ctx.expectError(GL_INVALID_ENUM);
225	ctx.endSection();
226}
227
228void blend_funci (NegativeTestContext& ctx)
229{
230	glw::GLint maxDrawBuffers = -1;
231
232	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !ctx.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
233		throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
234
235	ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
236	ctx.beginSection("GL_INVALID_ENUM is generated if either sfactor or dfactor is not an accepted value.");
237	ctx.glBlendFunci(0, -1, GL_ONE);
238	ctx.expectError(GL_INVALID_ENUM);
239	ctx.glBlendFunci(0, GL_ONE, -1);
240	ctx.expectError(GL_INVALID_ENUM);
241	ctx.endSection();
242	ctx.beginSection("GL_INVALID_VALUE is generated if buf is not in the range zero to the value of MAX_DRAW_BUFFERS minus one.");
243	ctx.glBlendFunci(-1, GL_ONE, GL_ONE);
244	ctx.expectError(GL_INVALID_VALUE);
245	ctx.glBlendFunci(maxDrawBuffers, GL_ONE, GL_ONE);
246	ctx.expectError(GL_INVALID_VALUE);
247	ctx.endSection();
248}
249
250void blend_func_separatei (NegativeTestContext& ctx)
251{
252	glw::GLint maxDrawBuffers = -1;
253
254	if (!glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !ctx.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
255		throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
256
257	ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
258	ctx.beginSection("GL_INVALID_ENUM is generated if srcRGB, dstRGB, srcAlpha, or dstAlpha is not an accepted value.");
259	ctx.glBlendFuncSeparatei(0, -1, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
260	ctx.expectError(GL_INVALID_ENUM);
261	ctx.glBlendFuncSeparatei(0, GL_ZERO, -1, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
262	ctx.expectError(GL_INVALID_ENUM);
263	ctx.glBlendFuncSeparatei(0, GL_ZERO, GL_ONE, -1, GL_ONE_MINUS_SRC_COLOR);
264	ctx.expectError(GL_INVALID_ENUM);
265	ctx.glBlendFuncSeparatei(0, GL_ZERO, GL_ONE, GL_SRC_COLOR, -1);
266	ctx.expectError(GL_INVALID_ENUM);
267	ctx.endSection();
268	ctx.beginSection("GL_INVALID_VALUE is generated if buf is not in the range zero to the value of MAX_DRAW_BUFFERS minus one.");
269	ctx.glBlendFuncSeparatei(-1, GL_ONE, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
270	ctx.expectError(GL_INVALID_VALUE);
271	ctx.glBlendFuncSeparatei(maxDrawBuffers, GL_ONE, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
272	ctx.expectError(GL_INVALID_VALUE);
273	ctx.endSection();
274}
275
276// Rasterization API functions
277void cull_face (NegativeTestContext& ctx)
278{
279	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
280	ctx.glCullFace(-1);
281	ctx.expectError(GL_INVALID_ENUM);
282	ctx.endSection();
283}
284
285void front_face (NegativeTestContext& ctx)
286{
287	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
288	ctx.glFrontFace(-1);
289	ctx.expectError(GL_INVALID_ENUM);
290	ctx.endSection();
291}
292
293void line_width (NegativeTestContext& ctx)
294{
295	ctx.beginSection("GL_INVALID_VALUE is generated if width is less than or equal to 0.");
296	ctx.glLineWidth(0);
297	ctx.expectError(GL_INVALID_VALUE);
298	ctx.glLineWidth(-1);
299	ctx.expectError(GL_INVALID_VALUE);
300	ctx.endSection();
301}
302
303// Asynchronous queries
304void gen_queries (NegativeTestContext& ctx)
305{
306	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
307	GLuint ids = 0;
308	ctx.glGenQueries	(-1, &ids);
309	ctx.expectError		(GL_INVALID_VALUE);
310	ctx.endSection();
311}
312
313void begin_query (NegativeTestContext& ctx)
314{
315	GLuint ids[3];
316	ctx.glGenQueries	(3, ids);
317
318	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
319	ctx.glBeginQuery	(-1, ids[0]);
320	ctx.expectError		(GL_INVALID_ENUM);
321	ctx.endSection();
322
323	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glBeginQuery is executed while a query object of the same target is already active.");
324	ctx.glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[0]);
325	ctx.expectError		(GL_NO_ERROR);
326	ctx.glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[1]);
327	ctx.expectError		(GL_INVALID_OPERATION);
328	// \note GL_ANY_SAMPLES_PASSED and GL_ANY_SAMPLES_PASSED_CONSERVATIVE alias to the same target for the purposes of this error.
329	ctx.glBeginQuery	(GL_ANY_SAMPLES_PASSED_CONSERVATIVE, ids[1]);
330	ctx.expectError		(GL_INVALID_OPERATION);
331	ctx.glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[1]);
332	ctx.expectError		(GL_NO_ERROR);
333	ctx.glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[2]);
334	ctx.expectError		(GL_INVALID_OPERATION);
335	ctx.glEndQuery		(GL_ANY_SAMPLES_PASSED);
336	ctx.glEndQuery		(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
337	ctx.expectError		(GL_NO_ERROR);
338	ctx.endSection();
339
340	ctx.beginSection("GL_INVALID_OPERATION is generated if id is 0.");
341	ctx.glBeginQuery	(GL_ANY_SAMPLES_PASSED, 0);
342	ctx.expectError		(GL_INVALID_OPERATION);
343	ctx.endSection();
344
345	ctx.beginSection("GL_INVALID_OPERATION is generated if id not a name returned from a previous call to ctx.glGenQueries, or if such a name has since been deleted with ctx.glDeleteQueries.");
346	ctx.glBeginQuery	(GL_ANY_SAMPLES_PASSED, -1);
347	ctx.expectError		(GL_INVALID_OPERATION);
348	ctx.glDeleteQueries	(1, &ids[2]);
349	ctx.expectError		(GL_NO_ERROR);
350	ctx.glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[2]);
351	ctx.expectError		(GL_INVALID_OPERATION);
352	ctx.endSection();
353
354	ctx.beginSection("GL_INVALID_OPERATION is generated if id is the name of an already active query object.");
355	ctx.glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[0]);
356	ctx.expectError		(GL_NO_ERROR);
357	ctx.glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[0]);
358	ctx.expectError		(GL_INVALID_OPERATION);
359	ctx.endSection();
360
361	ctx.beginSection("GL_INVALID_OPERATION is generated if id refers to an existing query object whose type does not does not match target.");
362	ctx.glEndQuery		(GL_ANY_SAMPLES_PASSED);
363	ctx.expectError		(GL_NO_ERROR);
364	ctx.glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[0]);
365	ctx.expectError		(GL_INVALID_OPERATION);
366	ctx.endSection();
367
368	ctx.glDeleteQueries	(2, &ids[0]);
369	ctx.expectError		(GL_NO_ERROR);
370}
371
372void end_query (NegativeTestContext& ctx)
373{
374	GLuint id = 0;
375	ctx.glGenQueries	(1, &id);
376
377	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
378	ctx.glEndQuery		(-1);
379	ctx.expectError		(GL_INVALID_ENUM);
380	ctx.endSection();
381
382	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glEndQuery is executed when a query object of the same target is not active.");
383	ctx.glEndQuery		(GL_ANY_SAMPLES_PASSED);
384	ctx.expectError		(GL_INVALID_OPERATION);
385	ctx.glBeginQuery	(GL_ANY_SAMPLES_PASSED, id);
386	ctx.expectError		(GL_NO_ERROR);
387	ctx.glEndQuery		(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
388	ctx.expectError		(GL_INVALID_OPERATION);
389	ctx.glEndQuery		(GL_ANY_SAMPLES_PASSED);
390	ctx.expectError		(GL_NO_ERROR);
391	ctx.endSection();
392
393	ctx.glDeleteQueries	(1, &id);
394	ctx.expectError		(GL_NO_ERROR);
395}
396
397void delete_queries (NegativeTestContext& ctx)
398{
399	GLuint id = 0;
400	ctx.glGenQueries	(1, &id);
401
402	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
403	ctx.glDeleteQueries	(-1, &id);
404	ctx.expectError		(GL_INVALID_VALUE);
405	ctx.endSection();
406
407	ctx.glDeleteQueries	(1, &id);
408}
409
410// Sync objects
411void fence_sync (NegativeTestContext& ctx)
412{
413	ctx.beginSection("GL_INVALID_ENUM is generated if condition is not GL_SYNC_GPU_COMMANDS_COMPLETE.");
414	ctx.glFenceSync(-1, 0);
415	ctx.expectError(GL_INVALID_ENUM);
416	ctx.endSection();
417
418	ctx.beginSection("GL_INVALID_VALUE is generated if flags is not zero.");
419	ctx.glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0x0010);
420	ctx.expectError(GL_INVALID_VALUE);
421	ctx.endSection();
422}
423
424void wait_sync (NegativeTestContext& ctx)
425{
426	GLsync sync = ctx.glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
427
428	ctx.beginSection("GL_INVALID_VALUE is generated if sync is not the name of a sync object.");
429	ctx.glWaitSync(0, 0, GL_TIMEOUT_IGNORED);
430	ctx.expectError(GL_INVALID_VALUE);
431	ctx.endSection();
432
433	ctx.beginSection("GL_INVALID_VALUE is generated if flags is not zero.");
434	ctx.glWaitSync(sync, 0x0010, GL_TIMEOUT_IGNORED);
435	ctx.expectError(GL_INVALID_VALUE);
436	ctx.endSection();
437
438	ctx.beginSection("GL_INVALID_VALUE is generated if timeout is not GL_TIMEOUT_IGNORED.");
439	ctx.glWaitSync(sync, 0, 0);
440	ctx.expectError(GL_INVALID_VALUE);
441	ctx.endSection();
442
443	ctx.glDeleteSync(sync);
444}
445
446void client_wait_sync (NegativeTestContext& ctx)
447{
448	GLsync sync = ctx.glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
449
450	ctx.beginSection("GL_INVALID_VALUE is generated if sync is not the name of an existing sync object.");
451	ctx.glClientWaitSync (0, 0, 10000);
452	ctx.expectError(GL_INVALID_VALUE);
453	ctx.endSection();
454
455	ctx.beginSection("GL_INVALID_VALUE is generated if flags contains any unsupported flag.");
456	ctx.glClientWaitSync(sync, 0x00000004, 10000);
457	ctx.expectError(GL_INVALID_VALUE);
458	ctx.endSection();
459
460	ctx.glDeleteSync(sync);
461}
462
463void delete_sync (NegativeTestContext& ctx)
464{
465	ctx.beginSection("GL_INVALID_VALUE is generated if sync is neither zero or the name of a sync object.");
466	ctx.glDeleteSync((GLsync)1);
467	ctx.expectError(GL_INVALID_VALUE);
468	ctx.glDeleteSync(0);
469	ctx.expectError(GL_NO_ERROR);
470	ctx.endSection();
471}
472
473std::vector<FunctionContainer> getNegativeFragmentApiTestFunctions ()
474{
475	FunctionContainer funcs[] =
476	{
477		{scissor,					"scissor",					"Invalid glScissor() usage"					},
478		{depth_func,				"depth_func",				"Invalid glDepthFunc() usage"				},
479		{viewport,					"viewport",					"Invalid glViewport() usage"				},
480		{stencil_func,				"stencil_func",				"Invalid glStencilFunc() usage"				},
481		{stencil_func_separate,		"stencil_func_separate",	"Invalid glStencilFuncSeparate() usage"		},
482		{stencil_op,				"stencil_op",				"Invalid glStencilOp() usage"				},
483		{stencil_op_separate,		"stencil_op_separate",		"Invalid glStencilOpSeparate() usage"		},
484		{stencil_mask_separate,		"stencil_mask_separate",	"Invalid glStencilMaskSeparate() usage"		},
485		{blend_equation,			"blend_equation",			"Invalid glBlendEquation() usage"			},
486		{blend_equationi,			"blend_equationi",			"Invalid glBlendEquationi() usage"			},
487		{blend_equation_separate,	"blend_equation_separate",	"Invalid glBlendEquationSeparate() usage"	},
488		{blend_equation_separatei,	"blend_equation_separatei",	"Invalid glBlendEquationSeparatei() usage"	},
489		{blend_func,				"blend_func",				"Invalid glBlendFunc() usage"				},
490		{blend_funci,				"blend_funci",				"Invalid glBlendFunci() usage"				},
491		{blend_func_separate,		"blend_func_separate",		"Invalid glBlendFuncSeparate() usage"		},
492		{blend_func_separatei,		"blend_func_separatei",		"Invalid glBlendFuncSeparatei() usage"		},
493		{cull_face,					"cull_face",				"Invalid glCullFace() usage"				},
494		{front_face,				"front_face",				"Invalid glFrontFace() usage"				},
495		{line_width,				"line_width",				"Invalid glLineWidth() usage"				},
496		{gen_queries,				"gen_queries",				"Invalid glGenQueries() usage"				},
497		{begin_query,				"begin_query",				"Invalid glBeginQuery() usage"				},
498		{end_query,					"end_query",				"Invalid glEndQuery() usage"				},
499		{delete_queries,			"delete_queries",			"Invalid glDeleteQueries() usage"			},
500		{fence_sync,				"fence_sync",				"Invalid glFenceSync() usage"				},
501		{wait_sync,					"wait_sync",				"Invalid glWaitSync() usage"				},
502		{client_wait_sync,			"client_wait_sync",			"Invalid glClientWaitSync() usage"			},
503		{delete_sync,				"delete_sync",				"Invalid glDeleteSync() usage"				},
504	};
505
506	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
507}
508
509} // NegativeTestShared
510} // Functional
511} // gles31
512} // deqp
513