Home | History | Annotate | Download | only in functional
      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
    513