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 #include "gluCallLogWrapper.hpp"
     26 #include "gluContextInfo.hpp"
     27 #include "gluShaderProgram.hpp"
     28 #include "glwDefs.hpp"
     29 #include "glwEnums.hpp"
     30 #include "tcuStringTemplate.hpp"
     31 
     32 namespace deqp
     33 {
     34 
     35 using std::string;
     36 using std::map;
     37 
     38 namespace gles31
     39 {
     40 namespace Functional
     41 {
     42 namespace NegativeTestShared
     43 {
     44 
     45 using tcu::TestLog;
     46 using glu::CallLogWrapper;
     47 using namespace glw;
     48 
     49 static const char* vertexShaderSource		=	"${GLSL_VERSION_STRING}\n"
     50 												"void main (void)\n"
     51 												"{\n"
     52 												"	gl_Position = vec4(0.0);\n"
     53 												"}\n\0";
     54 
     55 static const char* fragmentShaderSource		=	"${GLSL_VERSION_STRING}\n"
     56 												"layout(location = 0) out mediump vec4 fragColor;"
     57 												"void main (void)\n"
     58 												"{\n"
     59 												"	fragColor = vec4(0.0);\n"
     60 												"}\n\0";
     61 
     62 void vertex_attribf (NegativeTestContext& ctx)
     63 {
     64 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
     65 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
     66 	ctx.glVertexAttrib1f(maxVertexAttribs, 0.0f);
     67 	ctx.expectError(GL_INVALID_VALUE);
     68 	ctx.glVertexAttrib2f(maxVertexAttribs, 0.0f, 0.0f);
     69 	ctx.expectError(GL_INVALID_VALUE);
     70 	ctx.glVertexAttrib3f(maxVertexAttribs, 0.0f, 0.0f, 0.0f);
     71 	ctx.expectError(GL_INVALID_VALUE);
     72 	ctx.glVertexAttrib4f(maxVertexAttribs, 0.0f, 0.0f, 0.0f, 0.0f);
     73 	ctx.expectError(GL_INVALID_VALUE);
     74 	ctx.endSection();
     75 }
     76 
     77 void vertex_attribfv (NegativeTestContext& ctx)
     78 {
     79 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
     80 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
     81 	float v[4] = {0.0f};
     82 	ctx.glVertexAttrib1fv(maxVertexAttribs, &v[0]);
     83 	ctx.expectError(GL_INVALID_VALUE);
     84 	ctx.glVertexAttrib2fv(maxVertexAttribs, &v[0]);
     85 	ctx.expectError(GL_INVALID_VALUE);
     86 	ctx.glVertexAttrib3fv(maxVertexAttribs, &v[0]);
     87 	ctx.expectError(GL_INVALID_VALUE);
     88 	ctx.glVertexAttrib4fv(maxVertexAttribs, &v[0]);
     89 	ctx.expectError(GL_INVALID_VALUE);
     90 	ctx.endSection();
     91 }
     92 
     93 void vertex_attribi4 (NegativeTestContext& ctx)
     94 {
     95 	int maxVertexAttribs	= ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
     96 	GLint valInt			= 0;
     97 	GLuint valUint			= 0;
     98 
     99 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    100 	ctx.glVertexAttribI4i(maxVertexAttribs, valInt, valInt, valInt, valInt);
    101 	ctx.expectError(GL_INVALID_VALUE);
    102 	ctx.glVertexAttribI4ui(maxVertexAttribs, valUint, valUint, valUint, valUint);
    103 	ctx.expectError(GL_INVALID_VALUE);
    104 	ctx.endSection();
    105 }
    106 
    107 void vertex_attribi4v (NegativeTestContext& ctx)
    108 {
    109 	int maxVertexAttribs	= ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    110 	GLint valInt[4]			= { 0 };
    111 	GLuint valUint[4]		= { 0 };
    112 
    113 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    114 	ctx.glVertexAttribI4iv(maxVertexAttribs, &valInt[0]);
    115 	ctx.expectError(GL_INVALID_VALUE);
    116 	ctx.glVertexAttribI4uiv(maxVertexAttribs, &valUint[0]);
    117 	ctx.expectError(GL_INVALID_VALUE);
    118 	ctx.endSection();
    119 }
    120 
    121 void vertex_attrib_pointer (NegativeTestContext& ctx)
    122 {
    123 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not an accepted value.");
    124 	ctx.glVertexAttribPointer(0, 1, 0, GL_TRUE, 0, 0);
    125 	ctx.expectError(GL_INVALID_ENUM);
    126 	ctx.endSection();
    127 
    128 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    129 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    130 	ctx.glVertexAttribPointer(maxVertexAttribs, 1, GL_BYTE, GL_TRUE, 0, 0);
    131 	ctx.expectError(GL_INVALID_VALUE);
    132 	ctx.endSection();
    133 
    134 	ctx.beginSection("GL_INVALID_VALUE is generated if size is not 1, 2, 3, or 4.");
    135 	ctx.glVertexAttribPointer(0, 0, GL_BYTE, GL_TRUE, 0, 0);
    136 	ctx.expectError(GL_INVALID_VALUE);
    137 	ctx.endSection();
    138 
    139 	ctx.beginSection("GL_INVALID_VALUE is generated if stride is negative.");
    140 	ctx.glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, -1, 0);
    141 	ctx.expectError(GL_INVALID_VALUE);
    142 	ctx.endSection();
    143 
    144 	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.");
    145 	ctx.glVertexAttribPointer(0, 2, GL_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
    146 	ctx.expectError(GL_INVALID_OPERATION);
    147 	ctx.glVertexAttribPointer(0, 2, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
    148 	ctx.expectError(GL_INVALID_OPERATION);
    149 	ctx.glVertexAttribPointer(0, 4, GL_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
    150 	ctx.expectError(GL_NO_ERROR);
    151 	ctx.glVertexAttribPointer(0, 4, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
    152 	ctx.expectError(GL_NO_ERROR);
    153 	ctx.endSection();
    154 
    155 	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.");
    156 	GLuint vao = 0;
    157 	GLbyte offset = 1;
    158 	ctx.glGenVertexArrays(1, &vao);
    159 	ctx.glBindVertexArray(vao);
    160 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    161 	ctx.expectError(GL_NO_ERROR);
    162 
    163 	ctx.glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, 0, &offset);
    164 	ctx.expectError(GL_INVALID_OPERATION);
    165 
    166 	ctx.glBindVertexArray(0);
    167 	ctx.glDeleteVertexArrays(1, &vao);
    168 	ctx.expectError(GL_NO_ERROR);
    169 	ctx.endSection();
    170 }
    171 
    172 void vertex_attrib_i_pointer (NegativeTestContext& ctx)
    173 {
    174 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not an accepted value.");
    175 	ctx.glVertexAttribIPointer(0, 1, 0, 0, 0);
    176 	ctx.expectError(GL_INVALID_ENUM);
    177 	ctx.glVertexAttribIPointer(0, 4, GL_INT_2_10_10_10_REV, 0, 0);
    178 	ctx.expectError(GL_INVALID_ENUM);
    179 	ctx.glVertexAttribIPointer(0, 4, GL_UNSIGNED_INT_2_10_10_10_REV, 0, 0);
    180 	ctx.expectError(GL_INVALID_ENUM);
    181 	ctx.endSection();
    182 
    183 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    184 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    185 	ctx.glVertexAttribIPointer(maxVertexAttribs, 1, GL_BYTE, 0, 0);
    186 	ctx.expectError(GL_INVALID_VALUE);
    187 	ctx.endSection();
    188 
    189 	ctx.beginSection("GL_INVALID_VALUE is generated if size is not 1, 2, 3, or 4.");
    190 	ctx.glVertexAttribIPointer(0, 0, GL_BYTE, 0, 0);
    191 	ctx.expectError(GL_INVALID_VALUE);
    192 	ctx.endSection();
    193 
    194 	ctx.beginSection("GL_INVALID_VALUE is generated if stride is negative.");
    195 	ctx.glVertexAttribIPointer(0, 1, GL_BYTE, -1, 0);
    196 	ctx.expectError(GL_INVALID_VALUE);
    197 	ctx.endSection();
    198 
    199 	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.");
    200 	GLuint vao = 0;
    201 	GLbyte offset = 1;
    202 	ctx.glGenVertexArrays(1, &vao);
    203 	ctx.glBindVertexArray(vao);
    204 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    205 	ctx.expectError(GL_NO_ERROR);
    206 
    207 	ctx.glVertexAttribIPointer(0, 1, GL_BYTE, 0, &offset);
    208 	ctx.expectError(GL_INVALID_OPERATION);
    209 
    210 	ctx.glBindVertexArray(0);
    211 	ctx.glDeleteVertexArrays(1, &vao);
    212 	ctx.expectError(GL_NO_ERROR);
    213 	ctx.endSection();
    214 }
    215 
    216 void vertex_attrib_format (NegativeTestContext& ctx)
    217 {
    218 	int		maxVertexAttribs				= ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    219 	int		maxVertexAttribRelativeOffset	= ctx.getInteger(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET);
    220 	GLuint	vao								= 0;
    221 
    222 	ctx.beginSection("GL_INVALID_VALUE is generated if attribindex is greater than or equal to the value of MAX_VERTEX_ATTRIBS.");
    223 	ctx.glGenVertexArrays(1, &vao);
    224 	ctx.glBindVertexArray(vao);
    225 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    226 	ctx.glVertexAttribFormat(maxVertexAttribs, 4, GL_FLOAT, GL_FALSE, maxVertexAttribRelativeOffset);
    227 	ctx.expectError(GL_INVALID_VALUE);
    228 	ctx.endSection();
    229 
    230 	ctx.beginSection("GL_INVALID_VALUE is generated if size is not one of 1, 2, 3, 4.");
    231 	ctx.glGenVertexArrays(1, &vao);
    232 	ctx.glBindVertexArray(vao);
    233 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    234 	ctx.glVertexAttribFormat(1, 0, GL_FLOAT, GL_FALSE, maxVertexAttribRelativeOffset);
    235 	ctx.expectError(GL_INVALID_VALUE);
    236 	ctx.endSection();
    237 
    238 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the parameter token names allowed.");
    239 	ctx.glGenVertexArrays(1, &vao);
    240 	ctx.glBindVertexArray(vao);
    241 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    242 	ctx.glVertexAttribFormat(1, 4, 1, GL_FALSE, 0);
    243 	ctx.expectError(GL_INVALID_ENUM);
    244 	ctx.endSection();
    245 
    246 	ctx.beginSection("GL_INVALID_OPERATION is generated if type is not a token name allowed.");
    247 	ctx.glGenVertexArrays(1, &vao);
    248 	ctx.glBindVertexArray(0);
    249 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    250 	ctx.glVertexAttribFormat(1, 4, GL_FLOAT, GL_FALSE, 0);
    251 	ctx.expectError(GL_INVALID_OPERATION);
    252 	ctx.endSection();
    253 
    254 	ctx.beginSection("GL_INVALID_OPERATION is generated if type is GL_INT_2_10_10_10_REV and size is not 4.");
    255 	ctx.glGenVertexArrays(1, &vao);
    256 	ctx.glBindVertexArray(vao);
    257 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    258 	ctx.glVertexAttribFormat(1, 3, GL_INT_2_10_10_10_REV, GL_FALSE, 0);
    259 	ctx.expectError(GL_INVALID_OPERATION);
    260 	ctx.endSection();
    261 
    262 	ctx.beginSection("GL_INVALID_OPERATION is generated if type is GL_UNSIGNED_INT_2_10_10_10_REV and size is not 4.");
    263 	ctx.glGenVertexArrays(1, &vao);
    264 	ctx.glBindVertexArray(vao);
    265 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    266 	ctx.glVertexAttribFormat(1, 3, GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 0);
    267 	ctx.expectError(GL_INVALID_OPERATION);
    268 	ctx.endSection();
    269 
    270 	ctx.beginSection("GL_INVALID_VALUE is generated if relativeoffset is larger than the value of GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET.");
    271 	ctx.glGenVertexArrays(1, &vao);
    272 	ctx.glBindVertexArray(vao);
    273 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    274 	ctx.glVertexAttribFormat(1, 4, GL_FLOAT, GL_FALSE, maxVertexAttribRelativeOffset + 1);
    275 	ctx.expectError(GL_INVALID_VALUE);
    276 	ctx.endSection();
    277 }
    278 
    279 void vertex_attrib_i_format (NegativeTestContext& ctx)
    280 {
    281 	int		maxVertexAttribs				= ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    282 	int		maxVertexAttribRelativeOffset	= ctx.getInteger(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET);
    283 	GLuint	vao								= 0;
    284 
    285 	ctx.beginSection("GL_INVALID_VALUE is generated if attribindex is greater than or equal to the value of GL_MAX_VERTEX_ATTRIBS.");
    286 	ctx.glGenVertexArrays(1, &vao);
    287 	ctx.glBindVertexArray(vao);
    288 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    289 	ctx.glVertexAttribIFormat(maxVertexAttribs, 4, GL_INT, 0);
    290 	ctx.expectError(GL_INVALID_VALUE);
    291 	ctx.endSection();
    292 
    293 	ctx.beginSection("GL_INVALID_VALUE is generated if size is not one the values 1, 2, 3, 4.");
    294 	ctx.glGenVertexArrays(1, &vao);
    295 	ctx.glBindVertexArray(vao);
    296 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    297 	ctx.glVertexAttribIFormat(1, 0, GL_INT, 0);
    298 	ctx.expectError(GL_INVALID_VALUE);
    299 	ctx.endSection();
    300 
    301 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the parameter token names allowed.");
    302 	ctx.glGenVertexArrays(1, &vao);
    303 	ctx.glBindVertexArray(vao);
    304 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    305 	ctx.glVertexAttribIFormat(1, 4, GL_FLOAT, 0);
    306 	ctx.expectError(GL_INVALID_ENUM);
    307 	ctx.endSection();
    308 
    309 	ctx.beginSection("GL_INVALID_OPERATION is generated if type is not a token name allowed.");
    310 	ctx.glGenVertexArrays(1, &vao);
    311 	ctx.glBindVertexArray(0);
    312 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    313 	ctx.glVertexAttribIFormat(1, 4, GL_INT, 0);
    314 	ctx.expectError(GL_INVALID_OPERATION);
    315 	ctx.endSection();
    316 
    317 	ctx.beginSection("GL_INVALID_VALUE is generated if relativeoffset is larger than the value of GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET.");
    318 	ctx.glGenVertexArrays(1, &vao);
    319 	ctx.glBindVertexArray(vao);
    320 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    321 	ctx.glVertexAttribIFormat(1, 4, GL_INT, maxVertexAttribRelativeOffset + 1);
    322 	ctx.expectError(GL_INVALID_VALUE);
    323 	ctx.endSection();
    324 }
    325 
    326 void enable_vertex_attrib_array (NegativeTestContext& ctx)
    327 {
    328 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    329 
    330 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    331 	ctx.glEnableVertexAttribArray(maxVertexAttribs);
    332 	ctx.expectError(GL_INVALID_VALUE);
    333 	ctx.endSection();
    334 }
    335 
    336 void disable_vertex_attrib_array (NegativeTestContext& ctx)
    337 {
    338 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    339 
    340 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    341 	ctx.glDisableVertexAttribArray(maxVertexAttribs);
    342 	ctx.expectError(GL_INVALID_VALUE);
    343 	ctx.endSection();
    344 }
    345 
    346 void gen_vertex_arrays (NegativeTestContext& ctx)
    347 {
    348 	GLuint arrays = 0;
    349 
    350 	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
    351 	ctx.glGenVertexArrays(-1, &arrays);
    352 	ctx.expectError(GL_INVALID_VALUE);
    353 	ctx.endSection();
    354 }
    355 
    356 void bind_vertex_array (NegativeTestContext& ctx)
    357 {
    358 	ctx.beginSection("GL_INVALID_OPERATION is generated if array is not zero or the name of an existing vertex array object.");
    359 	ctx.glBindVertexArray(-1);
    360 	ctx.expectError(GL_INVALID_OPERATION);
    361 	ctx.endSection();
    362 }
    363 
    364 void delete_vertex_arrays (NegativeTestContext& ctx)
    365 {
    366 	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
    367 	ctx.glDeleteVertexArrays(-1, 0);
    368 	ctx.expectError(GL_INVALID_VALUE);
    369 	ctx.endSection();
    370 }
    371 
    372 void vertex_attrib_divisor (NegativeTestContext& ctx)
    373 {
    374 	int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
    375 
    376 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    377 	ctx.glVertexAttribDivisor(maxVertexAttribs, 0);
    378 	ctx.expectError(GL_INVALID_VALUE);
    379 	ctx.endSection();
    380 }
    381 
    382 void draw_arrays (NegativeTestContext& ctx)
    383 {
    384 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
    385 	GLuint						fbo		= 0;
    386 	map<string, string>			args;
    387 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
    388 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
    389 
    390 	ctx.glUseProgram(program.getProgram());
    391 	ctx.expectError(GL_NO_ERROR);
    392 
    393 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    394 	ctx.glDrawArrays(-1, 0, 1);
    395 	ctx.expectError(GL_INVALID_ENUM);
    396 	ctx.endSection();
    397 
    398 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    399 	ctx.glDrawArrays(GL_POINTS, 0, -1);
    400 	ctx.expectError(GL_INVALID_VALUE);
    401 	ctx.endSection();
    402 
    403 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    404 	ctx.glGenFramebuffers(1, &fbo);
    405 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    406 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    407 	ctx.glDrawArrays(GL_POINTS, 0, 1);
    408 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    409 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    410 	ctx.glDeleteFramebuffers(1, &fbo);
    411 	ctx.endSection();
    412 
    413 	ctx.glUseProgram(0);
    414 }
    415 
    416 void draw_arrays_invalid_program (NegativeTestContext& ctx)
    417 {
    418 	GLuint fbo = 0;
    419 	ctx.glUseProgram(0);
    420 
    421 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    422 	ctx.glDrawArrays(-1, 0, 1);
    423 	ctx.expectError(GL_INVALID_ENUM);
    424 	ctx.endSection();
    425 
    426 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    427 	ctx.glDrawArrays(GL_POINTS, 0, -1);
    428 	ctx.expectError(GL_INVALID_VALUE);
    429 	ctx.endSection();
    430 
    431 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    432 	ctx.glGenFramebuffers(1, &fbo);
    433 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    434 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    435 	ctx.glDrawArrays(GL_POINTS, 0, 1);
    436 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    437 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    438 	ctx.glDeleteFramebuffers(1, &fbo);
    439 	ctx.endSection();
    440 }
    441 
    442 void draw_arrays_incomplete_primitive (NegativeTestContext& ctx)
    443 {
    444 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
    445 	GLuint						fbo		= 0;
    446 	map<string, string>			args;
    447 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
    448 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
    449 
    450 	ctx.glUseProgram(program.getProgram());
    451 	ctx.expectError(GL_NO_ERROR);
    452 
    453 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    454 	ctx.glDrawArrays(-1, 0, 1);
    455 	ctx.expectError(GL_INVALID_ENUM);
    456 	ctx.endSection();
    457 
    458 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    459 	ctx.glDrawArrays(GL_TRIANGLES, 0, -1);
    460 	ctx.expectError(GL_INVALID_VALUE);
    461 	ctx.endSection();
    462 
    463 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    464 	ctx.glGenFramebuffers(1, &fbo);
    465 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    466 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    467 	ctx.glDrawArrays(GL_TRIANGLES, 0, 1);
    468 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    469 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    470 	ctx.glDeleteFramebuffers(1, &fbo);
    471 	ctx.endSection();
    472 
    473 	ctx.glUseProgram(0);
    474 }
    475 
    476 void draw_elements (NegativeTestContext& ctx)
    477 {
    478 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
    479 	GLuint						fbo		= 0;
    480 	GLuint						buf		= 0;
    481 	GLuint						tfID	= 0;
    482 	GLfloat						vertices[1];
    483 	map<string, string>			args;
    484 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
    485 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
    486 
    487 	ctx.glUseProgram(program.getProgram());
    488 	ctx.expectError(GL_NO_ERROR);
    489 
    490 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    491 	ctx.glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
    492 	ctx.expectError(GL_INVALID_ENUM);
    493 	ctx.endSection();
    494 
    495 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    496 	ctx.glDrawElements(GL_POINTS, 1, -1, vertices);
    497 	ctx.expectError(GL_INVALID_ENUM);
    498 	ctx.glDrawElements(GL_POINTS, 1, GL_FLOAT, vertices);
    499 	ctx.expectError(GL_INVALID_ENUM);
    500 	ctx.endSection();
    501 
    502 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    503 	ctx.glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
    504 	ctx.expectError(GL_INVALID_VALUE);
    505 	ctx.endSection();
    506 
    507 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    508 	ctx.glGenFramebuffers(1, &fbo);
    509 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    510 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    511 	ctx.glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
    512 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    513 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    514 	ctx.glDeleteFramebuffers(1, &fbo);
    515 	ctx.endSection();
    516 
    517 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
    518 	{
    519 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
    520 		const char* tfVarying = "gl_Position";
    521 
    522 		ctx.glGenBuffers(1, &buf);
    523 		ctx.glGenTransformFeedbacks(1, &tfID);
    524 
    525 		ctx.glUseProgram(program.getProgram());
    526 		ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
    527 		ctx.glLinkProgram(program.getProgram());
    528 		ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
    529 		ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
    530 		ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
    531 		ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
    532 		ctx.glBeginTransformFeedback(GL_POINTS);
    533 		ctx.expectError(GL_NO_ERROR);
    534 
    535 		ctx.glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
    536 		ctx.expectError(GL_INVALID_OPERATION);
    537 
    538 		ctx.glPauseTransformFeedback();
    539 		ctx.glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
    540 		ctx.expectError(GL_NO_ERROR);
    541 
    542 		ctx.glEndTransformFeedback();
    543 		ctx.glDeleteBuffers(1, &buf);
    544 		ctx.glDeleteTransformFeedbacks(1, &tfID);
    545 		ctx.expectError(GL_NO_ERROR);
    546 		ctx.endSection();
    547 	}
    548 
    549 	ctx.glUseProgram(0);
    550 }
    551 
    552 void draw_elements_invalid_program (NegativeTestContext& ctx)
    553 {
    554 	ctx.glUseProgram(0);
    555 	GLuint	fbo = 0;
    556 	GLfloat	vertices[1];
    557 
    558 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    559 	ctx.glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
    560 	ctx.expectError(GL_INVALID_ENUM);
    561 	ctx.endSection();
    562 
    563 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    564 	ctx.glDrawElements(GL_POINTS, 1, -1, vertices);
    565 	ctx.expectError(GL_INVALID_ENUM);
    566 	ctx.glDrawElements(GL_POINTS, 1, GL_FLOAT, vertices);
    567 	ctx.expectError(GL_INVALID_ENUM);
    568 	ctx.endSection();
    569 
    570 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    571 	ctx.glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
    572 	ctx.expectError(GL_INVALID_VALUE);
    573 	ctx.endSection();
    574 
    575 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    576 	ctx.glGenFramebuffers(1, &fbo);
    577 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    578 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    579 	ctx.glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
    580 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    581 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    582 	ctx.glDeleteFramebuffers(1, &fbo);
    583 	ctx.endSection();
    584 }
    585 
    586 void draw_elements_incomplete_primitive (NegativeTestContext& ctx)
    587 {
    588 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
    589 	GLuint						fbo		= 0;
    590 	GLuint						buf		= 0;
    591 	GLuint						tfID	= 0;
    592 	GLfloat						vertices[1];
    593 	map<string, string>			args;
    594 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
    595 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
    596 
    597 	ctx.glUseProgram(program.getProgram());
    598 	ctx.expectError(GL_NO_ERROR);
    599 
    600 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    601 	ctx.glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
    602 	ctx.expectError(GL_INVALID_ENUM);
    603 	ctx.endSection();
    604 
    605 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    606 	ctx.glDrawElements(GL_TRIANGLES, 1, -1, vertices);
    607 	ctx.expectError(GL_INVALID_ENUM);
    608 	ctx.glDrawElements(GL_TRIANGLES, 1, GL_FLOAT, vertices);
    609 	ctx.expectError(GL_INVALID_ENUM);
    610 	ctx.endSection();
    611 
    612 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    613 	ctx.glDrawElements(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices);
    614 	ctx.expectError(GL_INVALID_VALUE);
    615 	ctx.endSection();
    616 
    617 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    618 	ctx.glGenFramebuffers(1, &fbo);
    619 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    620 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    621 	ctx.glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
    622 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    623 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    624 	ctx.glDeleteFramebuffers(1, &fbo);
    625 	ctx.endSection();
    626 
    627 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
    628 	{
    629 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
    630 		const char* tfVarying= "gl_Position";
    631 
    632 		ctx.glGenBuffers(1, &buf);
    633 		ctx.glGenTransformFeedbacks(1, &tfID);
    634 
    635 		ctx.glUseProgram(program.getProgram());
    636 		ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
    637 		ctx.glLinkProgram(program.getProgram());
    638 		ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
    639 		ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
    640 		ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
    641 		ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
    642 		ctx.glBeginTransformFeedback(GL_TRIANGLES);
    643 		ctx.expectError(GL_NO_ERROR);
    644 
    645 		ctx.glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
    646 		ctx.expectError(GL_INVALID_OPERATION);
    647 
    648 		ctx.glPauseTransformFeedback();
    649 		ctx.glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
    650 		ctx.expectError(GL_NO_ERROR);
    651 
    652 		ctx.glEndTransformFeedback();
    653 		ctx.glDeleteBuffers(1, &buf);
    654 		ctx.glDeleteTransformFeedbacks(1, &tfID);
    655 		ctx.expectError(GL_NO_ERROR);
    656 		ctx.endSection();
    657 	}
    658 
    659 	ctx.glUseProgram(0);
    660 }
    661 
    662 void draw_elements_base_vertex (NegativeTestContext& ctx)
    663 {
    664 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
    665 
    666 	GLuint	fbo = 0;
    667 	GLfloat	vertices[1];
    668 
    669 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    670 	ctx.glDrawElementsBaseVertex(-1, 1, GL_UNSIGNED_INT, vertices, 1);
    671 	ctx.expectError(GL_INVALID_ENUM);
    672 	ctx.endSection();
    673 
    674 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    675 	ctx.glDrawElementsBaseVertex(GL_POINTS, 1, -1, vertices, 1);
    676 	ctx.expectError(GL_INVALID_ENUM);
    677 	ctx.glDrawElementsBaseVertex(GL_POINTS, 1, GL_FLOAT, vertices, 1);
    678 	ctx.expectError(GL_INVALID_ENUM);
    679 	ctx.endSection();
    680 
    681 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
    682 	ctx.glDrawElementsBaseVertex(GL_POINTS, -1, GL_UNSIGNED_INT, vertices, 1);
    683 	ctx.expectError(GL_INVALID_VALUE);
    684 	ctx.endSection();
    685 
    686 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    687 	ctx.glGenFramebuffers(1, &fbo);
    688 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    689 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    690 	ctx.glDrawElementsBaseVertex(GL_POINTS, 1, GL_UNSIGNED_INT, vertices, 1);
    691 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    692 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    693 	ctx.glDeleteFramebuffers(1, &fbo);
    694 	ctx.endSection();
    695 }
    696 
    697 void draw_arrays_instanced (NegativeTestContext& ctx)
    698 {
    699 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
    700 	GLuint						fbo		= 0;
    701 	map<string, string>			args;
    702 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
    703 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
    704 
    705 	ctx.glUseProgram(program.getProgram());
    706 	ctx.expectError(GL_NO_ERROR);
    707 	ctx.glVertexAttribDivisor(0, 1);
    708 	ctx.expectError(GL_NO_ERROR);
    709 
    710 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    711 	ctx.glDrawArraysInstanced(-1, 0, 1, 1);
    712 	ctx.expectError(GL_INVALID_ENUM);
    713 	ctx.endSection();
    714 
    715 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    716 	ctx.glDrawArraysInstanced(GL_POINTS, 0, -1, 1);
    717 	ctx.expectError(GL_INVALID_VALUE);
    718 	ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, -1);
    719 	ctx.expectError(GL_INVALID_VALUE);
    720 	ctx.endSection();
    721 
    722 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    723 	ctx.glGenFramebuffers(1, &fbo);
    724 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    725 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    726 	ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
    727 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    728 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    729 	ctx.glDeleteFramebuffers(1, &fbo);
    730 	ctx.endSection();
    731 
    732 	ctx.glUseProgram(0);
    733 }
    734 
    735 void draw_arrays_instanced_invalid_program (NegativeTestContext& ctx)
    736 {
    737 	ctx.glUseProgram(0);
    738 	GLuint fbo = 0;
    739 	ctx.glVertexAttribDivisor(0, 1);
    740 	ctx.expectError(GL_NO_ERROR);
    741 
    742 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    743 	ctx.glDrawArraysInstanced(-1, 0, 1, 1);
    744 	ctx.expectError(GL_INVALID_ENUM);
    745 	ctx.endSection();
    746 
    747 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    748 	ctx.glDrawArraysInstanced(GL_POINTS, 0, -1, 1);
    749 	ctx.expectError(GL_INVALID_VALUE);
    750 	ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, -1);
    751 	ctx.expectError(GL_INVALID_VALUE);
    752 	ctx.endSection();
    753 
    754 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    755 	ctx.glGenFramebuffers(1, &fbo);
    756 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    757 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    758 	ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
    759 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    760 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    761 	ctx.glDeleteFramebuffers(1, &fbo);
    762 	ctx.endSection();
    763 }
    764 
    765 void draw_arrays_instanced_incomplete_primitive (NegativeTestContext& ctx)
    766 {
    767 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
    768 	GLuint						fbo		= 0;
    769 	map<string, string>			args;
    770 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
    771 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
    772 
    773 	ctx.glVertexAttribDivisor(0, 1);
    774 	ctx.expectError(GL_NO_ERROR);
    775 
    776 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    777 	ctx.glDrawArraysInstanced(-1, 0, 1, 1);
    778 	ctx.expectError(GL_INVALID_ENUM);
    779 	ctx.endSection();
    780 
    781 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    782 	ctx.glDrawArraysInstanced(GL_TRIANGLES, 0, -1, 1);
    783 	ctx.expectError(GL_INVALID_VALUE);
    784 	ctx.glDrawArraysInstanced(GL_TRIANGLES, 0, 1, -1);
    785 	ctx.expectError(GL_INVALID_VALUE);
    786 	ctx.endSection();
    787 
    788 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    789 	ctx.glGenFramebuffers(1, &fbo);
    790 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    791 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    792 	ctx.glDrawArraysInstanced(GL_TRIANGLES, 0, 1, 1);
    793 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    794 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    795 	ctx.glDeleteFramebuffers(1, &fbo);
    796 	ctx.endSection();
    797 
    798 	ctx.glUseProgram(0);
    799 }
    800 
    801 void draw_elements_instanced (NegativeTestContext& ctx)
    802 {
    803 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
    804 	GLuint						fbo		= 0;
    805 	GLuint						buf		= 0;
    806 	GLuint						tfID	= 0;
    807 	GLfloat						vertices[1];
    808 	map<string, string>			args;
    809 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
    810 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
    811 
    812 	ctx.glUseProgram(program.getProgram());
    813 	ctx.glVertexAttribDivisor(0, 1);
    814 	ctx.expectError(GL_NO_ERROR);
    815 
    816 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    817 	ctx.glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
    818 	ctx.expectError(GL_INVALID_ENUM);
    819 	ctx.endSection();
    820 
    821 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    822 	ctx.glDrawElementsInstanced(GL_POINTS, 1, -1, vertices, 1);
    823 	ctx.expectError(GL_INVALID_ENUM);
    824 	ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_FLOAT, vertices, 1);
    825 	ctx.expectError(GL_INVALID_ENUM);
    826 	ctx.endSection();
    827 
    828 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    829 	ctx.glDrawElementsInstanced(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1);
    830 	ctx.expectError(GL_INVALID_VALUE);
    831 	ctx.glDrawElementsInstanced(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1);
    832 	ctx.expectError(GL_INVALID_VALUE);
    833 	ctx.endSection();
    834 
    835 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    836 	ctx.glGenFramebuffers(1, &fbo);
    837 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    838 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    839 	ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
    840 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    841 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    842 	ctx.glDeleteFramebuffers(1, &fbo);
    843 	ctx.endSection();
    844 
    845 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
    846 	{
    847 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
    848 		const char* tfVarying = "gl_Position";
    849 
    850 		ctx.glGenBuffers(1, &buf);
    851 		ctx.glGenTransformFeedbacks(1, &tfID);
    852 
    853 		ctx.glUseProgram(program.getProgram());
    854 		ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
    855 		ctx.glLinkProgram(program.getProgram());
    856 		ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
    857 		ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
    858 		ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
    859 		ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
    860 		ctx.glBeginTransformFeedback(GL_POINTS);
    861 		ctx.expectError(GL_NO_ERROR);
    862 
    863 		ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
    864 		ctx.expectError(GL_INVALID_OPERATION);
    865 
    866 		ctx.glPauseTransformFeedback();
    867 		ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
    868 		ctx.expectError(GL_NO_ERROR);
    869 
    870 		ctx.glEndTransformFeedback();
    871 		ctx.glDeleteBuffers(1, &buf);
    872 		ctx.glDeleteTransformFeedbacks(1, &tfID);
    873 		ctx.expectError(GL_NO_ERROR);
    874 		ctx.endSection();
    875 	}
    876 
    877 	ctx.glUseProgram(0);
    878 }
    879 
    880 void draw_elements_instanced_invalid_program (NegativeTestContext& ctx)
    881 {
    882 	ctx.glUseProgram(0);
    883 	GLuint fbo = 0;
    884 	GLfloat vertices[1];
    885 	ctx.glVertexAttribDivisor(0, 1);
    886 	ctx.expectError(GL_NO_ERROR);
    887 
    888 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    889 	ctx.glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
    890 	ctx.expectError(GL_INVALID_ENUM);
    891 	ctx.endSection();
    892 
    893 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
    894 	ctx.glDrawElementsInstanced(GL_POINTS, 1, -1, vertices, 1);
    895 	ctx.expectError(GL_INVALID_ENUM);
    896 	ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_FLOAT, vertices, 1);
    897 	ctx.expectError(GL_INVALID_ENUM);
    898 	ctx.endSection();
    899 
    900 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    901 	ctx.glDrawElementsInstanced(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1);
    902 	ctx.expectError(GL_INVALID_VALUE);
    903 	ctx.glDrawElementsInstanced(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1);
    904 	ctx.expectError(GL_INVALID_VALUE);
    905 	ctx.endSection();
    906 
    907 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    908 	ctx.glGenFramebuffers(1, &fbo);
    909 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    910 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    911 	ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
    912 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    913 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    914 	ctx.glDeleteFramebuffers(1, &fbo);
    915 	ctx.endSection();
    916 }
    917 
    918 void draw_elements_instanced_incomplete_primitive (NegativeTestContext& ctx)
    919 {
    920 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
    921 	GLuint						fbo		= 0;
    922 	GLuint						buf		= 0;
    923 	GLuint						tfID	= 0;
    924 	GLfloat						vertices[1];
    925 	map<string, string>			args;
    926 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
    927 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
    928 
    929 	ctx.glUseProgram(program.getProgram());
    930 	ctx.glVertexAttribDivisor(0, 1);
    931 	ctx.expectError(GL_NO_ERROR);
    932 
    933 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
    934 	ctx.glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
    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.glDrawElementsInstanced(GL_TRIANGLES, 1, -1, vertices, 1);
    940 	ctx.expectError(GL_INVALID_ENUM);
    941 	ctx.glDrawElementsInstanced(GL_TRIANGLES, 1, GL_FLOAT, vertices, 1);
    942 	ctx.expectError(GL_INVALID_ENUM);
    943 	ctx.endSection();
    944 
    945 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
    946 	ctx.glDrawElementsInstanced(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices, 1);
    947 	ctx.expectError(GL_INVALID_VALUE);
    948 	ctx.glDrawElementsInstanced(GL_TRIANGLES, 11, GL_UNSIGNED_BYTE, vertices, -1);
    949 	ctx.expectError(GL_INVALID_VALUE);
    950 	ctx.endSection();
    951 
    952 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    953 	ctx.glGenFramebuffers(1, &fbo);
    954 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    955 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    956 	ctx.glDrawElementsInstanced(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
    957 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    958 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
    959 	ctx.glDeleteFramebuffers(1, &fbo);
    960 	ctx.endSection();
    961 
    962 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
    963 	{
    964 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
    965 		const char* tfVarying= "gl_Position";
    966 
    967 		ctx.glGenBuffers(1, &buf);
    968 		ctx.glGenTransformFeedbacks(1, &tfID);
    969 
    970 		ctx.glUseProgram(program.getProgram());
    971 		ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
    972 		ctx.glLinkProgram(program.getProgram());
    973 		ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
    974 		ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
    975 		ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
    976 		ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
    977 		ctx.glBeginTransformFeedback(GL_TRIANGLES);
    978 		ctx.expectError(GL_NO_ERROR);
    979 
    980 		ctx.glDrawElementsInstanced(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
    981 		ctx.expectError(GL_INVALID_OPERATION);
    982 
    983 		ctx.glPauseTransformFeedback();
    984 		ctx.glDrawElementsInstanced	(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
    985 		ctx.expectError(GL_NO_ERROR);
    986 
    987 		ctx.glEndTransformFeedback();
    988 		ctx.glDeleteBuffers(1, &buf);
    989 		ctx.glDeleteTransformFeedbacks(1, &tfID);
    990 		ctx.expectError(GL_NO_ERROR);
    991 		ctx.endSection();
    992 	}
    993 
    994 	ctx.glUseProgram(0);
    995 }
    996 
    997 void draw_elements_instanced_base_vertex (NegativeTestContext& ctx)
    998 {
    999 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
   1000 
   1001 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
   1002 	GLuint						fbo		= 0;
   1003 	GLfloat						vertices[1];
   1004 	map<string, string>			args;
   1005 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
   1006 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
   1007 
   1008 	ctx.glUseProgram(program.getProgram());
   1009 	ctx.glVertexAttribDivisor(0, 1);
   1010 	ctx.expectError(GL_NO_ERROR);
   1011 
   1012 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
   1013 	ctx.glDrawElementsInstancedBaseVertex(-1, 1, GL_UNSIGNED_BYTE, vertices, 1, 1);
   1014 	ctx.expectError(GL_INVALID_ENUM);
   1015 	ctx.endSection();
   1016 
   1017 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
   1018 	ctx.glDrawElementsInstancedBaseVertex(GL_POINTS, 1, -1, vertices, 1, 1);
   1019 	ctx.expectError(GL_INVALID_ENUM);
   1020 	ctx.glDrawElementsInstancedBaseVertex(GL_POINTS, 1, GL_FLOAT, vertices, 1, 1);
   1021 	ctx.expectError(GL_INVALID_ENUM);
   1022 	ctx.endSection();
   1023 
   1024 	ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
   1025 	ctx.glDrawElementsInstancedBaseVertex(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1, 1);
   1026 	ctx.expectError(GL_INVALID_VALUE);
   1027 	ctx.glDrawElementsInstancedBaseVertex(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1, 1);
   1028 	ctx.expectError(GL_INVALID_VALUE);
   1029 	ctx.endSection();
   1030 
   1031 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
   1032 	ctx.glGenFramebuffers(1, &fbo);
   1033 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1034 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
   1035 	ctx.glDrawElementsInstancedBaseVertex(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1, 1);
   1036 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
   1037 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   1038 	ctx.glDeleteFramebuffers(1, &fbo);
   1039 	ctx.endSection();
   1040 
   1041 	ctx.glUseProgram(0);
   1042 }
   1043 
   1044 void draw_range_elements (NegativeTestContext& ctx)
   1045 {
   1046 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
   1047 	GLuint						fbo		= 0;
   1048 	GLuint						buf		= 0;
   1049 	GLuint						tfID	= 0;
   1050 	GLfloat						vertices[1];
   1051 	map<string, string>			args;
   1052 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
   1053 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
   1054 
   1055 	ctx.glUseProgram(program.getProgram());
   1056 	ctx.expectError(GL_NO_ERROR);
   1057 
   1058 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
   1059 	ctx.glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
   1060 	ctx.expectError(GL_INVALID_ENUM);
   1061 	ctx.endSection();
   1062 
   1063 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
   1064 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, -1, vertices);
   1065 	ctx.expectError(GL_INVALID_ENUM);
   1066 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices);
   1067 	ctx.expectError(GL_INVALID_ENUM);
   1068 	ctx.endSection();
   1069 
   1070 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
   1071 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
   1072 	ctx.expectError(GL_INVALID_VALUE);
   1073 	ctx.endSection();
   1074 
   1075 	ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
   1076 	ctx.glDrawRangeElements(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
   1077 	ctx.expectError(GL_INVALID_VALUE);
   1078 	ctx.endSection();
   1079 
   1080 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
   1081 	ctx.glGenFramebuffers(1, &fbo);
   1082 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1083 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
   1084 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
   1085 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
   1086 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   1087 	ctx.glDeleteFramebuffers(1, &fbo);
   1088 	ctx.endSection();
   1089 
   1090 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
   1091 	{
   1092 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
   1093 		const char* tfVarying= "gl_Position";
   1094 
   1095 		ctx.glGenBuffers(1, &buf);
   1096 		ctx.glGenTransformFeedbacks(1, &tfID);
   1097 
   1098 		ctx.glUseProgram(program.getProgram());
   1099 		ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
   1100 		ctx.glLinkProgram(program.getProgram());
   1101 		ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
   1102 		ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
   1103 		ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
   1104 		ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
   1105 		ctx.glBeginTransformFeedback(GL_POINTS);
   1106 		ctx.expectError(GL_NO_ERROR);
   1107 
   1108 		ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
   1109 		ctx.expectError(GL_INVALID_OPERATION);
   1110 
   1111 		ctx.glPauseTransformFeedback();
   1112 		ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
   1113 		ctx.expectError(GL_NO_ERROR);
   1114 
   1115 		ctx.glEndTransformFeedback();
   1116 		ctx.glDeleteBuffers(1, &buf);
   1117 		ctx.glDeleteTransformFeedbacks(1, &tfID);
   1118 		ctx.expectError(GL_NO_ERROR);
   1119 		ctx.endSection();
   1120 	}
   1121 
   1122 	ctx.glUseProgram(0);
   1123 }
   1124 
   1125 void draw_range_elements_invalid_program (NegativeTestContext& ctx)
   1126 {
   1127 	ctx.glUseProgram(0);
   1128 	GLuint fbo = 0;
   1129 	GLfloat vertices[1];
   1130 
   1131 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
   1132 	ctx.glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
   1133 	ctx.expectError(GL_INVALID_ENUM);
   1134 	ctx.endSection();
   1135 
   1136 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
   1137 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, -1, vertices);
   1138 	ctx.expectError(GL_INVALID_ENUM);
   1139 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices);
   1140 	ctx.expectError(GL_INVALID_ENUM);
   1141 	ctx.endSection();
   1142 
   1143 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
   1144 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
   1145 	ctx.expectError(GL_INVALID_VALUE);
   1146 	ctx.endSection();
   1147 
   1148 	ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
   1149 	ctx.glDrawRangeElements(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
   1150 	ctx.expectError(GL_INVALID_VALUE);
   1151 	ctx.endSection();
   1152 
   1153 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
   1154 	ctx.glGenFramebuffers(1, &fbo);
   1155 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1156 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
   1157 	ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
   1158 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
   1159 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   1160 	ctx.glDeleteFramebuffers(1, &fbo);
   1161 	ctx.endSection();
   1162 }
   1163 
   1164 void draw_range_elements_incomplete_primitive (NegativeTestContext& ctx)
   1165 {
   1166 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
   1167 	GLuint						fbo		= 0;
   1168 	GLuint						buf		= 0;
   1169 	GLuint						tfID	= 0;
   1170 	GLfloat						vertices[1];
   1171 	map<string, string>			args;
   1172 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
   1173 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
   1174 
   1175 	ctx.glUseProgram(program.getProgram());
   1176 	ctx.expectError(GL_NO_ERROR);
   1177 
   1178 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
   1179 	ctx.glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
   1180 	ctx.expectError(GL_INVALID_ENUM);
   1181 	ctx.endSection();
   1182 
   1183 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
   1184 	ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, -1, vertices);
   1185 	ctx.expectError(GL_INVALID_ENUM);
   1186 	ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_FLOAT, vertices);
   1187 	ctx.expectError(GL_INVALID_ENUM);
   1188 	ctx.endSection();
   1189 
   1190 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
   1191 	ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
   1192 	ctx.expectError(GL_INVALID_VALUE);
   1193 	ctx.endSection();
   1194 
   1195 	ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
   1196 	ctx.glDrawRangeElements(GL_TRIANGLES, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
   1197 	ctx.expectError(GL_INVALID_VALUE);
   1198 	ctx.endSection();
   1199 
   1200 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
   1201 	ctx.glGenFramebuffers(1, &fbo);
   1202 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1203 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
   1204 	ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
   1205 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
   1206 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   1207 	ctx.glDeleteFramebuffers(1, &fbo);
   1208 	ctx.endSection();
   1209 
   1210 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
   1211 	{
   1212 		ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
   1213 		const char* tfVarying = "gl_Position";
   1214 
   1215 		ctx.glGenBuffers(1, &buf);
   1216 		ctx.glGenTransformFeedbacks(1, &tfID);
   1217 
   1218 		ctx.glUseProgram(program.getProgram());
   1219 		ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
   1220 		ctx.glLinkProgram(program.getProgram());
   1221 		ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
   1222 		ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
   1223 		ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
   1224 		ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
   1225 		ctx.glBeginTransformFeedback(GL_TRIANGLES);
   1226 		ctx.expectError(GL_NO_ERROR);
   1227 
   1228 		ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
   1229 		ctx.expectError(GL_INVALID_OPERATION);
   1230 
   1231 		ctx.glPauseTransformFeedback();
   1232 		ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
   1233 		ctx.expectError(GL_NO_ERROR);
   1234 
   1235 		ctx.glEndTransformFeedback();
   1236 		ctx.glDeleteBuffers(1, &buf);
   1237 		ctx.glDeleteTransformFeedbacks(1, &tfID);
   1238 		ctx.expectError(GL_NO_ERROR);
   1239 		ctx.endSection();
   1240 	}
   1241 
   1242 	ctx.glUseProgram(0);
   1243 }
   1244 
   1245 void draw_range_elements_base_vertex (NegativeTestContext& ctx)
   1246 {
   1247 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
   1248 
   1249 	const bool					isES32	= glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
   1250 	GLuint						fbo		= 0;
   1251 	GLfloat						vertices[1];
   1252 	map<string, string>			args;
   1253 	args["GLSL_VERSION_STRING"]			= isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
   1254 	glu::ShaderProgram			program	(ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
   1255 
   1256 	ctx.glUseProgram(program.getProgram());
   1257 	ctx.expectError(GL_NO_ERROR);
   1258 
   1259 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
   1260 	ctx.glDrawRangeElementsBaseVertex(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices, 1);
   1261 	ctx.expectError(GL_INVALID_ENUM);
   1262 	ctx.endSection();
   1263 
   1264 	ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
   1265 	ctx.glDrawRangeElementsBaseVertex(GL_POINTS, 0, 1, 1, -1, vertices, 1);
   1266 	ctx.expectError(GL_INVALID_ENUM);
   1267 	ctx.glDrawRangeElementsBaseVertex(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices, 1);
   1268 	ctx.expectError(GL_INVALID_ENUM);
   1269 	ctx.endSection();
   1270 
   1271 	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
   1272 	ctx.glDrawRangeElementsBaseVertex(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices, 1);
   1273 	ctx.expectError(GL_INVALID_VALUE);
   1274 	ctx.endSection();
   1275 
   1276 	ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
   1277 	ctx.glDrawRangeElementsBaseVertex(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices, 1);
   1278 	ctx.expectError(GL_INVALID_VALUE);
   1279 	ctx.endSection();
   1280 
   1281 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
   1282 	ctx.glGenFramebuffers(1, &fbo);
   1283 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1284 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
   1285 	ctx.glDrawRangeElementsBaseVertex(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices, 1);
   1286 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
   1287 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   1288 	ctx.glDeleteFramebuffers(1, &fbo);
   1289 	ctx.endSection();
   1290 
   1291 	ctx.glUseProgram(0);
   1292 }
   1293 
   1294 std::vector<FunctionContainer> getNegativeVertexArrayApiTestFunctions ()
   1295 {
   1296 	FunctionContainer funcs[] =
   1297 	{
   1298 		{vertex_attribf,								"vertex_attribf",								"Invalid glVertexAttrib{1234}f() usage"				},
   1299 		{vertex_attribfv,								"vertex_attribfv",								"Invalid glVertexAttrib{1234}fv() usage"			},
   1300 		{vertex_attribi4,								"vertex_attribi4",								"Invalid glVertexAttribI4{i|ui}f() usage"			},
   1301 		{vertex_attribi4v,								"vertex_attribi4v",								"Invalid glVertexAttribI4{i|ui}fv() usage"			},
   1302 		{vertex_attrib_pointer,							"vertex_attrib_pointer",						"Invalid glVertexAttribPointer() usage"				},
   1303 		{vertex_attrib_i_pointer,						"vertex_attrib_i_pointer",						"Invalid glVertexAttribPointer() usage"				},
   1304 		{vertex_attrib_format,							"vertex_attrib_format",							"Invalid glVertexAttribFormat() usage"				},
   1305 		{vertex_attrib_i_format,						"vertex_attrib_i_format",						"Invalid glVertexAttribIFormat() usage"				},
   1306 		{enable_vertex_attrib_array,					"enable_vertex_attrib_array",					"Invalid glEnableVertexAttribArray() usage"			},
   1307 		{disable_vertex_attrib_array,					"disable_vertex_attrib_array",					"Invalid glDisableVertexAttribArray() usage"		},
   1308 		{gen_vertex_arrays,								"gen_vertex_arrays",							"Invalid glGenVertexArrays() usage"					},
   1309 		{bind_vertex_array,								"bind_vertex_array",							"Invalid glBindVertexArray() usage"					},
   1310 		{delete_vertex_arrays,							"delete_vertex_arrays",							"Invalid glDeleteVertexArrays() usage"				},
   1311 		{vertex_attrib_divisor,							"vertex_attrib_divisor",						"Invalid glVertexAttribDivisor() usage"				},
   1312 		{draw_arrays,									"draw_arrays",									"Invalid glDrawArrays() usage"						},
   1313 		{draw_arrays_invalid_program,					"draw_arrays_invalid_program",					"Invalid glDrawArrays() usage"						},
   1314 		{draw_arrays_incomplete_primitive,				"draw_arrays_incomplete_primitive",				"Invalid glDrawArrays() usage"						},
   1315 		{draw_elements,									"draw_elements",								"Invalid glDrawElements() usage"					},
   1316 		{draw_elements_base_vertex,						"draw_elements_base_vertex",					"Invalid glDrawElementsBaseVertex() usage"			},
   1317 		{draw_elements_invalid_program,					"draw_elements_invalid_program",				"Invalid glDrawElements() usage"					},
   1318 		{draw_elements_incomplete_primitive,			"draw_elements_incomplete_primitive",			"Invalid glDrawElements() usage"					},
   1319 		{draw_arrays_instanced,							"draw_arrays_instanced",						"Invalid glDrawArraysInstanced() usage"				},
   1320 		{draw_arrays_instanced_invalid_program,			"draw_arrays_instanced_invalid_program",		"Invalid glDrawArraysInstanced() usage"				},
   1321 		{draw_arrays_instanced_incomplete_primitive,	"draw_arrays_instanced_incomplete_primitive",	"Invalid glDrawArraysInstanced() usage"				},
   1322 		{draw_elements_instanced,						"draw_elements_instanced",						"Invalid glDrawElementsInstanced() usage"			},
   1323 		{draw_elements_instanced_invalid_program,		"draw_elements_instanced_invalid_program",		"Invalid glDrawElementsInstanced() usage"			},
   1324 		{draw_elements_instanced_incomplete_primitive,	"draw_elements_instanced_incomplete_primitive",	"Invalid glDrawElementsInstanced() usage"			},
   1325 		{draw_elements_instanced_base_vertex,			"draw_elements_instanced_base_vertex",			"Invalid glDrawElementsInstancedBaseVertex() usage"	},
   1326 		{draw_range_elements,							"draw_range_elements",							"Invalid glDrawRangeElements() usage"				},
   1327 		{draw_range_elements_invalid_program,			"draw_range_elements_invalid_program",			"Invalid glDrawRangeElements() usage"				},
   1328 		{draw_range_elements_incomplete_primitive,		"draw_range_elements_incomplete_primitive",		"Invalid glDrawRangeElements() usage"				},
   1329 		{draw_range_elements_base_vertex,				"draw_range_elements_base_vertex",				"Invalid glDrawRangeElementsBaseVertex() usage"		},
   1330 	};
   1331 
   1332 	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
   1333 }
   1334 
   1335 } // NegativeTestShared
   1336 } // Functional
   1337 } // gles31
   1338 } // deqp
   1339