Home | History | Annotate | Download | only in functional
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program OpenGL ES 3.1 Module
      3  * -------------------------------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Negative Buffer API tests.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "es31fNegativeBufferApiTests.hpp"
     25 
     26 #include "gluCallLogWrapper.hpp"
     27 
     28 #include "glwDefs.hpp"
     29 #include "glwEnums.hpp"
     30 
     31 namespace deqp
     32 {
     33 namespace gles31
     34 {
     35 namespace Functional
     36 {
     37 namespace NegativeTestShared
     38 {
     39 
     40 using tcu::TestLog;
     41 using glu::CallLogWrapper;
     42 using namespace glw;
     43 
     44 // Buffers
     45 void bind_buffer (NegativeTestContext& ctx)
     46 {
     47 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the allowable values.");
     48 	ctx.glBindBuffer(-1, 0);
     49 	ctx.expectError(GL_INVALID_ENUM);
     50 	ctx.endSection();
     51 }
     52 
     53 void delete_buffers (NegativeTestContext& ctx)
     54 {
     55 	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
     56 	ctx.glDeleteBuffers(-1, 0);
     57 	ctx.expectError(GL_INVALID_VALUE);
     58 	ctx.endSection();
     59 }
     60 
     61 void gen_buffers (NegativeTestContext& ctx)
     62 {
     63 	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
     64 	ctx.glGenBuffers(-1, 0);
     65 	ctx.expectError(GL_INVALID_VALUE);
     66 	ctx.endSection();
     67 }
     68 
     69 void buffer_data (NegativeTestContext& ctx)
     70 {
     71 	GLuint buffer = 0x1234;
     72 	ctx.glGenBuffers(1, &buffer);
     73 	ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer);
     74 
     75 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER.");
     76 	ctx.glBufferData(-1, 0, NULL, GL_STREAM_DRAW);
     77 	ctx.expectError(GL_INVALID_ENUM);
     78 	ctx.endSection();
     79 
     80 	ctx.beginSection("GL_INVALID_ENUM is generated if usage is not GL_STREAM_DRAW, GL_STATIC_DRAW, or GL_DYNAMIC_DRAW.");
     81 	ctx.glBufferData(GL_ARRAY_BUFFER, 0, NULL, -1);
     82 	ctx.expectError(GL_INVALID_ENUM);
     83 	ctx.endSection();
     84 
     85 	ctx.beginSection("GL_INVALID_VALUE is generated if size is negative.");
     86 	ctx.glBufferData(GL_ARRAY_BUFFER, -1, NULL, GL_STREAM_DRAW);
     87 	ctx.expectError(GL_INVALID_VALUE);
     88 	ctx.endSection();
     89 
     90 	ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
     91 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
     92 	ctx.glBufferData(GL_ARRAY_BUFFER, 0, NULL, GL_STREAM_DRAW);
     93 	ctx.expectError(GL_INVALID_OPERATION);
     94 	ctx.endSection();
     95 
     96 	ctx.glDeleteBuffers(1, &buffer);
     97 }
     98 
     99 void buffer_sub_data (NegativeTestContext& ctx)
    100 {
    101 	GLuint buffer = 0x1234;
    102 	ctx.glGenBuffers(1, &buffer);
    103 	ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer);
    104 	ctx.glBufferData(GL_ARRAY_BUFFER, 10, 0, GL_STREAM_DRAW);
    105 
    106 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER.");
    107 	ctx.glBufferSubData(-1, 1, 1, 0);
    108 	ctx.expectError(GL_INVALID_ENUM);
    109 	ctx.endSection();
    110 
    111 	ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
    112 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
    113 	ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, 1, 0);
    114 	ctx.expectError(GL_INVALID_OPERATION);
    115 	ctx.endSection();
    116 
    117 	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer object being updated is mapped.");
    118 	ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer);
    119 	ctx.glMapBufferRange(GL_ARRAY_BUFFER, 0, 5, GL_MAP_READ_BIT);
    120 	ctx.expectError(GL_NO_ERROR);
    121 	ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, 1, 0);
    122 	ctx.expectError(GL_INVALID_OPERATION);
    123 	ctx.endSection();
    124 
    125 	ctx.glDeleteBuffers(1, &buffer);
    126 }
    127 
    128 void buffer_sub_data_size_offset (NegativeTestContext& ctx)
    129 {
    130 	GLuint buffer = 0x1234;
    131 	ctx.glGenBuffers(1, &buffer);
    132 	ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer);
    133 	ctx.glBufferData(GL_ARRAY_BUFFER, 10, 0, GL_STREAM_DRAW);
    134 
    135 	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.");
    136 	ctx.glBufferSubData(GL_ARRAY_BUFFER, -1, 1, 0);
    137 	ctx.expectError(GL_INVALID_VALUE);
    138 	ctx.glBufferSubData(GL_ARRAY_BUFFER, -1, -1, 0);
    139 	ctx.expectError(GL_INVALID_VALUE);
    140 	ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, -1, 0);
    141 	ctx.expectError(GL_INVALID_VALUE);
    142 	ctx.glBufferSubData(GL_ARRAY_BUFFER, 15, 1, 0);
    143 	ctx.expectError(GL_INVALID_VALUE);
    144 	ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, 15, 0);
    145 	ctx.expectError(GL_INVALID_VALUE);
    146 	ctx.glBufferSubData(GL_ARRAY_BUFFER, 8, 8, 0);
    147 	ctx.expectError(GL_INVALID_VALUE);
    148 	ctx.endSection();
    149 
    150 	ctx.glDeleteBuffers(1, &buffer);
    151 }
    152 
    153 void clear (NegativeTestContext& ctx)
    154 {
    155 	ctx.beginSection("GL_INVALID_VALUE is generated if any bit other than the three defined bits is set in mask.");
    156 	ctx.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    157 	ctx.expectError(GL_NO_ERROR);
    158 	ctx.glClear(0x00000200);
    159 	ctx.expectError(GL_INVALID_VALUE);
    160 	ctx.glClear(0x00001000);
    161 	ctx.expectError(GL_INVALID_VALUE);
    162 	ctx.glClear(0x00000010);
    163 	ctx.expectError(GL_INVALID_VALUE);
    164 	ctx.endSection();
    165 }
    166 
    167 void read_pixels (NegativeTestContext& ctx)
    168 {
    169 	std::vector<GLubyte>	ubyteData	(4);
    170 	GLuint					fbo			= 0x1234;
    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 	ctx.glGenFramebuffers(1, &fbo);
    188 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    189 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    190 	ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
    191 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    192 	ctx.endSection();
    193 
    194 	ctx.glDeleteFramebuffers(1, &fbo);
    195 }
    196 
    197 void readn_pixels (NegativeTestContext& ctx)
    198 {
    199 	std::vector<GLfloat>	floatData	(4);
    200 	std::vector<GLubyte>	ubyteData	(4);
    201 	GLuint					fbo			= 0x1234;
    202 
    203 	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2))
    204 		&& !ctx.isExtensionSupported("GL_KHR_robustness")
    205 		&& !ctx.isExtensionSupported("GL_EXT_robustness"))
    206 	{
    207 		TCU_THROW(NotSupportedError, "GLES 3.2 or robustness extension not supported");
    208 	}
    209 
    210 	ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of format and type is unsupported.");
    211 	ctx.glReadnPixels(0, 0, 1, 1, GL_LUMINANCE_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, (int) ubyteData.size(), &ubyteData[0]);
    212 	ctx.expectError(GL_INVALID_OPERATION);
    213 	ctx.endSection();
    214 
    215 	ctx.beginSection("GL_INVALID_VALUE is generated if either width or height is negative.");
    216 	ctx.glReadnPixels(0, 0, -1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (int) ubyteData.size(), &ubyteData[0]);
    217 	ctx.expectError(GL_INVALID_VALUE);
    218 	ctx.glReadnPixels(0, 0, 1, -1, GL_RGBA, GL_UNSIGNED_BYTE, (int) ubyteData.size(), &ubyteData[0]);
    219 	ctx.expectError(GL_INVALID_VALUE);
    220 	ctx.glReadnPixels(0, 0, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, (int) ubyteData.size(), &ubyteData[0]);
    221 	ctx.expectError(GL_INVALID_VALUE);
    222 	ctx.endSection();
    223 
    224 	ctx.beginSection("GL_INVALID_OPERATION is generated by ReadnPixels if the buffer size required to store the requested data is larger than bufSize.");
    225 	ctx.glReadnPixels(0, 0, 0x1234, 0x1234, GL_RGBA, GL_UNSIGNED_BYTE, (int) ubyteData.size(), &ubyteData[0]);
    226 	ctx.expectError(GL_INVALID_OPERATION);
    227 	ctx.glReadnPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, (int) floatData.size(), &floatData[0]);
    228 	ctx.expectError(GL_INVALID_OPERATION);
    229 	ctx.endSection();
    230 
    231 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    232 	ctx.glGenFramebuffers(1, &fbo);
    233 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    234 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    235 	ctx.glReadnPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (int) ubyteData.size(), &ubyteData[0]);
    236 	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    237 	ctx.endSection();
    238 
    239 	ctx.glDeleteFramebuffers(1, &fbo);
    240 }
    241 
    242 void read_pixels_format_mismatch (NegativeTestContext& ctx)
    243 {
    244 	std::vector<GLubyte>	ubyteData	(4);
    245 	std::vector<GLushort>	ushortData	(4);
    246 	GLint					readFormat	= 0x1234;
    247 	GLint					readType	= 0x1234;
    248 
    249 	ctx.beginSection("Unsupported combinations of format and type will generate an GL_INVALID_OPERATION error.");
    250 	ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]);
    251 	ctx.expectError(GL_INVALID_OPERATION);
    252 	ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]);
    253 	ctx.expectError(GL_INVALID_OPERATION);
    254 	ctx.glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]);
    255 	ctx.expectError(GL_INVALID_OPERATION);
    256 	ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]);
    257 	ctx.expectError(GL_INVALID_OPERATION);
    258 	ctx.glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]);
    259 	ctx.expectError(GL_INVALID_OPERATION);
    260 	ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]);
    261 	ctx.expectError(GL_INVALID_OPERATION);
    262 	ctx.endSection();
    263 
    264 	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.");
    265 	ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
    266 	ctx.expectError(GL_NO_ERROR);
    267 	ctx.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &readFormat);
    268 	ctx.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readType);
    269 	ctx.glReadPixels(0, 0, 1, 1, readFormat, readType, &ubyteData[0]);
    270 	ctx.expectError(GL_NO_ERROR);
    271 	ctx.endSection();
    272 }
    273 
    274 void read_pixels_fbo_format_mismatch (NegativeTestContext& ctx)
    275 {
    276 	std::vector<GLubyte>	ubyteData(4);
    277 	std::vector<float>		floatData(4);
    278 	deUint32				fbo = 0x1234;
    279 	deUint32				texture = 0x1234;
    280 
    281 	ctx.glGenTextures			(1, &texture);
    282 	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
    283 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    284 	ctx.glGenFramebuffers		(1, &fbo);
    285 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
    286 	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    287 	ctx.expectError				(GL_NO_ERROR);
    288 
    289 	ctx.beginSection("GL_INVALID_OPERATION is generated if currently bound framebuffer format is incompatible with format and type.");
    290 
    291 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    292 	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    293 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    294 	ctx.expectError				(GL_NO_ERROR);
    295 	ctx.glReadPixels			(0, 0, 1, 1, GL_RGBA, GL_FLOAT, &floatData[0]);
    296 	ctx.expectError				(GL_INVALID_OPERATION);
    297 
    298 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL);
    299 	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    300 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    301 	ctx.expectError				(GL_NO_ERROR);
    302 	ctx.glReadPixels			(0, 0, 1, 1, GL_RGBA, GL_FLOAT, &floatData[0]);
    303 	ctx.expectError				(GL_INVALID_OPERATION);
    304 
    305 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL);
    306 	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    307 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    308 	ctx.expectError				(GL_NO_ERROR);
    309 	ctx.glReadPixels			(0, 0, 1, 1, GL_RGBA, GL_FLOAT, &floatData[0]);
    310 	ctx.expectError				(GL_INVALID_OPERATION);
    311 
    312 	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
    313 		ctx.isExtensionSupported("GL_EXT_color_buffer_float"))
    314 	{
    315 		ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32F, 32, 32, 0, GL_RGBA, GL_FLOAT, NULL);
    316 		ctx.expectError				(GL_NO_ERROR);
    317 		ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    318 		ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    319 		ctx.expectError				(GL_NO_ERROR);
    320 		ctx.glReadPixels			(0, 0, 1, 1, GL_RGBA, GL_INT, &floatData[0]);
    321 		ctx.expectError				(GL_INVALID_OPERATION);
    322 	}
    323 
    324 	ctx.endSection();
    325 
    326 	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.");
    327 
    328 	int			binding			= -1;
    329 	int			sampleBuffers = 0x1234;
    330 	deUint32	rbo = 0x1234;
    331 
    332 	ctx.glGenRenderbuffers(1, &rbo);
    333 	ctx.glBindRenderbuffer(GL_RENDERBUFFER, rbo);
    334 	ctx.glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 32, 32);
    335 	ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
    336 
    337 	ctx.glGetIntegerv			(GL_READ_FRAMEBUFFER_BINDING, &binding);
    338 	ctx.getLog() << TestLog::Message << "// GL_READ_FRAMEBUFFER_BINDING: " << binding << TestLog::EndMessage;
    339 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    340 	ctx.glGetIntegerv			(GL_SAMPLE_BUFFERS, &sampleBuffers);
    341 	ctx.getLog() << TestLog::Message << "// GL_SAMPLE_BUFFERS: " << sampleBuffers << TestLog::EndMessage;
    342 	ctx.expectError				(GL_NO_ERROR);
    343 
    344 	if (binding == 0 || sampleBuffers <= 0)
    345 	{
    346 		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;
    347 		ctx.fail("Got invalid value");
    348 	}
    349 	else
    350 	{
    351 		ctx.glReadPixels	(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
    352 		ctx.expectError		(GL_INVALID_OPERATION);
    353 	}
    354 
    355 	ctx.endSection();
    356 
    357 	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, 0);
    358 	ctx.glBindTexture			(GL_TEXTURE_2D, 0);
    359 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, 0);
    360 	ctx.glDeleteFramebuffers	(1, &fbo);
    361 	ctx.glDeleteTextures		(1, &texture);
    362 	ctx.glDeleteRenderbuffers	(1, &rbo);
    363 }
    364 
    365 void bind_buffer_range (NegativeTestContext& ctx)
    366 {
    367 	deUint32	bufAC		= 0x1234;
    368 	deUint32	bufU		= 0x1234;
    369 	deUint32	bufTF		= 0x1234;
    370 	int			maxTFSize	= 0x1234;
    371 	int			maxUSize	= 0x1234;
    372 	int			uAlignment	= 0x1234;
    373 
    374 	ctx.glGenBuffers(1, &bufU);
    375 	ctx.glBindBuffer(GL_UNIFORM_BUFFER, bufU);
    376 	ctx.glBufferData(GL_UNIFORM_BUFFER, 16, NULL, GL_STREAM_DRAW);
    377 
    378 	ctx.glGenBuffers(1, &bufTF);
    379 	ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, bufTF);
    380 	ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 16, NULL, GL_STREAM_DRAW);
    381 
    382 	ctx.glGenBuffers(1, &bufAC);
    383 	ctx.glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, bufAC);
    384 	ctx.glBufferData(GL_ATOMIC_COUNTER_BUFFER, 16, NULL, GL_STREAM_DRAW);
    385 
    386 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_ATOMIC_COUNTER_BUFFER, GL_SHADER_STORAGE_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER or GL_UNIFORM_BUFFER.");
    387 	ctx.glBindBufferRange(GL_ARRAY_BUFFER, 0, bufU, 0, 4);
    388 	ctx.expectError(GL_INVALID_ENUM);
    389 	ctx.endSection();
    390 
    391 	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.");
    392 	ctx.glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTFSize);
    393 	ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, maxTFSize, bufTF, 0, 4);
    394 	ctx.expectError(GL_INVALID_VALUE);
    395 	ctx.endSection();
    396 
    397 	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.");
    398 	ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUSize);
    399 	ctx.glBindBufferRange(GL_UNIFORM_BUFFER, maxUSize, bufU, 0, 4);
    400 	ctx.expectError(GL_INVALID_VALUE);
    401 	ctx.endSection();
    402 
    403 	ctx.beginSection("GL_INVALID_VALUE is generated if size is less than or equal to zero.");
    404 	ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, 0, -1);
    405 	ctx.expectError(GL_INVALID_VALUE);
    406 	ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, 0, 0);
    407 	ctx.expectError(GL_INVALID_VALUE);
    408 	ctx.endSection();
    409 
    410 	ctx.beginSection("GL_INVALID_VALUE is generated if offset is less than zero.");
    411 	ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, -1, 0);
    412 	ctx.expectError(GL_INVALID_VALUE);
    413 	ctx.endSection();
    414 
    415 	ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TRANSFORM_FEEDBACK_BUFFER and size or offset are not multiples of 4.");
    416 	ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 4, 5);
    417 	ctx.expectError(GL_INVALID_VALUE);
    418 	ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 5, 4);
    419 	ctx.expectError(GL_INVALID_VALUE);
    420 	ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 5, 7);
    421 	ctx.expectError(GL_INVALID_VALUE);
    422 	ctx.endSection();
    423 
    424 	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.");
    425 	ctx.glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &uAlignment);
    426 	ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, uAlignment+1, 4);
    427 	ctx.expectError(GL_INVALID_VALUE);
    428 	ctx.endSection();
    429 
    430 	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
    431 	{
    432 		int maxACize	= 0x1234;
    433 		int maxSSize	= 0x1234;
    434 		int ssAlignment	= 0x1234;
    435 
    436 		ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_ATOMIC_COUNTER_BUFFER and index is greater than or equal to GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS.");
    437 		ctx.glGetIntegerv(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &maxACize);
    438 		ctx.glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, maxACize, bufU, 0, 4);
    439 		ctx.expectError(GL_INVALID_VALUE);
    440 		ctx.endSection();
    441 
    442 		ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_SHADER_STORAGE_BUFFER and index is greater than or equal to GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS.");
    443 		ctx.glGetIntegerv(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, &maxSSize);
    444 		ctx.glBindBufferRange(GL_SHADER_STORAGE_BUFFER, maxSSize, bufU, 0, 4);
    445 		ctx.expectError(GL_INVALID_VALUE);
    446 		ctx.endSection();
    447 
    448 		ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_ATOMIC_COUNTER_BUFFER and offset is not multiples of 4.");
    449 		ctx.glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, 0, bufTF, 5, 4);
    450 		ctx.expectError(GL_INVALID_VALUE);
    451 		ctx.endSection();
    452 
    453 		ctx.glGetIntegerv(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT, &ssAlignment);
    454 
    455 		if (ssAlignment != 1)
    456 		{
    457 			ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_SHADER_STORAGE_BUFFER and offset is not a multiple of the value of GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT.");
    458 			ctx.glBindBufferRange(GL_SHADER_STORAGE_BUFFER, 0, bufTF, ssAlignment+1, 4);
    459 			ctx.expectError(GL_INVALID_VALUE);
    460 			ctx.endSection();
    461 		}
    462 	}
    463 
    464 	ctx.glDeleteBuffers(1, &bufU);
    465 	ctx.glDeleteBuffers(1, &bufTF);
    466 	ctx.glDeleteBuffers(1, &bufAC);
    467 }
    468 
    469 void bind_buffer_base (NegativeTestContext& ctx)
    470 {
    471 	deUint32	bufU		= 0x1234;
    472 	deUint32	bufTF		= 0x1234;
    473 	int			maxUSize	= 0x1234;
    474 	int			maxTFSize	= 0x1234;
    475 
    476 	ctx.glGenBuffers(1, &bufU);
    477 	ctx.glBindBuffer(GL_UNIFORM_BUFFER, bufU);
    478 	ctx.glBufferData(GL_UNIFORM_BUFFER, 16, NULL, GL_STREAM_DRAW);
    479 
    480 	ctx.glGenBuffers(1, &bufTF);
    481 	ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, bufTF);
    482 	ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 16, NULL, GL_STREAM_DRAW);
    483 	ctx.expectError(GL_NO_ERROR);
    484 
    485 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_ATOMIC_COUNTER_BUFFER, GL_SHADER_STORAGE_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER or GL_UNIFORM_BUFFER.");
    486 	ctx.glBindBufferBase(-1, 0, bufU);
    487 	ctx.expectError(GL_INVALID_ENUM);
    488 	ctx.glBindBufferBase(GL_ARRAY_BUFFER, 0, bufU);
    489 	ctx.expectError(GL_INVALID_ENUM);
    490 	ctx.endSection();
    491 
    492 	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.");
    493 	ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUSize);
    494 	ctx.glBindBufferBase(GL_UNIFORM_BUFFER, maxUSize, bufU);
    495 	ctx.expectError(GL_INVALID_VALUE);
    496 	ctx.endSection();
    497 
    498 	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.");
    499 	ctx.glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTFSize);
    500 	ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, maxTFSize, bufTF);
    501 	ctx.expectError(GL_INVALID_VALUE);
    502 	ctx.endSection();
    503 
    504 	ctx.glDeleteBuffers(1, &bufU);
    505 	ctx.glDeleteBuffers(1, &bufTF);
    506 }
    507 
    508 void clear_bufferiv (NegativeTestContext& ctx)
    509 {
    510 	std::vector<int>	data			(32*32);
    511 	deUint32			fbo				= 0x1234;
    512 	deUint32			texture			= 0x1234;
    513 	int					maxDrawBuffers	= 0x1234;
    514 
    515 	ctx.glGenTextures			(1, &texture);
    516 	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
    517 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL);
    518 	ctx.glGenFramebuffers		(1, &fbo);
    519 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
    520 	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    521 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    522 	ctx.expectError				(GL_NO_ERROR);
    523 
    524 	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not an accepted value.");
    525 	ctx.glClearBufferiv			(-1, 0, &data[0]);
    526 	ctx.expectError				(GL_INVALID_ENUM);
    527 	ctx.glClearBufferiv			(GL_FRAMEBUFFER, 0, &data[0]);
    528 	ctx.expectError				(GL_INVALID_ENUM);
    529 	ctx.endSection();
    530 
    531 	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is GL_DEPTH or GL_DEPTH_STENCIL.");
    532 	ctx.glClearBufferiv			(GL_DEPTH, 1, &data[0]);
    533 	ctx.expectError				(GL_INVALID_ENUM);
    534 	ctx.glClearBufferiv			(GL_DEPTH_STENCIL, 1, &data[0]);
    535 	ctx.expectError				(GL_INVALID_ENUM);
    536 	ctx.endSection();
    537 
    538 	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR or GL_STENCIL and drawBuffer is greater than or equal to GL_MAX_DRAW_BUFFERS.");
    539 	ctx.glGetIntegerv			(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
    540 	ctx.glClearBufferiv			(GL_COLOR, maxDrawBuffers, &data[0]);
    541 	ctx.expectError				(GL_INVALID_VALUE);
    542 	ctx.endSection();
    543 
    544 	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR or GL_STENCIL and drawBuffer is negative.");
    545 	ctx.glClearBufferiv			(GL_COLOR, -1, &data[0]);
    546 	ctx.expectError				(GL_INVALID_VALUE);
    547 	ctx.endSection();
    548 
    549 	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_STENCIL and drawBuffer is not zero.");
    550 	ctx.glClearBufferiv			(GL_STENCIL, 1, &data[0]);
    551 	ctx.expectError				(GL_INVALID_VALUE);
    552 	ctx.endSection();
    553 
    554 	ctx.glDeleteFramebuffers	(1, &fbo);
    555 	ctx.glDeleteTextures		(1, &texture);
    556 }
    557 
    558 void clear_bufferuiv (NegativeTestContext& ctx)
    559 {
    560 	std::vector<deUint32>	data			(32*32);
    561 	deUint32				fbo				= 0x1234;
    562 	deUint32				texture			= 0x1234;
    563 	int						maxDrawBuffers	= 0x1234;
    564 
    565 	ctx.glGenTextures			(1, &texture);
    566 	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
    567 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL);
    568 	ctx.glGenFramebuffers		(1, &fbo);
    569 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
    570 	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    571 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    572 	ctx.expectError				(GL_NO_ERROR);
    573 
    574 	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not GL_COLOR.");
    575 	ctx.glClearBufferuiv		(-1, 0, &data[0]);
    576 	ctx.expectError				(GL_INVALID_ENUM);
    577 	ctx.glClearBufferuiv		(GL_FRAMEBUFFER, 0, &data[0]);
    578 	ctx.expectError				(GL_INVALID_ENUM);
    579 	ctx.endSection();
    580 
    581 	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is GL_DEPTH, GL_STENCIL, or GL_DEPTH_STENCIL.");
    582 	ctx.glClearBufferuiv		(GL_DEPTH, 0, &data[0]);
    583 	ctx.expectError				(GL_INVALID_ENUM);
    584 	ctx.glClearBufferuiv		(GL_STENCIL, 0, &data[0]);
    585 	ctx.expectError				(GL_INVALID_ENUM);
    586 	ctx.glClearBufferuiv		(GL_DEPTH_STENCIL, 0, &data[0]);
    587 	ctx.expectError				(GL_INVALID_ENUM);
    588 	ctx.endSection();
    589 
    590 	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR and drawBuffer is greater than or equal to GL_MAX_DRAW_BUFFERS.");
    591 	ctx.glGetIntegerv			(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
    592 	ctx.glClearBufferuiv		(GL_COLOR, maxDrawBuffers, &data[0]);
    593 	ctx.expectError				(GL_INVALID_VALUE);
    594 	ctx.endSection();
    595 
    596 	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR and drawBuffer is negative.");
    597 	ctx.glClearBufferuiv		(GL_COLOR, -1, &data[0]);
    598 	ctx.expectError				(GL_INVALID_VALUE);
    599 	ctx.endSection();
    600 
    601 	ctx.glDeleteFramebuffers	(1, &fbo);
    602 	ctx.glDeleteTextures		(1, &texture);
    603 }
    604 
    605 void clear_bufferfv (NegativeTestContext& ctx)
    606 {
    607 	std::vector<float>	data			(32*32);
    608 	deUint32			fbo				= 0x1234;
    609 	deUint32			texture			= 0x1234;
    610 	int					maxDrawBuffers	= 0x1234;
    611 
    612 	ctx.glGenTextures			(1, &texture);
    613 	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
    614 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32F, 32, 32, 0, GL_RGBA, GL_FLOAT, NULL);
    615 	ctx.glGenFramebuffers		(1, &fbo);
    616 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
    617 	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    618 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    619 	ctx.expectError				(GL_NO_ERROR);
    620 
    621 	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not GL_COLOR or GL_DEPTH.");
    622 	ctx.glClearBufferfv			(-1, 0, &data[0]);
    623 	ctx.expectError				(GL_INVALID_ENUM);
    624 	ctx.glClearBufferfv			(GL_FRAMEBUFFER, 0, &data[0]);
    625 	ctx.expectError				(GL_INVALID_ENUM);
    626 	ctx.endSection();
    627 
    628 	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is GL_STENCIL or GL_DEPTH_STENCIL.");
    629 	ctx.glClearBufferfv			(GL_STENCIL, 1, &data[0]);
    630 	ctx.expectError				(GL_INVALID_ENUM);
    631 	ctx.glClearBufferfv			(GL_DEPTH_STENCIL, 1, &data[0]);
    632 	ctx.expectError				(GL_INVALID_ENUM);
    633 	ctx.endSection();
    634 
    635 	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR and drawBuffer is greater than or equal to GL_MAX_DRAW_BUFFERS.");
    636 	ctx.glGetIntegerv			(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
    637 	ctx.glClearBufferfv			(GL_COLOR, maxDrawBuffers, &data[0]);
    638 	ctx.expectError				(GL_INVALID_VALUE);
    639 	ctx.endSection();
    640 
    641 	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR and drawBuffer is negative.");
    642 	ctx.glClearBufferfv			(GL_COLOR, -1, &data[0]);
    643 	ctx.expectError				(GL_INVALID_VALUE);
    644 	ctx.endSection();
    645 
    646 	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_DEPTH and drawBuffer is not zero.");
    647 	ctx.glClearBufferfv			(GL_DEPTH, 1, &data[0]);
    648 	ctx.expectError				(GL_INVALID_VALUE);
    649 	ctx.endSection();
    650 
    651 	ctx.glDeleteFramebuffers	(1, &fbo);
    652 	ctx.glDeleteTextures		(1, &texture);
    653 }
    654 
    655 void clear_bufferfi (NegativeTestContext& ctx)
    656 {
    657 	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not GL_DEPTH_STENCIL.");
    658 	ctx.glClearBufferfi		(-1, 0, 1.0f, 1);
    659 	ctx.expectError			(GL_INVALID_ENUM);
    660 	ctx.glClearBufferfi		(GL_FRAMEBUFFER, 0, 1.0f, 1);
    661 	ctx.expectError			(GL_INVALID_ENUM);
    662 	ctx.glClearBufferfi		(GL_DEPTH, 0, 1.0f, 1);
    663 	ctx.expectError			(GL_INVALID_ENUM);
    664 	ctx.glClearBufferfi		(GL_STENCIL, 0, 1.0f, 1);
    665 	ctx.expectError			(GL_INVALID_ENUM);
    666 	ctx.glClearBufferfi		(GL_COLOR, 0, 1.0f, 1);
    667 	ctx.expectError			(GL_INVALID_ENUM);
    668 	ctx.endSection();
    669 
    670 	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_DEPTH_STENCIL and drawBuffer is not zero.");
    671 	ctx.glClearBufferfi		(GL_DEPTH_STENCIL, 1, 1.0f, 1);
    672 	ctx.expectError			(GL_INVALID_VALUE);
    673 	ctx.endSection();
    674 }
    675 
    676 void copy_buffer_sub_data (NegativeTestContext& ctx)
    677 {
    678 	deUint32				buf[2];
    679 	std::vector<float>		data	(32*32);
    680 
    681 	ctx.glGenBuffers			(2, buf);
    682 	ctx.glBindBuffer			(GL_COPY_READ_BUFFER, buf[0]);
    683 	ctx.glBufferData			(GL_COPY_READ_BUFFER, 32, &data[0], GL_DYNAMIC_COPY);
    684 	ctx.glBindBuffer			(GL_COPY_WRITE_BUFFER, buf[1]);
    685 	ctx.glBufferData			(GL_COPY_WRITE_BUFFER, 32, &data[0], GL_DYNAMIC_COPY);
    686 	ctx.expectError				(GL_NO_ERROR);
    687 
    688 	ctx.beginSection("GL_INVALID_VALUE is generated if any of readoffset, writeoffset or size is negative.");
    689 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, -4);
    690 	ctx.expectError				(GL_INVALID_VALUE);
    691 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, -1, 0, 4);
    692 	ctx.expectError				(GL_INVALID_VALUE);
    693 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, -1, 4);
    694 	ctx.expectError				(GL_INVALID_VALUE);
    695 	ctx.endSection();
    696 
    697 	ctx.beginSection("GL_INVALID_VALUE is generated if readoffset + size exceeds the size of the buffer object bound to readtarget.");
    698 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 36);
    699 	ctx.expectError				(GL_INVALID_VALUE);
    700 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 24, 0, 16);
    701 	ctx.expectError				(GL_INVALID_VALUE);
    702 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 36, 0, 4);
    703 	ctx.expectError				(GL_INVALID_VALUE);
    704 	ctx.endSection();
    705 
    706 	ctx.beginSection("GL_INVALID_VALUE is generated if writeoffset + size exceeds the size of the buffer object bound to writetarget.");
    707 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 36);
    708 	ctx.expectError				(GL_INVALID_VALUE);
    709 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 24, 16);
    710 	ctx.expectError				(GL_INVALID_VALUE);
    711 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 36, 4);
    712 	ctx.expectError				(GL_INVALID_VALUE);
    713 	ctx.endSection();
    714 
    715 	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.");
    716 	ctx.glBindBuffer			(GL_COPY_WRITE_BUFFER, buf[0]);
    717 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 16, 4);
    718 	ctx.expectError				(GL_NO_ERROR);
    719 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 4);
    720 	ctx.expectError				(GL_INVALID_VALUE);
    721 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 16, 18);
    722 	ctx.expectError				(GL_INVALID_VALUE);
    723 	ctx.glBindBuffer			(GL_COPY_WRITE_BUFFER, buf[1]);
    724 	ctx.endSection();
    725 
    726 	ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to readtarget or writetarget.");
    727 	ctx.glBindBuffer			(GL_COPY_READ_BUFFER, 0);
    728 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16);
    729 	ctx.expectError				(GL_INVALID_OPERATION);
    730 
    731 	ctx.glBindBuffer			(GL_COPY_READ_BUFFER, buf[0]);
    732 	ctx.glBindBuffer			(GL_COPY_WRITE_BUFFER, 0);
    733 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16);
    734 	ctx.expectError				(GL_INVALID_OPERATION);
    735 
    736 	ctx.glBindBuffer			(GL_COPY_WRITE_BUFFER, buf[1]);
    737 	ctx.endSection();
    738 
    739 	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer object bound to either readtarget or writetarget is mapped.");
    740 	ctx.glMapBufferRange		(GL_COPY_READ_BUFFER, 0, 4, GL_MAP_READ_BIT);
    741 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16);
    742 	ctx.expectError				(GL_INVALID_OPERATION);
    743 	ctx.glUnmapBuffer			(GL_COPY_READ_BUFFER);
    744 
    745 	ctx.glMapBufferRange		(GL_COPY_WRITE_BUFFER, 0, 4, GL_MAP_READ_BIT);
    746 	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16);
    747 	ctx.expectError				(GL_INVALID_OPERATION);
    748 	ctx.glUnmapBuffer			(GL_COPY_WRITE_BUFFER);
    749 	ctx.endSection();
    750 
    751 	ctx.glDeleteBuffers(2, buf);
    752 }
    753 
    754 void draw_buffers (NegativeTestContext& ctx)
    755 {
    756 	deUint32				fbo						= 0x1234;
    757 	deUint32				texture					= 0x1234;
    758 	int						maxDrawBuffers			= 0x1234;
    759 	int						maxColorAttachments		= -1;
    760 	ctx.glGetIntegerv		(GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments);
    761 	ctx.glGetIntegerv		(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
    762 	std::vector<deUint32>	values					(maxDrawBuffers+1);
    763 	std::vector<deUint32>	attachments				(4);
    764 	std::vector<GLfloat>	data					(32*32);
    765 	values[0]				= GL_NONE;
    766 	values[1]				= GL_BACK;
    767 	values[2]				= GL_COLOR_ATTACHMENT0;
    768 	values[3]				= GL_DEPTH_ATTACHMENT;
    769 	attachments[0]			= (glw::GLenum) (GL_COLOR_ATTACHMENT0 + maxColorAttachments);
    770 	attachments[1]			= GL_COLOR_ATTACHMENT0;
    771 	attachments[2]			= GL_COLOR_ATTACHMENT1;
    772 	attachments[3]			= GL_NONE;
    773 
    774 	ctx.glGenTextures			(1, &texture);
    775 	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
    776 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    777 	ctx.glGenFramebuffers		(1, &fbo);
    778 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
    779 	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    780 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    781 	ctx.expectError				(GL_NO_ERROR);
    782 
    783 	ctx.beginSection("GL_INVALID_ENUM is generated if one of the values in bufs is not an accepted value.");
    784 	ctx.glDrawBuffers			(2, &values[2]);
    785 	ctx.expectError				(GL_INVALID_ENUM);
    786 	ctx.endSection();
    787 
    788 	ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to a draw framebuffer and DrawBuffers is supplied with BACK or COLOR_ATTACHMENTm where m is greater than or equal to the value of MAX_COLOR_ATTACHMENTS.");
    789 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
    790 	ctx.glDrawBuffers			(1, &values[1]);
    791 	ctx.expectError				(GL_INVALID_OPERATION);
    792 	ctx.glDrawBuffers			(4, &attachments[0]);
    793 	ctx.expectError				(GL_INVALID_OPERATION);
    794 	ctx.endSection();
    795 
    796 	ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to the default framebuffer and n is not 1.");
    797 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, 0);
    798 	ctx.glDrawBuffers			(2, &values[0]);
    799 	ctx.expectError				(GL_INVALID_OPERATION);
    800 	ctx.endSection();
    801 
    802 	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.");
    803 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, 0);
    804 	ctx.glDrawBuffers			(1, &values[2]);
    805 	ctx.expectError				(GL_INVALID_OPERATION);
    806 	ctx.endSection();
    807 
    808 	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.");
    809 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
    810 	ctx.glDrawBuffers			(1, &values[1]);
    811 	ctx.expectError				(GL_INVALID_OPERATION);
    812 	ctx.glDrawBuffers			(4, &attachments[0]);
    813 	ctx.expectError				(GL_INVALID_OPERATION);
    814 
    815 	ctx.endSection();
    816 
    817 	ctx.beginSection("GL_INVALID_VALUE is generated if n is less than 0 or greater than GL_MAX_DRAW_BUFFERS.");
    818 	ctx.glDrawBuffers			(-1, &values[1]);
    819 	ctx.expectError				(GL_INVALID_VALUE);
    820 	ctx.glDrawBuffers			(maxDrawBuffers+1, &values[0]);
    821 	ctx.expectError				(GL_INVALID_VALUE);
    822 	ctx.endSection();
    823 
    824 	ctx.glDeleteTextures(1, &texture);
    825 	ctx.glDeleteFramebuffers(1, &fbo);
    826 }
    827 
    828 void flush_mapped_buffer_range (NegativeTestContext& ctx)
    829 {
    830 	deUint32				buf		= 0x1234;
    831 	std::vector<GLfloat>	data	(32);
    832 
    833 	ctx.glGenBuffers			(1, &buf);
    834 	ctx.glBindBuffer			(GL_ARRAY_BUFFER, buf);
    835 	ctx.glBufferData			(GL_ARRAY_BUFFER, 32, &data[0], GL_STATIC_READ);
    836 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
    837 	ctx.expectError				(GL_NO_ERROR);
    838 
    839 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted values.");
    840 	ctx.glFlushMappedBufferRange(-1, 0, 16);
    841 	ctx.expectError				(GL_INVALID_ENUM);
    842 	ctx.endSection();
    843 
    844 	ctx.beginSection("GL_INVALID_VALUE is generated if offset or length is negative, or if offset + length exceeds the size of the mapping.");
    845 	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, -1, 1);
    846 	ctx.expectError				(GL_INVALID_VALUE);
    847 	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, -1);
    848 	ctx.expectError				(GL_INVALID_VALUE);
    849 	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 12, 8);
    850 	ctx.expectError				(GL_INVALID_VALUE);
    851 	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 24, 4);
    852 	ctx.expectError				(GL_INVALID_VALUE);
    853 	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 24);
    854 	ctx.expectError				(GL_INVALID_VALUE);
    855 	ctx.endSection();
    856 
    857 	ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target.");
    858 	ctx.glBindBuffer			(GL_ARRAY_BUFFER, 0);
    859 	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 8);
    860 	ctx.expectError				(GL_INVALID_OPERATION);
    861 	ctx.endSection();
    862 
    863 	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.");
    864 	ctx.glBindBuffer			(GL_ARRAY_BUFFER, buf);
    865 	ctx.glUnmapBuffer			(GL_ARRAY_BUFFER);
    866 	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 8);
    867 	ctx.expectError				(GL_INVALID_OPERATION);
    868 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT);
    869 	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 8);
    870 	ctx.expectError				(GL_INVALID_OPERATION);
    871 	ctx.endSection();
    872 
    873 	ctx.glUnmapBuffer			(GL_ARRAY_BUFFER);
    874 	ctx.glDeleteBuffers			(1, &buf);
    875 }
    876 
    877 void map_buffer_range (NegativeTestContext& ctx)
    878 {
    879 	deUint32				buf		= 0x1234;
    880 	std::vector<GLfloat>	data	(32);
    881 
    882 	ctx.glGenBuffers			(1, &buf);
    883 	ctx.glBindBuffer			(GL_ARRAY_BUFFER, buf);
    884 	ctx.glBufferData			(GL_ARRAY_BUFFER, 32, &data[0], GL_DYNAMIC_COPY);
    885 	ctx.expectError				(GL_NO_ERROR);
    886 
    887 	ctx.beginSection("GL_INVALID_VALUE is generated if either of offset or length is negative.");
    888 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, -1, 1, GL_MAP_READ_BIT);
    889 	ctx.expectError				(GL_INVALID_VALUE);
    890 
    891 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 1, -1, GL_MAP_READ_BIT);
    892 	ctx.expectError				(GL_INVALID_VALUE);
    893 	ctx.endSection();
    894 
    895 	ctx.beginSection("GL_INVALID_VALUE is generated if offset + length is greater than the value of GL_BUFFER_SIZE.");
    896 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 33, GL_MAP_READ_BIT);
    897 	ctx.expectError				(GL_INVALID_VALUE);
    898 
    899 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 32, 1, GL_MAP_READ_BIT);
    900 	ctx.expectError				(GL_INVALID_VALUE);
    901 
    902 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 16, 17, GL_MAP_READ_BIT);
    903 	ctx.expectError				(GL_INVALID_VALUE);
    904 	ctx.endSection();
    905 
    906 	ctx.beginSection("GL_INVALID_VALUE is generated if access has any bits set other than those accepted.");
    907 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | 0x1000);
    908 	ctx.expectError				(GL_INVALID_VALUE);
    909 
    910 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT | 0x1000);
    911 	ctx.expectError				(GL_INVALID_VALUE);
    912 	ctx.endSection();
    913 
    914 	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer is already in a mapped state.");
    915 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT);
    916 	ctx.expectError				(GL_NO_ERROR);
    917 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 16, 8, GL_MAP_READ_BIT);
    918 	ctx.expectError				(GL_INVALID_OPERATION);
    919 	ctx.glUnmapBuffer			(GL_ARRAY_BUFFER);
    920 	ctx.endSection();
    921 
    922 	ctx.beginSection("GL_INVALID_OPERATION is generated if neither GL_MAP_READ_BIT or GL_MAP_WRITE_BIT is set.");
    923 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_INVALIDATE_RANGE_BIT);
    924 	ctx.expectError				(GL_INVALID_OPERATION);
    925 	ctx.endSection();
    926 
    927 	ctx.beginSection("GL_INVALID_OPERATION is generated if length is 0");
    928 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 0, GL_MAP_READ_BIT);
    929 	ctx.expectError				(GL_INVALID_OPERATION);
    930 	ctx.endSection();
    931 
    932 	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.");
    933 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
    934 	ctx.expectError				(GL_INVALID_OPERATION);
    935 
    936 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
    937 	ctx.expectError				(GL_INVALID_OPERATION);
    938 
    939 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
    940 	ctx.expectError				(GL_INVALID_OPERATION);
    941 	ctx.endSection();
    942 
    943 	ctx.beginSection("GL_INVALID_OPERATION is generated if GL_MAP_FLUSH_EXPLICIT_BIT is set and GL_MAP_WRITE_BIT is not set.");
    944 	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
    945 	ctx.expectError				(GL_INVALID_OPERATION);
    946 	ctx.endSection();
    947 
    948 	ctx.glDeleteBuffers			(1, &buf);
    949 }
    950 
    951 void read_buffer (NegativeTestContext& ctx)
    952 {
    953 	deUint32	fbo					= 0x1234;
    954 	deUint32	texture				= 0x1234;
    955 	int			maxColorAttachments	= 0x1234;
    956 
    957 	ctx.glGetIntegerv			(GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments);
    958 	ctx.glGenTextures			(1, &texture);
    959 	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
    960 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    961 	ctx.glGenFramebuffers		(1, &fbo);
    962 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
    963 	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    964 	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
    965 	ctx.expectError				(GL_NO_ERROR);
    966 
    967 	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not GL_BACK, GL_NONE, or GL_COLOR_ATTACHMENTi.");
    968 	ctx.glReadBuffer			(GL_NONE);
    969 	ctx.expectError				(GL_NO_ERROR);
    970 	ctx.glReadBuffer			(1);
    971 	ctx.expectError				(GL_INVALID_ENUM);
    972 	ctx.glReadBuffer			(GL_FRAMEBUFFER);
    973 	ctx.expectError				(GL_INVALID_ENUM);
    974 	ctx.glReadBuffer			(GL_COLOR_ATTACHMENT0 - 1);
    975 	ctx.expectError				(GL_INVALID_ENUM);
    976 	ctx.glReadBuffer			(GL_FRONT);
    977 	ctx.expectError				(GL_INVALID_ENUM);
    978 
    979 	// \ note Spec isn't actually clear here, but it is safe to assume that
    980 	//		  GL_DEPTH_ATTACHMENT can't be interpreted as GL_COLOR_ATTACHMENTm
    981 	//		  where m = (GL_DEPTH_ATTACHMENT - GL_COLOR_ATTACHMENT0).
    982 	ctx.glReadBuffer			(GL_DEPTH_ATTACHMENT);
    983 	ctx.expectError				(GL_INVALID_ENUM);
    984 	ctx.glReadBuffer			(GL_STENCIL_ATTACHMENT);
    985 	ctx.expectError				(GL_INVALID_ENUM);
    986 	ctx.glReadBuffer			(GL_STENCIL_ATTACHMENT+1);
    987 	ctx.expectError				(GL_INVALID_ENUM);
    988 	ctx.glReadBuffer			(0xffffffffu);
    989 	ctx.expectError				(GL_INVALID_ENUM);
    990 	ctx.endSection();
    991 
    992 	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.");
    993 	ctx.glReadBuffer			(GL_BACK);
    994 	ctx.expectError				(GL_INVALID_OPERATION);
    995 	ctx.glReadBuffer			(GL_COLOR_ATTACHMENT0 + maxColorAttachments);
    996 	ctx.expectError				(GL_INVALID_OPERATION);
    997 
    998 	if (GL_COLOR_ATTACHMENT0+maxColorAttachments < GL_DEPTH_ATTACHMENT-1)
    999 	{
   1000 		ctx.glReadBuffer			(GL_DEPTH_ATTACHMENT - 1);
   1001 		ctx.expectError				(GL_INVALID_OPERATION);
   1002 	}
   1003 
   1004 	ctx.endSection();
   1005 
   1006 	ctx.beginSection("GL_INVALID_OPERATION is generated if the current framebuffer is the default framebuffer and mode is not GL_NONE or GL_BACK.");
   1007 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, 0);
   1008 	ctx.glReadBuffer			(GL_COLOR_ATTACHMENT0);
   1009 	ctx.expectError				(GL_INVALID_OPERATION);
   1010 	ctx.endSection();
   1011 
   1012 	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.");
   1013 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
   1014 	ctx.glReadBuffer			(GL_BACK);
   1015 	ctx.expectError				(GL_INVALID_OPERATION);
   1016 	ctx.endSection();
   1017 
   1018 	ctx.glDeleteTextures(1, &texture);
   1019 	ctx.glDeleteFramebuffers(1, &fbo);
   1020 }
   1021 
   1022 void unmap_buffer (NegativeTestContext& ctx)
   1023 {
   1024 	deUint32				buf		= 0x1234;
   1025 	std::vector<GLfloat>	data	(32);
   1026 
   1027 	ctx.glGenBuffers			(1, &buf);
   1028 	ctx.glBindBuffer			(GL_ARRAY_BUFFER, buf);
   1029 	ctx.glBufferData			(GL_ARRAY_BUFFER, 32, &data[0], GL_DYNAMIC_COPY);
   1030 	ctx.expectError				(GL_NO_ERROR);
   1031 
   1032 	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer data store is already in an unmapped state.");
   1033 	ctx.glUnmapBuffer			(GL_ARRAY_BUFFER);
   1034 	ctx.expectError				(GL_INVALID_OPERATION);
   1035 	ctx.endSection();
   1036 
   1037 	ctx.glDeleteBuffers			(1, &buf);
   1038 }
   1039 // Framebuffer Objects
   1040 
   1041 void bind_framebuffer (NegativeTestContext& ctx)
   1042 {
   1043 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_DRAW_FRAMEBUFFER, GL_READ_FRAMEBUFFER, or GL_FRAMEBUFFER.");
   1044 	ctx.glBindFramebuffer(-1, 0);
   1045 	ctx.expectError(GL_INVALID_ENUM);
   1046 	ctx.glBindFramebuffer(GL_RENDERBUFFER, 0);
   1047 	ctx.expectError(GL_INVALID_ENUM);
   1048 	ctx.endSection();
   1049 }
   1050 
   1051 void bind_renderbuffer (NegativeTestContext& ctx)
   1052 {
   1053 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
   1054 	ctx.glBindRenderbuffer(-1, 0);
   1055 	ctx.expectError(GL_INVALID_ENUM);
   1056 	ctx.glBindRenderbuffer(GL_FRAMEBUFFER, 0);
   1057 	ctx.expectError(GL_INVALID_ENUM);
   1058 	ctx.endSection();
   1059 }
   1060 
   1061 void check_framebuffer_status (NegativeTestContext& ctx)
   1062 {
   1063 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_DRAW_FRAMEBUFFER, GL_READ_FRAMEBUFFER, or GL_FRAMEBUFFER..");
   1064 	ctx.glCheckFramebufferStatus(-1);
   1065 	ctx.expectError(GL_INVALID_ENUM);
   1066 	ctx.glCheckFramebufferStatus(GL_RENDERBUFFER);
   1067 	ctx.expectError(GL_INVALID_ENUM);
   1068 	ctx.endSection();
   1069 }
   1070 
   1071 void gen_framebuffers (NegativeTestContext& ctx)
   1072 {
   1073 	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
   1074 	ctx.glGenFramebuffers(-1, 0);
   1075 	ctx.expectError(GL_INVALID_VALUE);
   1076 	ctx.endSection();
   1077 }
   1078 
   1079 void gen_renderbuffers (NegativeTestContext& ctx)
   1080 {
   1081 	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
   1082 	ctx.glGenRenderbuffers(-1, 0);
   1083 	ctx.expectError(GL_INVALID_VALUE);
   1084 	ctx.endSection();
   1085 }
   1086 
   1087 void delete_framebuffers (NegativeTestContext& ctx)
   1088 {
   1089 	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
   1090 	ctx.glDeleteFramebuffers(-1, 0);
   1091 	ctx.expectError(GL_INVALID_VALUE);
   1092 	ctx.endSection();
   1093 }
   1094 
   1095 void delete_renderbuffers (NegativeTestContext& ctx)
   1096 {;
   1097 	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
   1098 	ctx.glDeleteRenderbuffers(-1, 0);
   1099 	ctx.expectError(GL_INVALID_VALUE);
   1100 	ctx.endSection();
   1101 }
   1102 
   1103 void framebuffer_renderbuffer (NegativeTestContext& ctx)
   1104 {
   1105 	GLuint fbo = 0x1234;
   1106 	GLuint rbo = 0x1234;
   1107 	ctx.glGenFramebuffers(1, &fbo);
   1108 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1109 	ctx.glGenRenderbuffers(1, &rbo);
   1110 
   1111 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
   1112 	ctx.glFramebufferRenderbuffer(-1, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
   1113 	ctx.expectError(GL_INVALID_ENUM);
   1114 	ctx.endSection();
   1115 
   1116 	ctx.beginSection("GL_INVALID_ENUM is generated if attachment is not one of the accepted tokens.");
   1117 	ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, -1, GL_RENDERBUFFER, 0);
   1118 	ctx.expectError(GL_INVALID_ENUM);
   1119 	ctx.endSection();
   1120 
   1121 	ctx.beginSection("GL_INVALID_ENUM is generated if renderbuffertarget is not GL_RENDERBUFFER.");
   1122 	ctx.glBindRenderbuffer(GL_RENDERBUFFER, rbo);
   1123 	ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, rbo);
   1124 	ctx.expectError(GL_INVALID_ENUM);
   1125 	ctx.glBindRenderbuffer(GL_RENDERBUFFER, 0);
   1126 	ctx.endSection();
   1127 
   1128 	ctx.beginSection("GL_INVALID_OPERATION is generated if renderbuffer is neither 0 nor the name of an existing renderbuffer object.");
   1129 	ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, -1);
   1130 	ctx.expectError(GL_INVALID_OPERATION);
   1131 	ctx.endSection();
   1132 
   1133 	ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target.");
   1134 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   1135 	ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
   1136 	ctx.expectError(GL_INVALID_OPERATION);
   1137 	ctx.endSection();
   1138 
   1139 	ctx.glDeleteRenderbuffers(1, &rbo);
   1140 	ctx.glDeleteFramebuffers(1, &fbo);
   1141 }
   1142 
   1143 void framebuffer_texture (NegativeTestContext& ctx)
   1144 {
   1145 	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
   1146 	{
   1147 		GLuint fbo = 0x1234;
   1148 		GLuint texture[] = {0x1234, 0x1234};
   1149 
   1150 		ctx.glGenFramebuffers(1, &fbo);
   1151 		ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1152 		ctx.glGenTextures(2, texture);
   1153 		ctx.glBindTexture(GL_TEXTURE_2D, texture[0]);
   1154 		ctx.glBindTexture(GL_TEXTURE_BUFFER, texture[1]);
   1155 		ctx.expectError(GL_NO_ERROR);
   1156 
   1157 		ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
   1158 		ctx.glFramebufferTexture(-1, GL_COLOR_ATTACHMENT0, texture[0], 0);
   1159 		ctx.expectError(GL_INVALID_ENUM);
   1160 		ctx.endSection();
   1161 
   1162 		ctx.beginSection("GL_INVALID_ENUM is generated if attachment is not one of the accepted tokens.");
   1163 		ctx.glFramebufferTexture(GL_FRAMEBUFFER, -1, texture[0], 0);
   1164 		ctx.expectError(GL_INVALID_ENUM);
   1165 		ctx.endSection();
   1166 
   1167 		ctx.beginSection("GL_INVALID_OPERATION is generated if texture is neither 0 nor the name of an existing texture object.");
   1168 		ctx.glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, 0);
   1169 		ctx.expectError(GL_INVALID_VALUE);
   1170 		ctx.endSection();
   1171 
   1172 		ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target.");
   1173 		ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   1174 		ctx.glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 0, 0);
   1175 		ctx.expectError(GL_INVALID_OPERATION);
   1176 		ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1177 		ctx.endSection();
   1178 
   1179 		ctx.beginSection("GL_INVALID_OPERATION is generated by if texture is a buffer texture.");
   1180 		ctx.glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture[1], 0);
   1181 		ctx.expectError(GL_INVALID_OPERATION);
   1182 		ctx.endSection();
   1183 
   1184 		ctx.glDeleteFramebuffers(1, &fbo);
   1185 		ctx.glDeleteBuffers(2, texture);
   1186 	}
   1187 }
   1188 
   1189 void framebuffer_texture2d (NegativeTestContext& ctx)
   1190 {
   1191 	GLuint	fbo				= 0x1234;
   1192 	GLuint	tex2D			= 0x1234;
   1193 	GLuint	texCube			= 0x1234;
   1194 	GLuint	tex2DMS			= 0x1234;
   1195 	GLint	maxTexSize		= 0x1234;
   1196 	GLint	maxTexCubeSize	= 0x1234;
   1197 	int		maxSize			= 0x1234;
   1198 
   1199 	ctx.glGenFramebuffers(1, &fbo);
   1200 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1201 	ctx.glGenTextures(1, &tex2D);
   1202 	ctx.glBindTexture(GL_TEXTURE_2D, tex2D);
   1203 	ctx.glGenTextures(1, &texCube);
   1204 	ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, texCube);
   1205 	ctx.glGenTextures(1, &tex2DMS);
   1206 	ctx.glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex2DMS);
   1207 	ctx.glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
   1208 	ctx.glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxTexCubeSize);
   1209 	ctx.expectError(GL_NO_ERROR);
   1210 
   1211 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
   1212 	ctx.glFramebufferTexture2D(-1, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
   1213 	ctx.expectError(GL_INVALID_ENUM);
   1214 	ctx.endSection();
   1215 
   1216 	ctx.beginSection("GL_INVALID_ENUM is generated if textarget is not an accepted texture target.");
   1217 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, tex2D, 0);
   1218 	ctx.expectError(GL_INVALID_ENUM);
   1219 	ctx.endSection();
   1220 
   1221 	ctx.beginSection("GL_INVALID_ENUM is generated if attachment is not an accepted token.");
   1222 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, -1, GL_TEXTURE_2D, tex2D, 0);
   1223 	ctx.expectError(GL_INVALID_ENUM);
   1224 	ctx.endSection();
   1225 
   1226 	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0 or larger than log_2 of maximum texture size.");
   1227 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, -1);
   1228 	ctx.expectError(GL_INVALID_VALUE);
   1229 	maxSize = deLog2Floor32(maxTexSize) + 1;
   1230 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, maxSize);
   1231 	ctx.expectError(GL_INVALID_VALUE);
   1232 	maxSize = deLog2Floor32(maxTexSize) + 1;
   1233 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texCube, maxSize);
   1234 	ctx.expectError(GL_INVALID_VALUE);
   1235 	ctx.endSection();
   1236 
   1237 	ctx.beginSection("GL_INVALID_VALUE is generated if level is larger than maximum texture size.");
   1238 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, maxTexSize + 1);
   1239 	ctx.expectError(GL_INVALID_VALUE);
   1240 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, -1);
   1241 	ctx.expectError(GL_INVALID_VALUE);
   1242 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, texCube, maxTexCubeSize + 1);
   1243 	ctx.expectError(GL_INVALID_VALUE);
   1244 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, texCube, -1);
   1245 	ctx.expectError(GL_INVALID_VALUE);
   1246 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex2DMS, 1);
   1247 	ctx.expectError(GL_INVALID_VALUE);
   1248 	ctx.endSection();
   1249 
   1250 	ctx.beginSection("GL_INVALID_OPERATION is generated if texture is neither 0 nor the name of an existing texture object.");
   1251 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, -1, 0);
   1252 	ctx.expectError(GL_INVALID_OPERATION);
   1253 	ctx.endSection();
   1254 
   1255 	ctx.beginSection("GL_INVALID_OPERATION is generated if textarget and texture are not compatible.");
   1256 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, tex2D, 0);
   1257 	ctx.expectError(GL_INVALID_OPERATION);
   1258 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex2D, 0);
   1259 	ctx.expectError(GL_INVALID_OPERATION);
   1260 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texCube, 0);
   1261 	ctx.expectError(GL_INVALID_OPERATION);
   1262 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2DMS, 0);
   1263 	ctx.expectError(GL_INVALID_OPERATION);
   1264 	ctx.glDeleteTextures(1, &tex2D);
   1265 	ctx.glDeleteTextures(1, &texCube);
   1266 	ctx.glDeleteTextures(1, &tex2DMS);
   1267 	ctx.endSection();
   1268 
   1269 	ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target.");
   1270 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   1271 	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
   1272 	ctx.expectError(GL_INVALID_OPERATION);
   1273 	ctx.endSection();
   1274 
   1275 	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
   1276 	{
   1277 		GLuint texBuf = 0x1234;
   1278 		ctx.beginSection("GL_INVALID_OPERATION error is generated if texture is the name of a buffer texture.");
   1279 		ctx.glGenTextures(1, &texBuf);
   1280 		ctx.glBindTexture(GL_TEXTURE_BUFFER, texBuf);
   1281 		ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1282 		ctx.expectError(GL_NO_ERROR);
   1283 		ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texBuf, 0);
   1284 		ctx.expectError(GL_INVALID_OPERATION);
   1285 		ctx.endSection();
   1286 	}
   1287 
   1288 	ctx.glDeleteFramebuffers(1, &fbo);
   1289 }
   1290 
   1291 void renderbuffer_storage (NegativeTestContext& ctx)
   1292 {
   1293 	deUint32	rbo		= 0x1234;
   1294 	GLint		maxSize	= 0x1234;
   1295 
   1296 	ctx.glGenRenderbuffers		(1, &rbo);
   1297 	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, rbo);
   1298 
   1299 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
   1300 	ctx.glRenderbufferStorage	(-1, GL_RGBA4, 1, 1);
   1301 	ctx.expectError				(GL_INVALID_ENUM);
   1302 	ctx.glRenderbufferStorage	(GL_FRAMEBUFFER, GL_RGBA4, 1, 1);
   1303 	ctx.expectError				(GL_INVALID_ENUM);
   1304 	ctx.endSection();
   1305 
   1306 	ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not a color-renderable, depth-renderable, or stencil-renderable format.");
   1307 	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, -1, 1, 1);
   1308 	ctx.expectError				(GL_INVALID_ENUM);
   1309 
   1310 	if (!ctx.isExtensionSupported("GL_EXT_color_buffer_half_float")) // GL_EXT_color_buffer_half_float disables error
   1311 	{
   1312 		ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGB16F, 1, 1);
   1313 		ctx.expectError				(GL_INVALID_ENUM);
   1314 	}
   1315 
   1316 	if (!ctx.isExtensionSupported("GL_EXT_render_snorm")) // GL_EXT_render_snorm disables error
   1317 	{
   1318 		ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA8_SNORM, 1, 1);
   1319 		ctx.expectError				(GL_INVALID_ENUM);
   1320 	}
   1321 
   1322 	ctx.endSection();
   1323 
   1324 	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than zero.");
   1325 	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, -1, 1);
   1326 	ctx.expectError				(GL_INVALID_VALUE);
   1327 	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, 1, -1);
   1328 	ctx.expectError				(GL_INVALID_VALUE);
   1329 	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, -1, -1);
   1330 	ctx.expectError				(GL_INVALID_VALUE);
   1331 	ctx.endSection();
   1332 
   1333 	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_RENDERBUFFER_SIZE.");
   1334 	ctx.glGetIntegerv			(GL_MAX_RENDERBUFFER_SIZE, &maxSize);
   1335 	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, 1, maxSize+1);
   1336 	ctx.expectError				(GL_INVALID_VALUE);
   1337 	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, maxSize+1, 1);
   1338 	ctx.expectError				(GL_INVALID_VALUE);
   1339 	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, maxSize+1, maxSize+1);
   1340 	ctx.expectError				(GL_INVALID_VALUE);
   1341 	ctx.endSection();
   1342 
   1343 	ctx.glDeleteRenderbuffers(1, &rbo);
   1344 }
   1345 
   1346 void blit_framebuffer (NegativeTestContext& ctx)
   1347 {
   1348 	deUint32					fbo[2];
   1349 	deUint32					rbo[2];
   1350 	deUint32					texture[2];
   1351 	deUint32					blankFrameBuffer;
   1352 
   1353 	ctx.glGenFramebuffers		(1, &blankFrameBuffer);
   1354 	ctx.glGenFramebuffers		(2, fbo);
   1355 	ctx.glGenTextures			(2, texture);
   1356 	ctx.glGenRenderbuffers		(2, rbo);
   1357 
   1358 	ctx.glBindTexture			(GL_TEXTURE_2D, texture[0]);
   1359 	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, rbo[0]);
   1360 	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, fbo[0]);
   1361 
   1362 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1363 	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 32, 32);
   1364 	ctx.glFramebufferTexture2D	(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
   1365 	ctx.glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[0]);
   1366 	ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
   1367 
   1368 	ctx.glBindTexture			(GL_TEXTURE_2D, texture[1]);
   1369 	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, rbo[1]);
   1370 	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, fbo[1]);
   1371 
   1372 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1373 	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 32, 32);
   1374 	ctx.glFramebufferTexture2D	(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0);
   1375 	ctx.glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[1]);
   1376 	ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
   1377 	ctx.expectError				(GL_NO_ERROR);
   1378 
   1379 	ctx.beginSection("GL_INVALID_VALUE is generated if mask contains any bits other than GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, or GL_STENCIL_BUFFER_BIT.");
   1380 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, 1, GL_NEAREST);
   1381 	ctx.expectError				(GL_INVALID_VALUE);
   1382 	ctx.endSection();
   1383 
   1384 	ctx.beginSection("GL_INVALID_ENUM is generated if filter is not GL_LINEAR or GL_NEAREST.");
   1385 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, 0);
   1386 	ctx.expectError				(GL_INVALID_ENUM);
   1387 	ctx.endSection();
   1388 
   1389 	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.");
   1390 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_LINEAR);
   1391 	ctx.expectError				(GL_INVALID_OPERATION);
   1392 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_LINEAR);
   1393 	ctx.expectError				(GL_INVALID_OPERATION);
   1394 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_LINEAR);
   1395 	ctx.expectError				(GL_INVALID_OPERATION);
   1396 	ctx.endSection();
   1397 
   1398 	ctx.beginSection("GL_INVALID_OPERATION is generated if mask contains GL_COLOR_BUFFER_BIT and read buffer format is incompatible with draw buffer format.");
   1399 	ctx.glBindTexture			(GL_TEXTURE_2D, texture[0]);
   1400 
   1401 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL);
   1402 	ctx.glFramebufferTexture2D	(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
   1403 	ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA32UI, draw buffer: GL_RGBA" << TestLog::EndMessage;
   1404 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
   1405 	ctx.expectError				(GL_INVALID_OPERATION);
   1406 
   1407 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL);
   1408 	ctx.glFramebufferTexture2D	(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
   1409 	ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA32I, draw buffer: GL_RGBA" << TestLog::EndMessage;
   1410 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
   1411 	ctx.expectError				(GL_INVALID_OPERATION);
   1412 
   1413 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1414 	ctx.glFramebufferTexture2D	(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
   1415 	ctx.glBindTexture			(GL_TEXTURE_2D, texture[1]);
   1416 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL);
   1417 	ctx.glFramebufferTexture2D	(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0);
   1418 	ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA8, draw buffer: GL_RGBA32I" << TestLog::EndMessage;
   1419 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
   1420 	ctx.expectError				(GL_INVALID_OPERATION);
   1421 	ctx.endSection();
   1422 
   1423 	ctx.beginSection("GL_INVALID_OPERATION is generated if filter is GL_LINEAR and the read buffer contains integer data.");
   1424 	ctx.glBindTexture			(GL_TEXTURE_2D, texture[0]);
   1425 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL);
   1426 	ctx.glFramebufferTexture2D	(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
   1427 	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1428 	ctx.glFramebufferTexture2D	(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0);
   1429 	ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA32I, draw buffer: GL_RGBA8" << TestLog::EndMessage;
   1430 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_LINEAR);
   1431 	ctx.expectError				(GL_INVALID_OPERATION);
   1432 	ctx.endSection();
   1433 
   1434 	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.");
   1435 	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, rbo[0]);
   1436 	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_DEPTH32F_STENCIL8, 32, 32);
   1437 	ctx.glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[0]);
   1438 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
   1439 	ctx.expectError				(GL_INVALID_OPERATION);
   1440 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
   1441 	ctx.expectError				(GL_INVALID_OPERATION);
   1442 	ctx.endSection();
   1443 
   1444 	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the read or draw framebuffer is not framebuffer complete.");
   1445 	ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
   1446 	ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
   1447 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, 0, GL_NEAREST);
   1448 	ctx.expectError				(GL_NO_ERROR);
   1449 	ctx.getLog() << TestLog::Message << "// incomplete read framebuffer" << TestLog::EndMessage;
   1450 	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, blankFrameBuffer);
   1451 	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, fbo[1]);
   1452 	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);
   1453 	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
   1454 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, 0, GL_NEAREST);
   1455 	ctx.expectError				(GL_INVALID_FRAMEBUFFER_OPERATION);
   1456 	ctx.getLog() << TestLog::Message << "// incomplete draw framebuffer" << TestLog::EndMessage;
   1457 	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, fbo[1]);
   1458 	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, blankFrameBuffer);
   1459 	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
   1460 	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);
   1461 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, 0, GL_NEAREST);
   1462 	ctx.expectError				(GL_INVALID_FRAMEBUFFER_OPERATION);
   1463 	ctx.getLog() << TestLog::Message << "// incomplete read and draw framebuffer" << TestLog::EndMessage;
   1464 	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, blankFrameBuffer);
   1465 	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, blankFrameBuffer);
   1466 	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);
   1467 	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);
   1468 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, 0, GL_NEAREST);
   1469 	ctx.expectError				(GL_INVALID_FRAMEBUFFER_OPERATION);
   1470 	// restore
   1471 	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, fbo[0]);
   1472 	ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
   1473 	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, fbo[1]);
   1474 	ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
   1475 	ctx.endSection();
   1476 
   1477 	ctx.beginSection("GL_INVALID_OPERATION is generated if the source and destination buffers are identical.");
   1478 	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, fbo[0]);
   1479 	ctx.expectError				(GL_NO_ERROR);
   1480 	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
   1481 	ctx.expectError				(GL_INVALID_OPERATION);
   1482 	// restore
   1483 	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, fbo[1]);
   1484 	ctx.endSection();
   1485 
   1486 	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, 0);
   1487 	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, 0);
   1488 	ctx.glDeleteFramebuffers	(2, fbo);
   1489 	ctx.glDeleteFramebuffers	(1, &blankFrameBuffer);
   1490 	ctx.glDeleteTextures		(2, texture);
   1491 	ctx.glDeleteRenderbuffers	(2, rbo);
   1492 }
   1493 
   1494 void blit_framebuffer_multisample (NegativeTestContext& ctx)
   1495 {
   1496 	deUint32							fbo[2];
   1497 	deUint32							rbo[2];
   1498 
   1499 	ctx.glGenFramebuffers				(2, fbo);
   1500 	ctx.glGenRenderbuffers				(2, rbo);
   1501 
   1502 	ctx.glBindRenderbuffer				(GL_RENDERBUFFER, rbo[0]);
   1503 	ctx.glBindFramebuffer				(GL_READ_FRAMEBUFFER, fbo[0]);
   1504 	ctx.glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 32, 32);
   1505 	ctx.glFramebufferRenderbuffer		(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[0]);
   1506 	ctx.glCheckFramebufferStatus		(GL_READ_FRAMEBUFFER);
   1507 
   1508 	ctx.glBindRenderbuffer				(GL_RENDERBUFFER, rbo[1]);
   1509 	ctx.glBindFramebuffer				(GL_DRAW_FRAMEBUFFER, fbo[1]);
   1510 
   1511 	ctx.expectError						(GL_NO_ERROR);
   1512 
   1513 	if (!ctx.isExtensionSupported("GL_NV_framebuffer_multisample"))
   1514 	{
   1515 		ctx.beginSection("GL_INVALID_OPERATION is generated if the value of GL_SAMPLE_BUFFERS for the draw buffer is greater than zero.");
   1516 		ctx.glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 32, 32);
   1517 		ctx.glFramebufferRenderbuffer		(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]);
   1518 		ctx.glBlitFramebuffer				(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
   1519 		ctx.expectError						(GL_INVALID_OPERATION);
   1520 		ctx.endSection();
   1521 
   1522 		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.");
   1523 		ctx.glRenderbufferStorage			(GL_RENDERBUFFER, GL_RGBA4, 32, 32);
   1524 		ctx.glFramebufferRenderbuffer		(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]);
   1525 		ctx.glBlitFramebuffer				(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
   1526 		ctx.expectError						(GL_INVALID_OPERATION);
   1527 		ctx.endSection();
   1528 
   1529 		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.");
   1530 		ctx.glRenderbufferStorage			(GL_RENDERBUFFER, GL_RGBA8, 32, 32);
   1531 		ctx.glFramebufferRenderbuffer		(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]);
   1532 		ctx.glBlitFramebuffer				(0, 0, 16, 16, 2, 2, 18, 18, GL_COLOR_BUFFER_BIT, GL_NEAREST);
   1533 		ctx.expectError						(GL_INVALID_OPERATION);
   1534 		ctx.endSection();
   1535 	}
   1536 
   1537 	ctx.glBindFramebuffer				(GL_FRAMEBUFFER, 0);
   1538 	ctx.glDeleteRenderbuffers			(2, rbo);
   1539 	ctx.glDeleteFramebuffers			(2, fbo);
   1540 }
   1541 
   1542 void framebuffer_texture_layer (NegativeTestContext& ctx)
   1543 {
   1544 	deUint32						fbo					= 0x1234;
   1545 	deUint32						tex3D				= 0x1234;
   1546 	deUint32						tex2DArray			= 0x1234;
   1547 	deUint32						tex2D				= 0x1234;
   1548 	deUint32						tex2DMSArray		= 0x1234;
   1549 	deUint32						texBuffer			= 0x1234;
   1550 	int								max3DTexSize		= 0x1234;
   1551 	int								maxTexSize			= 0x1234;
   1552 	int								maxArrayTexLayers	= 0x1234;
   1553 	int								log2Max3DTexSize	= 0x1234;
   1554 	int								log2MaxTexSize		= 0x1234;
   1555 
   1556 	ctx.glGetIntegerv				(GL_MAX_3D_TEXTURE_SIZE, &max3DTexSize);
   1557 	ctx.glGetIntegerv				(GL_MAX_TEXTURE_SIZE, &maxTexSize);
   1558 	ctx.glGetIntegerv				(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxArrayTexLayers);
   1559 
   1560 	ctx.glGenFramebuffers			(1, &fbo);
   1561 	ctx.glGenTextures				(1, &tex3D);
   1562 	ctx.glGenTextures				(1, &tex2DArray);
   1563 	ctx.glGenTextures				(1, &tex2D);
   1564 	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, fbo);
   1565 
   1566 	ctx.glBindTexture				(GL_TEXTURE_3D, tex3D);
   1567 	ctx.glTexImage3D				(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1568 	ctx.glBindTexture				(GL_TEXTURE_2D_ARRAY, tex2DArray);
   1569 	ctx.glTexImage3D				(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1570 	ctx.glBindTexture				(GL_TEXTURE_2D, tex2D);
   1571 	ctx.glTexImage2D				(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1572 
   1573 	ctx.expectError					(GL_NO_ERROR);
   1574 
   1575 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
   1576 	ctx.glFramebufferTextureLayer	(-1, GL_COLOR_ATTACHMENT0, tex3D, 0, 1);
   1577 	ctx.expectError					(GL_INVALID_ENUM);
   1578 	ctx.glFramebufferTextureLayer	(GL_RENDERBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, 1);
   1579 	ctx.expectError					(GL_INVALID_ENUM);
   1580 	ctx.endSection();
   1581 
   1582 	ctx.beginSection("GL_INVALID_ENUM is generated if attachment is not one of the accepted tokens.");
   1583 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, -1, tex3D, 0, 1);
   1584 	ctx.expectError					(GL_INVALID_ENUM);
   1585 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_BACK, tex3D, 0, 1);
   1586 	ctx.expectError					(GL_INVALID_ENUM);
   1587 	ctx.endSection();
   1588 
   1589 	ctx.beginSection("GL_INVALID_OPERATION is generated if texture is non-zero and not the name of a 3D texture or 2D array texture, 2D multisample array texture or cube map array texture.");
   1590 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, 0, 0);
   1591 	ctx.expectError					(GL_INVALID_OPERATION);
   1592 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0, 0);
   1593 	ctx.expectError					(GL_INVALID_OPERATION);
   1594 	ctx.endSection();
   1595 
   1596 	ctx.beginSection("GL_INVALID_VALUE is generated if texture is not zero and layer is negative.");
   1597 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, -1);
   1598 	ctx.expectError					(GL_INVALID_VALUE);
   1599 	ctx.endSection();
   1600 
   1601 	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.");
   1602 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, max3DTexSize);
   1603 	ctx.expectError					(GL_INVALID_VALUE);
   1604 	ctx.endSection();
   1605 
   1606 	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.");
   1607 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, maxArrayTexLayers);
   1608 	ctx.expectError					(GL_INVALID_VALUE);
   1609 	ctx.endSection();
   1610 
   1611 	ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target.");
   1612 	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, 0);
   1613 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, 1);
   1614 	ctx.expectError					(GL_INVALID_OPERATION);
   1615 	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, fbo);
   1616 	ctx.endSection();
   1617 
   1618 	ctx.beginSection("GL_INVALID_VALUE is generated if texture is a 3D texture and level is less than 0 or greater than log2 of the value of GL_MAX_3D_TEXTURE_SIZE.");
   1619 	log2Max3DTexSize	= deLog2Floor32(max3DTexSize);
   1620 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, -1, max3DTexSize - 1);
   1621 	ctx.expectError					(GL_INVALID_VALUE);
   1622 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, log2Max3DTexSize + 1, max3DTexSize - 1);
   1623 	ctx.expectError					(GL_INVALID_VALUE);
   1624 	ctx.endSection();
   1625 
   1626 	ctx.beginSection("GL_INVALID_VALUE is generated if texture is a 2D array texture and level is less than 0 or greater than log2 of the value of GL_MAX_TEXTURE_SIZE.");
   1627 	log2MaxTexSize		= deLog2Floor32(maxTexSize);
   1628 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, -1, maxArrayTexLayers - 1);
   1629 	ctx.expectError					(GL_INVALID_VALUE);
   1630 	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, log2MaxTexSize + 1, maxArrayTexLayers - 1);
   1631 	ctx.expectError					(GL_INVALID_VALUE);
   1632 	ctx.endSection();
   1633 
   1634 	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
   1635 	{
   1636 		deUint32						texCubeArray		= 0x1234;
   1637 		int								maxCubeTexSize		= 0x1234;
   1638 		ctx.glGetIntegerv				(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeTexSize);
   1639 		ctx.glGenTextures				(1, &tex2DMSArray);
   1640 		ctx.glGenTextures				(1, &texCubeArray);
   1641 		ctx.glGenTextures				(1, &texBuffer);
   1642 		ctx.glBindTexture				(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, tex2DMSArray);
   1643 		ctx.glBindTexture				(GL_TEXTURE_CUBE_MAP_ARRAY, texCubeArray);
   1644 		ctx.glBindTexture				(GL_TEXTURE_BUFFER, texBuffer);
   1645 		ctx.expectError					(GL_NO_ERROR);
   1646 
   1647 		ctx.beginSection("GL_INVALID_VALUE is generated if texture is a 2D multisample array texture and level is not 0.");
   1648 		ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DMSArray, -1, 0);
   1649 		ctx.expectError					(GL_INVALID_VALUE);
   1650 		ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DMSArray, 1, 0);
   1651 		ctx.expectError					(GL_INVALID_VALUE);
   1652 		ctx.endSection();
   1653 
   1654 		ctx.beginSection("GL_INVALID_VALUE is generated if texture is a cube map array texture and layer is larger than MAX_ARRAY_TEXTURE_LAYERS-1. (See Khronos bug 15968)");
   1655 		ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texCubeArray, 0, maxArrayTexLayers);
   1656 		ctx.expectError					(GL_INVALID_VALUE);
   1657 		ctx.endSection();
   1658 
   1659 		ctx.beginSection("GL_INVALID_OPERATION is generated if texture is the name of a buffer texture.");
   1660 		ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texBuffer, 0, 0);
   1661 		ctx.expectError					(GL_INVALID_OPERATION);
   1662 		ctx.endSection();
   1663 
   1664 		ctx.glDeleteTextures			(1, &tex2DMSArray);
   1665 		ctx.glDeleteTextures			(1, &texCubeArray);
   1666 		ctx.glDeleteTextures			(1, &texBuffer);
   1667 	}
   1668 
   1669 	ctx.glDeleteTextures		(1, &tex3D);
   1670 	ctx.glDeleteTextures		(1, &tex2DArray);
   1671 	ctx.glDeleteTextures		(1, &tex2D);
   1672 	ctx.glDeleteFramebuffers	(1, &fbo);
   1673 }
   1674 
   1675 void invalidate_framebuffer (NegativeTestContext& ctx)
   1676 {
   1677 	deUint32	attachments[3];
   1678 	deUint32	fbo					= 0x1234;
   1679 	deUint32	texture				= 0x1234;
   1680 	int			maxColorAttachments = 0x1234;
   1681 
   1682 	ctx.glGetIntegerv				(GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments);
   1683 	attachments[0]					= GL_COLOR_ATTACHMENT0;
   1684 	attachments[1]					= GL_COLOR_ATTACHMENT0 + maxColorAttachments;
   1685 	attachments[2]					= GL_DEPTH_STENCIL_ATTACHMENT;
   1686 
   1687 	ctx.glGenFramebuffers			(1, &fbo);
   1688 	ctx.glGenTextures				(1, &texture);
   1689 	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, fbo);
   1690 	ctx.glBindTexture				(GL_TEXTURE_2D, texture);
   1691 	ctx.glTexImage2D				(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1692 	ctx.glFramebufferTexture2D		(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
   1693 	ctx.glCheckFramebufferStatus	(GL_FRAMEBUFFER);
   1694 	ctx.expectError					(GL_NO_ERROR);
   1695 
   1696 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER or GL_DRAW_FRAMEBUFFER.");
   1697 	ctx.glInvalidateFramebuffer		(-1, 1, &attachments[0]);
   1698 	ctx.expectError					(GL_INVALID_ENUM);
   1699 	ctx.glInvalidateFramebuffer		(GL_BACK, 1, &attachments[0]);
   1700 	ctx.expectError					(GL_INVALID_ENUM);
   1701 	ctx.endSection();
   1702 
   1703 	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.");
   1704 	ctx.glInvalidateFramebuffer		(GL_FRAMEBUFFER, 1, &attachments[1]);
   1705 	ctx.expectError					(GL_INVALID_OPERATION);
   1706 	ctx.endSection();
   1707 
   1708 	ctx.beginSection("GL_INVALID_VALUE is generated if numAttachments is negative.");
   1709 	ctx.glInvalidateFramebuffer		(GL_FRAMEBUFFER, -1, &attachments[0]);
   1710 	ctx.expectError					(GL_INVALID_VALUE);
   1711 	ctx.endSection();
   1712 
   1713 	ctx.beginSection("GL_INVALID_ENUM is generated if the default framebuffer is bound to target and any elements of attachments are not one of the accepted attachments.");
   1714 	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, 0);
   1715 	ctx.glInvalidateFramebuffer		(GL_FRAMEBUFFER, 1, &attachments[2]);
   1716 	ctx.expectError					(GL_INVALID_ENUM);
   1717 	ctx.endSection();
   1718 
   1719 
   1720 	ctx.glDeleteTextures		(1, &texture);
   1721 	ctx.glDeleteFramebuffers	(1, &fbo);
   1722 }
   1723 
   1724 void invalidate_sub_framebuffer (NegativeTestContext& ctx)
   1725 {
   1726 	deUint32	attachments[3];
   1727 	deUint32	fbo					= 0x1234;
   1728 	deUint32	texture				= 0x1234;
   1729 	int			maxColorAttachments	= 0x1234;
   1730 
   1731 	ctx.glGetIntegerv				(GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments);
   1732 	attachments[0]					= GL_COLOR_ATTACHMENT0;
   1733 	attachments[1]					= GL_COLOR_ATTACHMENT0 + maxColorAttachments;
   1734 	attachments[2]					= GL_DEPTH_STENCIL_ATTACHMENT;
   1735 
   1736 	ctx.glGenFramebuffers			(1, &fbo);
   1737 	ctx.glGenTextures				(1, &texture);
   1738 	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, fbo);
   1739 	ctx.glBindTexture				(GL_TEXTURE_2D, texture);
   1740 	ctx.glTexImage2D				(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1741 	ctx.glFramebufferTexture2D		(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
   1742 	ctx.glCheckFramebufferStatus	(GL_FRAMEBUFFER);
   1743 	ctx.expectError					(GL_NO_ERROR);
   1744 
   1745 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER or GL_DRAW_FRAMEBUFFER.");
   1746 	ctx.glInvalidateSubFramebuffer	(-1, 1, &attachments[0], 0, 0, 16, 16);
   1747 	ctx.expectError					(GL_INVALID_ENUM);
   1748 	ctx.glInvalidateSubFramebuffer	(GL_BACK, 1, &attachments[0], 0, 0, 16, 16);
   1749 	ctx.expectError					(GL_INVALID_ENUM);
   1750 	ctx.endSection();
   1751 
   1752 	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.");
   1753 	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, 1, &attachments[1], 0, 0, 16, 16);
   1754 	ctx.expectError					(GL_INVALID_OPERATION);
   1755 	ctx.endSection();
   1756 
   1757 	ctx.beginSection("GL_INVALID_VALUE is generated if numAttachments, width, or heigh is negative.");
   1758 	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, -1, &attachments[0], 0, 0, 16, 16);
   1759 	ctx.expectError					(GL_INVALID_VALUE);
   1760 	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, -1, &attachments[0], 0, 0, -1, 16);
   1761 	ctx.expectError					(GL_INVALID_VALUE);
   1762 	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, -1, &attachments[0], 0, 0, 16, -1);
   1763 	ctx.expectError					(GL_INVALID_VALUE);
   1764 	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, -1, &attachments[0], 0, 0, -1, -1);
   1765 	ctx.expectError					(GL_INVALID_VALUE);
   1766 	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, 1, &attachments[0], 0, 0, -1, 16);
   1767 	ctx.expectError					(GL_INVALID_VALUE);
   1768 	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, 1, &attachments[0], 0, 0, 16, -1);
   1769 	ctx.expectError					(GL_INVALID_VALUE);
   1770 	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, 1, &attachments[0], 0, 0, -1, -1);
   1771 	ctx.expectError					(GL_INVALID_VALUE);
   1772 	ctx.endSection();
   1773 
   1774 	ctx.beginSection("GL_INVALID_ENUM is generated if the default framebuffer is bound to target and any elements of attachments are not one of the accepted attachments.");
   1775 	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, 0);
   1776 	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, 1, &attachments[2], 0, 0, 16, 16);
   1777 	ctx.expectError					(GL_INVALID_ENUM);
   1778 	ctx.endSection();
   1779 
   1780 	ctx.glDeleteTextures		(1, &texture);
   1781 	ctx.glDeleteFramebuffers	(1, &fbo);
   1782 }
   1783 
   1784 void renderbuffer_storage_multisample (NegativeTestContext& ctx)
   1785 {
   1786 	deUint32	rbo							= 0x1234;
   1787 	int			maxSamplesSupportedRGBA4	= -1;
   1788 	int			maxSamplesSupportedRGBA8UI	= -1;
   1789 	GLint		maxSize						= 0x1234;
   1790 
   1791 	ctx.glGetInternalformativ				(GL_RENDERBUFFER, GL_RGBA4, GL_SAMPLES, 1, &maxSamplesSupportedRGBA4);
   1792 	ctx.glGetInternalformativ				(GL_RENDERBUFFER, GL_RGBA8UI, GL_SAMPLES, 1, &maxSamplesSupportedRGBA8UI);
   1793 
   1794 	ctx.glGenRenderbuffers					(1, &rbo);
   1795 	ctx.glBindRenderbuffer					(GL_RENDERBUFFER, rbo);
   1796 
   1797 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
   1798 	ctx.glRenderbufferStorageMultisample	(-1, 2, GL_RGBA4, 1, 1);
   1799 	ctx.expectError							(GL_INVALID_ENUM);
   1800 	ctx.glRenderbufferStorageMultisample	(GL_FRAMEBUFFER, 2, GL_RGBA4, 1, 1);
   1801 	ctx.expectError							(GL_INVALID_ENUM);
   1802 	ctx.endSection();
   1803 
   1804 	ctx.beginSection("GL_INVALID_OPERATION is generated if samples is greater than the maximum number of samples supported for internalformat.");
   1805 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, maxSamplesSupportedRGBA4+1, GL_RGBA4, 1, 1);
   1806 	ctx.expectError							(GL_INVALID_OPERATION);
   1807 	ctx.endSection();
   1808 
   1809 	ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not a color-renderable, depth-renderable, or stencil-renderable format.");
   1810 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, -1, 1, 1);
   1811 	ctx.expectError							(GL_INVALID_ENUM);
   1812 
   1813 	if (!ctx.isExtensionSupported("GL_EXT_color_buffer_half_float")) // GL_EXT_color_buffer_half_float disables error
   1814 	{
   1815 		ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGB16F, 1, 1);
   1816 		ctx.expectError							(GL_INVALID_ENUM);
   1817 	}
   1818 
   1819 	if (!ctx.isExtensionSupported("GL_EXT_render_snorm")) // GL_EXT_render_snorm disables error
   1820 	{
   1821 		ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGBA8_SNORM, 1, 1);
   1822 		ctx.expectError							(GL_INVALID_ENUM);
   1823 	}
   1824 
   1825 	ctx.endSection();
   1826 
   1827 	ctx.beginSection("GL_INVALID_OPERATION is generated if samples is greater than the maximum number of samples supported for internalformat. (Unsigned integer format)");
   1828 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, maxSamplesSupportedRGBA8UI+1, GL_RGBA8UI, 1, 1);
   1829 	ctx.expectError							(GL_INVALID_OPERATION);
   1830 	ctx.endSection();
   1831 
   1832 	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than zero.");
   1833 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGBA4, -1, 1);
   1834 	ctx.expectError							(GL_INVALID_VALUE);
   1835 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGBA4, 1, -1);
   1836 	ctx.expectError							(GL_INVALID_VALUE);
   1837 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGBA4, -1, -1);
   1838 	ctx.expectError							(GL_INVALID_VALUE);
   1839 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, -1, GL_RGBA4, 1, 1);
   1840 	ctx.expectError							(GL_INVALID_VALUE);
   1841 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, -1, GL_RGBA4, -1, 1);
   1842 	ctx.expectError							(GL_INVALID_VALUE);
   1843 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, -1, GL_RGBA4, 1, -1);
   1844 	ctx.expectError							(GL_INVALID_VALUE);
   1845 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, -1, GL_RGBA4, -1, -1);
   1846 	ctx.expectError							(GL_INVALID_VALUE);
   1847 	ctx.endSection();
   1848 
   1849 	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_RENDERBUFFER_SIZE.");
   1850 	ctx.glGetIntegerv						(GL_MAX_RENDERBUFFER_SIZE, &maxSize);
   1851 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 4, GL_RGBA4, 1, maxSize+1);
   1852 	ctx.expectError							(GL_INVALID_VALUE);
   1853 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 4, GL_RGBA4, maxSize+1, 1);
   1854 	ctx.expectError							(GL_INVALID_VALUE);
   1855 	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 4, GL_RGBA4, maxSize+1, maxSize+1);
   1856 	ctx.expectError							(GL_INVALID_VALUE);
   1857 	ctx.endSection();
   1858 
   1859 	ctx.glDeleteRenderbuffers(1, &rbo);
   1860 }
   1861 
   1862 void copy_image_sub_data (NegativeTestContext& ctx)
   1863 {
   1864 	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
   1865 	{
   1866 		deUint32					texture[5];
   1867 		deUint32					rbo = 0x1234;
   1868 
   1869 		ctx.glGenTextures			(5, texture);
   1870 		ctx.glGenRenderbuffers		(1, &rbo);
   1871 		ctx.glBindRenderbuffer		(GL_RENDERBUFFER, rbo);
   1872 
   1873 		ctx.glBindTexture			(GL_TEXTURE_2D, texture[0]);
   1874 		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   1875 		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   1876 		ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1877 		ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA8, 32, 32);
   1878 		ctx.glBindTexture			(GL_TEXTURE_2D, texture[1]);
   1879 		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   1880 		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   1881 		ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1882 		ctx.expectError				(GL_NO_ERROR);
   1883 
   1884 		ctx.glBindTexture			(GL_TEXTURE_3D, texture[2]);
   1885 		ctx.glTexParameteri			(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   1886 		ctx.glTexParameteri			(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   1887 		ctx.glTexImage3D			(GL_TEXTURE_3D, 0, GL_RGBA8, 32, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1888 		ctx.expectError				(GL_NO_ERROR);
   1889 
   1890 		ctx.glBindTexture			(GL_TEXTURE_3D, texture[3]);
   1891 		ctx.glTexImage3D			(GL_TEXTURE_3D, 0, GL_RGBA8, 32, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
   1892 		ctx.expectError				(GL_NO_ERROR);
   1893 
   1894 		ctx.glBindTexture			(GL_TEXTURE_2D, texture[4]);
   1895 		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   1896 		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   1897 		ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32F, 32, 32, 0, GL_RGBA, GL_FLOAT, NULL);
   1898 		ctx.expectError				(GL_NO_ERROR);
   1899 
   1900 		ctx.beginSection("GL_INVALID_VALUE is generated if srcWidth, srcHeight, or srcDepth is negative.");
   1901 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, -1, 1, 1);
   1902 		ctx.expectError				(GL_INVALID_VALUE);
   1903 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 1, -1, 1);
   1904 		ctx.expectError				(GL_INVALID_VALUE);
   1905 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 1, 1, -1);
   1906 		ctx.expectError				(GL_INVALID_VALUE);
   1907 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, -1, -1, 1);
   1908 		ctx.expectError				(GL_INVALID_VALUE);
   1909 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, -1, 1, -1);
   1910 		ctx.expectError				(GL_INVALID_VALUE);
   1911 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 1, -1, -1);
   1912 		ctx.expectError				(GL_INVALID_VALUE);
   1913 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, -1, -1, -1);
   1914 		ctx.expectError				(GL_INVALID_VALUE);
   1915 		ctx.endSection();
   1916 
   1917 		ctx.beginSection("GL_INVALID_VALUE is generated if srcLevel and dstLevel are not valid levels for the corresponding images.");
   1918 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 1, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
   1919 		ctx.expectError				(GL_INVALID_VALUE);
   1920 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 1, 0, 0, 0, 0, 0, 1);
   1921 		ctx.expectError				(GL_INVALID_VALUE);
   1922 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 1, 0, 0, 0, texture[1], GL_TEXTURE_2D, 1, 0, 0, 0, 0, 0, 1);
   1923 		ctx.expectError				(GL_INVALID_VALUE);
   1924 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, -1, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
   1925 		ctx.expectError				(GL_INVALID_VALUE);
   1926 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, -1, 0, 0, 0, 0, 0, 1);
   1927 		ctx.expectError				(GL_INVALID_VALUE);
   1928 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, -1, 0, 0, 0, texture[1], GL_TEXTURE_2D, -1, 0, 0, 0, 0, 0, 1);
   1929 		ctx.expectError				(GL_INVALID_VALUE);
   1930 		ctx.glCopyImageSubData		(rbo, GL_RENDERBUFFER, -1, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
   1931 		ctx.expectError				(GL_INVALID_VALUE);
   1932 		ctx.glCopyImageSubData		(rbo, GL_RENDERBUFFER, 1, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
   1933 		ctx.expectError				(GL_INVALID_VALUE);
   1934 		ctx.glCopyImageSubData		(texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, rbo, GL_RENDERBUFFER, -1, 0, 0, 0, 0, 0, 1);
   1935 		ctx.expectError				(GL_INVALID_VALUE);
   1936 		ctx.glCopyImageSubData		(texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, rbo, GL_RENDERBUFFER, 1, 0, 0, 0, 0, 0, 1);
   1937 		ctx.expectError				(GL_INVALID_VALUE);
   1938 		ctx.endSection();
   1939 
   1940 		ctx.beginSection("GL_INVALID_ENUM is generated if either target does not match the type of the object.");
   1941 		// \note: This could be either:
   1942 		//		1. GL_INVALID_ENUM is generated if either target does not match the type of the object.
   1943 		//		2. GL_INVALID_VALUE is generated if either name does not correspond to a valid renderbuffer or texture object according to the corresponding target parameter.
   1944 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 1);
   1945 		ctx.expectError				(GL_INVALID_ENUM);
   1946 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[2], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
   1947 		ctx.expectError				(GL_INVALID_ENUM);
   1948 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_3D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
   1949 		ctx.expectError				(GL_INVALID_ENUM);
   1950 		ctx.glCopyImageSubData		(texture[2], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
   1951 		ctx.expectError				(GL_INVALID_ENUM);
   1952 		ctx.endSection();
   1953 
   1954 		ctx.beginSection("GL_INVALID_OPERATION is generated if either object is a texture and the texture is not complete.");
   1955 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[3], GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 1);
   1956 		ctx.expectError				(GL_INVALID_OPERATION);
   1957 		ctx.glCopyImageSubData		(texture[3], GL_TEXTURE_3D, 0, 0, 0, 0, texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
   1958 		ctx.expectError				(GL_INVALID_OPERATION);
   1959 		ctx.glCopyImageSubData		(texture[3], GL_TEXTURE_3D, 0, 0, 0, 0, texture[3], GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 1);
   1960 		ctx.expectError				(GL_INVALID_OPERATION);
   1961 		ctx.endSection();
   1962 
   1963 		ctx.beginSection("GL_INVALID_VALUE is generated if the dimensions of either subregion exceeds the boundaries of the corresponding image object.");
   1964 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 33, 0, 1);
   1965 		ctx.expectError				(GL_INVALID_VALUE);
   1966 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 33, 1);
   1967 		ctx.expectError				(GL_INVALID_VALUE);
   1968 		ctx.endSection();
   1969 
   1970 		ctx.beginSection("GL_INVALID_OPERATION error is generated if the source and destination internal formats are not compatible.");
   1971 		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[4], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
   1972 		ctx.expectError				(GL_INVALID_OPERATION);
   1973 		ctx.glCopyImageSubData		(texture[4], GL_TEXTURE_2D, 0, 0, 0, 0, texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
   1974 		ctx.expectError				(GL_INVALID_OPERATION);
   1975 		ctx.endSection();
   1976 
   1977 		ctx.glDeleteTextures		(5, texture);
   1978 		ctx.glDeleteRenderbuffers	(1, &rbo);
   1979 	}
   1980 }
   1981 
   1982 std::vector<FunctionContainer> getNegativeBufferApiTestFunctions ()
   1983 {
   1984 	const FunctionContainer funcs[] =
   1985 	{
   1986 		{bind_buffer,						"bind_buffer",						"Invalid glBindBuffer() usage"						},
   1987 		{delete_buffers,					"delete_buffers",					"Invalid glDeleteBuffers() usage"					},
   1988 		{gen_buffers,						"gen_buffers",						"Invalid glGenBuffers() usage"						},
   1989 		{buffer_data,						"buffer_data",						"Invalid glBufferData() usage"						},
   1990 		{buffer_sub_data,					"buffer_sub_data",					"Invalid glBufferSubData() usage"					},
   1991 		{buffer_sub_data_size_offset,		"buffer_sub_data_size_offset",		"Invalid glBufferSubData() usage"					},
   1992 		{clear,								"clear",							"Invalid glClear() usage"							},
   1993 		{read_pixels,						"read_pixels",						"Invalid glReadPixels() usage"						},
   1994 		{readn_pixels,						"readn_pixels",						"Invalid glReadPixels() usage"						},
   1995 		{read_pixels_format_mismatch,		"read_pixels_format_mismatch",		"Invalid glReadPixels() usage"						},
   1996 		{read_pixels_fbo_format_mismatch,	"read_pixels_fbo_format_mismatch",	"Invalid glReadPixels() usage"						},
   1997 		{bind_buffer_range,					"bind_buffer_range",				"Invalid glBindBufferRange() usage"					},
   1998 		{bind_buffer_base,					"bind_buffer_base",					"Invalid glBindBufferBase() usage"					},
   1999 		{clear_bufferiv,					"clear_bufferiv",					"Invalid glClearBufferiv() usage"					},
   2000 		{clear_bufferuiv,					"clear_bufferuiv",					"Invalid glClearBufferuiv() usage"					},
   2001 		{clear_bufferfv,					"clear_bufferfv",					"Invalid glClearBufferfv() usage"					},
   2002 		{clear_bufferfi,					"clear_bufferfi",					"Invalid glClearBufferfi() usage"					},
   2003 		{copy_buffer_sub_data,				"copy_buffer_sub_data",				"Invalid glCopyBufferSubData() usage"				},
   2004 		{draw_buffers,						"draw_buffers",						"Invalid glDrawBuffers() usage"						},
   2005 		{flush_mapped_buffer_range,			"flush_mapped_buffer_range",		"Invalid glFlushMappedBufferRange() usage"			},
   2006 		{map_buffer_range,					"map_buffer_range",					"Invalid glMapBufferRange() usage"					},
   2007 		{read_buffer,						"read_buffer",						"Invalid glReadBuffer() usage"						},
   2008 		{unmap_buffer,						"unmap_buffer",						"Invalid glUnmapBuffer() usage"						},
   2009 		{bind_framebuffer,					"bind_framebuffer",					"Invalid glBindFramebuffer() usage"					},
   2010 		{bind_renderbuffer,					"bind_renderbuffer",				"Invalid glBindRenderbuffer() usage"				},
   2011 		{check_framebuffer_status,			"check_framebuffer_status",			"Invalid glCheckFramebufferStatus() usage"			},
   2012 		{gen_framebuffers,					"gen_framebuffers",					"Invalid glGenFramebuffers() usage"					},
   2013 		{gen_renderbuffers,					"gen_renderbuffers",				"Invalid glGenRenderbuffers() usage"				},
   2014 		{delete_framebuffers,				"delete_framebuffers",				"Invalid glDeleteFramebuffers() usage"				},
   2015 		{delete_renderbuffers,				"delete_renderbuffers",				"Invalid glDeleteRenderbuffers() usage"				},
   2016 		{framebuffer_renderbuffer,			"framebuffer_renderbuffer",			"Invalid glFramebufferRenderbuffer() usage"			},
   2017 		{framebuffer_texture,				"framebuffer_texture",				"Invalid glFramebufferTexture() usage"				},
   2018 		{framebuffer_texture2d,				"framebuffer_texture2d",			"Invalid glFramebufferTexture2D() usage"			},
   2019 		{renderbuffer_storage,				"renderbuffer_storage",				"Invalid glRenderbufferStorage() usage"				},
   2020 		{blit_framebuffer,					"blit_framebuffer",					"Invalid glBlitFramebuffer() usage"					},
   2021 		{blit_framebuffer_multisample,		"blit_framebuffer_multisample",		"Invalid glBlitFramebuffer() usage"					},
   2022 		{framebuffer_texture_layer,			"framebuffer_texture_layer",		"Invalid glFramebufferTextureLayer() usage"			},
   2023 		{invalidate_framebuffer,			"invalidate_framebuffer",			"Invalid glInvalidateFramebuffer() usage"			},
   2024 		{invalidate_sub_framebuffer,		"invalidate_sub_framebuffer",		"Invalid glInvalidateSubFramebuffer() usage"		},
   2025 		{renderbuffer_storage_multisample,	"renderbuffer_storage_multisample",	"Invalid glRenderbufferStorageMultisample() usage"	},
   2026 		{copy_image_sub_data,				"copy_image_sub_data",				"Invalid glCopyImageSubData() usage"				},
   2027 	};
   2028 
   2029 	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
   2030 }
   2031 
   2032 } // NegativeTestShared
   2033 } // Functional
   2034 } // gles31
   2035 } // deqp
   2036