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 Buffer API tests. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "es31fNegativeBufferApiTests.hpp" 25 26 #include "gluCallLogWrapper.hpp" 27 #include "gluContextInfo.hpp" 28 29 #include "glwDefs.hpp" 30 #include "glwEnums.hpp" 31 32 namespace deqp 33 { 34 namespace gles31 35 { 36 namespace Functional 37 { 38 namespace NegativeTestShared 39 { 40 41 using tcu::TestLog; 42 using glu::CallLogWrapper; 43 using namespace glw; 44 45 // Buffers 46 void bind_buffer (NegativeTestContext& ctx) 47 { 48 ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the allowable values."); 49 ctx.glBindBuffer(-1, 0); 50 ctx.expectError(GL_INVALID_ENUM); 51 ctx.endSection(); 52 } 53 54 void delete_buffers (NegativeTestContext& ctx) 55 { 56 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative."); 57 ctx.glDeleteBuffers(-1, 0); 58 ctx.expectError(GL_INVALID_VALUE); 59 ctx.endSection(); 60 } 61 62 void gen_buffers (NegativeTestContext& ctx) 63 { 64 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative."); 65 ctx.glGenBuffers(-1, 0); 66 ctx.expectError(GL_INVALID_VALUE); 67 ctx.endSection(); 68 } 69 70 void buffer_data (NegativeTestContext& ctx) 71 { 72 GLuint buffer = 0x1234; 73 ctx.glGenBuffers(1, &buffer); 74 ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer); 75 76 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER."); 77 ctx.glBufferData(-1, 0, NULL, GL_STREAM_DRAW); 78 ctx.expectError(GL_INVALID_ENUM); 79 ctx.endSection(); 80 81 ctx.beginSection("GL_INVALID_ENUM is generated if usage is not GL_STREAM_DRAW, GL_STATIC_DRAW, or GL_DYNAMIC_DRAW."); 82 ctx.glBufferData(GL_ARRAY_BUFFER, 0, NULL, -1); 83 ctx.expectError(GL_INVALID_ENUM); 84 ctx.endSection(); 85 86 ctx.beginSection("GL_INVALID_VALUE is generated if size is negative."); 87 ctx.glBufferData(GL_ARRAY_BUFFER, -1, NULL, GL_STREAM_DRAW); 88 ctx.expectError(GL_INVALID_VALUE); 89 ctx.endSection(); 90 91 ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target."); 92 ctx.glBindBuffer(GL_ARRAY_BUFFER, 0); 93 ctx.glBufferData(GL_ARRAY_BUFFER, 0, NULL, GL_STREAM_DRAW); 94 ctx.expectError(GL_INVALID_OPERATION); 95 ctx.endSection(); 96 97 ctx.glDeleteBuffers(1, &buffer); 98 } 99 100 void buffer_sub_data (NegativeTestContext& ctx) 101 { 102 GLuint buffer = 0x1234; 103 ctx.glGenBuffers(1, &buffer); 104 ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer); 105 ctx.glBufferData(GL_ARRAY_BUFFER, 10, 0, GL_STREAM_DRAW); 106 107 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER."); 108 ctx.glBufferSubData(-1, 1, 1, 0); 109 ctx.expectError(GL_INVALID_ENUM); 110 ctx.endSection(); 111 112 ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target."); 113 ctx.glBindBuffer(GL_ARRAY_BUFFER, 0); 114 ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, 1, 0); 115 ctx.expectError(GL_INVALID_OPERATION); 116 ctx.endSection(); 117 118 ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer object being updated is mapped."); 119 ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer); 120 ctx.glMapBufferRange(GL_ARRAY_BUFFER, 0, 5, GL_MAP_READ_BIT); 121 ctx.expectError(GL_NO_ERROR); 122 ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, 1, 0); 123 ctx.expectError(GL_INVALID_OPERATION); 124 ctx.endSection(); 125 126 ctx.glDeleteBuffers(1, &buffer); 127 } 128 129 void buffer_sub_data_size_offset (NegativeTestContext& ctx) 130 { 131 GLuint buffer = 0x1234; 132 ctx.glGenBuffers(1, &buffer); 133 ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer); 134 ctx.glBufferData(GL_ARRAY_BUFFER, 10, 0, GL_STREAM_DRAW); 135 136 ctx.beginSection("GL_INVALID_VALUE is generated if offset or size is negative, or if together they define a region of memory that extends beyond the buffer object's allocated data store."); 137 ctx.glBufferSubData(GL_ARRAY_BUFFER, -1, 1, 0); 138 ctx.expectError(GL_INVALID_VALUE); 139 ctx.glBufferSubData(GL_ARRAY_BUFFER, -1, -1, 0); 140 ctx.expectError(GL_INVALID_VALUE); 141 ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, -1, 0); 142 ctx.expectError(GL_INVALID_VALUE); 143 ctx.glBufferSubData(GL_ARRAY_BUFFER, 15, 1, 0); 144 ctx.expectError(GL_INVALID_VALUE); 145 ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, 15, 0); 146 ctx.expectError(GL_INVALID_VALUE); 147 ctx.glBufferSubData(GL_ARRAY_BUFFER, 8, 8, 0); 148 ctx.expectError(GL_INVALID_VALUE); 149 ctx.endSection(); 150 151 ctx.glDeleteBuffers(1, &buffer); 152 } 153 154 void clear (NegativeTestContext& ctx) 155 { 156 ctx.beginSection("GL_INVALID_VALUE is generated if any bit other than the three defined bits is set in mask."); 157 ctx.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 158 ctx.expectError(GL_NO_ERROR); 159 ctx.glClear(0x00000200); 160 ctx.expectError(GL_INVALID_VALUE); 161 ctx.glClear(0x00001000); 162 ctx.expectError(GL_INVALID_VALUE); 163 ctx.glClear(0x00000010); 164 ctx.expectError(GL_INVALID_VALUE); 165 ctx.endSection(); 166 } 167 168 void read_pixels (NegativeTestContext& ctx) 169 { 170 std::vector<GLubyte> ubyteData(4); 171 172 ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of format and type is unsupported."); 173 ctx.glReadPixels(0, 0, 1, 1, GL_LUMINANCE_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, &ubyteData[0]); 174 ctx.expectError(GL_INVALID_OPERATION); 175 ctx.endSection(); 176 177 ctx.beginSection("GL_INVALID_VALUE is generated if either width or height is negative."); 178 ctx.glReadPixels(0, 0, -1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]); 179 ctx.expectError(GL_INVALID_VALUE); 180 ctx.glReadPixels(0, 0, 1, -1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]); 181 ctx.expectError(GL_INVALID_VALUE); 182 ctx.glReadPixels(0, 0, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]); 183 ctx.expectError(GL_INVALID_VALUE); 184 ctx.endSection(); 185 186 ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete."); 187 GLuint fbo = 0x1234; 188 ctx.glGenFramebuffers(1, &fbo); 189 ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo); 190 ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER); 191 ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]); 192 ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 193 ctx.endSection(); 194 195 ctx.glDeleteFramebuffers(1, &fbo); 196 } 197 198 void read_pixels_format_mismatch (NegativeTestContext& ctx) 199 { 200 std::vector<GLubyte> ubyteData(4); 201 std::vector<GLushort> ushortData(4); 202 203 ctx.beginSection("Unsupported combinations of format and type will generate an INVALID_OPERATION error."); 204 ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]); 205 ctx.expectError(GL_INVALID_OPERATION); 206 ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]); 207 ctx.expectError(GL_INVALID_OPERATION); 208 ctx.glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]); 209 ctx.expectError(GL_INVALID_OPERATION); 210 ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]); 211 ctx.expectError(GL_INVALID_OPERATION); 212 ctx.glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]); 213 ctx.expectError(GL_INVALID_OPERATION); 214 ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]); 215 ctx.expectError(GL_INVALID_OPERATION); 216 ctx.endSection(); 217 218 ctx.beginSection("GL_RGBA/GL_UNSIGNED_BYTE is always accepted and the other acceptable pair can be discovered by querying GL_IMPLEMENTATION_COLOR_READ_FORMAT and GL_IMPLEMENTATION_COLOR_READ_TYPE."); 219 ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]); 220 ctx.expectError(GL_NO_ERROR); 221 GLint readFormat = 0x1234; 222 GLint readType = 0x1234; 223 ctx.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &readFormat); 224 ctx.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readType); 225 ctx.glReadPixels(0, 0, 1, 1, readFormat, readType, &ubyteData[0]); 226 ctx.expectError(GL_NO_ERROR); 227 ctx.endSection(); 228 } 229 230 void read_pixels_fbo_format_mismatch (NegativeTestContext& ctx) 231 { 232 std::vector<GLubyte> ubyteData(4); 233 std::vector<float> floatData(4); 234 deUint32 fbo = 0x1234; 235 deUint32 texture = 0x1234; 236 237 ctx.glGenTextures (1, &texture); 238 ctx.glBindTexture (GL_TEXTURE_2D, texture); 239 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 240 ctx.glGenFramebuffers (1, &fbo); 241 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 242 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 243 ctx.expectError (GL_NO_ERROR); 244 245 ctx.beginSection("GL_INVALID_OPERATION is generated if currently bound framebuffer format is incompatible with format and type."); 246 247 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 248 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 249 ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER); 250 ctx.expectError (GL_NO_ERROR); 251 ctx.glReadPixels (0, 0, 1, 1, GL_RGBA, GL_FLOAT, &floatData[0]); 252 ctx.expectError (GL_INVALID_OPERATION); 253 254 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL); 255 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 256 ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER); 257 ctx.expectError (GL_NO_ERROR); 258 ctx.glReadPixels (0, 0, 1, 1, GL_RGBA, GL_FLOAT, &floatData[0]); 259 ctx.expectError (GL_INVALID_OPERATION); 260 261 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL); 262 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 263 ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER); 264 ctx.expectError (GL_NO_ERROR); 265 ctx.glReadPixels (0, 0, 1, 1, GL_RGBA, GL_FLOAT, &floatData[0]); 266 ctx.expectError (GL_INVALID_OPERATION); 267 268 ctx.endSection(); 269 270 ctx.beginSection("GL_INVALID_OPERATION is generated if GL_READ_FRAMEBUFFER_BINDING is non-zero, the read framebuffer is complete, and the value of GL_SAMPLE_BUFFERS for the read framebuffer is greater than zero."); 271 272 int binding = -1; 273 int sampleBuffers = 0x1234; 274 deUint32 rbo = 0x1234; 275 276 ctx.glGenRenderbuffers(1, &rbo); 277 ctx.glBindRenderbuffer(GL_RENDERBUFFER, rbo); 278 ctx.glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 32, 32); 279 ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo); 280 281 ctx.glGetIntegerv (GL_READ_FRAMEBUFFER_BINDING, &binding); 282 ctx.getLog() << TestLog::Message << "// GL_READ_FRAMEBUFFER_BINDING: " << binding << TestLog::EndMessage; 283 ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER); 284 ctx.glGetIntegerv (GL_SAMPLE_BUFFERS, &sampleBuffers); 285 ctx.getLog() << TestLog::Message << "// GL_SAMPLE_BUFFERS: " << sampleBuffers << TestLog::EndMessage; 286 ctx.expectError (GL_NO_ERROR); 287 288 if (binding == 0 || sampleBuffers <= 0) 289 { 290 ctx.getLog() << TestLog::Message << "// ERROR: expected GL_READ_FRAMEBUFFER_BINDING to be non-zero and GL_SAMPLE_BUFFERS to be greater than zero" << TestLog::EndMessage; 291 ctx.fail("Got invalid value"); 292 } 293 else 294 { 295 ctx.glReadPixels (0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]); 296 ctx.expectError (GL_INVALID_OPERATION); 297 } 298 299 ctx.endSection(); 300 301 ctx.glBindRenderbuffer (GL_RENDERBUFFER, 0); 302 ctx.glBindTexture (GL_TEXTURE_2D, 0); 303 ctx.glBindFramebuffer (GL_FRAMEBUFFER, 0); 304 ctx.glDeleteFramebuffers (1, &fbo); 305 ctx.glDeleteTextures (1, &texture); 306 ctx.glDeleteRenderbuffers (1, &rbo); 307 } 308 309 void bind_buffer_range (NegativeTestContext& ctx) 310 { 311 deUint32 bufU = 0x1234; 312 ctx.glGenBuffers(1, &bufU); 313 ctx.glBindBuffer(GL_UNIFORM_BUFFER, bufU); 314 ctx.glBufferData(GL_UNIFORM_BUFFER, 16, NULL, GL_STREAM_DRAW); 315 316 deUint32 bufTF = 0x1234; 317 ctx.glGenBuffers(1, &bufTF); 318 ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, bufTF); 319 ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 16, NULL, GL_STREAM_DRAW); 320 321 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_TRANSFORM_FEEDBACK_BUFFER or GL_UNIFORM_BUFFER."); 322 ctx.glBindBufferRange(GL_ARRAY_BUFFER, 0, bufU, 0, 4); 323 ctx.expectError(GL_INVALID_ENUM); 324 ctx.endSection(); 325 326 ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TRANSFORM_FEEDBACK_BUFFER and index is greater than or equal to GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS."); 327 int maxTFSize = 0x1234; 328 ctx.glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTFSize); 329 ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, maxTFSize, bufTF, 0, 4); 330 ctx.expectError(GL_INVALID_VALUE); 331 ctx.endSection(); 332 333 ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_UNIFORM_BUFFER and index is greater than or equal to GL_MAX_UNIFORM_BUFFER_BINDINGS."); 334 int maxUSize = 0x1234; 335 ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUSize); 336 ctx.glBindBufferRange(GL_UNIFORM_BUFFER, maxUSize, bufU, 0, 4); 337 ctx.expectError(GL_INVALID_VALUE); 338 ctx.endSection(); 339 340 ctx.beginSection("GL_INVALID_VALUE is generated if size is less than or equal to zero."); 341 ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, 0, -1); 342 ctx.expectError(GL_INVALID_VALUE); 343 ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, 0, 0); 344 ctx.expectError(GL_INVALID_VALUE); 345 ctx.endSection(); 346 347 ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TRANSFORM_FEEDBACK_BUFFER and size or offset are not multiples of 4."); 348 ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 4, 5); 349 ctx.expectError(GL_INVALID_VALUE); 350 ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 5, 4); 351 ctx.expectError(GL_INVALID_VALUE); 352 ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 5, 7); 353 ctx.expectError(GL_INVALID_VALUE); 354 ctx.endSection(); 355 356 ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_UNIFORM_BUFFER and offset is not a multiple of GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT."); 357 int alignment = 0x1234; 358 ctx.glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &alignment); 359 ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, alignment+1, 4); 360 ctx.expectError(GL_INVALID_VALUE); 361 ctx.endSection(); 362 363 ctx.glDeleteBuffers(1, &bufU); 364 ctx.glDeleteBuffers(1, &bufTF); 365 } 366 367 void bind_buffer_base (NegativeTestContext& ctx) 368 { 369 deUint32 bufU = 0x1234; 370 ctx.glGenBuffers(1, &bufU); 371 ctx.glBindBuffer(GL_UNIFORM_BUFFER, bufU); 372 ctx.glBufferData(GL_UNIFORM_BUFFER, 16, NULL, GL_STREAM_DRAW); 373 374 deUint32 bufTF = 0x1234; 375 ctx.glGenBuffers(1, &bufTF); 376 ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, bufTF); 377 ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 16, NULL, GL_STREAM_DRAW); 378 ctx.expectError(GL_NO_ERROR); 379 380 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_TRANSFORM_FEEDBACK_BUFFER or GL_UNIFORM_BUFFER."); 381 ctx.glBindBufferBase(-1, 0, bufU); 382 ctx.expectError(GL_INVALID_ENUM); 383 ctx.glBindBufferBase(GL_ARRAY_BUFFER, 0, bufU); 384 ctx.expectError(GL_INVALID_ENUM); 385 ctx.endSection(); 386 387 ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_UNIFORM_BUFFER and index is greater than or equal to GL_MAX_UNIFORM_BUFFER_BINDINGS."); 388 int maxUSize = 0x1234; 389 ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUSize); 390 ctx.glBindBufferBase(GL_UNIFORM_BUFFER, maxUSize, bufU); 391 ctx.expectError(GL_INVALID_VALUE); 392 ctx.endSection(); 393 394 ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TRANSFORM_FEEDBACK_BUFFER andindex is greater than or equal to GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS."); 395 int maxTFSize = 0x1234; 396 ctx.glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTFSize); 397 ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, maxTFSize, bufTF); 398 ctx.expectError(GL_INVALID_VALUE); 399 ctx.endSection(); 400 401 ctx.glDeleteBuffers(1, &bufU); 402 ctx.glDeleteBuffers(1, &bufTF); 403 } 404 405 void clear_bufferiv (NegativeTestContext& ctx) 406 { 407 std::vector<int> data(32*32); 408 deUint32 fbo = 0x1234; 409 deUint32 texture = 0x1234; 410 411 ctx.glGenTextures (1, &texture); 412 ctx.glBindTexture (GL_TEXTURE_2D, texture); 413 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL); 414 ctx.glGenFramebuffers (1, &fbo); 415 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 416 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 417 ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER); 418 ctx.expectError (GL_NO_ERROR); 419 420 ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not an accepted value."); 421 ctx.glClearBufferiv(-1, 0, &data[0]); 422 ctx.expectError(GL_INVALID_ENUM); 423 ctx.glClearBufferiv(GL_FRAMEBUFFER, 0, &data[0]); 424 ctx.expectError(GL_INVALID_ENUM); 425 ctx.endSection(); 426 427 ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR, GL_FRONT, GL_BACK, GL_LEFT, GL_RIGHT, or GL_FRONT_AND_BACK and drawBuffer is greater than or equal to GL_MAX_DRAW_BUFFERS."); 428 int maxDrawBuffers = 0x1234; 429 ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers); 430 ctx.glClearBufferiv(GL_COLOR, maxDrawBuffers, &data[0]); 431 ctx.expectError(GL_INVALID_VALUE); 432 ctx.endSection(); 433 434 ctx.beginSection("GL_INVALID_ENUM is generated if buffer is GL_DEPTH or GL_DEPTH_STENCIL."); 435 ctx.glClearBufferiv(GL_DEPTH, 1, &data[0]); 436 ctx.expectError(GL_INVALID_ENUM); 437 ctx.glClearBufferiv(GL_DEPTH_STENCIL, 1, &data[0]); 438 ctx.expectError(GL_INVALID_ENUM); 439 ctx.endSection(); 440 441 ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_STENCIL and drawBuffer is not zero."); 442 ctx.glClearBufferiv(GL_STENCIL, 1, &data[0]); 443 ctx.expectError(GL_INVALID_VALUE); 444 ctx.endSection(); 445 446 ctx.glDeleteFramebuffers(1, &fbo); 447 ctx.glDeleteTextures(1, &texture); 448 } 449 450 void clear_bufferuiv (NegativeTestContext& ctx) 451 { 452 std::vector<deUint32> data(32*32); 453 deUint32 fbo = 0x1234; 454 deUint32 texture = 0x1234; 455 456 ctx.glGenTextures (1, &texture); 457 ctx.glBindTexture (GL_TEXTURE_2D, texture); 458 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL); 459 ctx.glGenFramebuffers (1, &fbo); 460 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 461 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 462 ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER); 463 ctx.expectError (GL_NO_ERROR); 464 465 ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not an accepted value."); 466 ctx.glClearBufferuiv(-1, 0, &data[0]); 467 ctx.expectError(GL_INVALID_ENUM); 468 ctx.glClearBufferuiv(GL_FRAMEBUFFER, 0, &data[0]); 469 ctx.expectError(GL_INVALID_ENUM); 470 ctx.endSection(); 471 472 ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR, GL_FRONT, GL_BACK, GL_LEFT, GL_RIGHT, or GL_FRONT_AND_BACK and drawBuffer is greater than or equal to GL_MAX_DRAW_BUFFERS."); 473 int maxDrawBuffers = 0x1234; 474 ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers); 475 ctx.glClearBufferuiv(GL_COLOR, maxDrawBuffers, &data[0]); 476 ctx.expectError(GL_INVALID_VALUE); 477 ctx.endSection(); 478 479 ctx.beginSection("GL_INVALID_ENUM is generated if buffer is GL_DEPTH, GL_STENCIL or GL_DEPTH_STENCIL."); 480 ctx.glClearBufferuiv(GL_DEPTH, 1, &data[0]); 481 ctx.expectError(GL_INVALID_ENUM); 482 ctx.glClearBufferuiv(GL_STENCIL, 1, &data[0]); 483 ctx.expectError(GL_INVALID_ENUM); 484 ctx.glClearBufferuiv(GL_DEPTH_STENCIL, 1, &data[0]); 485 ctx.expectError(GL_INVALID_ENUM); 486 ctx.endSection(); 487 488 ctx.glDeleteFramebuffers(1, &fbo); 489 ctx.glDeleteTextures(1, &texture); 490 } 491 492 void clear_bufferfv (NegativeTestContext& ctx) 493 { 494 std::vector<float> data(32*32); 495 deUint32 fbo = 0x1234; 496 deUint32 texture = 0x1234; 497 498 ctx.glGenTextures (1, &texture); 499 ctx.glBindTexture (GL_TEXTURE_2D, texture); 500 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA32F, 32, 32, 0, GL_RGBA, GL_FLOAT, NULL); 501 ctx.glGenFramebuffers (1, &fbo); 502 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 503 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 504 ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER); 505 ctx.expectError (GL_NO_ERROR); 506 507 ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not an accepted value."); 508 ctx.glClearBufferfv(-1, 0, &data[0]); 509 ctx.expectError(GL_INVALID_ENUM); 510 ctx.glClearBufferfv(GL_FRAMEBUFFER, 0, &data[0]); 511 ctx.expectError(GL_INVALID_ENUM); 512 ctx.endSection(); 513 514 ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR, GL_FRONT, GL_BACK, GL_LEFT, GL_RIGHT, or GL_FRONT_AND_BACK and drawBuffer is greater than or equal to GL_MAX_DRAW_BUFFERS."); 515 int maxDrawBuffers = 0x1234; 516 ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers); 517 ctx.glClearBufferfv(GL_COLOR, maxDrawBuffers, &data[0]); 518 ctx.expectError(GL_INVALID_VALUE); 519 ctx.endSection(); 520 521 ctx.beginSection("GL_INVALID_ENUM is generated if buffer is GL_STENCIL or GL_DEPTH_STENCIL."); 522 ctx.glClearBufferfv(GL_STENCIL, 1, &data[0]); 523 ctx.expectError(GL_INVALID_ENUM); 524 ctx.glClearBufferfv(GL_DEPTH_STENCIL, 1, &data[0]); 525 ctx.expectError(GL_INVALID_ENUM); 526 ctx.endSection(); 527 528 ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_DEPTH and drawBuffer is not zero."); 529 ctx.glClearBufferfv(GL_DEPTH, 1, &data[0]); 530 ctx.expectError(GL_INVALID_VALUE); 531 ctx.endSection(); 532 533 ctx.glDeleteFramebuffers(1, &fbo); 534 ctx.glDeleteTextures(1, &texture); 535 } 536 537 void clear_bufferfi (NegativeTestContext& ctx) 538 { 539 ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not an accepted value."); 540 ctx.glClearBufferfi(-1, 0, 1.0f, 1); 541 ctx.expectError(GL_INVALID_ENUM); 542 ctx.glClearBufferfi(GL_FRAMEBUFFER, 0, 1.0f, 1); 543 ctx.expectError(GL_INVALID_ENUM); 544 ctx.endSection(); 545 546 ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not GL_DEPTH_STENCIL."); 547 ctx.glClearBufferfi(GL_DEPTH, 0, 1.0f, 1); 548 ctx.expectError(GL_INVALID_ENUM); 549 ctx.glClearBufferfi(GL_STENCIL, 0, 1.0f, 1); 550 ctx.expectError(GL_INVALID_ENUM); 551 ctx.glClearBufferfi(GL_COLOR, 0, 1.0f, 1); 552 ctx.expectError(GL_INVALID_ENUM); 553 ctx.endSection(); 554 555 ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_DEPTH_STENCIL and drawBuffer is not zero."); 556 ctx.glClearBufferfi(GL_DEPTH_STENCIL, 1, 1.0f, 1); 557 ctx.expectError(GL_INVALID_VALUE); 558 ctx.endSection(); 559 } 560 561 void copy_buffer_sub_data (NegativeTestContext& ctx) 562 { 563 deUint32 buf[2]; 564 std::vector<float> data(32*32); 565 566 ctx.glGenBuffers (2, buf); 567 ctx.glBindBuffer (GL_COPY_READ_BUFFER, buf[0]); 568 ctx.glBufferData (GL_COPY_READ_BUFFER, 32, &data[0], GL_DYNAMIC_COPY); 569 ctx.glBindBuffer (GL_COPY_WRITE_BUFFER, buf[1]); 570 ctx.glBufferData (GL_COPY_WRITE_BUFFER, 32, &data[0], GL_DYNAMIC_COPY); 571 ctx.expectError (GL_NO_ERROR); 572 573 ctx.beginSection("GL_INVALID_VALUE is generated if any of readoffset, writeoffset or size is negative."); 574 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, -4); 575 ctx.expectError (GL_INVALID_VALUE); 576 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, -1, 0, 4); 577 ctx.expectError (GL_INVALID_VALUE); 578 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, -1, 4); 579 ctx.expectError (GL_INVALID_VALUE); 580 ctx.endSection(); 581 582 ctx.beginSection("GL_INVALID_VALUE is generated if readoffset + size exceeds the size of the buffer object bound to readtarget."); 583 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 36); 584 ctx.expectError (GL_INVALID_VALUE); 585 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 24, 0, 16); 586 ctx.expectError (GL_INVALID_VALUE); 587 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 36, 0, 4); 588 ctx.expectError (GL_INVALID_VALUE); 589 ctx.endSection(); 590 591 ctx.beginSection("GL_INVALID_VALUE is generated if writeoffset + size exceeds the size of the buffer object bound to writetarget."); 592 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 36); 593 ctx.expectError (GL_INVALID_VALUE); 594 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 24, 16); 595 ctx.expectError (GL_INVALID_VALUE); 596 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 36, 4); 597 ctx.expectError (GL_INVALID_VALUE); 598 ctx.endSection(); 599 600 ctx.beginSection("GL_INVALID_VALUE is generated if the same buffer object is bound to both readtarget and writetarget and the ranges [readoffset, readoffset + size) and [writeoffset, writeoffset + size) overlap."); 601 ctx.glBindBuffer (GL_COPY_WRITE_BUFFER, buf[0]); 602 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 16, 4); 603 ctx.expectError (GL_NO_ERROR); 604 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 4); 605 ctx.expectError (GL_INVALID_VALUE); 606 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 16, 18); 607 ctx.expectError (GL_INVALID_VALUE); 608 ctx.glBindBuffer (GL_COPY_WRITE_BUFFER, buf[1]); 609 ctx.endSection(); 610 611 ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to readtarget or writetarget."); 612 ctx.glBindBuffer (GL_COPY_READ_BUFFER, 0); 613 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16); 614 ctx.expectError (GL_INVALID_OPERATION); 615 616 ctx.glBindBuffer (GL_COPY_READ_BUFFER, buf[0]); 617 ctx.glBindBuffer (GL_COPY_WRITE_BUFFER, 0); 618 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16); 619 ctx.expectError (GL_INVALID_OPERATION); 620 621 ctx.glBindBuffer (GL_COPY_WRITE_BUFFER, buf[1]); 622 ctx.endSection(); 623 624 ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer object bound to either readtarget or writetarget is mapped."); 625 ctx.glMapBufferRange (GL_COPY_READ_BUFFER, 0, 4, GL_MAP_READ_BIT); 626 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16); 627 ctx.expectError (GL_INVALID_OPERATION); 628 ctx.glUnmapBuffer (GL_COPY_READ_BUFFER); 629 630 ctx.glMapBufferRange (GL_COPY_WRITE_BUFFER, 0, 4, GL_MAP_READ_BIT); 631 ctx.glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16); 632 ctx.expectError (GL_INVALID_OPERATION); 633 ctx.glUnmapBuffer (GL_COPY_WRITE_BUFFER); 634 ctx.endSection(); 635 636 ctx.glDeleteBuffers(2, buf); 637 } 638 639 void draw_buffers (NegativeTestContext& ctx) 640 { 641 deUint32 fbo = 0x1234; 642 deUint32 texture = 0x1234; 643 int maxDrawBuffers = 0x1234; 644 ctx.glGetIntegerv (GL_MAX_DRAW_BUFFERS, &maxDrawBuffers); 645 std::vector<deUint32> values(maxDrawBuffers+1); 646 values[0] = GL_NONE; 647 values[1] = GL_BACK; 648 values[2] = GL_COLOR_ATTACHMENT0; 649 values[3] = GL_DEPTH_ATTACHMENT; 650 std::vector<GLfloat> data(32*32); 651 652 ctx.glGenTextures (1, &texture); 653 ctx.glBindTexture (GL_TEXTURE_2D, texture); 654 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 655 ctx.glGenFramebuffers (1, &fbo); 656 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 657 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 658 ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER); 659 ctx.expectError (GL_NO_ERROR); 660 661 ctx.beginSection("GL_INVALID_ENUM is generated if one of the values in bufs is not an accepted value."); 662 ctx.glDrawBuffers (2, &values[2]); 663 ctx.expectError (GL_INVALID_ENUM); 664 ctx.endSection(); 665 666 ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to the default framebuffer and n is not 1."); 667 ctx.glBindFramebuffer (GL_FRAMEBUFFER, 0); 668 ctx.glDrawBuffers (2, &values[0]); 669 ctx.expectError (GL_INVALID_OPERATION); 670 ctx.endSection(); 671 672 ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to the default framebuffer and the value in bufs is one of the GL_COLOR_ATTACHMENTn tokens."); 673 ctx.glBindFramebuffer (GL_FRAMEBUFFER, 0); 674 ctx.glDrawBuffers (1, &values[2]); 675 ctx.expectError (GL_INVALID_OPERATION); 676 ctx.endSection(); 677 678 ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to a framebuffer object and the ith buffer listed in bufs is anything other than GL_NONE or GL_COLOR_ATTACHMENTSi."); 679 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 680 ctx.glDrawBuffers (1, &values[1]); 681 ctx.expectError (GL_INVALID_OPERATION); 682 ctx.endSection(); 683 684 ctx.beginSection("GL_INVALID_VALUE is generated if n is less than 0 or greater than GL_MAX_DRAW_BUFFERS."); 685 ctx.glDrawBuffers (-1, &values[1]); 686 ctx.expectError (GL_INVALID_VALUE); 687 ctx.glDrawBuffers (maxDrawBuffers+1, &values[0]); 688 ctx.expectError (GL_INVALID_VALUE); 689 ctx.endSection(); 690 691 ctx.glDeleteTextures(1, &texture); 692 ctx.glDeleteFramebuffers(1, &fbo); 693 } 694 695 void flush_mapped_buffer_range (NegativeTestContext& ctx) 696 { 697 deUint32 buf = 0x1234; 698 std::vector<GLfloat> data(32); 699 700 ctx.glGenBuffers (1, &buf); 701 ctx.glBindBuffer (GL_ARRAY_BUFFER, buf); 702 ctx.glBufferData (GL_ARRAY_BUFFER, 32, &data[0], GL_STATIC_READ); 703 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); 704 ctx.expectError (GL_NO_ERROR); 705 706 ctx.beginSection("GL_INVALID_VALUE is generated if offset or length is negative, or if offset + length exceeds the size of the mapping."); 707 ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, -1, 1); 708 ctx.expectError (GL_INVALID_VALUE); 709 ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, -1); 710 ctx.expectError (GL_INVALID_VALUE); 711 ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 12, 8); 712 ctx.expectError (GL_INVALID_VALUE); 713 ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 24, 4); 714 ctx.expectError (GL_INVALID_VALUE); 715 ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 24); 716 ctx.expectError (GL_INVALID_VALUE); 717 ctx.endSection(); 718 719 ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target."); 720 ctx.glBindBuffer (GL_ARRAY_BUFFER, 0); 721 ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 8); 722 ctx.expectError (GL_INVALID_OPERATION); 723 ctx.endSection(); 724 725 ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer bound to target is not mapped, or is mapped without the GL_MAP_FLUSH_EXPLICIT flag."); 726 ctx.glBindBuffer (GL_ARRAY_BUFFER, buf); 727 ctx.glUnmapBuffer (GL_ARRAY_BUFFER); 728 ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 8); 729 ctx.expectError (GL_INVALID_OPERATION); 730 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT); 731 ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 8); 732 ctx.expectError (GL_INVALID_OPERATION); 733 ctx.endSection(); 734 735 ctx.glUnmapBuffer (GL_ARRAY_BUFFER); 736 ctx.glDeleteBuffers (1, &buf); 737 } 738 739 void map_buffer_range (NegativeTestContext& ctx) 740 { 741 deUint32 buf = 0x1234; 742 std::vector<GLfloat> data(32); 743 744 ctx.glGenBuffers (1, &buf); 745 ctx.glBindBuffer (GL_ARRAY_BUFFER, buf); 746 ctx.glBufferData (GL_ARRAY_BUFFER, 32, &data[0], GL_DYNAMIC_COPY); 747 ctx.expectError (GL_NO_ERROR); 748 749 ctx.beginSection("GL_INVALID_VALUE is generated if either of offset or length is negative."); 750 ctx.glMapBufferRange (GL_ARRAY_BUFFER, -1, 1, GL_MAP_READ_BIT); 751 ctx.expectError (GL_INVALID_VALUE); 752 753 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 1, -1, GL_MAP_READ_BIT); 754 ctx.expectError (GL_INVALID_VALUE); 755 ctx.endSection(); 756 757 ctx.beginSection("GL_INVALID_VALUE is generated if offset + length is greater than the value of GL_BUFFER_SIZE."); 758 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 33, GL_MAP_READ_BIT); 759 ctx.expectError (GL_INVALID_VALUE); 760 761 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 32, 1, GL_MAP_READ_BIT); 762 ctx.expectError (GL_INVALID_VALUE); 763 764 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 16, 17, GL_MAP_READ_BIT); 765 ctx.expectError (GL_INVALID_VALUE); 766 ctx.endSection(); 767 768 ctx.beginSection("GL_INVALID_VALUE is generated if access has any bits set other than those accepted."); 769 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | 0x1000); 770 ctx.expectError (GL_INVALID_VALUE); 771 772 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT | 0x1000); 773 ctx.expectError (GL_INVALID_VALUE); 774 ctx.endSection(); 775 776 ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer is already in a mapped state."); 777 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT); 778 ctx.expectError (GL_NO_ERROR); 779 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 16, 8, GL_MAP_READ_BIT); 780 ctx.expectError (GL_INVALID_OPERATION); 781 ctx.glUnmapBuffer (GL_ARRAY_BUFFER); 782 ctx.endSection(); 783 784 ctx.beginSection("GL_INVALID_OPERATION is generated if neither GL_MAP_READ_BIT or GL_MAP_WRITE_BIT is set."); 785 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_INVALIDATE_RANGE_BIT); 786 ctx.expectError (GL_INVALID_OPERATION); 787 ctx.endSection(); 788 789 ctx.beginSection("GL_INVALID_OPERATION is generated if "); 790 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_INVALIDATE_RANGE_BIT); 791 ctx.expectError (GL_INVALID_OPERATION); 792 ctx.endSection(); 793 794 ctx.beginSection("GL_INVALID_OPERATION is generated if GL_MAP_READ_BIT is set and any of GL_MAP_INVALIDATE_RANGE_BIT, GL_MAP_INVALIDATE_BUFFER_BIT, or GL_MAP_UNSYNCHRONIZED_BIT is set."); 795 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_INVALIDATE_RANGE_BIT); 796 ctx.expectError (GL_INVALID_OPERATION); 797 798 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); 799 ctx.expectError (GL_INVALID_OPERATION); 800 801 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_UNSYNCHRONIZED_BIT); 802 ctx.expectError (GL_INVALID_OPERATION); 803 ctx.endSection(); 804 805 ctx.beginSection("GL_INVALID_OPERATION is generated if GL_MAP_FLUSH_EXPLICIT_BIT is set and GL_MAP_WRITE_BIT is not set."); 806 ctx.glMapBufferRange (GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); 807 ctx.expectError (GL_INVALID_OPERATION); 808 ctx.endSection(); 809 810 ctx.glDeleteBuffers (1, &buf); 811 } 812 813 void read_buffer (NegativeTestContext& ctx) 814 { 815 deUint32 fbo = 0x1234; 816 deUint32 texture = 0x1234; 817 int maxColorAttachments = 0x1234; 818 819 ctx.glGetIntegerv (GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments); 820 ctx.glGenTextures (1, &texture); 821 ctx.glBindTexture (GL_TEXTURE_2D, texture); 822 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 823 ctx.glGenFramebuffers (1, &fbo); 824 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 825 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 826 ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER); 827 ctx.expectError (GL_NO_ERROR); 828 829 ctx.beginSection("GL_INVALID_ENUM is generated if mode is not GL_BACK, GL_NONE, or GL_COLOR_ATTACHMENTi."); 830 ctx.glReadBuffer (GL_NONE); 831 ctx.expectError (GL_NO_ERROR); 832 ctx.glReadBuffer (1); 833 ctx.expectError (GL_INVALID_ENUM); 834 ctx.glReadBuffer (GL_FRAMEBUFFER); 835 ctx.expectError (GL_INVALID_ENUM); 836 ctx.glReadBuffer (GL_COLOR_ATTACHMENT0 - 1); 837 ctx.expectError (GL_INVALID_ENUM); 838 ctx.glReadBuffer (GL_FRONT); 839 ctx.expectError (GL_INVALID_ENUM); 840 841 // \ note Spec isn't actually clear here, but it is safe to assume that 842 // GL_DEPTH_ATTACHMENT can't be interpreted as GL_COLOR_ATTACHMENTm 843 // where m = (GL_DEPTH_ATTACHMENT - GL_COLOR_ATTACHMENT0). 844 ctx.glReadBuffer (GL_DEPTH_ATTACHMENT); 845 ctx.expectError (GL_INVALID_ENUM); 846 ctx.glReadBuffer (GL_STENCIL_ATTACHMENT); 847 ctx.expectError (GL_INVALID_ENUM); 848 ctx.glReadBuffer (GL_STENCIL_ATTACHMENT+1); 849 ctx.expectError (GL_INVALID_ENUM); 850 ctx.glReadBuffer (0xffffffffu); 851 ctx.expectError (GL_INVALID_ENUM); 852 ctx.endSection(); 853 854 ctx.beginSection("GL_INVALID_OPERATION error is generated if src is GL_BACK or if src is GL_COLOR_ATTACHMENTm where m is greater than or equal to the value of GL_MAX_COLOR_ATTACHMENTS."); 855 ctx.glReadBuffer (GL_BACK); 856 ctx.expectError (GL_INVALID_OPERATION); 857 ctx.glReadBuffer (GL_COLOR_ATTACHMENT0 + maxColorAttachments); 858 ctx.expectError (GL_INVALID_OPERATION); 859 860 if (GL_COLOR_ATTACHMENT0+maxColorAttachments < GL_DEPTH_ATTACHMENT-1) 861 { 862 ctx.glReadBuffer (GL_DEPTH_ATTACHMENT - 1); 863 ctx.expectError (GL_INVALID_OPERATION); 864 } 865 866 ctx.endSection(); 867 868 ctx.beginSection("GL_INVALID_OPERATION is generated if the current framebuffer is the default framebuffer and mode is not GL_NONE or GL_BACK."); 869 ctx.glBindFramebuffer (GL_FRAMEBUFFER, 0); 870 ctx.glReadBuffer (GL_COLOR_ATTACHMENT0); 871 ctx.expectError (GL_INVALID_OPERATION); 872 ctx.endSection(); 873 874 ctx.beginSection("GL_INVALID_OPERATION is generated if the current framebuffer is a named framebuffer and mode is not GL_NONE or GL_COLOR_ATTACHMENTi."); 875 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 876 ctx.glReadBuffer (GL_BACK); 877 ctx.expectError (GL_INVALID_OPERATION); 878 ctx.endSection(); 879 880 ctx.glDeleteTextures(1, &texture); 881 ctx.glDeleteFramebuffers(1, &fbo); 882 } 883 884 void unmap_buffer (NegativeTestContext& ctx) 885 { 886 deUint32 buf = 0x1234; 887 std::vector<GLfloat> data(32); 888 889 ctx.glGenBuffers (1, &buf); 890 ctx.glBindBuffer (GL_ARRAY_BUFFER, buf); 891 ctx.glBufferData (GL_ARRAY_BUFFER, 32, &data[0], GL_DYNAMIC_COPY); 892 ctx.expectError (GL_NO_ERROR); 893 894 ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer data store is already in an unmapped state."); 895 ctx.glUnmapBuffer (GL_ARRAY_BUFFER); 896 ctx.expectError (GL_INVALID_OPERATION); 897 ctx.endSection(); 898 899 ctx.glDeleteBuffers (1, &buf); 900 } 901 // Framebuffer Objects 902 903 void bind_framebuffer (NegativeTestContext& ctx) 904 { 905 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER."); 906 ctx.glBindFramebuffer(-1, 0); 907 ctx.expectError(GL_INVALID_ENUM); 908 ctx.glBindFramebuffer(GL_RENDERBUFFER, 0); 909 ctx.expectError(GL_INVALID_ENUM); 910 ctx.endSection(); 911 } 912 913 void bind_renderbuffer (NegativeTestContext& ctx) 914 { 915 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER."); 916 ctx.glBindRenderbuffer(-1, 0); 917 ctx.expectError(GL_INVALID_ENUM); 918 ctx.glBindRenderbuffer(GL_FRAMEBUFFER, 0); 919 ctx.expectError(GL_INVALID_ENUM); 920 ctx.endSection(); 921 } 922 923 void check_framebuffer_status (NegativeTestContext& ctx) 924 { 925 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER."); 926 ctx.glCheckFramebufferStatus(-1); 927 ctx.expectError(GL_INVALID_ENUM); 928 ctx.glCheckFramebufferStatus(GL_RENDERBUFFER); 929 ctx.expectError(GL_INVALID_ENUM); 930 ctx.endSection(); 931 } 932 933 void gen_framebuffers (NegativeTestContext& ctx) 934 { 935 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative."); 936 ctx.glGenFramebuffers(-1, 0); 937 ctx.expectError(GL_INVALID_VALUE); 938 ctx.endSection(); 939 } 940 941 void gen_renderbuffers (NegativeTestContext& ctx) 942 { 943 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative."); 944 ctx.glGenRenderbuffers(-1, 0); 945 ctx.expectError(GL_INVALID_VALUE); 946 ctx.endSection(); 947 } 948 949 void delete_framebuffers (NegativeTestContext& ctx) 950 { 951 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative."); 952 ctx.glDeleteFramebuffers(-1, 0); 953 ctx.expectError(GL_INVALID_VALUE); 954 ctx.endSection(); 955 } 956 957 void delete_renderbuffers (NegativeTestContext& ctx) 958 {; 959 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative."); 960 ctx.glDeleteRenderbuffers(-1, 0); 961 ctx.expectError(GL_INVALID_VALUE); 962 ctx.endSection(); 963 } 964 965 void framebuffer_renderbuffer (NegativeTestContext& ctx) 966 { 967 GLuint fbo = 0x1234; 968 GLuint rbo = 0x1234; 969 ctx.glGenFramebuffers(1, &fbo); 970 ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo); 971 ctx.glGenRenderbuffers(1, &rbo); 972 973 ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens."); 974 ctx.glFramebufferRenderbuffer(-1, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); 975 ctx.expectError(GL_INVALID_ENUM); 976 ctx.endSection(); 977 978 ctx.beginSection("GL_INVALID_ENUM is generated if renderbuffertarget is not GL_RENDERBUFFER."); 979 ctx.glBindRenderbuffer(GL_RENDERBUFFER, rbo); 980 ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, rbo); 981 ctx.expectError(GL_INVALID_ENUM); 982 ctx.glBindRenderbuffer(GL_RENDERBUFFER, 0); 983 ctx.endSection(); 984 985 ctx.beginSection("GL_INVALID_OPERATION is generated if renderbuffer is neither 0 nor the name of an existing renderbuffer object."); 986 ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, -1); 987 ctx.expectError(GL_INVALID_OPERATION); 988 ctx.endSection(); 989 990 ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target."); 991 ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0); 992 ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); 993 ctx.expectError(GL_INVALID_OPERATION); 994 ctx.endSection(); 995 996 ctx.glDeleteRenderbuffers(1, &rbo); 997 ctx.glDeleteFramebuffers(1, &fbo); 998 } 999 1000 void framebuffer_texture2d (NegativeTestContext& ctx) 1001 { 1002 GLuint fbo = 0x1234; 1003 GLuint tex2D = 0x1234; 1004 GLuint texCube = 0x1234; 1005 GLint maxTexSize = 0x1234; 1006 GLint maxTexCubeSize = 0x1234; 1007 1008 ctx.glGenFramebuffers(1, &fbo); 1009 ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo); 1010 ctx.glGenTextures(1, &tex2D); 1011 ctx.glBindTexture(GL_TEXTURE_2D, tex2D); 1012 ctx.glGenTextures(1, &texCube); 1013 ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, texCube); 1014 ctx.glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize); 1015 ctx.glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxTexCubeSize); 1016 ctx.expectError(GL_NO_ERROR); 1017 1018 ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens."); 1019 ctx.glFramebufferTexture2D(-1, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 1020 ctx.expectError(GL_INVALID_ENUM); 1021 ctx.endSection(); 1022 1023 ctx.beginSection("GL_INVALID_ENUM is generated if textarget is not an accepted texture target."); 1024 ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, tex2D, 0); 1025 ctx.expectError(GL_INVALID_ENUM); 1026 ctx.endSection(); 1027 1028 ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0 or larger than log_2 of maximum texture size."); 1029 int maxSize = 0x1234; 1030 ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, -1); 1031 ctx.expectError(GL_INVALID_VALUE); 1032 maxSize = deLog2Floor32(maxTexSize) + 1; 1033 ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, maxSize); 1034 ctx.expectError(GL_INVALID_VALUE); 1035 maxSize = deLog2Floor32(maxTexSize) + 1; 1036 ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texCube, maxSize); 1037 ctx.expectError(GL_INVALID_VALUE); 1038 ctx.endSection(); 1039 1040 ctx.beginSection("GL_INVALID_OPERATION is generated if texture is neither 0 nor the name of an existing texture object."); 1041 ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, -1, 0); 1042 ctx.expectError(GL_INVALID_OPERATION); 1043 ctx.endSection(); 1044 1045 ctx.beginSection("GL_INVALID_OPERATION is generated if textarget and texture are not compatible."); 1046 ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, tex2D, 0); 1047 ctx.expectError(GL_INVALID_OPERATION); 1048 ctx.glDeleteTextures(1, &tex2D); 1049 1050 ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texCube, 0); 1051 ctx.expectError(GL_INVALID_OPERATION); 1052 ctx.glDeleteTextures(1, &texCube); 1053 ctx.endSection(); 1054 1055 ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target."); 1056 ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0); 1057 ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 1058 ctx.expectError(GL_INVALID_OPERATION); 1059 ctx.endSection(); 1060 1061 ctx.glDeleteFramebuffers(1, &fbo); 1062 } 1063 1064 void renderbuffer_storage (NegativeTestContext& ctx) 1065 { 1066 deUint32 rbo = 0x1234; 1067 ctx.glGenRenderbuffers (1, &rbo); 1068 ctx.glBindRenderbuffer (GL_RENDERBUFFER, rbo); 1069 1070 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER."); 1071 ctx.glRenderbufferStorage (-1, GL_RGBA4, 1, 1); 1072 ctx.expectError (GL_INVALID_ENUM); 1073 ctx.glRenderbufferStorage (GL_FRAMEBUFFER, GL_RGBA4, 1, 1); 1074 ctx.expectError (GL_INVALID_ENUM); 1075 ctx.endSection(); 1076 1077 ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not a color-renderable, depth-renderable, or stencil-renderable format."); 1078 ctx.glRenderbufferStorage (GL_RENDERBUFFER, -1, 1, 1); 1079 ctx.expectError (GL_INVALID_ENUM); 1080 1081 if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_color_buffer_half_float")) // GL_EXT_color_buffer_half_float disables error 1082 { 1083 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGB16F, 1, 1); 1084 ctx.expectError (GL_INVALID_ENUM); 1085 } 1086 1087 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA8_SNORM, 1, 1); 1088 ctx.expectError (GL_INVALID_ENUM); 1089 ctx.endSection(); 1090 1091 ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than zero."); 1092 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA4, -1, 1); 1093 ctx.expectError (GL_INVALID_VALUE); 1094 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA4, 1, -1); 1095 ctx.expectError (GL_INVALID_VALUE); 1096 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA4, -1, -1); 1097 ctx.expectError (GL_INVALID_VALUE); 1098 ctx.endSection(); 1099 1100 ctx.beginSection("GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_RENDERBUFFER_SIZE."); 1101 GLint maxSize = 0x1234; 1102 ctx.glGetIntegerv (GL_MAX_RENDERBUFFER_SIZE, &maxSize); 1103 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA4, 1, maxSize+1); 1104 ctx.expectError (GL_INVALID_VALUE); 1105 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA4, maxSize+1, 1); 1106 ctx.expectError (GL_INVALID_VALUE); 1107 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA4, maxSize+1, maxSize+1); 1108 ctx.expectError (GL_INVALID_VALUE); 1109 ctx.endSection(); 1110 1111 ctx.glDeleteRenderbuffers(1, &rbo); 1112 } 1113 1114 void blit_framebuffer (NegativeTestContext& ctx) 1115 { 1116 deUint32 fbo[2]; 1117 deUint32 rbo[2]; 1118 deUint32 texture[2]; 1119 1120 ctx.glGenFramebuffers (2, fbo); 1121 ctx.glGenTextures (2, texture); 1122 ctx.glGenRenderbuffers (2, rbo); 1123 1124 ctx.glBindTexture (GL_TEXTURE_2D, texture[0]); 1125 ctx.glBindRenderbuffer (GL_RENDERBUFFER, rbo[0]); 1126 ctx.glBindFramebuffer (GL_READ_FRAMEBUFFER, fbo[0]); 1127 1128 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1129 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 32, 32); 1130 ctx.glFramebufferTexture2D (GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0); 1131 ctx.glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[0]); 1132 ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER); 1133 1134 ctx.glBindTexture (GL_TEXTURE_2D, texture[1]); 1135 ctx.glBindRenderbuffer (GL_RENDERBUFFER, rbo[1]); 1136 ctx.glBindFramebuffer (GL_DRAW_FRAMEBUFFER, fbo[1]); 1137 1138 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1139 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 32, 32); 1140 ctx.glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0); 1141 ctx.glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[1]); 1142 ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER); 1143 ctx.expectError (GL_NO_ERROR); 1144 1145 ctx.beginSection("GL_INVALID_OPERATION is generated if mask contains any of the GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT and filter is not GL_NEAREST."); 1146 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_LINEAR); 1147 ctx.expectError (GL_INVALID_OPERATION); 1148 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_LINEAR); 1149 ctx.expectError (GL_INVALID_OPERATION); 1150 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_LINEAR); 1151 ctx.expectError (GL_INVALID_OPERATION); 1152 ctx.endSection(); 1153 1154 ctx.beginSection("GL_INVALID_OPERATION is generated if mask contains GL_COLOR_BUFFER_BIT and read buffer format is incompatible with draw buffer format."); 1155 ctx.glBindTexture (GL_TEXTURE_2D, texture[0]); 1156 1157 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL); 1158 ctx.glFramebufferTexture2D (GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0); 1159 ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA32UI, draw buffer: GL_RGBA" << TestLog::EndMessage; 1160 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST); 1161 ctx.expectError (GL_INVALID_OPERATION); 1162 1163 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL); 1164 ctx.glFramebufferTexture2D (GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0); 1165 ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA32I, draw buffer: GL_RGBA" << TestLog::EndMessage; 1166 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST); 1167 ctx.expectError (GL_INVALID_OPERATION); 1168 1169 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1170 ctx.glFramebufferTexture2D (GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0); 1171 ctx.glBindTexture (GL_TEXTURE_2D, texture[1]); 1172 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL); 1173 ctx.glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0); 1174 ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA8, draw buffer: GL_RGBA32I" << TestLog::EndMessage; 1175 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST); 1176 ctx.expectError (GL_INVALID_OPERATION); 1177 ctx.endSection(); 1178 1179 ctx.beginSection("GL_INVALID_OPERATION is generated if filter is GL_LINEAR and the read buffer contains integer data."); 1180 ctx.glBindTexture (GL_TEXTURE_2D, texture[0]); 1181 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL); 1182 ctx.glFramebufferTexture2D (GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0); 1183 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1184 ctx.glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0); 1185 ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA32I, draw buffer: GL_RGBA8" << TestLog::EndMessage; 1186 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_LINEAR); 1187 ctx.expectError (GL_INVALID_OPERATION); 1188 ctx.endSection(); 1189 1190 ctx.beginSection("GL_INVALID_OPERATION is generated if mask contains GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT and the source and destination depth and stencil formats do not match."); 1191 ctx.glBindRenderbuffer (GL_RENDERBUFFER, rbo[0]); 1192 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH32F_STENCIL8, 32, 32); 1193 ctx.glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[0]); 1194 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT, GL_NEAREST); 1195 ctx.expectError (GL_INVALID_OPERATION); 1196 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_STENCIL_BUFFER_BIT, GL_NEAREST); 1197 ctx.expectError (GL_INVALID_OPERATION); 1198 ctx.endSection(); 1199 1200 ctx.glBindFramebuffer (GL_FRAMEBUFFER, 0); 1201 ctx.glDeleteFramebuffers (2, fbo); 1202 ctx.glDeleteTextures (2, texture); 1203 ctx.glDeleteRenderbuffers (2, rbo); 1204 } 1205 1206 void blit_framebuffer_multisample (NegativeTestContext& ctx) 1207 { 1208 deUint32 fbo[2]; 1209 deUint32 rbo[2]; 1210 1211 ctx.glGenFramebuffers (2, fbo); 1212 ctx.glGenRenderbuffers (2, rbo); 1213 1214 ctx.glBindRenderbuffer (GL_RENDERBUFFER, rbo[0]); 1215 ctx.glBindFramebuffer (GL_READ_FRAMEBUFFER, fbo[0]); 1216 ctx.glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 32, 32); 1217 ctx.glFramebufferRenderbuffer (GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[0]); 1218 ctx.glCheckFramebufferStatus (GL_READ_FRAMEBUFFER); 1219 1220 ctx.glBindRenderbuffer (GL_RENDERBUFFER, rbo[1]); 1221 ctx.glBindFramebuffer (GL_DRAW_FRAMEBUFFER, fbo[1]); 1222 1223 ctx.expectError (GL_NO_ERROR); 1224 1225 ctx.beginSection("GL_INVALID_OPERATION is generated if the value of GL_SAMPLE_BUFFERS for the draw buffer is greater than zero."); 1226 ctx.glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 32, 32); 1227 ctx.glFramebufferRenderbuffer (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]); 1228 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST); 1229 ctx.expectError (GL_INVALID_OPERATION); 1230 ctx.endSection(); 1231 1232 ctx.beginSection("GL_INVALID_OPERATION is generated if GL_SAMPLE_BUFFERS for the read buffer is greater than zero and the formats of draw and read buffers are not identical."); 1233 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA4, 32, 32); 1234 ctx.glFramebufferRenderbuffer (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]); 1235 ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST); 1236 ctx.expectError (GL_INVALID_OPERATION); 1237 ctx.endSection(); 1238 1239 ctx.beginSection("GL_INVALID_OPERATION is generated if GL_SAMPLE_BUFFERS for the read buffer is greater than zero and the source and destination rectangles are not defined with the same (X0, Y0) and (X1, Y1) bounds."); 1240 ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA8, 32, 32); 1241 ctx.glFramebufferRenderbuffer (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]); 1242 ctx.glBlitFramebuffer (0, 0, 16, 16, 2, 2, 18, 18, GL_COLOR_BUFFER_BIT, GL_NEAREST); 1243 ctx.expectError (GL_INVALID_OPERATION); 1244 ctx.endSection(); 1245 1246 ctx.glBindFramebuffer (GL_FRAMEBUFFER, 0); 1247 ctx.glDeleteRenderbuffers (2, rbo); 1248 ctx.glDeleteFramebuffers (2, fbo); 1249 } 1250 1251 void framebuffer_texture_layer (NegativeTestContext& ctx) 1252 { 1253 deUint32 fbo = 0x1234; 1254 deUint32 tex3D; 1255 deUint32 tex2DArray; 1256 deUint32 tex2D; 1257 1258 ctx.glGenFramebuffers (1, &fbo); 1259 ctx.glGenTextures (1, &tex3D); 1260 ctx.glGenTextures (1, &tex2DArray); 1261 ctx.glGenTextures (1, &tex2D); 1262 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 1263 1264 ctx.glBindTexture (GL_TEXTURE_3D, tex3D); 1265 ctx.glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1266 ctx.glBindTexture (GL_TEXTURE_2D_ARRAY, tex2DArray); 1267 ctx.glTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1268 ctx.glBindTexture (GL_TEXTURE_2D, tex2D); 1269 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1270 1271 ctx.expectError (GL_NO_ERROR); 1272 1273 ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens."); 1274 ctx.glFramebufferTextureLayer (-1, GL_COLOR_ATTACHMENT0, tex3D, 0, 1); 1275 ctx.expectError (GL_INVALID_ENUM); 1276 ctx.glFramebufferTextureLayer (GL_RENDERBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, 1); 1277 ctx.expectError (GL_INVALID_ENUM); 1278 ctx.endSection(); 1279 1280 ctx.beginSection("GL_INVALID_ENUM is generated if attachment is not one of the accepted tokens."); 1281 ctx.glFramebufferTextureLayer (GL_FRAMEBUFFER, -1, tex3D, 0, 1); 1282 ctx.expectError (GL_INVALID_ENUM); 1283 ctx.glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_BACK, tex3D, 0, 1); 1284 ctx.expectError (GL_INVALID_ENUM); 1285 ctx.endSection(); 1286 1287 ctx.beginSection("GL_INVALID_OPERATION is generated if texture is non-zero and not the name of a 3D texture or 2D array texture."); 1288 ctx.glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, 0, 0); 1289 ctx.expectError (GL_INVALID_OPERATION); 1290 ctx.glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0, 0); 1291 ctx.expectError (GL_INVALID_OPERATION); 1292 ctx.endSection(); 1293 1294 ctx.beginSection("GL_INVALID_VALUE is generated if texture is not zero and layer is negative."); 1295 ctx.glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, -1); 1296 ctx.expectError (GL_INVALID_VALUE); 1297 ctx.endSection(); 1298 1299 ctx.beginSection("GL_INVALID_VALUE is generated if texture is not zero and layer is greater than GL_MAX_3D_TEXTURE_SIZE-1 for a 3D texture."); 1300 int max3DTexSize = 0x1234; 1301 ctx.glGetIntegerv (GL_MAX_3D_TEXTURE_SIZE, &max3DTexSize); 1302 ctx.glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, max3DTexSize); 1303 ctx.expectError (GL_INVALID_VALUE); 1304 ctx.endSection(); 1305 1306 ctx.beginSection("GL_INVALID_VALUE is generated if texture is not zero and layer is greater than GL_MAX_ARRAY_TEXTURE_LAYERS-1 for a 2D array texture."); 1307 int maxArrayTexLayers = 0x1234; 1308 ctx.glGetIntegerv (GL_MAX_ARRAY_TEXTURE_LAYERS, &maxArrayTexLayers); 1309 ctx.glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, maxArrayTexLayers); 1310 ctx.expectError (GL_INVALID_VALUE); 1311 ctx.endSection(); 1312 1313 ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target."); 1314 ctx.glBindFramebuffer (GL_FRAMEBUFFER, 0); 1315 ctx.glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, 1); 1316 ctx.expectError (GL_INVALID_OPERATION); 1317 ctx.endSection(); 1318 1319 ctx.glDeleteTextures (1, &tex3D); 1320 ctx.glDeleteTextures (1, &tex2DArray); 1321 ctx.glDeleteTextures (1, &tex2D); 1322 ctx.glDeleteFramebuffers (1, &fbo); 1323 } 1324 1325 void invalidate_framebuffer (NegativeTestContext& ctx) 1326 { 1327 deUint32 fbo = 0x1234; 1328 deUint32 texture = 0x1234; 1329 deUint32 attachments[2]; 1330 int maxColorAttachments = 0x1234; 1331 ctx.glGetIntegerv (GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments); 1332 attachments[0] = GL_COLOR_ATTACHMENT0; 1333 attachments[1] = GL_COLOR_ATTACHMENT0 + maxColorAttachments; 1334 1335 ctx.glGenFramebuffers (1, &fbo); 1336 ctx.glGenTextures (1, &texture); 1337 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 1338 ctx.glBindTexture (GL_TEXTURE_2D, texture); 1339 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1340 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 1341 ctx.glCheckFramebufferStatus (GL_FRAMEBUFFER); 1342 ctx.expectError (GL_NO_ERROR); 1343 1344 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER or GL_DRAW_FRAMEBUFFER."); 1345 ctx.glInvalidateFramebuffer (-1, 1, &attachments[0]); 1346 ctx.expectError (GL_INVALID_ENUM); 1347 ctx.glInvalidateFramebuffer (GL_BACK, 1, &attachments[0]); 1348 ctx.expectError (GL_INVALID_ENUM); 1349 ctx.endSection(); 1350 1351 ctx.beginSection("GL_INVALID_OPERATION is generated if attachments contains GL_COLOR_ATTACHMENTm and m is greater than or equal to the value of GL_MAX_COLOR_ATTACHMENTS."); 1352 ctx.glInvalidateFramebuffer (GL_FRAMEBUFFER, 1, &attachments[1]); 1353 ctx.expectError (GL_INVALID_OPERATION); 1354 ctx.endSection(); 1355 1356 ctx.glDeleteTextures (1, &texture); 1357 ctx.glDeleteFramebuffers (1, &fbo); 1358 } 1359 1360 void invalidate_sub_framebuffer (NegativeTestContext& ctx) 1361 { 1362 deUint32 fbo = 0x1234; 1363 deUint32 texture = 0x1234; 1364 deUint32 attachments[2]; 1365 int maxColorAttachments = 0x1234; 1366 ctx.glGetIntegerv (GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments); 1367 attachments[0] = GL_COLOR_ATTACHMENT0; 1368 attachments[1] = GL_COLOR_ATTACHMENT0 + maxColorAttachments; 1369 1370 ctx.glGenFramebuffers (1, &fbo); 1371 ctx.glGenTextures (1, &texture); 1372 ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo); 1373 ctx.glBindTexture (GL_TEXTURE_2D, texture); 1374 ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1375 ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 1376 ctx.glCheckFramebufferStatus (GL_FRAMEBUFFER); 1377 ctx.expectError (GL_NO_ERROR); 1378 1379 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER or GL_DRAW_FRAMEBUFFER."); 1380 ctx.glInvalidateSubFramebuffer (-1, 1, &attachments[0], 0, 0, 16, 16); 1381 ctx.expectError (GL_INVALID_ENUM); 1382 ctx.glInvalidateSubFramebuffer (GL_BACK, 1, &attachments[0], 0, 0, 16, 16); 1383 ctx.expectError (GL_INVALID_ENUM); 1384 ctx.endSection(); 1385 1386 ctx.beginSection("GL_INVALID_OPERATION is generated if attachments contains GL_COLOR_ATTACHMENTm and m is greater than or equal to the value of GL_MAX_COLOR_ATTACHMENTS."); 1387 ctx.glInvalidateSubFramebuffer (GL_FRAMEBUFFER, 1, &attachments[1], 0, 0, 16, 16); 1388 ctx.expectError (GL_INVALID_OPERATION); 1389 ctx.endSection(); 1390 1391 ctx.glDeleteTextures (1, &texture); 1392 ctx.glDeleteFramebuffers (1, &fbo); 1393 } 1394 1395 void renderbuffer_storage_multisample (NegativeTestContext& ctx) 1396 { 1397 deUint32 rbo = 0x1234; 1398 int maxSamplesSupportedRGBA4 = -1; 1399 int maxSamplesSupportedRGBA8UI = -1; 1400 1401 ctx.glGetInternalformativ (GL_RENDERBUFFER, GL_RGBA4, GL_SAMPLES, 1, &maxSamplesSupportedRGBA4); 1402 ctx.glGetInternalformativ (GL_RENDERBUFFER, GL_RGBA8UI, GL_SAMPLES, 1, &maxSamplesSupportedRGBA8UI); 1403 1404 ctx.glGenRenderbuffers (1, &rbo); 1405 ctx.glBindRenderbuffer (GL_RENDERBUFFER, rbo); 1406 1407 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER."); 1408 ctx.glRenderbufferStorageMultisample (-1, 2, GL_RGBA4, 1, 1); 1409 ctx.expectError (GL_INVALID_ENUM); 1410 ctx.glRenderbufferStorageMultisample (GL_FRAMEBUFFER, 2, GL_RGBA4, 1, 1); 1411 ctx.expectError (GL_INVALID_ENUM); 1412 ctx.endSection(); 1413 1414 ctx.beginSection("GL_INVALID_OPERATION is generated if samples is greater than the maximum number of samples supported for internalformat."); 1415 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, maxSamplesSupportedRGBA4+1, GL_RGBA4, 1, 1); 1416 ctx.expectError (GL_INVALID_OPERATION); 1417 ctx.endSection(); 1418 1419 ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not a color-renderable, depth-renderable, or stencil-renderable format."); 1420 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 2, -1, 1, 1); 1421 ctx.expectError (GL_INVALID_ENUM); 1422 1423 if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_color_buffer_half_float")) // GL_EXT_color_buffer_half_float disables error 1424 { 1425 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 2, GL_RGB16F, 1, 1); 1426 ctx.expectError (GL_INVALID_ENUM); 1427 } 1428 1429 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 2, GL_RGBA8_SNORM, 1, 1); 1430 ctx.expectError (GL_INVALID_ENUM); 1431 ctx.endSection(); 1432 1433 ctx.beginSection("GL_INVALID_OPERATION is generated if samples is greater than the maximum number of samples supported for internalformat. (Unsigned integer format)"); 1434 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, maxSamplesSupportedRGBA8UI+1, GL_RGBA8UI, 1, 1); 1435 ctx.expectError (GL_INVALID_OPERATION); 1436 ctx.endSection(); 1437 1438 ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than zero."); 1439 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 2, GL_RGBA4, -1, 1); 1440 ctx.expectError (GL_INVALID_VALUE); 1441 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 2, GL_RGBA4, 1, -1); 1442 ctx.expectError (GL_INVALID_VALUE); 1443 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 2, GL_RGBA4, -1, -1); 1444 ctx.expectError (GL_INVALID_VALUE); 1445 ctx.endSection(); 1446 1447 ctx.beginSection("GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_RENDERBUFFER_SIZE."); 1448 GLint maxSize = 0x1234; 1449 ctx.glGetIntegerv (GL_MAX_RENDERBUFFER_SIZE, &maxSize); 1450 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 4, GL_RGBA4, 1, maxSize+1); 1451 ctx.expectError (GL_INVALID_VALUE); 1452 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 4, GL_RGBA4, maxSize+1, 1); 1453 ctx.expectError (GL_INVALID_VALUE); 1454 ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 4, GL_RGBA4, maxSize+1, maxSize+1); 1455 ctx.expectError (GL_INVALID_VALUE); 1456 ctx.endSection(); 1457 1458 ctx.glDeleteRenderbuffers(1, &rbo); 1459 } 1460 1461 std::vector<FunctionContainer> getNegativeBufferApiTestFunctions () 1462 { 1463 FunctionContainer funcs[] = 1464 { 1465 {bind_buffer, "bind_buffer", "Invalid glBindBuffer() usage" }, 1466 {delete_buffers, "delete_buffers", "Invalid glDeleteBuffers() usage" }, 1467 {gen_buffers, "gen_buffers", "Invalid glGenBuffers() usage" }, 1468 {buffer_data, "buffer_data", "Invalid glBufferData() usage" }, 1469 {buffer_sub_data, "buffer_sub_data", "Invalid glBufferSubData() usage" }, 1470 {buffer_sub_data_size_offset, "buffer_sub_data_size_offset", "Invalid glBufferSubData() usage" }, 1471 {clear, "clear", "Invalid glClear() usage" }, 1472 {read_pixels, "read_pixels", "Invalid glReadPixels() usage" }, 1473 {read_pixels_format_mismatch, "read_pixels_format_mismatch", "Invalid glReadPixels() usage" }, 1474 {read_pixels_fbo_format_mismatch, "read_pixels_fbo_format_mismatch", "Invalid glReadPixels() usage" }, 1475 {bind_buffer_range, "bind_buffer_range", "Invalid glBindBufferRange() usage" }, 1476 {bind_buffer_base, "bind_buffer_base", "Invalid glBindBufferBase() usage" }, 1477 {clear_bufferiv, "clear_bufferiv", "Invalid glClearBufferiv() usage" }, 1478 {clear_bufferuiv, "clear_bufferuiv", "Invalid glClearBufferuiv() usage" }, 1479 {clear_bufferfv, "clear_bufferfv", "Invalid glClearBufferfv() usage" }, 1480 {clear_bufferfi, "clear_bufferfi", "Invalid glClearBufferfi() usage" }, 1481 {copy_buffer_sub_data, "copy_buffer_sub_data", "Invalid glCopyBufferSubData() usage" }, 1482 {draw_buffers, "draw_buffers", "Invalid glDrawBuffers() usage" }, 1483 {flush_mapped_buffer_range, "flush_mapped_buffer_range", "Invalid glFlushMappedBufferRange() usage" }, 1484 {map_buffer_range, "map_buffer_range", "Invalid glMapBufferRange() usage" }, 1485 {read_buffer, "read_buffer", "Invalid glReadBuffer() usage" }, 1486 {unmap_buffer, "unmap_buffer", "Invalid glUnmapBuffer() usage" }, 1487 {bind_framebuffer, "bind_framebuffer", "Invalid glBindFramebuffer() usage" }, 1488 {bind_renderbuffer, "bind_renderbuffer", "Invalid glBindRenderbuffer() usage" }, 1489 {check_framebuffer_status, "check_framebuffer_status", "Invalid glCheckFramebufferStatus() usage" }, 1490 {gen_framebuffers, "gen_framebuffers", "Invalid glGenFramebuffers() usage" }, 1491 {gen_renderbuffers, "gen_renderbuffers", "Invalid glGenRenderbuffers() usage" }, 1492 {delete_framebuffers, "delete_framebuffers", "Invalid glDeleteFramebuffers() usage" }, 1493 {delete_renderbuffers, "delete_renderbuffers", "Invalid glDeleteRenderbuffers() usage" }, 1494 {framebuffer_renderbuffer, "framebuffer_renderbuffer", "Invalid glFramebufferRenderbuffer() usage" }, 1495 {framebuffer_texture2d, "framebuffer_texture2d", "Invalid glFramebufferTexture2D() usage" }, 1496 {renderbuffer_storage, "renderbuffer_storage", "Invalid glRenderbufferStorage() usage" }, 1497 {blit_framebuffer, "blit_framebuffer", "Invalid glBlitFramebuffer() usage" }, 1498 {blit_framebuffer_multisample, "blit_framebuffer_multisample", "Invalid glBlitFramebuffer() usage" }, 1499 {framebuffer_texture_layer, "framebuffer_texture_layer", "Invalid glFramebufferTextureLayer() usage" }, 1500 {invalidate_framebuffer, "invalidate_framebuffer", "Invalid glInvalidateFramebuffer() usage" }, 1501 {invalidate_sub_framebuffer, "invalidate_sub_framebuffer", "Invalid glInvalidateSubFramebuffer() usage" }, 1502 {renderbuffer_storage_multisample, "renderbuffer_storage_multisample", "Invalid glRenderbufferStorageMultisample() usage"}, 1503 }; 1504 1505 return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs)); 1506 } 1507 1508 } // NegativeTestShared 1509 } // Functional 1510 } // gles31 1511 } // deqp 1512