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