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