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
scissor(NegativeTestContext & ctx)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
depth_func(NegativeTestContext & ctx)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
viewport(NegativeTestContext & ctx)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
stencil_func(NegativeTestContext & ctx)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
stencil_func_separate(NegativeTestContext & ctx)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
stencil_op(NegativeTestContext & ctx)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
stencil_op_separate(NegativeTestContext & ctx)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
stencil_mask_separate(NegativeTestContext & ctx)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
blend_equation(NegativeTestContext & ctx)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
blend_equation_separate(NegativeTestContext & ctx)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
blend_equationi(NegativeTestContext & ctx)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_KHR_blend_equation_advanced"))
165 throw tcu::NotSupportedError("GL_KHR_blend_equation_advanced 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
blend_equation_separatei(NegativeTestContext & ctx)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_KHR_blend_equation_advanced"))
185 throw tcu::NotSupportedError("GL_KHR_blend_equation_advanced 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
blend_func(NegativeTestContext & ctx)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
blend_func_separate(NegativeTestContext & ctx)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
blend_funci(NegativeTestContext & ctx)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_KHR_blend_equation_advanced"))
233 throw tcu::NotSupportedError("GL_KHR_blend_equation_advanced 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
blend_func_separatei(NegativeTestContext & ctx)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_KHR_blend_equation_advanced"))
255 throw tcu::NotSupportedError("GL_KHR_blend_equation_advanced 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
cull_face(NegativeTestContext & ctx)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
front_face(NegativeTestContext & ctx)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
line_width(NegativeTestContext & ctx)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
gen_queries(NegativeTestContext & ctx)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
begin_query(NegativeTestContext & ctx)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
end_query(NegativeTestContext & ctx)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
delete_queries(NegativeTestContext & ctx)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
fence_sync(NegativeTestContext & ctx)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
wait_sync(NegativeTestContext & ctx)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
client_wait_sync(NegativeTestContext & ctx)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
delete_sync(NegativeTestContext & ctx)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
getNegativeFragmentApiTestFunctions()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
513