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 Vertex Array API tests.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "es31fNegativeVertexArrayApiTests.hpp"
     25 
     26 #include "gluCallLogWrapper.hpp"
     27 #include "gluContextInfo.hpp"
     28 #include "gluShaderProgram.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 static const char* vertexShaderSource		=	"#version 300 es\n"
     47 												"void main (void)\n"
     48 												"{\n"
     49 												"	gl_Position = vec4(0.0);\n"
     50 												"}\n\0";
     51 
     52 static const char* fragmentShaderSource		=	"#version 300 es\n"
     53 												"layout(location = 0) out mediump vec4 fragColor;"
     54 												"void main (void)\n"
     55 												"{\n"
     56 												"	fragColor = vec4(0.0);\n"
     57 												"}\n\0";
     58 
     59 void vertex_attribf (NegativeTestContext& ctx)
     60 {
     61 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
     62 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
     63 	ctx.glVertexAttrib1f(maxVertexAttribs, 0.0f);
     64 	ctx.expectError(GL_INVALID_VALUE);
     65 	ctx.glVertexAttrib2f(maxVertexAttribs, 0.0f, 0.0f);
     66 	ctx.expectError(GL_INVALID_VALUE);
     67 	ctx.glVertexAttrib3f(maxVertexAttribs, 0.0f, 0.0f, 0.0f);
     68 	ctx.expectError(GL_INVALID_VALUE);
     69 	ctx.glVertexAttrib4f(maxVertexAttribs, 0.0f, 0.0f, 0.0f, 0.0f);
     70 	ctx.expectError(GL_INVALID_VALUE);
     71 	ctx.endSection();
     72 }
     73 
     74 void vertex_attribfv (NegativeTestContext& ctx)
     75 {
     76 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
     77 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
     78 	float v[4] = {0.0f};
     79 	ctx.glVertexAttrib1fv(maxVertexAttribs, &v[0]);
     80 	ctx.expectError(GL_INVALID_VALUE);
     81 	ctx.glVertexAttrib2fv(maxVertexAttribs, &v[0]);
     82 	ctx.expectError(GL_INVALID_VALUE);
     83 	ctx.glVertexAttrib3fv(maxVertexAttribs, &v[0]);
     84 	ctx.expectError(GL_INVALID_VALUE);
     85 	ctx.glVertexAttrib4fv(maxVertexAttribs, &v[0]);
     86 	ctx.expectError(GL_INVALID_VALUE);
     87 	ctx.endSection();
     88 }
     89 
     90 void vertex_attribi4 (NegativeTestContext& ctx)
     91 {
     92 	int maxVertexAttribs	= ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
     93 	GLint valInt			= 0;
     94 	GLuint valUint			= 0;
     95 
     96 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
     97 	ctx.glVertexAttribI4i(maxVertexAttribs, valInt, valInt, valInt, valInt);
     98 	ctx.expectError(GL_INVALID_VALUE);
     99 	ctx.glVertexAttribI4ui(maxVertexAttribs, valUint, valUint, valUint, valUint);
    100 	ctx.expectError(GL_INVALID_VALUE);
    101 	ctx.endSection();
    102 }
    103 
    104 void vertex_attribi4v (NegativeTestContext& ctx)
    105 {
    106 	int maxVertexAttribs	= ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    107 	GLint valInt[4]			= { 0 };
    108 	GLuint valUint[4]		= { 0 };
    109 
    110 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    111 	ctx.glVertexAttribI4iv(maxVertexAttribs, &valInt[0]);
    112 	ctx.expectError(GL_INVALID_VALUE);
    113 	ctx.glVertexAttribI4uiv(maxVertexAttribs, &valUint[0]);
    114 	ctx.expectError(GL_INVALID_VALUE);
    115 	ctx.endSection();
    116 }
    117 
    118 void vertex_attrib_pointer (NegativeTestContext& ctx)
    119 {
    120 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not an accepted value.");
    121 	ctx.glVertexAttribPointer(0, 1, 0, GL_TRUE, 0, 0);
    122 	ctx.expectError(GL_INVALID_ENUM);
    123 	ctx.endSection();
    124 
    125 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    126 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    127 	ctx.glVertexAttribPointer(maxVertexAttribs, 1, GL_BYTE, GL_TRUE, 0, 0);
    128 	ctx.expectError(GL_INVALID_VALUE);
    129 	ctx.endSection();
    130 
    131 	ctx.beginSection("GL_INVALID_VALUE is generated if size is not 1, 2, 3, or 4.");
    132 	ctx.glVertexAttribPointer(0, 0, GL_BYTE, GL_TRUE, 0, 0);
    133 	ctx.expectError(GL_INVALID_VALUE);
    134 	ctx.endSection();
    135 
    136 	ctx.beginSection("GL_INVALID_VALUE is generated if stride is negative.");
    137 	ctx.glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, -1, 0);
    138 	ctx.expectError(GL_INVALID_VALUE);
    139 	ctx.endSection();
    140 
    141 	ctx.beginSection("GL_INVALID_OPERATION is generated if type is GL_INT_2_10_10_10_REV or GL_UNSIGNED_INT_2_10_10_10_REV and size is not 4.");
    142 	ctx.glVertexAttribPointer(0, 2, GL_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
    143 	ctx.expectError(GL_INVALID_OPERATION);
    144 	ctx.glVertexAttribPointer(0, 2, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
    145 	ctx.expectError(GL_INVALID_OPERATION);
    146 	ctx.glVertexAttribPointer(0, 4, GL_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
    147 	ctx.expectError(GL_NO_ERROR);
    148 	ctx.glVertexAttribPointer(0, 4, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
    149 	ctx.expectError(GL_NO_ERROR);
    150 	ctx.endSection();
    151 
    152 	ctx.beginSection("GL_INVALID_OPERATION is generated a non-zero vertex array object is bound, zero is bound to the GL_ARRAY_BUFFER buffer object binding point and the pointer argument is not NULL.");
    153 	GLuint vao = 0;
    154 	GLbyte offset = 1;
    155 	ctx.glGenVertexArrays(1, &vao);
    156 	ctx.glBindVertexArray(vao);
    157 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    158 	ctx.expectError(GL_NO_ERROR);
    159 
    160 	ctx.glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, 0, &offset);
    161 	ctx.expectError(GL_INVALID_OPERATION);
    162 
    163 	ctx.glBindVertexArray(0);
    164 	ctx.glDeleteVertexArrays(1, &vao);
    165 	ctx.expectError(GL_NO_ERROR);
    166 	ctx.endSection();
    167 }
    168 
    169 void vertex_attrib_i_pointer (NegativeTestContext& ctx)
    170 {
    171 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not an accepted value.");
    172 	ctx.glVertexAttribIPointer(0, 1, 0, 0, 0);
    173 	ctx.expectError(GL_INVALID_ENUM);
    174 	ctx.glVertexAttribIPointer(0, 4, GL_INT_2_10_10_10_REV, 0, 0);
    175 	ctx.expectError(GL_INVALID_ENUM);
    176 	ctx.glVertexAttribIPointer(0, 4, GL_UNSIGNED_INT_2_10_10_10_REV, 0, 0);
    177 	ctx.expectError(GL_INVALID_ENUM);
    178 	ctx.endSection();
    179 
    180 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    181 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    182 	ctx.glVertexAttribIPointer(maxVertexAttribs, 1, GL_BYTE, 0, 0);
    183 	ctx.expectError(GL_INVALID_VALUE);
    184 	ctx.endSection();
    185 
    186 	ctx.beginSection("GL_INVALID_VALUE is generated if size is not 1, 2, 3, or 4.");
    187 	ctx.glVertexAttribIPointer(0, 0, GL_BYTE, 0, 0);
    188 	ctx.expectError(GL_INVALID_VALUE);
    189 	ctx.endSection();
    190 
    191 	ctx.beginSection("GL_INVALID_VALUE is generated if stride is negative.");
    192 	ctx.glVertexAttribIPointer(0, 1, GL_BYTE, -1, 0);
    193 	ctx.expectError(GL_INVALID_VALUE);
    194 	ctx.endSection();
    195 
    196 	ctx.beginSection("GL_INVALID_OPERATION is generated a non-zero vertex array object is bound, zero is bound to the GL_ARRAY_BUFFER buffer object binding point and the pointer argument is not NULL.");
    197 	GLuint vao = 0;
    198 	GLbyte offset = 1;
    199 	ctx.glGenVertexArrays(1, &vao);
    200 	ctx.glBindVertexArray(vao);
    201 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    202 	ctx.expectError(GL_NO_ERROR);
    203 
    204 	ctx.glVertexAttribIPointer(0, 1, GL_BYTE, 0, &offset);
    205 	ctx.expectError(GL_INVALID_OPERATION);
    206 
    207 	ctx.glBindVertexArray(0);
    208 	ctx.glDeleteVertexArrays(1, &vao);
    209 	ctx.expectError(GL_NO_ERROR);
    210 	ctx.endSection();
    211 }
    212 
    213 void enable_vertex_attrib_array (NegativeTestContext& ctx)
    214 {
    215 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    216 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    217 	ctx.glEnableVertexAttribArray(maxVertexAttribs);
    218 	ctx.expectError(GL_INVALID_VALUE);
    219 	ctx.endSection();
    220 }
    221 
    222 void disable_vertex_attrib_array (NegativeTestContext& ctx)
    223 {
    224 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    225 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    226 	ctx.glDisableVertexAttribArray(maxVertexAttribs);
    227 	ctx.expectError(GL_INVALID_VALUE);
    228 	ctx.endSection();
    229 }
    230 
    231 void gen_vertex_arrays (NegativeTestContext& ctx)
    232 {
    233 	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
    234 	GLuint arrays = 0;
    235 	ctx.glGenVertexArrays(-1, &arrays);
    236 	ctx.expectError(GL_INVALID_VALUE);
    237 	ctx.endSection();
    238 }
    239 
    240 void bind_vertex_array (NegativeTestContext& ctx)
    241 {
    242 	ctx.beginSection("GL_INVALID_OPERATION is generated if array is not zero or the name of an existing vertex array object.");
    243 	ctx.glBindVertexArray(-1);
    244 	ctx.expectError(GL_INVALID_OPERATION);
    245 	ctx.endSection();
    246 }
    247 
    248 void delete_vertex_arrays (NegativeTestContext& ctx)
    249 {
    250 	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
    251 	ctx.glDeleteVertexArrays(-1, 0);
    252 	ctx.expectError(GL_INVALID_VALUE);
    253 	ctx.endSection();
    254 }
    255 
    256 void vertex_attrib_divisor (NegativeTestContext& ctx)
    257 {
    258 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    259 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    260 	ctx.glVertexAttribDivisor(maxVertexAttribs, 0);
    261 	ctx.expectError(GL_INVALID_VALUE);
    262 	ctx.endSection();
    263 }
    264 
    265 void draw_arrays (NegativeTestContext& ctx)
    266 {
    267 	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    268 	ctx.glUseProgram(program.getProgram());
    269 	GLuint fbo = 0;
    270 
    271 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    272 	ctx.glDrawArrays(-1, 0, 1);
    273 	ctx.expectError(GL_INVALID_ENUM);
    274 	ctx.endSection();
    275 
    276 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    277 	ctx.glDrawArrays(GL_POINTS, 0, -1);
    278 	ctx.expectError(GL_INVALID_VALUE);
    279 	ctx.endSection();
    280 
    281 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    282 	ctx.glGenFramebuffers(1, &fbo);
    283 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    284 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    285 	ctx.glDrawArrays(GL_POINTS, 0, 1);
    286 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    287 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    288 	ctx.glDeleteFramebuffers(1, &fbo);
    289 	ctx.endSection();
    290 
    291 	ctx.glUseProgram(0);
    292 }
    293 
    294 void draw_arrays_invalid_program (NegativeTestContext& ctx)
    295 {
    296 	ctx.glUseProgram(0);
    297 	GLuint fbo = 0;
    298 
    299 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    300 	ctx.glDrawArrays(-1, 0, 1);
    301 	ctx.expectError(GL_INVALID_ENUM);
    302 	ctx.endSection();
    303 
    304 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    305 	ctx.glDrawArrays(GL_POINTS, 0, -1);
    306 	ctx.expectError(GL_INVALID_VALUE);
    307 	ctx.endSection();
    308 
    309 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    310 	ctx.glGenFramebuffers(1, &fbo);
    311 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    312 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    313 	ctx.glDrawArrays(GL_POINTS, 0, 1);
    314 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    315 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    316 	ctx.glDeleteFramebuffers(1, &fbo);
    317 	ctx.endSection();
    318 }
    319 
    320 void draw_arrays_incomplete_primitive (NegativeTestContext& ctx)
    321 {
    322 	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    323 	ctx.glUseProgram(program.getProgram());
    324 	GLuint fbo = 0;
    325 
    326 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    327 	ctx.glDrawArrays(-1, 0, 1);
    328 	ctx.expectError(GL_INVALID_ENUM);
    329 	ctx.endSection();
    330 
    331 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    332 	ctx.glDrawArrays(GL_TRIANGLES, 0, -1);
    333 	ctx.expectError(GL_INVALID_VALUE);
    334 	ctx.endSection();
    335 
    336 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    337 	ctx.glGenFramebuffers(1, &fbo);
    338 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    339 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    340 	ctx.glDrawArrays(GL_TRIANGLES, 0, 1);
    341 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    342 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    343 	ctx.glDeleteFramebuffers(1, &fbo);
    344 	ctx.endSection();
    345 
    346 	ctx.glUseProgram(0);
    347 }
    348 
    349 void draw_elements (NegativeTestContext& ctx)
    350 {
    351 	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    352 	ctx.glUseProgram(program.getProgram());
    353 	GLuint fbo = 0;
    354 	GLuint buf = 0;
    355 	GLuint tfID = 0;
    356 	GLfloat vertices[1];
    357 
    358 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    359 	ctx.glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
    360 	ctx.expectError(GL_INVALID_ENUM);
    361 	ctx.endSection();
    362 
    363 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    364 	ctx.glDrawElements(GL_POINTS, 1, -1, vertices);
    365 	ctx.expectError(GL_INVALID_ENUM);
    366 	ctx.glDrawElements(GL_POINTS, 1, GL_FLOAT, vertices);
    367 	ctx.expectError(GL_INVALID_ENUM);
    368 	ctx.endSection();
    369 
    370 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    371 	ctx.glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
    372 	ctx.expectError(GL_INVALID_VALUE);
    373 	ctx.endSection();
    374 
    375 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    376 	ctx.glGenFramebuffers(1, &fbo);
    377 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    378 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    379 	ctx.glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
    380 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    381 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    382 	ctx.glDeleteFramebuffers(1, &fbo);
    383 	ctx.endSection();
    384 
    385 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
    386 	{
    387 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
    388 		const char* tfVarying		= "gl_Position";
    389 
    390 		ctx.glGenBuffers				(1, &buf);
    391 		ctx.glGenTransformFeedbacks		(1, &tfID);
    392 
    393 		ctx.glUseProgram				(program.getProgram());
    394 		ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
    395 		ctx.glLinkProgram				(program.getProgram());
    396 		ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
    397 		ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
    398 		ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
    399 		ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
    400 		ctx.glBeginTransformFeedback	(GL_POINTS);
    401 		ctx.expectError				(GL_NO_ERROR);
    402 
    403 		ctx.glDrawElements				(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
    404 		ctx.expectError				(GL_INVALID_OPERATION);
    405 
    406 		ctx.glPauseTransformFeedback();
    407 		ctx.glDrawElements				(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
    408 		ctx.expectError				(GL_NO_ERROR);
    409 
    410 		ctx.glEndTransformFeedback		();
    411 		ctx.glDeleteBuffers				(1, &buf);
    412 		ctx.glDeleteTransformFeedbacks	(1, &tfID);
    413 		ctx.expectError				(GL_NO_ERROR);
    414 		ctx.endSection();
    415 	}
    416 
    417 	ctx.glUseProgram(0);
    418 }
    419 
    420 void draw_elements_invalid_program (NegativeTestContext& ctx)
    421 {
    422 	ctx.glUseProgram(0);
    423 	GLuint fbo = 0;
    424 	GLfloat vertices[1];
    425 
    426 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    427 	ctx.glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
    428 	ctx.expectError(GL_INVALID_ENUM);
    429 	ctx.endSection();
    430 
    431 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    432 	ctx.glDrawElements(GL_POINTS, 1, -1, vertices);
    433 	ctx.expectError(GL_INVALID_ENUM);
    434 	ctx.glDrawElements(GL_POINTS, 1, GL_FLOAT, vertices);
    435 	ctx.expectError(GL_INVALID_ENUM);
    436 	ctx.endSection();
    437 
    438 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    439 	ctx.glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
    440 	ctx.expectError(GL_INVALID_VALUE);
    441 	ctx.endSection();
    442 
    443 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    444 	ctx.glGenFramebuffers(1, &fbo);
    445 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    446 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    447 	ctx.glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
    448 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    449 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    450 	ctx.glDeleteFramebuffers(1, &fbo);
    451 	ctx.endSection();
    452 }
    453 
    454 void draw_elements_incomplete_primitive (NegativeTestContext& ctx)
    455 {
    456 	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    457 	ctx.glUseProgram(program.getProgram());
    458 	GLuint fbo = 0;
    459 	GLuint buf = 0;
    460 	GLuint tfID = 0;
    461 	GLfloat vertices[1];
    462 
    463 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    464 	ctx.glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
    465 	ctx.expectError(GL_INVALID_ENUM);
    466 	ctx.endSection();
    467 
    468 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    469 	ctx.glDrawElements(GL_TRIANGLES, 1, -1, vertices);
    470 	ctx.expectError(GL_INVALID_ENUM);
    471 	ctx.glDrawElements(GL_TRIANGLES, 1, GL_FLOAT, vertices);
    472 	ctx.expectError(GL_INVALID_ENUM);
    473 	ctx.endSection();
    474 
    475 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    476 	ctx.glDrawElements(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices);
    477 	ctx.expectError(GL_INVALID_VALUE);
    478 	ctx.endSection();
    479 
    480 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    481 	ctx.glGenFramebuffers(1, &fbo);
    482 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    483 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    484 	ctx.glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
    485 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    486 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    487 	ctx.glDeleteFramebuffers(1, &fbo);
    488 	ctx.endSection();
    489 
    490 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
    491 	{
    492 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
    493 		const char* tfVarying		= "gl_Position";
    494 
    495 		ctx.glGenBuffers				(1, &buf);
    496 		ctx.glGenTransformFeedbacks		(1, &tfID);
    497 
    498 		ctx.glUseProgram				(program.getProgram());
    499 		ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
    500 		ctx.glLinkProgram				(program.getProgram());
    501 		ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
    502 		ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
    503 		ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
    504 		ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
    505 		ctx.glBeginTransformFeedback	(GL_TRIANGLES);
    506 		ctx.expectError					(GL_NO_ERROR);
    507 
    508 		ctx.glDrawElements				(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
    509 		ctx.expectError					(GL_INVALID_OPERATION);
    510 
    511 		ctx.glPauseTransformFeedback	();
    512 		ctx.glDrawElements				(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
    513 		ctx.expectError					(GL_NO_ERROR);
    514 
    515 		ctx.glEndTransformFeedback		();
    516 		ctx.glDeleteBuffers				(1, &buf);
    517 		ctx.glDeleteTransformFeedbacks	(1, &tfID);
    518 		ctx.expectError					(GL_NO_ERROR);
    519 		ctx.endSection					();
    520 	}
    521 
    522 	ctx.glUseProgram(0);
    523 }
    524 
    525 void draw_arrays_instanced (NegativeTestContext& ctx)
    526 {
    527 	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    528 	ctx.glUseProgram(program.getProgram());
    529 	GLuint fbo = 0;
    530 	ctx.glVertexAttribDivisor(0, 1);
    531 	ctx.expectError(GL_NO_ERROR);
    532 
    533 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    534 	ctx.glDrawArraysInstanced(-1, 0, 1, 1);
    535 	ctx.expectError(GL_INVALID_ENUM);
    536 	ctx.endSection();
    537 
    538 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    539 	ctx.glDrawArraysInstanced(GL_POINTS, 0, -1, 1);
    540 	ctx.expectError(GL_INVALID_VALUE);
    541 	ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, -1);
    542 	ctx.expectError(GL_INVALID_VALUE);
    543 	ctx.endSection();
    544 
    545 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    546 	ctx.glGenFramebuffers(1, &fbo);
    547 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    548 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    549 	ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
    550 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    551 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    552 	ctx.glDeleteFramebuffers(1, &fbo);
    553 	ctx.endSection();
    554 
    555 	ctx.glUseProgram(0);
    556 }
    557 
    558 void draw_arrays_instanced_invalid_program (NegativeTestContext& ctx)
    559 {
    560 	ctx.glUseProgram(0);
    561 	GLuint fbo = 0;
    562 	ctx.glVertexAttribDivisor(0, 1);
    563 	ctx.expectError(GL_NO_ERROR);
    564 
    565 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    566 	ctx.glDrawArraysInstanced(-1, 0, 1, 1);
    567 	ctx.expectError(GL_INVALID_ENUM);
    568 	ctx.endSection();
    569 
    570 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    571 	ctx.glDrawArraysInstanced(GL_POINTS, 0, -1, 1);
    572 	ctx.expectError(GL_INVALID_VALUE);
    573 	ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, -1);
    574 	ctx.expectError(GL_INVALID_VALUE);
    575 	ctx.endSection();
    576 
    577 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    578 	ctx.glGenFramebuffers(1, &fbo);
    579 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    580 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    581 	ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
    582 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    583 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    584 	ctx.glDeleteFramebuffers(1, &fbo);
    585 	ctx.endSection();
    586 }
    587 
    588 void draw_arrays_instanced_incomplete_primitive (NegativeTestContext& ctx)
    589 {
    590 	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    591 	ctx.glUseProgram(program.getProgram());
    592 	GLuint fbo = 0;
    593 	ctx.glVertexAttribDivisor(0, 1);
    594 	ctx.expectError(GL_NO_ERROR);
    595 
    596 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    597 	ctx.glDrawArraysInstanced(-1, 0, 1, 1);
    598 	ctx.expectError(GL_INVALID_ENUM);
    599 	ctx.endSection();
    600 
    601 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    602 	ctx.glDrawArraysInstanced(GL_TRIANGLES, 0, -1, 1);
    603 	ctx.expectError(GL_INVALID_VALUE);
    604 	ctx.glDrawArraysInstanced(GL_TRIANGLES, 0, 1, -1);
    605 	ctx.expectError(GL_INVALID_VALUE);
    606 	ctx.endSection();
    607 
    608 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    609 	ctx.glGenFramebuffers(1, &fbo);
    610 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    611 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    612 	ctx.glDrawArraysInstanced(GL_TRIANGLES, 0, 1, 1);
    613 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    614 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    615 	ctx.glDeleteFramebuffers(1, &fbo);
    616 	ctx.endSection();
    617 
    618 	ctx.glUseProgram(0);
    619 }
    620 
    621 void draw_elements_instanced (NegativeTestContext& ctx)
    622 {
    623 	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    624 	ctx.glUseProgram(program.getProgram());
    625 	GLuint fbo = 0;
    626 	GLuint buf = 0;
    627 	GLuint tfID = 0;
    628 	GLfloat vertices[1];
    629 	ctx.glVertexAttribDivisor(0, 1);
    630 	ctx.expectError(GL_NO_ERROR);
    631 
    632 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    633 	ctx.glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
    634 	ctx.expectError(GL_INVALID_ENUM);
    635 	ctx.endSection();
    636 
    637 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    638 	ctx.glDrawElementsInstanced(GL_POINTS, 1, -1, vertices, 1);
    639 	ctx.expectError(GL_INVALID_ENUM);
    640 	ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_FLOAT, vertices, 1);
    641 	ctx.expectError(GL_INVALID_ENUM);
    642 	ctx.endSection();
    643 
    644 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    645 	ctx.glDrawElementsInstanced(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1);
    646 	ctx.expectError(GL_INVALID_VALUE);
    647 	ctx.glDrawElementsInstanced(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1);
    648 	ctx.expectError(GL_INVALID_VALUE);
    649 	ctx.endSection();
    650 
    651 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    652 	ctx.glGenFramebuffers(1, &fbo);
    653 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    654 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    655 	ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
    656 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    657 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    658 	ctx.glDeleteFramebuffers(1, &fbo);
    659 	ctx.endSection();
    660 
    661 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
    662 	{
    663 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
    664 		const char* tfVarying		= "gl_Position";
    665 
    666 		ctx.glGenBuffers				(1, &buf);
    667 		ctx.glGenTransformFeedbacks		(1, &tfID);
    668 
    669 		ctx.glUseProgram				(program.getProgram());
    670 		ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
    671 		ctx.glLinkProgram				(program.getProgram());
    672 		ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
    673 		ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
    674 		ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
    675 		ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
    676 		ctx.glBeginTransformFeedback	(GL_POINTS);
    677 		ctx.expectError				(GL_NO_ERROR);
    678 
    679 		ctx.glDrawElementsInstanced		(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
    680 		ctx.expectError				(GL_INVALID_OPERATION);
    681 
    682 		ctx.glPauseTransformFeedback();
    683 		ctx.glDrawElementsInstanced		(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
    684 		ctx.expectError				(GL_NO_ERROR);
    685 
    686 		ctx.glEndTransformFeedback		();
    687 		ctx.glDeleteBuffers				(1, &buf);
    688 		ctx.glDeleteTransformFeedbacks	(1, &tfID);
    689 		ctx.expectError				(GL_NO_ERROR);
    690 		ctx.endSection();
    691 	}
    692 
    693 	ctx.glUseProgram(0);
    694 }
    695 
    696 void draw_elements_instanced_invalid_program (NegativeTestContext& ctx)
    697 {
    698 	ctx.glUseProgram(0);
    699 	GLuint fbo = 0;
    700 	GLfloat vertices[1];
    701 	ctx.glVertexAttribDivisor(0, 1);
    702 	ctx.expectError(GL_NO_ERROR);
    703 
    704 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    705 	ctx.glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
    706 	ctx.expectError(GL_INVALID_ENUM);
    707 	ctx.endSection();
    708 
    709 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    710 	ctx.glDrawElementsInstanced(GL_POINTS, 1, -1, vertices, 1);
    711 	ctx.expectError(GL_INVALID_ENUM);
    712 	ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_FLOAT, vertices, 1);
    713 	ctx.expectError(GL_INVALID_ENUM);
    714 	ctx.endSection();
    715 
    716 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    717 	ctx.glDrawElementsInstanced(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1);
    718 	ctx.expectError(GL_INVALID_VALUE);
    719 	ctx.glDrawElementsInstanced(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1);
    720 	ctx.expectError(GL_INVALID_VALUE);
    721 	ctx.endSection();
    722 
    723 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    724 	ctx.glGenFramebuffers(1, &fbo);
    725 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    726 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    727 	ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
    728 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    729 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    730 	ctx.glDeleteFramebuffers(1, &fbo);
    731 	ctx.endSection();
    732 }
    733 
    734 void draw_elements_instanced_incomplete_primitive (NegativeTestContext& ctx)
    735 {
    736 	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    737 	ctx.glUseProgram(program.getProgram());
    738 	GLuint fbo = 0;
    739 	GLuint buf = 0;
    740 	GLuint tfID = 0;
    741 	GLfloat vertices[1];
    742 	ctx.glVertexAttribDivisor(0, 1);
    743 	ctx.expectError(GL_NO_ERROR);
    744 
    745 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    746 	ctx.glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
    747 	ctx.expectError(GL_INVALID_ENUM);
    748 	ctx.endSection();
    749 
    750 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    751 	ctx.glDrawElementsInstanced(GL_TRIANGLES, 1, -1, vertices, 1);
    752 	ctx.expectError(GL_INVALID_ENUM);
    753 	ctx.glDrawElementsInstanced(GL_TRIANGLES, 1, GL_FLOAT, vertices, 1);
    754 	ctx.expectError(GL_INVALID_ENUM);
    755 	ctx.endSection();
    756 
    757 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    758 	ctx.glDrawElementsInstanced(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices, 1);
    759 	ctx.expectError(GL_INVALID_VALUE);
    760 	ctx.glDrawElementsInstanced(GL_TRIANGLES, 11, GL_UNSIGNED_BYTE, vertices, -1);
    761 	ctx.expectError(GL_INVALID_VALUE);
    762 	ctx.endSection();
    763 
    764 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    765 	ctx.glGenFramebuffers(1, &fbo);
    766 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    767 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    768 	ctx.glDrawElementsInstanced(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
    769 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    770 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    771 	ctx.glDeleteFramebuffers(1, &fbo);
    772 	ctx.endSection();
    773 
    774 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
    775 	{
    776 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
    777 		const char* tfVarying		= "gl_Position";
    778 
    779 		ctx.glGenBuffers				(1, &buf);
    780 		ctx.glGenTransformFeedbacks		(1, &tfID);
    781 
    782 		ctx.glUseProgram				(program.getProgram());
    783 		ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
    784 		ctx.glLinkProgram				(program.getProgram());
    785 		ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
    786 		ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
    787 		ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
    788 		ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
    789 		ctx.glBeginTransformFeedback	(GL_TRIANGLES);
    790 		ctx.expectError					(GL_NO_ERROR);
    791 
    792 		ctx.glDrawElementsInstanced		(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
    793 		ctx.expectError					(GL_INVALID_OPERATION);
    794 
    795 		ctx.glPauseTransformFeedback();
    796 		ctx.glDrawElementsInstanced		(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
    797 		ctx.expectError					(GL_NO_ERROR);
    798 
    799 		ctx.glEndTransformFeedback		();
    800 		ctx.glDeleteBuffers				(1, &buf);
    801 		ctx.glDeleteTransformFeedbacks	(1, &tfID);
    802 		ctx.expectError					(GL_NO_ERROR);
    803 		ctx.endSection();
    804 	}
    805 
    806 	ctx.glUseProgram(0);
    807 }
    808 
    809 void draw_range_elements (NegativeTestContext& ctx)
    810 {
    811 	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    812 	ctx.glUseProgram(program.getProgram());
    813 	GLuint fbo = 0;
    814 	GLuint buf = 0;
    815 	GLuint tfID = 0;
    816 	GLfloat vertices[1];
    817 
    818 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    819 	ctx.glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
    820 	ctx.expectError(GL_INVALID_ENUM);
    821 	ctx.endSection();
    822 
    823 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    824 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, -1, vertices);
    825 	ctx.expectError(GL_INVALID_ENUM);
    826 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices);
    827 	ctx.expectError(GL_INVALID_ENUM);
    828 	ctx.endSection();
    829 
    830 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    831 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
    832 	ctx.expectError(GL_INVALID_VALUE);
    833 	ctx.endSection();
    834 
    835 	ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
    836 	ctx.glDrawRangeElements(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
    837 	ctx.expectError(GL_INVALID_VALUE);
    838 	ctx.endSection();
    839 
    840 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    841 	ctx.glGenFramebuffers(1, &fbo);
    842 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    843 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    844 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
    845 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    846 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    847 	ctx.glDeleteFramebuffers(1, &fbo);
    848 	ctx.endSection();
    849 
    850 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
    851 	{
    852 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
    853 		const char* tfVarying		= "gl_Position";
    854 
    855 		ctx.glGenBuffers				(1, &buf);
    856 		ctx.glGenTransformFeedbacks		(1, &tfID);
    857 
    858 		ctx.glUseProgram				(program.getProgram());
    859 		ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
    860 		ctx.glLinkProgram				(program.getProgram());
    861 		ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
    862 		ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
    863 		ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
    864 		ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
    865 		ctx.glBeginTransformFeedback	(GL_POINTS);
    866 		ctx.expectError					(GL_NO_ERROR);
    867 
    868 		ctx.glDrawRangeElements			(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
    869 		ctx.expectError					(GL_INVALID_OPERATION);
    870 
    871 		ctx.glPauseTransformFeedback();
    872 		ctx.glDrawRangeElements			(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
    873 		ctx.expectError					(GL_NO_ERROR);
    874 
    875 		ctx.glEndTransformFeedback		();
    876 		ctx.glDeleteBuffers				(1, &buf);
    877 		ctx.glDeleteTransformFeedbacks	(1, &tfID);
    878 		ctx.expectError					(GL_NO_ERROR);
    879 		ctx.endSection();
    880 	}
    881 
    882 	ctx.glUseProgram(0);
    883 }
    884 
    885 void draw_range_elements_invalid_program (NegativeTestContext& ctx)
    886 {
    887 	ctx.glUseProgram(0);
    888 	GLuint fbo = 0;
    889 	GLfloat vertices[1];
    890 
    891 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    892 	ctx.glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
    893 	ctx.expectError(GL_INVALID_ENUM);
    894 	ctx.endSection();
    895 
    896 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    897 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, -1, vertices);
    898 	ctx.expectError(GL_INVALID_ENUM);
    899 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices);
    900 	ctx.expectError(GL_INVALID_ENUM);
    901 	ctx.endSection();
    902 
    903 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    904 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
    905 	ctx.expectError(GL_INVALID_VALUE);
    906 	ctx.endSection();
    907 
    908 	ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
    909 	ctx.glDrawRangeElements(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
    910 	ctx.expectError(GL_INVALID_VALUE);
    911 	ctx.endSection();
    912 
    913 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    914 	ctx.glGenFramebuffers(1, &fbo);
    915 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    916 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    917 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
    918 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    919 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    920 	ctx.glDeleteFramebuffers(1, &fbo);
    921 	ctx.endSection();
    922 }
    923 
    924 void draw_range_elements_incomplete_primitive (NegativeTestContext& ctx)
    925 {
    926 	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    927 	ctx.glUseProgram(program.getProgram());
    928 	GLuint fbo = 0;
    929 	GLuint buf = 0;
    930 	GLuint tfID = 0;
    931 	GLfloat vertices[1];
    932 
    933 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    934 	ctx.glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
    935 	ctx.expectError(GL_INVALID_ENUM);
    936 	ctx.endSection();
    937 
    938 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    939 	ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, -1, vertices);
    940 	ctx.expectError(GL_INVALID_ENUM);
    941 	ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_FLOAT, vertices);
    942 	ctx.expectError(GL_INVALID_ENUM);
    943 	ctx.endSection();
    944 
    945 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    946 	ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
    947 	ctx.expectError(GL_INVALID_VALUE);
    948 	ctx.endSection();
    949 
    950 	ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
    951 	ctx.glDrawRangeElements(GL_TRIANGLES, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
    952 	ctx.expectError(GL_INVALID_VALUE);
    953 	ctx.endSection();
    954 
    955 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    956 	ctx.glGenFramebuffers(1, &fbo);
    957 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    958 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    959 	ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
    960 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    961 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    962 	ctx.glDeleteFramebuffers(1, &fbo);
    963 	ctx.endSection();
    964 
    965 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
    966 	{
    967 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
    968 		const char* tfVarying		= "gl_Position";
    969 
    970 		ctx.glGenBuffers				(1, &buf);
    971 		ctx.glGenTransformFeedbacks		(1, &tfID);
    972 
    973 		ctx.glUseProgram				(program.getProgram());
    974 		ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
    975 		ctx.glLinkProgram				(program.getProgram());
    976 		ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
    977 		ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
    978 		ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
    979 		ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
    980 		ctx.glBeginTransformFeedback	(GL_TRIANGLES);
    981 		ctx.expectError				(GL_NO_ERROR);
    982 
    983 		ctx.glDrawRangeElements			(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
    984 		ctx.expectError				(GL_INVALID_OPERATION);
    985 
    986 		ctx.glPauseTransformFeedback();
    987 		ctx.glDrawRangeElements			(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
    988 		ctx.expectError				(GL_NO_ERROR);
    989 
    990 		ctx.glEndTransformFeedback		();
    991 		ctx.glDeleteBuffers				(1, &buf);
    992 		ctx.glDeleteTransformFeedbacks	(1, &tfID);
    993 		ctx.expectError				(GL_NO_ERROR);
    994 		ctx.endSection();
    995 	}
    996 
    997 	ctx.glUseProgram(0);
    998 }
    999 
   1000 std::vector<FunctionContainer> getNegativeVertexArrayApiTestFunctions ()
   1001 {
   1002 	FunctionContainer funcs[] =
   1003 	{
   1004 		{vertex_attribf,								"vertex_attribf",								"Invalid glVertexAttrib{1234}f() usage"		},
   1005 		{vertex_attribfv,								"vertex_attribfv",								"Invalid glVertexAttrib{1234}fv() usage"	},
   1006 		{vertex_attribi4,								"vertex_attribi4",								"Invalid glVertexAttribI4{i|ui}f() usage"	},
   1007 		{vertex_attribi4v,								"vertex_attribi4v",								"Invalid glVertexAttribI4{i|ui}fv() usage"	},
   1008 		{vertex_attrib_pointer,							"vertex_attrib_pointer",						"Invalid glVertexAttribPointer() usage"		},
   1009 		{vertex_attrib_i_pointer,						"vertex_attrib_i_pointer",						"Invalid glVertexAttribPointer() usage"		},
   1010 		{enable_vertex_attrib_array,					"enable_vertex_attrib_array",					"Invalid glEnableVertexAttribArray() usage"	},
   1011 		{disable_vertex_attrib_array,					"disable_vertex_attrib_array",					"Invalid glDisableVertexAttribArray() usage"},
   1012 		{gen_vertex_arrays,								"gen_vertex_arrays",							"Invalid glGenVertexArrays() usage"			},
   1013 		{bind_vertex_array,								"bind_vertex_array",							"Invalid glBindVertexArray() usage"			},
   1014 		{delete_vertex_arrays,							"delete_vertex_arrays",							"Invalid glDeleteVertexArrays() usage"		},
   1015 		{vertex_attrib_divisor,							"vertex_attrib_divisor",						"Invalid glVertexAttribDivisor() usage"		},
   1016 		{draw_arrays,									"draw_arrays",									"Invalid glDrawArrays() usage"				},
   1017 		{draw_arrays_invalid_program,					"draw_arrays_invalid_program",					"Invalid glDrawArrays() usage"				},
   1018 		{draw_arrays_incomplete_primitive,				"draw_arrays_incomplete_primitive",				"Invalid glDrawArrays() usage"				},
   1019 		{draw_elements,									"draw_elements",								"Invalid glDrawElements() usage"			},
   1020 		{draw_elements_invalid_program,					"draw_elements_invalid_program",				"Invalid glDrawElements() usage"			},
   1021 		{draw_elements_incomplete_primitive,			"draw_elements_incomplete_primitive",			"Invalid glDrawElements() usage"			},
   1022 		{draw_arrays_instanced,							"draw_arrays_instanced",						"Invalid glDrawArraysInstanced() usage"		},
   1023 		{draw_arrays_instanced_invalid_program,			"draw_arrays_instanced_invalid_program",		"Invalid glDrawArraysInstanced() usage"		},
   1024 		{draw_arrays_instanced_incomplete_primitive,	"draw_arrays_instanced_incomplete_primitive",	"Invalid glDrawArraysInstanced() usage"		},
   1025 		{draw_elements_instanced,						"draw_elements_instanced",						"Invalid glDrawElementsInstanced() usage"	},
   1026 		{draw_elements_instanced_invalid_program,		"draw_elements_instanced_invalid_program",		"Invalid glDrawElementsInstanced() usage"	},
   1027 		{draw_elements_instanced_incomplete_primitive,	"draw_elements_instanced_incomplete_primitive",	"Invalid glDrawElementsInstanced() usage"	},
   1028 		{draw_range_elements,							"draw_range_elements",							"Invalid glDrawRangeElements() usage"		},
   1029 		{draw_range_elements_invalid_program,			"draw_range_elements_invalid_program",			"Invalid glDrawRangeElements() usage"		},
   1030 		{draw_range_elements_incomplete_primitive,		"draw_range_elements_incomplete_primitive",		"Invalid glDrawRangeElements() usage"		},
   1031 	};
   1032 
   1033 	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
   1034 }
   1035 
   1036 } // NegativeTestShared
   1037 } // Functional
   1038 } // gles31
   1039 } // deqp
   1040