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 
NegativeBufferApiTests(Context & context)42 NegativeBufferApiTests::NegativeBufferApiTests (Context& context)
43 	: TestCaseGroup(context, "buffer", "Negative Buffer API Cases")
44 {
45 }
46 
~NegativeBufferApiTests(void)47 NegativeBufferApiTests::~NegativeBufferApiTests (void)
48 {
49 }
50 
init(void)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