Fix PIPELINE_STAGE_TOP_OF_PIPE_BIT usage in api tests
[platform/upstream/VK-GL-CTS.git] / modules / gles31 / functional / es31fNegativeFragmentApiTests.cpp
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
33 namespace deqp
34 {
35 namespace gles31
36 {
37 namespace Functional
38 {
39 namespace NegativeTestShared
40 {
41
42 using tcu::TestLog;
43 using glu::CallLogWrapper;
44 using namespace glw;
45
46 using tcu::TestLog;
47
48 void 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
60 void 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
68 void 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
81 void 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
89 void 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
102 void 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
114 void 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
131 void 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
140 void 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
148 void 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
160 void 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
180 void 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
204 void 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
214 void 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
228 void 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
250 void 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
277 void 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
285 void 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
293 void 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
304 void 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
313 void 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
372 void 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
397 void 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
411 void 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
424 void 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
446 void 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
463 void 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
473 std::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