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