Home | History | Annotate | Download | only in functional
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program OpenGL ES 2.0 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 "es2fNegativeBufferApiTests.hpp"
     25 #include "es2fApiCase.hpp"
     26 #include "gluContextInfo.hpp"
     27 
     28 #include "glwEnums.hpp"
     29 #include "glwDefs.hpp"
     30 
     31 using namespace glw; // GL types
     32 
     33 namespace deqp
     34 {
     35 namespace gles2
     36 {
     37 namespace Functional
     38 {
     39 
     40 using tcu::TestLog;
     41 
     42 NegativeBufferApiTests::NegativeBufferApiTests (Context& context)
     43 	: TestCaseGroup(context, "buffer", "Negative Buffer API Cases")
     44 {
     45 }
     46 
     47 NegativeBufferApiTests::~NegativeBufferApiTests (void)
     48 {
     49 }
     50 
     51 void NegativeBufferApiTests::init (void)
     52 {
     53 	ES2F_ADD_API_CASE(bind_buffer, "Invalid glBindBuffer() usage",
     54 		{
     55 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the allowable values.");
     56 			glBindBuffer(-1, 0);
     57 			expectError(GL_INVALID_ENUM);
     58 			m_log << TestLog::EndSection;
     59 		});
     60 	ES2F_ADD_API_CASE(delete_buffers, "Invalid glDeleteBuffers() usage",
     61 		{
     62 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
     63 			glDeleteBuffers(-1, 0);
     64 			expectError(GL_INVALID_VALUE);
     65 			m_log << TestLog::EndSection;
     66 		});
     67 	ES2F_ADD_API_CASE(gen_buffers, "Invalid glGenBuffers() usage",
     68 		{
     69 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
     70 			glGenBuffers(-1, 0);
     71 			expectError(GL_INVALID_VALUE);
     72 			m_log << TestLog::EndSection;
     73 		});
     74 	ES2F_ADD_API_CASE(buffer_data, "Invalid glBufferData() usage",
     75 		{
     76 			GLuint buffer;
     77 			glGenBuffers(1, &buffer);
     78 			glBindBuffer(GL_ARRAY_BUFFER, buffer);
     79 
     80 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER.");
     81 			glBufferData(-1, 0, NULL, GL_STREAM_DRAW);
     82 			expectError(GL_INVALID_ENUM);
     83 			m_log << TestLog::EndSection;
     84 
     85 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if usage is not GL_STREAM_DRAW, GL_STATIC_DRAW, or GL_DYNAMIC_DRAW.");
     86 			glBufferData(GL_ARRAY_BUFFER, 0, NULL, -1);
     87 			expectError(GL_INVALID_ENUM);
     88 			m_log << TestLog::EndSection;
     89 
     90 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if size is negative.");
     91 			glBufferData(GL_ARRAY_BUFFER, -1, NULL, GL_STREAM_DRAW);
     92 			expectError(GL_INVALID_VALUE);
     93 			m_log << TestLog::EndSection;
     94 
     95 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
     96 			glBindBuffer(GL_ARRAY_BUFFER, 0);
     97 			glBufferData(GL_ARRAY_BUFFER, 0, NULL, GL_STREAM_DRAW);
     98 			expectError(GL_INVALID_OPERATION);
     99 			m_log << TestLog::EndSection;
    100 
    101 			glDeleteBuffers(1, &buffer);
    102 		});
    103 	ES2F_ADD_API_CASE(buffer_sub_data, "Invalid glBufferSubData() usage",
    104 		{
    105 			GLuint buffer;
    106 			glGenBuffers(1, &buffer);
    107 			glBindBuffer(GL_ARRAY_BUFFER, buffer);
    108 			glBufferData(GL_ARRAY_BUFFER, 10, 0, GL_STREAM_DRAW);
    109 
    110 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER.");
    111 			glBufferSubData(-1, 1, 1, 0);
    112 			expectError(GL_INVALID_ENUM);
    113 			m_log << TestLog::EndSection;
    114 
    115 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
    116 			glBindBuffer(GL_ARRAY_BUFFER, 0);
    117 			glBufferSubData(GL_ARRAY_BUFFER, 1, 1, 0);
    118 			expectError(GL_INVALID_OPERATION);
    119 			m_log << TestLog::EndSection;
    120 
    121 			glDeleteBuffers(1, &buffer);
    122 		});
    123 	ES2F_ADD_API_CASE(buffer_sub_data_size_offset, "Invalid glBufferSubData() usage",
    124 		{
    125 			GLuint buffer;
    126 			glGenBuffers(1, &buffer);
    127 			glBindBuffer(GL_ARRAY_BUFFER, buffer);
    128 			glBufferData(GL_ARRAY_BUFFER, 10, 0, GL_STREAM_DRAW);
    129 
    130 			m_log << TestLog::Section("", "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.");
    131 			glBufferSubData(GL_ARRAY_BUFFER, -1, 1, 0);
    132 			expectError(GL_INVALID_VALUE);
    133 			glBufferSubData(GL_ARRAY_BUFFER, -1, -1, 0);
    134 			expectError(GL_INVALID_VALUE);
    135 			glBufferSubData(GL_ARRAY_BUFFER, 1, -1, 0);
    136 			expectError(GL_INVALID_VALUE);
    137 			glBufferSubData(GL_ARRAY_BUFFER, 15, 1, 0);
    138 			expectError(GL_INVALID_VALUE);
    139 			glBufferSubData(GL_ARRAY_BUFFER, 1, 15, 0);
    140 			expectError(GL_INVALID_VALUE);
    141 			glBufferSubData(GL_ARRAY_BUFFER, 8, 8, 0);
    142 			expectError(GL_INVALID_VALUE);
    143 			m_log << TestLog::EndSection;
    144 
    145 			glDeleteBuffers(1, &buffer);
    146 		});
    147 	ES2F_ADD_API_CASE(clear, "Invalid glClear() usage",
    148 		{
    149 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if any bit other than the three defined bits is set in mask.");
    150 			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    151 			expectError(GL_NO_ERROR);
    152 			glClear(0x00000200);
    153 			expectError(GL_INVALID_VALUE);
    154 			glClear(0x00001000);
    155 			expectError(GL_INVALID_VALUE);
    156 			glClear(0x00000010);
    157 			expectError(GL_INVALID_VALUE);
    158 			m_log << TestLog::EndSection;
    159 		});
    160 	ES2F_ADD_API_CASE(read_pixels, "Invalid glReadPixels() usage",
    161 		{
    162 			std::vector<GLubyte> ubyteData(4);
    163 
    164 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the combination of format and type is unsupported.");
    165 			glReadPixels(0, 0, 1, 1, GL_LUMINANCE_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, &ubyteData[0]);
    166 			expectError(GL_INVALID_OPERATION);
    167 			m_log << TestLog::EndSection;
    168 
    169 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if either width or height is negative.");
    170 			glReadPixels(0, 0, -1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
    171 			expectError(GL_INVALID_VALUE);
    172 			glReadPixels(0, 0, 1, -1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
    173 			expectError(GL_INVALID_VALUE);
    174 			glReadPixels(0, 0, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
    175 			expectError(GL_INVALID_VALUE);
    176 			m_log << TestLog::EndSection;
    177 
    178 			m_log << TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
    179 			GLuint fbo;
    180 			glGenFramebuffers(1, &fbo);
    181 			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    182 			glCheckFramebufferStatus(GL_FRAMEBUFFER);
    183 			glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
    184 			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
    185 			m_log << TestLog::EndSection;
    186 		});
    187 	ES2F_ADD_API_CASE(read_pixels_format_mismatch, "Invalid glReadPixels() usage",
    188 		{
    189 			std::vector<GLubyte> ubyteData(4);
    190 			std::vector<GLushort> ushortData(4);
    191 
    192 			m_log << TestLog::Section("", "Unsupported combinations of format and type will generate an INVALID_OPERATION error.");
    193 			glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]);
    194 			expectError(GL_INVALID_OPERATION);
    195 			glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]);
    196 			expectError(GL_INVALID_OPERATION);
    197 			glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]);
    198 			expectError(GL_INVALID_OPERATION);
    199 			glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]);
    200 			expectError(GL_INVALID_OPERATION);
    201 			glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]);
    202 			expectError(GL_INVALID_OPERATION);
    203 			glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]);
    204 			expectError(GL_INVALID_OPERATION);
    205 			m_log << TestLog::EndSection;
    206 
    207 			m_log << TestLog::Section("", "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.");
    208 			glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
    209 			expectError(GL_NO_ERROR);
    210 			GLint readFormat;
    211 			GLint readType;
    212 			glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &readFormat);
    213 			glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readType);
    214 			glReadPixels(0, 0, 1, 1, readFormat, readType, &ubyteData[0]);
    215 			expectError(GL_NO_ERROR);
    216 			m_log << TestLog::EndSection;
    217 		});
    218 
    219 	// Framebuffer Objects
    220 
    221 	ES2F_ADD_API_CASE(bind_framebuffer, "Invalid glBindFramebuffer() usage",
    222 		{
    223 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER.");
    224 			glBindFramebuffer(-1, 0);
    225 			expectError(GL_INVALID_ENUM);
    226 			glBindFramebuffer(GL_RENDERBUFFER, 0);
    227 			expectError(GL_INVALID_ENUM);
    228 			m_log << TestLog::EndSection;
    229 		});
    230 	ES2F_ADD_API_CASE(bind_renderbuffer, "Invalid glBindRenderbuffer() usage",
    231 		{
    232 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
    233 			glBindRenderbuffer(-1, 0);
    234 			expectError(GL_INVALID_ENUM);
    235 			glBindRenderbuffer(GL_FRAMEBUFFER, 0);
    236 			expectError(GL_INVALID_ENUM);
    237 			m_log << TestLog::EndSection;
    238 		});
    239 	ES2F_ADD_API_CASE(check_framebuffer_status, "Invalid glCheckFramebufferStatus() usage",
    240 		{
    241 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER.");
    242 			glCheckFramebufferStatus(-1);
    243 			expectError(GL_INVALID_ENUM);
    244 			glCheckFramebufferStatus(GL_RENDERBUFFER);
    245 			expectError(GL_INVALID_ENUM);
    246 			m_log << TestLog::EndSection;
    247 		});
    248 	ES2F_ADD_API_CASE(gen_framebuffers, "Invalid glGenFramebuffers() usage",
    249 		{
    250 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
    251 			glGenFramebuffers(-1, 0);
    252 			expectError(GL_INVALID_VALUE);
    253 			m_log << TestLog::EndSection;
    254 		});
    255 	ES2F_ADD_API_CASE(gen_renderbuffers, "Invalid glGenRenderbuffers() usage",
    256 		{
    257 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
    258 			glGenRenderbuffers(-1, 0);
    259 			expectError(GL_INVALID_VALUE);
    260 			m_log << TestLog::EndSection;
    261 		});
    262 	ES2F_ADD_API_CASE(delete_framebuffers, "Invalid glDeleteFramebuffers() usage",
    263 		{
    264 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
    265 			glDeleteFramebuffers(-1, 0);
    266 			expectError(GL_INVALID_VALUE);
    267 			m_log << TestLog::EndSection;
    268 		});
    269 	ES2F_ADD_API_CASE(delete_renderbuffers, "Invalid glDeleteRenderbuffers() usage",
    270 		{;
    271 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
    272 			glDeleteRenderbuffers(-1, 0);
    273 			expectError(GL_INVALID_VALUE);
    274 			m_log << TestLog::EndSection;
    275 		});
    276 	ES2F_ADD_API_CASE(framebuffer_renderbuffer, "Invalid glFramebufferRenderbuffer() usage",
    277 		{
    278 			GLuint fbo;
    279 			GLuint rbo;
    280 			glGenFramebuffers(1, &fbo);
    281 			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    282 			glGenRenderbuffers(1, &rbo);
    283 
    284 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER.");
    285 			glFramebufferRenderbuffer(-1, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
    286 			expectError(GL_INVALID_ENUM);
    287 			m_log << TestLog::EndSection;
    288 
    289 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if attachment is not an accepted attachment point.");
    290 			glFramebufferRenderbuffer(GL_FRAMEBUFFER, -1, GL_RENDERBUFFER, 0);
    291 			expectError(GL_INVALID_ENUM);
    292 			m_log << TestLog::EndSection;
    293 
    294 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if renderbuffertarget is not GL_RENDERBUFFER.");
    295 			glBindRenderbuffer(GL_RENDERBUFFER, rbo);
    296 			glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, rbo);
    297 			expectError(GL_INVALID_ENUM);
    298 			glBindRenderbuffer(GL_RENDERBUFFER, 0);
    299 			m_log << TestLog::EndSection;
    300 
    301 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if renderbuffer is neither 0 nor the name of an existing renderbuffer object.");
    302 			glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, -1);
    303 			expectError(GL_INVALID_OPERATION);
    304 			m_log << TestLog::EndSection;
    305 
    306 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the default framebuffer object name 0 is bound.");
    307 			glBindFramebuffer(GL_FRAMEBUFFER, 0);
    308 			glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
    309 			expectError(GL_INVALID_OPERATION);
    310 			m_log << TestLog::EndSection;
    311 
    312 			glDeleteRenderbuffers(1, &rbo);
    313 			glDeleteFramebuffers(1, &fbo);
    314 		});
    315 	ES2F_ADD_API_CASE(framebuffer_texture2d, "Invalid glFramebufferTexture2D() usage",
    316 		{
    317 			GLuint fbo;
    318 			GLuint tex2D;
    319 			GLuint texCube;
    320 			glGenFramebuffers(1, &fbo);
    321 			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    322 			glGenTextures(1, &tex2D);
    323 			glBindTexture(GL_TEXTURE_2D, tex2D);
    324 			glGenTextures(1, &texCube);
    325 			glBindTexture(GL_TEXTURE_CUBE_MAP, texCube);
    326 			expectError(GL_NO_ERROR);
    327 
    328 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER.");
    329 			glFramebufferTexture2D(-1, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
    330 			expectError(GL_INVALID_ENUM);
    331 			m_log << TestLog::EndSection;
    332 
    333 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if textarget is not an accepted texture target.");
    334 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, tex2D, 0);
    335 			expectError(GL_INVALID_ENUM);
    336 			m_log << TestLog::EndSection;
    337 
    338 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if attachment is not an accepted attachment point.");
    339 			glFramebufferTexture2D(GL_FRAMEBUFFER, -1, GL_TEXTURE_2D, 0, 0);
    340 			expectError(GL_INVALID_ENUM);
    341 			m_log << TestLog::EndSection;
    342 
    343 			if (!m_context.getContextInfo().isExtensionSupported("GL_OES_fbo_render_mipmap"))
    344 			{
    345 				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is not 0.");
    346 				glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, 3);
    347 				expectError(GL_INVALID_VALUE);
    348 				m_log << TestLog::EndSection;
    349 			}
    350 
    351 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if texture is neither 0 nor the name of an existing texture object.");
    352 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, -1, 0);
    353 			expectError(GL_INVALID_OPERATION);
    354 			m_log << TestLog::EndSection;
    355 
    356 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if texture is the name of an existing two-dimensional texture object but textarget is not GL_TEXTURE_2D.");
    357 
    358 			expectError(GL_NO_ERROR);
    359 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, tex2D, 0);
    360 			expectError(GL_INVALID_OPERATION);
    361 			glDeleteTextures(1, &tex2D);
    362 			m_log << TestLog::EndSection;
    363 
    364 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if texture is the name of an existing cube map texture object but textarget is GL_TEXTURE_2D.");
    365 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texCube, 0);
    366 			expectError(GL_INVALID_OPERATION);
    367 			glDeleteTextures(1, &texCube);
    368 			m_log << TestLog::EndSection;
    369 
    370 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the default framebuffer object name 0 is bound.");
    371 			glBindFramebuffer(GL_FRAMEBUFFER, 0);
    372 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
    373 			expectError(GL_INVALID_OPERATION);
    374 			m_log << TestLog::EndSection;
    375 
    376 			glDeleteFramebuffers(1, &fbo);
    377 		});
    378 	ES2F_ADD_API_CASE(renderbuffer_storage, "Invalid glRenderbufferStorage() usage",
    379 		{
    380 			GLuint rbo;
    381 			glGenRenderbuffers(1, &rbo);
    382 			glBindRenderbuffer(GL_RENDERBUFFER, rbo);
    383 
    384 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
    385 			glRenderbufferStorage(-1, GL_RGBA4, 1, 1);
    386 			expectError(GL_INVALID_ENUM);
    387 			glRenderbufferStorage(GL_FRAMEBUFFER, GL_RGBA4, 1, 1);
    388 			expectError(GL_INVALID_ENUM);
    389 			m_log << TestLog::EndSection;
    390 
    391 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if internalformat is not an accepted format.");
    392 			glRenderbufferStorage(GL_RENDERBUFFER, -1, 1, 1);
    393 			expectError(GL_INVALID_ENUM);
    394 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 1, 1);
    395 			expectError(GL_INVALID_ENUM);
    396 			glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1, 1);
    397 			expectError(GL_INVALID_ENUM);
    398 			m_log << TestLog::EndSection;
    399 
    400 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than zero.");
    401 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, -1, 1);
    402 			expectError(GL_INVALID_VALUE);
    403 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 1, -1);
    404 			expectError(GL_INVALID_VALUE);
    405 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, -1, -1);
    406 			expectError(GL_INVALID_VALUE);
    407 			m_log << TestLog::EndSection;
    408 
    409 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_RENDERBUFFER_SIZE.");
    410 			GLint maxSize;
    411 			glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &maxSize);
    412 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 1, maxSize+1);
    413 			expectError(GL_INVALID_VALUE);
    414 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, maxSize+1, 1);
    415 			expectError(GL_INVALID_VALUE);
    416 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, maxSize+1, maxSize+1);
    417 			expectError(GL_INVALID_VALUE);
    418 			m_log << TestLog::EndSection;
    419 
    420 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the reserved renderbuffer object name 0 is bound.");
    421 			glBindRenderbuffer(GL_RENDERBUFFER, 0);
    422 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 1, 1);
    423 			expectError(GL_INVALID_OPERATION);
    424 			m_log << TestLog::EndSection;
    425 
    426 			glDeleteRenderbuffers(1, &rbo);
    427 		});
    428 }
    429 
    430 } // Functional
    431 } // gles2
    432 } // deqp
    433