xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fNegativeTextureApiTests.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 Texture API tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es3fNegativeTextureApiTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "es3fApiCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuFormatUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker 
30*35238bceSAndroid Build Coastguard Worker #include <vector>
31*35238bceSAndroid Build Coastguard Worker #include <algorithm>
32*35238bceSAndroid Build Coastguard Worker 
33*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker using namespace glw; // GL types
37*35238bceSAndroid Build Coastguard Worker 
38*35238bceSAndroid Build Coastguard Worker namespace deqp
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker namespace gles3
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker namespace Functional
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker 
45*35238bceSAndroid Build Coastguard Worker using glu::mapGLCompressedTexFormat;
46*35238bceSAndroid Build Coastguard Worker using std::vector;
47*35238bceSAndroid Build Coastguard Worker using tcu::CompressedTexFormat;
48*35238bceSAndroid Build Coastguard Worker using tcu::getBlockPixelSize;
49*35238bceSAndroid Build Coastguard Worker using tcu::getBlockSize;
50*35238bceSAndroid Build Coastguard Worker using tcu::IVec3;
51*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
52*35238bceSAndroid Build Coastguard Worker 
divRoundUp(int a,int b)53*35238bceSAndroid Build Coastguard Worker static inline int divRoundUp(int a, int b)
54*35238bceSAndroid Build Coastguard Worker {
55*35238bceSAndroid Build Coastguard Worker     return a / b + (a % b != 0 ? 1 : 0);
56*35238bceSAndroid Build Coastguard Worker }
57*35238bceSAndroid Build Coastguard Worker 
etc2DataSize(int width,int height)58*35238bceSAndroid Build Coastguard Worker static inline int etc2DataSize(int width, int height)
59*35238bceSAndroid Build Coastguard Worker {
60*35238bceSAndroid Build Coastguard Worker     return (int)(divRoundUp(width, 4) * divRoundUp(height, 4) * sizeof(uint64_t));
61*35238bceSAndroid Build Coastguard Worker }
62*35238bceSAndroid Build Coastguard Worker 
etc2EacDataSize(int width,int height)63*35238bceSAndroid Build Coastguard Worker static inline int etc2EacDataSize(int width, int height)
64*35238bceSAndroid Build Coastguard Worker {
65*35238bceSAndroid Build Coastguard Worker     return 2 * etc2DataSize(width, height);
66*35238bceSAndroid Build Coastguard Worker }
67*35238bceSAndroid Build Coastguard Worker 
68*35238bceSAndroid Build Coastguard Worker static const GLuint s_astcFormats[] = {
69*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_RGBA_ASTC_4x4_KHR,           GL_COMPRESSED_RGBA_ASTC_5x4_KHR,
70*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_RGBA_ASTC_5x5_KHR,           GL_COMPRESSED_RGBA_ASTC_6x5_KHR,
71*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_RGBA_ASTC_6x6_KHR,           GL_COMPRESSED_RGBA_ASTC_8x5_KHR,
72*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_RGBA_ASTC_8x6_KHR,           GL_COMPRESSED_RGBA_ASTC_8x8_KHR,
73*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_RGBA_ASTC_10x5_KHR,          GL_COMPRESSED_RGBA_ASTC_10x6_KHR,
74*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_RGBA_ASTC_10x8_KHR,          GL_COMPRESSED_RGBA_ASTC_10x10_KHR,
75*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_RGBA_ASTC_12x10_KHR,         GL_COMPRESSED_RGBA_ASTC_12x12_KHR,
76*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,   GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,
77*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,   GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,
78*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,   GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,
79*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,   GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,
80*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,  GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,
81*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,  GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,
82*35238bceSAndroid Build Coastguard Worker     GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR};
83*35238bceSAndroid Build Coastguard Worker 
cubeFaceToGLFace(tcu::CubeFace face)84*35238bceSAndroid Build Coastguard Worker static uint32_t cubeFaceToGLFace(tcu::CubeFace face)
85*35238bceSAndroid Build Coastguard Worker {
86*35238bceSAndroid Build Coastguard Worker     switch (face)
87*35238bceSAndroid Build Coastguard Worker     {
88*35238bceSAndroid Build Coastguard Worker     case tcu::CUBEFACE_NEGATIVE_X:
89*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_CUBE_MAP_NEGATIVE_X;
90*35238bceSAndroid Build Coastguard Worker     case tcu::CUBEFACE_POSITIVE_X:
91*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_CUBE_MAP_POSITIVE_X;
92*35238bceSAndroid Build Coastguard Worker     case tcu::CUBEFACE_NEGATIVE_Y:
93*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
94*35238bceSAndroid Build Coastguard Worker     case tcu::CUBEFACE_POSITIVE_Y:
95*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
96*35238bceSAndroid Build Coastguard Worker     case tcu::CUBEFACE_NEGATIVE_Z:
97*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
98*35238bceSAndroid Build Coastguard Worker     case tcu::CUBEFACE_POSITIVE_Z:
99*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
100*35238bceSAndroid Build Coastguard Worker     default:
101*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
102*35238bceSAndroid Build Coastguard Worker         return GL_NONE;
103*35238bceSAndroid Build Coastguard Worker     }
104*35238bceSAndroid Build Coastguard Worker }
105*35238bceSAndroid Build Coastguard Worker 
106*35238bceSAndroid Build Coastguard Worker #define FOR_CUBE_FACES(FACE_GL_VAR, BODY)                                            \
107*35238bceSAndroid Build Coastguard Worker     do                                                                               \
108*35238bceSAndroid Build Coastguard Worker     {                                                                                \
109*35238bceSAndroid Build Coastguard Worker         for (int faceIterTcu = 0; faceIterTcu < tcu::CUBEFACE_LAST; faceIterTcu++)   \
110*35238bceSAndroid Build Coastguard Worker         {                                                                            \
111*35238bceSAndroid Build Coastguard Worker             const GLenum FACE_GL_VAR = cubeFaceToGLFace((tcu::CubeFace)faceIterTcu); \
112*35238bceSAndroid Build Coastguard Worker             BODY                                                                     \
113*35238bceSAndroid Build Coastguard Worker         }                                                                            \
114*35238bceSAndroid Build Coastguard Worker     } while (false)
115*35238bceSAndroid Build Coastguard Worker 
NegativeTextureApiTests(Context & context)116*35238bceSAndroid Build Coastguard Worker NegativeTextureApiTests::NegativeTextureApiTests(Context &context)
117*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "texture", "Negative Texture API Cases")
118*35238bceSAndroid Build Coastguard Worker {
119*35238bceSAndroid Build Coastguard Worker }
120*35238bceSAndroid Build Coastguard Worker 
~NegativeTextureApiTests(void)121*35238bceSAndroid Build Coastguard Worker NegativeTextureApiTests::~NegativeTextureApiTests(void)
122*35238bceSAndroid Build Coastguard Worker {
123*35238bceSAndroid Build Coastguard Worker }
124*35238bceSAndroid Build Coastguard Worker 
init(void)125*35238bceSAndroid Build Coastguard Worker void NegativeTextureApiTests::init(void)
126*35238bceSAndroid Build Coastguard Worker {
127*35238bceSAndroid Build Coastguard Worker     // glActiveTexture
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(activetexture, "Invalid glActiveTexture() usage", {
130*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if texture is not one of GL_TEXTUREi, where i "
131*35238bceSAndroid Build Coastguard Worker                                       "ranges from 0 to (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1).");
132*35238bceSAndroid Build Coastguard Worker         glActiveTexture(-1);
133*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
134*35238bceSAndroid Build Coastguard Worker         int numMaxTextureUnits = m_context.getContextInfo().getInt(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS);
135*35238bceSAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0 + numMaxTextureUnits);
136*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
137*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
138*35238bceSAndroid Build Coastguard Worker     });
139*35238bceSAndroid Build Coastguard Worker 
140*35238bceSAndroid Build Coastguard Worker     // glBindTexture
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(bindtexture, "Invalid glBindTexture() usage", {
143*35238bceSAndroid Build Coastguard Worker         GLuint texture[2];
144*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, texture);
145*35238bceSAndroid Build Coastguard Worker 
146*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the allowable values.");
147*35238bceSAndroid Build Coastguard Worker         glBindTexture(0, 1);
148*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
149*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_FRAMEBUFFER, 1);
150*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
151*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if texture was previously created with a "
154*35238bceSAndroid Build Coastguard Worker                                       "target that doesn't match that of target.");
155*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture[0]);
156*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
157*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]);
158*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
159*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture[0]);
160*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
161*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture[0]);
162*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
163*35238bceSAndroid Build Coastguard Worker 
164*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, texture[1]);
165*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
166*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture[1]);
167*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
168*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture[1]);
169*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
170*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture[1]);
171*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
172*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
173*35238bceSAndroid Build Coastguard Worker 
174*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, texture);
175*35238bceSAndroid Build Coastguard Worker     });
176*35238bceSAndroid Build Coastguard Worker 
177*35238bceSAndroid Build Coastguard Worker     // glCompressedTexImage2D
178*35238bceSAndroid Build Coastguard Worker 
179*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage2d_invalid_target, "Invalid glCompressedTexImage2D() usage", {
180*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
181*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
182*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
183*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
184*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
185*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
186*35238bceSAndroid Build Coastguard Worker     });
187*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage2d_invalid_format, "Invalid glCompressedTexImage2D() usage", {
188*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if internalformat is not a supported format "
189*35238bceSAndroid Build Coastguard Worker                                       "returned in GL_COMPRESSED_TEXTURE_FORMATS.");
190*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 0);
191*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
192*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 0, 0, 0);
193*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
194*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 0, 0, 0, 0, 0);
195*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
196*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 0, 0, 0);
197*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
198*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 0, 0, 0);
199*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
200*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 0, 0, 0);
201*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
202*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 0, 0, 0);
203*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
204*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 0, 0, 0);
205*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
206*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 0, 0, 0);
207*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
208*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
209*35238bceSAndroid Build Coastguard Worker     });
210*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage2d_neg_level, "Invalid glCompressedTexImage2D() usage", {
211*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
212*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
213*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
214*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
215*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
216*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
217*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
218*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
219*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
220*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
221*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
222*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
223*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
224*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
225*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
226*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
227*35238bceSAndroid Build Coastguard Worker     });
228*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage2d_max_level, "Invalid glCompressedTexImage2D() usage", {
229*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than "
230*35238bceSAndroid Build Coastguard Worker                                       "log_2(GL_MAX_TEXTURE_SIZE) for a 2d texture target.");
231*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
232*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0,
233*35238bceSAndroid Build Coastguard Worker                                etc2DataSize(16, 16), 0);
234*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
235*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
236*35238bceSAndroid Build Coastguard Worker 
237*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than "
238*35238bceSAndroid Build Coastguard Worker                                       "log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE) for a cubemap target.");
239*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxCubemapSize =
240*35238bceSAndroid Build Coastguard Worker             deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
241*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16,
242*35238bceSAndroid Build Coastguard Worker                                0, etc2EacDataSize(16, 16), 0);
243*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
244*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16,
245*35238bceSAndroid Build Coastguard Worker                                0, etc2EacDataSize(16, 16), 0);
246*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
247*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16,
248*35238bceSAndroid Build Coastguard Worker                                0, etc2EacDataSize(16, 16), 0);
249*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
250*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16,
251*35238bceSAndroid Build Coastguard Worker                                0, etc2EacDataSize(16, 16), 0);
252*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
253*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16,
254*35238bceSAndroid Build Coastguard Worker                                0, etc2EacDataSize(16, 16), 0);
255*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
256*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16,
257*35238bceSAndroid Build Coastguard Worker                                0, etc2EacDataSize(16, 16), 0);
258*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
259*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
260*35238bceSAndroid Build Coastguard Worker     });
261*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage2d_neg_width_height, "Invalid glCompressedTexImage2D() usage", {
262*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
263*35238bceSAndroid Build Coastguard Worker 
264*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_2D target");
265*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
266*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
267*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
268*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
269*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
270*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
271*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
272*35238bceSAndroid Build Coastguard Worker 
273*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
274*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
275*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
276*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
277*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
278*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
279*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
280*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
281*35238bceSAndroid Build Coastguard Worker 
282*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
283*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
284*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
285*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
286*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
287*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
288*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
289*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
290*35238bceSAndroid Build Coastguard Worker 
291*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
292*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
293*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
294*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
295*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
296*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
297*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
298*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
299*35238bceSAndroid Build Coastguard Worker 
300*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
301*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
302*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
303*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
304*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
305*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
306*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
307*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
308*35238bceSAndroid Build Coastguard Worker 
309*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
310*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
311*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
312*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
313*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
314*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
315*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
316*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
317*35238bceSAndroid Build Coastguard Worker 
318*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
319*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
320*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
321*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
322*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
323*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
324*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
325*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
326*35238bceSAndroid Build Coastguard Worker 
327*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
328*35238bceSAndroid Build Coastguard Worker     });
329*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage2d_max_width_height, "Invalid glCompressedTexImage2D() usage", {
330*35238bceSAndroid Build Coastguard Worker         int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1;
331*35238bceSAndroid Build Coastguard Worker         int maxCubemapSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
332*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
333*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE.");
334*35238bceSAndroid Build Coastguard Worker 
335*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_2D target");
336*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, 1, 0,
337*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(maxTextureSize, 1), 0);
338*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
339*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxTextureSize, 0,
340*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(1, maxTextureSize), 0);
341*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
342*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, maxTextureSize, 0,
343*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(maxTextureSize, maxTextureSize), 0);
344*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
345*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
346*35238bceSAndroid Build Coastguard Worker 
347*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
348*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0,
349*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(maxCubemapSize, 1), 0);
350*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
351*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0,
352*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(1, maxCubemapSize), 0);
353*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
354*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize,
355*35238bceSAndroid Build Coastguard Worker                                maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
356*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
357*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
358*35238bceSAndroid Build Coastguard Worker 
359*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
360*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0,
361*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(maxCubemapSize, 1), 0);
362*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
363*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0,
364*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(1, maxCubemapSize), 0);
365*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
366*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize,
367*35238bceSAndroid Build Coastguard Worker                                maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
368*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
369*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
370*35238bceSAndroid Build Coastguard Worker 
371*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
372*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0,
373*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(maxCubemapSize, 1), 0);
374*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
375*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0,
376*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(1, maxCubemapSize), 0);
377*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
378*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize,
379*35238bceSAndroid Build Coastguard Worker                                maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
380*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
381*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
382*35238bceSAndroid Build Coastguard Worker 
383*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
384*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0,
385*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(maxCubemapSize, 1), 0);
386*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
387*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0,
388*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(1, maxCubemapSize), 0);
389*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
390*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize,
391*35238bceSAndroid Build Coastguard Worker                                maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
392*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
393*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
394*35238bceSAndroid Build Coastguard Worker 
395*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
396*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0,
397*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(maxCubemapSize, 1), 0);
398*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
399*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0,
400*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(1, maxCubemapSize), 0);
401*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
402*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize,
403*35238bceSAndroid Build Coastguard Worker                                maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
404*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
405*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
406*35238bceSAndroid Build Coastguard Worker 
407*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
408*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0,
409*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(maxCubemapSize, 1), 0);
410*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
411*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0,
412*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(1, maxCubemapSize), 0);
413*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
414*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize,
415*35238bceSAndroid Build Coastguard Worker                                maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
416*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
417*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
418*35238bceSAndroid Build Coastguard Worker 
419*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
420*35238bceSAndroid Build Coastguard Worker     });
421*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage2d_invalid_border, "Invalid glCompressedTexImage2D() usage", {
422*35238bceSAndroid Build Coastguard Worker         bool isES    = glu::isContextTypeES(m_context.getRenderContext().getType());
423*35238bceSAndroid Build Coastguard Worker         GLenum error = isES ? GL_INVALID_VALUE : GL_INVALID_OPERATION;
424*35238bceSAndroid Build Coastguard Worker 
425*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
426*35238bceSAndroid Build Coastguard Worker 
427*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_2D target");
428*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
429*35238bceSAndroid Build Coastguard Worker         expectError(error);
430*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
431*35238bceSAndroid Build Coastguard Worker         expectError(error);
432*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
433*35238bceSAndroid Build Coastguard Worker 
434*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
435*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
436*35238bceSAndroid Build Coastguard Worker         expectError(error);
437*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
438*35238bceSAndroid Build Coastguard Worker         expectError(error);
439*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
440*35238bceSAndroid Build Coastguard Worker 
441*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
442*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
443*35238bceSAndroid Build Coastguard Worker         expectError(error);
444*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
445*35238bceSAndroid Build Coastguard Worker         expectError(error);
446*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
447*35238bceSAndroid Build Coastguard Worker 
448*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
449*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
450*35238bceSAndroid Build Coastguard Worker         expectError(error);
451*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
452*35238bceSAndroid Build Coastguard Worker         expectError(error);
453*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
454*35238bceSAndroid Build Coastguard Worker 
455*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
456*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
457*35238bceSAndroid Build Coastguard Worker         expectError(error);
458*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
459*35238bceSAndroid Build Coastguard Worker         expectError(error);
460*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
461*35238bceSAndroid Build Coastguard Worker 
462*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
463*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
464*35238bceSAndroid Build Coastguard Worker         expectError(error);
465*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
466*35238bceSAndroid Build Coastguard Worker         expectError(error);
467*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
468*35238bceSAndroid Build Coastguard Worker 
469*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
470*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
471*35238bceSAndroid Build Coastguard Worker         expectError(error);
472*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
473*35238bceSAndroid Build Coastguard Worker         expectError(error);
474*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
475*35238bceSAndroid Build Coastguard Worker 
476*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
477*35238bceSAndroid Build Coastguard Worker     });
478*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage2d_invalid_size, "Invalid glCompressedTexImage2D() usage", {
479*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if imageSize is not consistent with the format, "
480*35238bceSAndroid Build Coastguard Worker                                       "dimensions, and contents of the specified compressed image data.");
481*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, -1, 0);
482*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
483*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, 4 * 4 * 8, 0);
484*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
485*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0, 4 * 4 * 16, 0);
486*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
487*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SIGNED_R11_EAC, 16, 16, 0, 4 * 4 * 16, 0);
488*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
489*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
490*35238bceSAndroid Build Coastguard Worker     });
491*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage2d_invalid_buffer_target, "Invalid glCompressedTexImage2D() usage", {
492*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
493*35238bceSAndroid Build Coastguard Worker         std::vector<GLubyte> data(64);
494*35238bceSAndroid Build Coastguard Worker 
495*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
496*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
497*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY);
498*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
499*35238bceSAndroid Build Coastguard Worker 
500*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
501*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the "
502*35238bceSAndroid Build Coastguard Worker                 "GL_PIXEL_UNPACK_BUFFER target and the buffer object's data store is currently mapped.");
503*35238bceSAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 32, GL_MAP_WRITE_BIT);
504*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 4, 4, 0, etc2DataSize(4, 4), 0);
505*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
506*35238bceSAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
507*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
508*35238bceSAndroid Build Coastguard Worker 
509*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
510*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the "
511*35238bceSAndroid Build Coastguard Worker                                   "GL_PIXEL_UNPACK_BUFFER target and the data would be unpacked from the buffer object "
512*35238bceSAndroid Build Coastguard Worker                                   "such that the memory reads required would exceed the data store size.");
513*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0, etc2DataSize(16, 16), 0);
514*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
515*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
516*35238bceSAndroid Build Coastguard Worker 
517*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
518*35238bceSAndroid Build Coastguard Worker     });
519*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(
520*35238bceSAndroid Build Coastguard Worker         compressedteximage2d_invalid_astc_target, "ASTC formats should not be supported without a proper extension.", {
521*35238bceSAndroid Build Coastguard Worker             if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
522*35238bceSAndroid Build Coastguard Worker             {
523*35238bceSAndroid Build Coastguard Worker                 m_log.writeMessage("ASTC supported. No negative API requirements.");
524*35238bceSAndroid Build Coastguard Worker             }
525*35238bceSAndroid Build Coastguard Worker             else
526*35238bceSAndroid Build Coastguard Worker             {
527*35238bceSAndroid Build Coastguard Worker                 m_log.writeMessage("GL_INVALID_ENUM should be generated if no ASTC extensions are present.");
528*35238bceSAndroid Build Coastguard Worker 
529*35238bceSAndroid Build Coastguard Worker                 for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_astcFormats); formatNdx++)
530*35238bceSAndroid Build Coastguard Worker                 {
531*35238bceSAndroid Build Coastguard Worker                     const GLuint format                 = s_astcFormats[formatNdx];
532*35238bceSAndroid Build Coastguard Worker                     const CompressedTexFormat tcuFormat = mapGLCompressedTexFormat(format);
533*35238bceSAndroid Build Coastguard Worker                     const IVec3 blockPixels             = getBlockPixelSize(tcuFormat);
534*35238bceSAndroid Build Coastguard Worker                     {
535*35238bceSAndroid Build Coastguard Worker                         const size_t blockBytes = getBlockSize(tcuFormat);
536*35238bceSAndroid Build Coastguard Worker                         const vector<uint8_t> unusedData(blockBytes);
537*35238bceSAndroid Build Coastguard Worker 
538*35238bceSAndroid Build Coastguard Worker                         glCompressedTexImage2D(GL_TEXTURE_2D, 0, format, blockPixels.x(), blockPixels.y(), 0,
539*35238bceSAndroid Build Coastguard Worker                                                (int)blockBytes, &unusedData[0]);
540*35238bceSAndroid Build Coastguard Worker                         expectError(GL_INVALID_ENUM);
541*35238bceSAndroid Build Coastguard Worker                     }
542*35238bceSAndroid Build Coastguard Worker                     FOR_CUBE_FACES(faceGL, {
543*35238bceSAndroid Build Coastguard Worker                         const int32_t cubeSize =
544*35238bceSAndroid Build Coastguard Worker                             blockPixels.x() * blockPixels.y(); // Divisible by the block size and square
545*35238bceSAndroid Build Coastguard Worker                         const size_t blockBytes = getBlockSize(tcuFormat) * cubeSize; // We have a x * y grid of blocks
546*35238bceSAndroid Build Coastguard Worker                         const vector<uint8_t> unusedData(blockBytes);
547*35238bceSAndroid Build Coastguard Worker 
548*35238bceSAndroid Build Coastguard Worker                         glCompressedTexImage2D(faceGL, 0, format, cubeSize, cubeSize, 0, (int)blockBytes,
549*35238bceSAndroid Build Coastguard Worker                                                &unusedData[0]);
550*35238bceSAndroid Build Coastguard Worker                         expectError(GL_INVALID_ENUM);
551*35238bceSAndroid Build Coastguard Worker                     });
552*35238bceSAndroid Build Coastguard Worker                 }
553*35238bceSAndroid Build Coastguard Worker             }
554*35238bceSAndroid Build Coastguard Worker         });
555*35238bceSAndroid Build Coastguard Worker 
556*35238bceSAndroid Build Coastguard Worker     // glCopyTexImage2D
557*35238bceSAndroid Build Coastguard Worker 
558*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copyteximage2d_invalid_target, "Invalid glCopyTexImage2D() usage", {
559*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
560*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(0, 0, GL_RGB, 0, 0, 64, 64, 0);
561*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
562*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
563*35238bceSAndroid Build Coastguard Worker     });
564*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copyteximage2d_invalid_format, "Invalid glCopyTexImage2D() usage", {
565*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
566*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not an accepted format.");
567*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 64, 64, 0);
568*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
569*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 16, 16, 0);
570*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
571*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 16, 16, 0);
572*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
573*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 16, 16, 0);
574*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
575*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 16, 16, 0);
576*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
577*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 16, 16, 0);
578*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
579*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 16, 16, 0);
580*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, 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(copyteximage2d_inequal_width_height_cube, "Invalid glCopyTexImage2D() usage", {
584*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if target is one of the six cube map 2D image "
585*35238bceSAndroid Build Coastguard Worker                                       "targets and the width and height parameters are not equal.");
586*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 16, 17, 0);
587*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
588*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 16, 17, 0);
589*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
590*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 16, 17, 0);
591*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
592*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 16, 17, 0);
593*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
594*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 16, 17, 0);
595*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
596*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 16, 17, 0);
597*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
598*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
599*35238bceSAndroid Build Coastguard Worker     });
600*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copyteximage2d_neg_level, "Invalid glCopyTexImage2D() usage", {
601*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
602*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, -1, GL_RGB, 0, 0, 64, 64, 0);
603*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
604*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_RGB, 0, 0, 16, 16, 0);
605*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
606*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_RGB, 0, 0, 16, 16, 0);
607*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
608*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_RGB, 0, 0, 16, 16, 0);
609*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
610*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_RGB, 0, 0, 16, 16, 0);
611*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
612*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_RGB, 0, 0, 16, 16, 0);
613*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
614*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_RGB, 0, 0, 16, 16, 0);
615*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
616*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
617*35238bceSAndroid Build Coastguard Worker     });
618*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copyteximage2d_max_level, "Invalid glCopyTexImage2D() usage", {
619*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
620*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
621*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
622*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_RGB, 0, 0, 64, 64, 0);
623*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
624*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
625*35238bceSAndroid Build Coastguard Worker 
626*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
627*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
628*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxCubemapSize =
629*35238bceSAndroid Build Coastguard Worker             deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
630*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
631*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
632*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
633*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
634*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
635*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
636*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
637*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
638*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
639*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
640*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
641*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
642*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
643*35238bceSAndroid Build Coastguard Worker     });
644*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copyteximage2d_neg_width_height, "Invalid glCopyTexImage2D() usage", {
645*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
646*35238bceSAndroid Build Coastguard Worker 
647*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_2D target");
648*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, -1, 1, 0);
649*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
650*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, -1, 0);
651*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
652*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, -1, -1, 0);
653*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
654*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
655*35238bceSAndroid Build Coastguard Worker 
656*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
657*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, -1, 1, 0);
658*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
659*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 1, -1, 0);
660*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
661*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, -1, -1, 0);
662*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
663*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
664*35238bceSAndroid Build Coastguard Worker 
665*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
666*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, -1, 1, 0);
667*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
668*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 1, -1, 0);
669*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
670*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, -1, -1, 0);
671*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
672*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
673*35238bceSAndroid Build Coastguard Worker 
674*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
675*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, -1, 1, 0);
676*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
677*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 1, -1, 0);
678*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
679*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, -1, -1, 0);
680*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
681*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
682*35238bceSAndroid Build Coastguard Worker 
683*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
684*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, -1, 1, 0);
685*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
686*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 1, -1, 0);
687*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
688*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, -1, -1, 0);
689*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
690*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
691*35238bceSAndroid Build Coastguard Worker 
692*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
693*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, -1, 1, 0);
694*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
695*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 1, -1, 0);
696*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
697*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, -1, -1, 0);
698*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
699*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
700*35238bceSAndroid Build Coastguard Worker 
701*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
702*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, -1, 1, 0);
703*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
704*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 1, -1, 0);
705*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
706*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, -1, -1, 0);
707*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
708*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
709*35238bceSAndroid Build Coastguard Worker 
710*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
711*35238bceSAndroid Build Coastguard Worker     });
712*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copyteximage2d_max_width_height, "Invalid glCopyTexImage2D() usage", {
713*35238bceSAndroid Build Coastguard Worker         int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1;
714*35238bceSAndroid Build Coastguard Worker         int maxCubemapSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
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 width or height is greater than GL_MAX_TEXTURE_SIZE.");
718*35238bceSAndroid Build Coastguard Worker 
719*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_2D target");
720*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, maxTextureSize, 1, 0);
721*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
722*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, maxTextureSize, 0);
723*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
724*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, maxTextureSize, maxTextureSize, 0);
725*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
726*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
727*35238bceSAndroid Build Coastguard Worker 
728*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
729*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
730*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
731*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
732*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
733*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
734*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
735*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
736*35238bceSAndroid Build Coastguard Worker 
737*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
738*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
739*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
740*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
741*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
742*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
743*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
744*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
745*35238bceSAndroid Build Coastguard Worker 
746*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
747*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
748*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
749*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
750*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
751*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
752*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
753*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
754*35238bceSAndroid Build Coastguard Worker 
755*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
756*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
757*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
758*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
759*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
760*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
761*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
762*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
763*35238bceSAndroid Build Coastguard Worker 
764*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
765*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
766*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
767*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
768*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
769*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
770*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
771*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
772*35238bceSAndroid Build Coastguard Worker 
773*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
774*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
775*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
776*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
777*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
778*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
779*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
780*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
781*35238bceSAndroid Build Coastguard Worker 
782*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
783*35238bceSAndroid Build Coastguard Worker     });
784*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copyteximage2d_invalid_border, "Invalid glCopyTexImage2D() usage", {
785*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
786*35238bceSAndroid Build Coastguard Worker 
787*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_2D target");
788*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 0, 0, -1);
789*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
790*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 0, 0, 1);
791*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
792*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
793*35238bceSAndroid Build Coastguard Worker 
794*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
795*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 0, 0, -1);
796*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
797*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 0, 0, 1);
798*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
799*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
800*35238bceSAndroid Build Coastguard Worker 
801*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
802*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 0, 0, -1);
803*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
804*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 0, 0, 1);
805*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
806*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
807*35238bceSAndroid Build Coastguard Worker 
808*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_2D target");
809*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 0, 0, -1);
810*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
811*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 0, 0, 1);
812*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
813*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
814*35238bceSAndroid Build Coastguard Worker 
815*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
816*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 0, 0, -1);
817*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
818*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 0, 0, 1);
819*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
820*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
821*35238bceSAndroid Build Coastguard Worker 
822*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
823*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 0, 0, -1);
824*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
825*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 0, 0, 1);
826*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
827*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
828*35238bceSAndroid Build Coastguard Worker 
829*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
830*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 0, 0, -1);
831*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
832*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 0, 0, 1);
833*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
834*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
835*35238bceSAndroid Build Coastguard Worker 
836*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
837*35238bceSAndroid Build Coastguard Worker     });
838*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copyteximage2d_incomplete_framebuffer, "Invalid glCopyTexImage2D() usage", {
839*35238bceSAndroid Build Coastguard Worker         GLuint fbo;
840*35238bceSAndroid Build Coastguard Worker         glGenFramebuffers(1, &fbo);
841*35238bceSAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
842*35238bceSAndroid Build Coastguard Worker         glCheckFramebufferStatus(GL_FRAMEBUFFER);
843*35238bceSAndroid Build Coastguard Worker 
844*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound "
845*35238bceSAndroid Build Coastguard Worker                                            "framebuffer is not framebuffer complete.");
846*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, 0, 0, 0);
847*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
848*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA8, 0, 0, 0, 0, 0);
849*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
850*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA8, 0, 0, 0, 0, 0);
851*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
852*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA8, 0, 0, 0, 0, 0);
853*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
854*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA8, 0, 0, 0, 0, 0);
855*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
856*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, 0, 0, 0, 0, 0);
857*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
858*35238bceSAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA8, 0, 0, 0, 0, 0);
859*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
860*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
861*35238bceSAndroid Build Coastguard Worker 
862*35238bceSAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
863*35238bceSAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &fbo);
864*35238bceSAndroid Build Coastguard Worker     });
865*35238bceSAndroid Build Coastguard Worker 
866*35238bceSAndroid Build Coastguard Worker     // glCopyTexSubImage2D
867*35238bceSAndroid Build Coastguard Worker 
868*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage2d_invalid_target, "Invalid glCopyTexSubImage2D() usage", {
869*35238bceSAndroid Build Coastguard Worker         GLuint texture;
870*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
871*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
872*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
873*35238bceSAndroid Build Coastguard Worker 
874*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
875*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(0, 0, 0, 0, 0, 0, 4, 4);
876*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
877*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
878*35238bceSAndroid Build Coastguard Worker 
879*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
880*35238bceSAndroid Build Coastguard Worker     });
881*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage2d_neg_level, "Invalid glCopyTexSubImage2D() usage", {
882*35238bceSAndroid Build Coastguard Worker         GLuint textures[2];
883*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
884*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[0]);
885*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
886*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
887*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0););
888*35238bceSAndroid Build Coastguard Worker 
889*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
890*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, 4, 4);
891*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
892*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, {
893*35238bceSAndroid Build Coastguard Worker             glCopyTexSubImage2D(faceGL, -1, 0, 0, 0, 0, 4, 4);
894*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_VALUE);
895*35238bceSAndroid Build Coastguard Worker         });
896*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
897*35238bceSAndroid Build Coastguard Worker 
898*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
899*35238bceSAndroid Build Coastguard Worker     });
900*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage2d_max_level, "Invalid glCopyTexSubImage2D() usage", {
901*35238bceSAndroid Build Coastguard Worker         GLuint textures[2];
902*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
903*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[0]);
904*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
905*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
906*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0););
907*35238bceSAndroid Build Coastguard Worker 
908*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than "
909*35238bceSAndroid Build Coastguard Worker                                       "log_2(GL_MAX_TEXTURE_SIZE) for 2D texture targets.");
910*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
911*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, 4, 4);
912*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
913*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
914*35238bceSAndroid Build Coastguard Worker 
915*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
916*35238bceSAndroid Build Coastguard Worker             "",
917*35238bceSAndroid Build Coastguard Worker             "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_SIZE) for cubemap targets.");
918*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxCubemapSize =
919*35238bceSAndroid Build Coastguard Worker             deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
920*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, {
921*35238bceSAndroid Build Coastguard Worker             glCopyTexSubImage2D(faceGL, log2MaxCubemapSize, 0, 0, 0, 0, 4, 4);
922*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_VALUE);
923*35238bceSAndroid Build Coastguard Worker         });
924*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
925*35238bceSAndroid Build Coastguard Worker 
926*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
927*35238bceSAndroid Build Coastguard Worker     });
928*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage2d_neg_offset, "Invalid glCopyTexSubImage2D() usage", {
929*35238bceSAndroid Build Coastguard Worker         GLuint texture;
930*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
931*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
932*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
933*35238bceSAndroid Build Coastguard Worker 
934*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset < 0 or yoffset < 0.");
935*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 0, 0, 4, 4);
936*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
937*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 0, 0, 4, 4);
938*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
939*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, -1, -1, 0, 0, 4, 4);
940*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
941*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
942*35238bceSAndroid Build Coastguard Worker 
943*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
944*35238bceSAndroid Build Coastguard Worker     });
945*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage2d_invalid_offset, "Invalid glCopyTexSubImage2D() usage", {
946*35238bceSAndroid Build Coastguard Worker         GLuint texture;
947*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
948*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
949*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
950*35238bceSAndroid Build Coastguard Worker 
951*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
952*35238bceSAndroid Build Coastguard Worker             "",
953*35238bceSAndroid Build Coastguard Worker             "GL_INVALID_VALUE is generated if xoffset + width > texture_width or yoffset + height > texture_height.");
954*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 14, 0, 0, 0, 4, 4);
955*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
956*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 14, 0, 0, 4, 4);
957*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
958*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 14, 14, 0, 0, 4, 4);
959*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
960*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
961*35238bceSAndroid Build Coastguard Worker 
962*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
963*35238bceSAndroid Build Coastguard Worker     });
964*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage2d_neg_width_height, "Invalid glCopyTexSubImage2D() usage", {
965*35238bceSAndroid Build Coastguard Worker         GLuint texture;
966*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
967*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
968*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
969*35238bceSAndroid Build Coastguard Worker 
970*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
971*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, -1, 0);
972*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
973*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, -1);
974*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
975*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, -1, -1);
976*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
977*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
978*35238bceSAndroid Build Coastguard Worker 
979*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
980*35238bceSAndroid Build Coastguard Worker     });
981*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage2d_incomplete_framebuffer, "Invalid glCopyTexSubImage2D() usage", {
982*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound "
983*35238bceSAndroid Build Coastguard Worker                                            "framebuffer is not framebuffer complete.");
984*35238bceSAndroid Build Coastguard Worker 
985*35238bceSAndroid Build Coastguard Worker         GLuint texture[2];
986*35238bceSAndroid Build Coastguard Worker         GLuint fbo;
987*35238bceSAndroid Build Coastguard Worker 
988*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, texture);
989*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture[0]);
990*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
991*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, texture[1]);
992*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
993*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
994*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
995*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
996*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
997*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
998*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
999*35238bceSAndroid Build Coastguard Worker 
1000*35238bceSAndroid Build Coastguard Worker         glGenFramebuffers(1, &fbo);
1001*35238bceSAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1002*35238bceSAndroid Build Coastguard Worker         glCheckFramebufferStatus(GL_FRAMEBUFFER);
1003*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1004*35238bceSAndroid Build Coastguard Worker 
1005*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 0);
1006*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1007*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 0, 0, 0);
1008*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1009*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 0, 0, 0);
1010*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1011*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 0, 0, 0);
1012*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1013*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 0, 0, 0);
1014*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1015*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 0, 0, 0);
1016*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1017*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 0, 0, 0);
1018*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1019*35238bceSAndroid Build Coastguard Worker 
1020*35238bceSAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
1021*35238bceSAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &fbo);
1022*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, texture);
1023*35238bceSAndroid Build Coastguard Worker 
1024*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1025*35238bceSAndroid Build Coastguard Worker     });
1026*35238bceSAndroid Build Coastguard Worker 
1027*35238bceSAndroid Build Coastguard Worker     // glDeleteTextures
1028*35238bceSAndroid Build Coastguard Worker 
1029*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(deletetextures, "Invalid glDeleteTextures() usage", {
1030*35238bceSAndroid Build Coastguard Worker         GLuint texture;
1031*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1032*35238bceSAndroid Build Coastguard Worker 
1033*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
1034*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(-1, 0);
1035*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1036*35238bceSAndroid Build Coastguard Worker 
1037*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1038*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(-1, 0);
1039*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1040*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1041*35238bceSAndroid Build Coastguard Worker 
1042*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1043*35238bceSAndroid Build Coastguard Worker     });
1044*35238bceSAndroid Build Coastguard Worker 
1045*35238bceSAndroid Build Coastguard Worker     // glGenerateMipmap
1046*35238bceSAndroid Build Coastguard Worker 
1047*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(generatemipmap, "Invalid glGenerateMipmap() usage", {
1048*35238bceSAndroid Build Coastguard Worker         GLuint texture[2];
1049*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, texture);
1050*35238bceSAndroid Build Coastguard Worker 
1051*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1052*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target is not GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP.");
1053*35238bceSAndroid Build Coastguard Worker         glGenerateMipmap(0);
1054*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1055*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1056*35238bceSAndroid Build Coastguard Worker 
1057*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1058*35238bceSAndroid Build Coastguard Worker             "", "INVALID_OPERATION is generated if the texture bound to target is not cube complete.");
1059*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]);
1060*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);
1061*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1062*35238bceSAndroid Build Coastguard Worker         glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
1063*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1064*35238bceSAndroid Build Coastguard Worker 
1065*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]);
1066*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1067*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1068*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1069*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1070*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1071*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1072*35238bceSAndroid Build Coastguard Worker         glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
1073*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1074*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1075*35238bceSAndroid Build Coastguard Worker 
1076*35238bceSAndroid Build Coastguard Worker         if (glu::isContextTypeES(m_context.getRenderContext().getType()))
1077*35238bceSAndroid Build Coastguard Worker         {
1078*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section(
1079*35238bceSAndroid Build Coastguard Worker                 "",
1080*35238bceSAndroid Build Coastguard Worker                 "GL_INVALID_OPERATION is generated if the zero level array is stored in a compressed internal format.");
1081*35238bceSAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, texture[1]);
1082*35238bceSAndroid Build Coastguard Worker             glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
1083*35238bceSAndroid Build Coastguard Worker             glGenerateMipmap(GL_TEXTURE_2D);
1084*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
1085*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
1086*35238bceSAndroid Build Coastguard Worker 
1087*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section(
1088*35238bceSAndroid Build Coastguard Worker                 "", "GL_INVALID_OPERATION is generated if the level base array was not specified with an unsized "
1089*35238bceSAndroid Build Coastguard Worker                     "internal format or a sized internal format that is both color-renderable and texture-filterable.");
1090*35238bceSAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8_SNORM, 0, 0, 0, GL_RGB, GL_BYTE, 0);
1091*35238bceSAndroid Build Coastguard Worker             glGenerateMipmap(GL_TEXTURE_2D);
1092*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
1093*35238bceSAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_R8I, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, 0);
1094*35238bceSAndroid Build Coastguard Worker             glGenerateMipmap(GL_TEXTURE_2D);
1095*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
1096*35238bceSAndroid Build Coastguard Worker 
1097*35238bceSAndroid Build Coastguard Worker             if (!(m_context.getContextInfo().isExtensionSupported("GL_EXT_color_buffer_float") &&
1098*35238bceSAndroid Build Coastguard Worker                   m_context.getContextInfo().isExtensionSupported("GL_OES_texture_float_linear")))
1099*35238bceSAndroid Build Coastguard Worker             {
1100*35238bceSAndroid Build Coastguard Worker                 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 0, 0, 0, GL_RGBA, GL_FLOAT, 0);
1101*35238bceSAndroid Build Coastguard Worker                 glGenerateMipmap(GL_TEXTURE_2D);
1102*35238bceSAndroid Build Coastguard Worker                 expectError(GL_INVALID_OPERATION);
1103*35238bceSAndroid Build Coastguard Worker             }
1104*35238bceSAndroid Build Coastguard Worker 
1105*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
1106*35238bceSAndroid Build Coastguard Worker         }
1107*35238bceSAndroid Build Coastguard Worker 
1108*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, texture);
1109*35238bceSAndroid Build Coastguard Worker     });
1110*35238bceSAndroid Build Coastguard Worker 
1111*35238bceSAndroid Build Coastguard Worker     // glGenTextures
1112*35238bceSAndroid Build Coastguard Worker 
1113*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(gentextures, "Invalid glGenTextures() usage", {
1114*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
1115*35238bceSAndroid Build Coastguard Worker         glGenTextures(-1, 0);
1116*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1117*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1118*35238bceSAndroid Build Coastguard Worker     });
1119*35238bceSAndroid Build Coastguard Worker 
1120*35238bceSAndroid Build Coastguard Worker     // glPixelStorei
1121*35238bceSAndroid Build Coastguard Worker 
1122*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(pixelstorei, "Invalid glPixelStorei() usage", {
1123*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
1124*35238bceSAndroid Build Coastguard Worker         glPixelStorei(0, 1);
1125*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1126*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1127*35238bceSAndroid Build Coastguard Worker 
1128*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if a negative row length, pixel skip, or row skip "
1129*35238bceSAndroid Build Coastguard Worker                                       "value is specified, or if alignment is specified as other than 1, 2, 4, or 8.");
1130*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_ROW_LENGTH, -1);
1131*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1132*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_SKIP_ROWS, -1);
1133*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1134*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_SKIP_PIXELS, -1);
1135*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1136*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ROW_LENGTH, -1);
1137*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1138*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, -1);
1139*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1140*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_ROWS, -1);
1141*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1142*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_PIXELS, -1);
1143*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1144*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_IMAGES, -1);
1145*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1146*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_ALIGNMENT, 0);
1147*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1148*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ALIGNMENT, 0);
1149*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1150*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_ALIGNMENT, 16);
1151*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1152*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ALIGNMENT, 16);
1153*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1154*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1155*35238bceSAndroid Build Coastguard Worker     });
1156*35238bceSAndroid Build Coastguard Worker 
1157*35238bceSAndroid Build Coastguard Worker     // glTexImage2D
1158*35238bceSAndroid Build Coastguard Worker 
1159*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage2d, "Invalid glTexImage2D() usage", {
1160*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
1161*35238bceSAndroid Build Coastguard Worker         glTexImage2D(0, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1162*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1163*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1164*35238bceSAndroid Build Coastguard Worker 
1165*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if type is not a type constant.");
1166*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, 0, 0);
1167*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1168*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1169*35238bceSAndroid Build Coastguard Worker 
1170*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1171*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if the combination of internalFormat, format and type is invalid.");
1172*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
1173*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1174*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
1175*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1176*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB10_A2, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_2_10_10_10_REV, 0);
1177*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1178*35238bceSAndroid Build Coastguard Worker         if (glu::isContextTypeES(m_context.getRenderContext().getType()))
1179*35238bceSAndroid Build Coastguard Worker         {
1180*35238bceSAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1181*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
1182*35238bceSAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32UI, 1, 1, 0, GL_RGBA_INTEGER, GL_INT, 0);
1183*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
1184*35238bceSAndroid Build Coastguard Worker         }
1185*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1186*35238bceSAndroid Build Coastguard Worker     });
1187*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage2d_inequal_width_height_cube, "Invalid glTexImage2D() usage", {
1188*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if target is one of the six cube map 2D image "
1189*35238bceSAndroid Build Coastguard Worker                                       "targets and the width and height parameters are not equal.");
1190*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1191*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1192*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1193*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1194*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1195*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1196*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1197*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1198*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1199*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1200*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1201*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1202*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1203*35238bceSAndroid Build Coastguard Worker     });
1204*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage2d_neg_level, "Invalid glTexImage2D() usage", {
1205*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
1206*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1207*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1208*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1209*35238bceSAndroid Build Coastguard Worker 
1210*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
1211*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1212*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1213*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1214*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1215*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1216*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1217*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1218*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1219*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1220*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1221*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1222*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1223*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1224*35238bceSAndroid Build Coastguard Worker     });
1225*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage2d_max_level, "Invalid glTexImage2D() usage", {
1226*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
1227*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
1228*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
1229*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1230*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1231*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1232*35238bceSAndroid Build Coastguard Worker 
1233*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1234*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
1235*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxCubemapSize =
1236*35238bceSAndroid Build Coastguard Worker             deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
1237*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1238*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1239*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1240*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1241*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1242*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1243*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1244*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1245*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1246*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1247*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1248*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1249*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1250*35238bceSAndroid Build Coastguard Worker     });
1251*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage2d_neg_width_height, "Invalid glTexImage2D() usage", {
1252*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1253*35238bceSAndroid Build Coastguard Worker 
1254*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_2D target");
1255*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1256*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1257*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1258*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1259*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1260*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1261*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1262*35238bceSAndroid Build Coastguard Worker 
1263*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
1264*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1265*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1266*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1267*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1268*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1269*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1270*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1271*35238bceSAndroid Build Coastguard Worker 
1272*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
1273*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1274*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1275*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1276*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1277*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1278*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1279*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1280*35238bceSAndroid Build Coastguard Worker 
1281*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
1282*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1283*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1284*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1285*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1286*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1287*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1288*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1289*35238bceSAndroid Build Coastguard Worker 
1290*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
1291*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1292*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1293*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1294*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1295*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1296*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1297*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1298*35238bceSAndroid Build Coastguard Worker 
1299*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
1300*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1301*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1302*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1303*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1304*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1305*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1306*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1307*35238bceSAndroid Build Coastguard Worker 
1308*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
1309*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1310*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1311*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1312*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1313*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1314*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1315*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1316*35238bceSAndroid Build Coastguard Worker 
1317*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1318*35238bceSAndroid Build Coastguard Worker     });
1319*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage2d_max_width_height, "Invalid glTexImage2D() usage", {
1320*35238bceSAndroid Build Coastguard Worker         int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1;
1321*35238bceSAndroid Build Coastguard Worker         int maxCubemapSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
1322*35238bceSAndroid Build Coastguard Worker 
1323*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1324*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE.");
1325*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, maxTextureSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1326*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1327*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1328*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1329*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, maxTextureSize, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1330*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1331*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1332*35238bceSAndroid Build Coastguard Worker 
1333*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1334*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
1335*35238bceSAndroid Build Coastguard Worker 
1336*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
1337*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1338*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1339*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1340*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1341*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB,
1342*35238bceSAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, 0);
1343*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1344*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1345*35238bceSAndroid Build Coastguard Worker 
1346*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
1347*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1348*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1349*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1350*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1351*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB,
1352*35238bceSAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, 0);
1353*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1354*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1355*35238bceSAndroid Build Coastguard Worker 
1356*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
1357*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1358*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1359*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1360*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1361*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB,
1362*35238bceSAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, 0);
1363*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1364*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1365*35238bceSAndroid Build Coastguard Worker 
1366*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
1367*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1368*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1369*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1370*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1371*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB,
1372*35238bceSAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, 0);
1373*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1374*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1375*35238bceSAndroid Build Coastguard Worker 
1376*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
1377*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1378*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1379*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1380*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1381*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB,
1382*35238bceSAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, 0);
1383*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1384*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1385*35238bceSAndroid Build Coastguard Worker 
1386*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
1387*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1388*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1389*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1390*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1391*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB,
1392*35238bceSAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, 0);
1393*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1394*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1395*35238bceSAndroid Build Coastguard Worker 
1396*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1397*35238bceSAndroid Build Coastguard Worker     });
1398*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage2d_invalid_border, "Invalid glTexImage2D() usage", {
1399*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
1400*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1401*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1402*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1403*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1404*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1405*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1406*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1407*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1408*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1409*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1410*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1411*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1412*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1413*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1414*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1415*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1416*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1417*35238bceSAndroid Build Coastguard Worker     });
1418*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage2d_invalid_buffer_target, "Invalid glTexImage2D() usage", {
1419*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
1420*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
1421*35238bceSAndroid Build Coastguard Worker         std::vector<GLubyte> data(64);
1422*35238bceSAndroid Build Coastguard Worker 
1423*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
1424*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
1425*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY);
1426*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1427*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1428*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1429*35238bceSAndroid Build Coastguard Worker 
1430*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to "
1431*35238bceSAndroid Build Coastguard Worker                                       "the GL_PIXEL_UNPACK_BUFFER target and...");
1432*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the buffer object's data store is currently mapped.");
1433*35238bceSAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 32, GL_MAP_WRITE_BIT);
1434*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1435*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1436*35238bceSAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
1437*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1438*35238bceSAndroid Build Coastguard Worker 
1439*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads "
1440*35238bceSAndroid Build Coastguard Worker                                       "required would exceed the data store size.");
1441*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1442*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1443*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1444*35238bceSAndroid Build Coastguard Worker 
1445*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...data is not evenly divisible into the number of bytes needed to store in "
1446*35238bceSAndroid Build Coastguard Worker                                       "memory a datum indicated by type.");
1447*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage;
1448*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, (const GLvoid *)3);
1449*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1450*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1451*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1452*35238bceSAndroid Build Coastguard Worker 
1453*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
1454*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1455*35238bceSAndroid Build Coastguard Worker     });
1456*35238bceSAndroid Build Coastguard Worker 
1457*35238bceSAndroid Build Coastguard Worker     // glTexSubImage2D
1458*35238bceSAndroid Build Coastguard Worker 
1459*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage2d, "Invalid glTexSubImage2D() usage", {
1460*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
1461*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1462*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1463*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1464*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1465*35238bceSAndroid Build Coastguard Worker 
1466*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
1467*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(0, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1468*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1469*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1470*35238bceSAndroid Build Coastguard Worker 
1471*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if format is not an accepted format constant.");
1472*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 4, 4, GL_UNSIGNED_BYTE, 0);
1473*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1474*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1475*35238bceSAndroid Build Coastguard Worker 
1476*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if type is not a type constant.");
1477*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, 0, 0);
1478*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1479*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1480*35238bceSAndroid Build Coastguard Worker 
1481*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if the combination of internalFormat of "
1482*35238bceSAndroid Build Coastguard Worker                                            "the previously specified texture array, format and type is not valid.");
1483*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, 0);
1484*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1485*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
1486*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1487*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
1488*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1489*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
1490*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1491*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0);
1492*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1493*35238bceSAndroid Build Coastguard Worker         if (glu::isContextTypeES(m_context.getRenderContext().getType()))
1494*35238bceSAndroid Build Coastguard Worker         {
1495*35238bceSAndroid Build Coastguard Worker             glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_FLOAT, 0);
1496*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
1497*35238bceSAndroid Build Coastguard Worker         }
1498*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1499*35238bceSAndroid Build Coastguard Worker 
1500*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1501*35238bceSAndroid Build Coastguard Worker     });
1502*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage2d_neg_level, "Invalid glTexSubImage2D() usage", {
1503*35238bceSAndroid Build Coastguard Worker         uint32_t textures[2];
1504*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
1505*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[0]);
1506*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1507*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[1]);
1508*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0););
1509*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1510*35238bceSAndroid Build Coastguard Worker 
1511*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
1512*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1513*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1514*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1515*35238bceSAndroid Build Coastguard Worker 
1516*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
1517*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, {
1518*35238bceSAndroid Build Coastguard Worker             glTexSubImage2D(faceGL, -1, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1519*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_VALUE);
1520*35238bceSAndroid Build Coastguard Worker         });
1521*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1522*35238bceSAndroid Build Coastguard Worker 
1523*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
1524*35238bceSAndroid Build Coastguard Worker     });
1525*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage2d_max_level, "Invalid glTexSubImage2D() usage", {
1526*35238bceSAndroid Build Coastguard Worker         uint32_t textures[2];
1527*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
1528*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[0]);
1529*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1530*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
1531*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0););
1532*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1533*35238bceSAndroid Build Coastguard Worker 
1534*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
1535*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
1536*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
1537*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1538*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1539*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1540*35238bceSAndroid Build Coastguard Worker 
1541*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1542*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
1543*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxCubemapSize =
1544*35238bceSAndroid Build Coastguard Worker             deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
1545*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, {
1546*35238bceSAndroid Build Coastguard Worker             glTexSubImage2D(faceGL, log2MaxCubemapSize, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1547*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_VALUE);
1548*35238bceSAndroid Build Coastguard Worker         });
1549*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1550*35238bceSAndroid Build Coastguard Worker 
1551*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
1552*35238bceSAndroid Build Coastguard Worker     });
1553*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage2d_neg_offset, "Invalid glTexSubImage2D() usage", {
1554*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
1555*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1556*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1557*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1558*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1559*35238bceSAndroid Build Coastguard Worker 
1560*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset or yoffset are negative.");
1561*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1562*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1563*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1564*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1565*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, -1, -1, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1566*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1567*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1568*35238bceSAndroid Build Coastguard Worker 
1569*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1570*35238bceSAndroid Build Coastguard Worker     });
1571*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage2d_invalid_offset, "Invalid glTexSubImage2D() usage", {
1572*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
1573*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1574*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1575*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1576*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1577*35238bceSAndroid Build Coastguard Worker 
1578*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1579*35238bceSAndroid Build Coastguard Worker             "",
1580*35238bceSAndroid Build Coastguard Worker             "GL_INVALID_VALUE is generated if xoffset + width > texture_width or yoffset + height > texture_height.");
1581*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 30, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1582*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1583*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 30, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1584*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1585*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 30, 30, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1586*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1587*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1588*35238bceSAndroid Build Coastguard Worker 
1589*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1590*35238bceSAndroid Build Coastguard Worker     });
1591*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage2d_neg_width_height, "Invalid glTexSubImage2D() usage", {
1592*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
1593*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1594*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1595*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1596*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1597*35238bceSAndroid Build Coastguard Worker 
1598*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1599*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1600*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1601*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1602*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1603*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1604*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1605*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1606*35238bceSAndroid Build Coastguard Worker 
1607*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1608*35238bceSAndroid Build Coastguard Worker     });
1609*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage2d_invalid_buffer_target, "Invalid glTexSubImage2D() usage", {
1610*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
1611*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
1612*35238bceSAndroid Build Coastguard Worker         std::vector<GLubyte> data(64);
1613*35238bceSAndroid Build Coastguard Worker 
1614*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1615*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1616*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1617*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
1618*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
1619*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY);
1620*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1621*35238bceSAndroid Build Coastguard Worker 
1622*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to "
1623*35238bceSAndroid Build Coastguard Worker                                       "the GL_PIXEL_UNPACK_BUFFER target and...");
1624*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the buffer object's data store is currently mapped.");
1625*35238bceSAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 32, GL_MAP_WRITE_BIT);
1626*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1627*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1628*35238bceSAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
1629*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1630*35238bceSAndroid Build Coastguard Worker 
1631*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads "
1632*35238bceSAndroid Build Coastguard Worker                                       "required would exceed the data store size.");
1633*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 32, 32, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1634*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1635*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1636*35238bceSAndroid Build Coastguard Worker 
1637*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...data is not evenly divisible into the number of bytes needed to store in "
1638*35238bceSAndroid Build Coastguard Worker                                       "memory a datum indicated by type.");
1639*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage;
1640*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
1641*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 0);
1642*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
1643*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1644*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, (const GLvoid *)3);
1645*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1646*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1647*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1648*35238bceSAndroid Build Coastguard Worker 
1649*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
1650*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1651*35238bceSAndroid Build Coastguard Worker     });
1652*35238bceSAndroid Build Coastguard Worker 
1653*35238bceSAndroid Build Coastguard Worker     // glTexParameteri
1654*35238bceSAndroid Build Coastguard Worker 
1655*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texparameteri, "Invalid glTexParameteri() usage", {
1656*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1657*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1658*35238bceSAndroid Build Coastguard Worker         glTexParameteri(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1659*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1660*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, 0, GL_LINEAR);
1661*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1662*35238bceSAndroid Build Coastguard Worker         glTexParameteri(0, 0, GL_LINEAR);
1663*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1664*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1665*35238bceSAndroid Build Coastguard Worker 
1666*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant "
1667*35238bceSAndroid Build Coastguard Worker                                       "value (based on the value of pname) and does not.");
1668*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0);
1669*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1670*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT);
1671*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1672*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0);
1673*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1674*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST);
1675*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1676*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1677*35238bceSAndroid Build Coastguard Worker 
1678*35238bceSAndroid Build Coastguard Worker         GLuint texture;
1679*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1680*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1681*35238bceSAndroid Build Coastguard Worker 
1682*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1683*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1684*35238bceSAndroid Build Coastguard Worker         glTexParameteri(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1685*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1686*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, 0, GL_LINEAR);
1687*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1688*35238bceSAndroid Build Coastguard Worker         glTexParameteri(0, 0, GL_LINEAR);
1689*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1690*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1691*35238bceSAndroid Build Coastguard Worker 
1692*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant "
1693*35238bceSAndroid Build Coastguard Worker                                       "value (based on the value of pname) and does not.");
1694*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0);
1695*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1696*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT);
1697*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1698*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0);
1699*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1700*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST);
1701*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1702*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1703*35238bceSAndroid Build Coastguard Worker 
1704*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1705*35238bceSAndroid Build Coastguard Worker     });
1706*35238bceSAndroid Build Coastguard Worker 
1707*35238bceSAndroid Build Coastguard Worker     // glTexParameterf
1708*35238bceSAndroid Build Coastguard Worker 
1709*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texparameterf, "Invalid glTexParameterf() usage", {
1710*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1711*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1712*35238bceSAndroid Build Coastguard Worker         glTexParameterf(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1713*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1714*35238bceSAndroid Build Coastguard Worker         glTexParameterf(GL_TEXTURE_2D, 0, GL_LINEAR);
1715*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1716*35238bceSAndroid Build Coastguard Worker         glTexParameterf(0, 0, GL_LINEAR);
1717*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1718*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1719*35238bceSAndroid Build Coastguard Worker 
1720*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant "
1721*35238bceSAndroid Build Coastguard Worker                                       "value (based on the value of pname) and does not.");
1722*35238bceSAndroid Build Coastguard Worker         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0);
1723*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1724*35238bceSAndroid Build Coastguard Worker         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT);
1725*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1726*35238bceSAndroid Build Coastguard Worker         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0);
1727*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1728*35238bceSAndroid Build Coastguard Worker         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST);
1729*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1730*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1731*35238bceSAndroid Build Coastguard Worker 
1732*35238bceSAndroid Build Coastguard Worker         GLuint texture;
1733*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1734*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1735*35238bceSAndroid Build Coastguard Worker 
1736*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1737*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1738*35238bceSAndroid Build Coastguard Worker         glTexParameterf(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1739*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1740*35238bceSAndroid Build Coastguard Worker         glTexParameterf(GL_TEXTURE_2D, 0, GL_LINEAR);
1741*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1742*35238bceSAndroid Build Coastguard Worker         glTexParameterf(0, 0, GL_LINEAR);
1743*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1744*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1745*35238bceSAndroid Build Coastguard Worker 
1746*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant "
1747*35238bceSAndroid Build Coastguard Worker                                       "value (based on the value of pname) and does not.");
1748*35238bceSAndroid Build Coastguard Worker         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0);
1749*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1750*35238bceSAndroid Build Coastguard Worker         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT);
1751*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1752*35238bceSAndroid Build Coastguard Worker         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0);
1753*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1754*35238bceSAndroid Build Coastguard Worker         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST);
1755*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1756*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1757*35238bceSAndroid Build Coastguard Worker 
1758*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1759*35238bceSAndroid Build Coastguard Worker     });
1760*35238bceSAndroid Build Coastguard Worker 
1761*35238bceSAndroid Build Coastguard Worker     // glTexParameteriv
1762*35238bceSAndroid Build Coastguard Worker 
1763*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texparameteriv, "Invalid glTexParameteriv() usage", {
1764*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1765*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1766*35238bceSAndroid Build Coastguard Worker         GLint params[1] = {GL_LINEAR};
1767*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(0, GL_TEXTURE_MIN_FILTER, &params[0]);
1768*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1769*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(GL_TEXTURE_2D, 0, &params[0]);
1770*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1771*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(0, 0, &params[0]);
1772*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1773*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1774*35238bceSAndroid Build Coastguard Worker 
1775*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant "
1776*35238bceSAndroid Build Coastguard Worker                                       "value (based on the value of pname) and does not.");
1777*35238bceSAndroid Build Coastguard Worker         params[0] = 0;
1778*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &params[0]);
1779*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1780*35238bceSAndroid Build Coastguard Worker         params[0] = GL_REPEAT;
1781*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &params[0]);
1782*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1783*35238bceSAndroid Build Coastguard Worker         params[0] = 0;
1784*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &params[0]);
1785*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1786*35238bceSAndroid Build Coastguard Worker         params[0] = GL_NEAREST;
1787*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &params[0]);
1788*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1789*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1790*35238bceSAndroid Build Coastguard Worker 
1791*35238bceSAndroid Build Coastguard Worker         GLuint texture;
1792*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1793*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1794*35238bceSAndroid Build Coastguard Worker 
1795*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1796*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1797*35238bceSAndroid Build Coastguard Worker         params[0] = GL_LINEAR;
1798*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(0, GL_TEXTURE_MIN_FILTER, &params[0]);
1799*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1800*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(GL_TEXTURE_2D, 0, &params[0]);
1801*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1802*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(0, 0, &params[0]);
1803*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1804*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1805*35238bceSAndroid Build Coastguard Worker 
1806*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant "
1807*35238bceSAndroid Build Coastguard Worker                                       "value (based on the value of pname) and does not.");
1808*35238bceSAndroid Build Coastguard Worker         params[0] = 0;
1809*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &params[0]);
1810*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1811*35238bceSAndroid Build Coastguard Worker         params[0] = GL_REPEAT;
1812*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &params[0]);
1813*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1814*35238bceSAndroid Build Coastguard Worker         params[0] = 0;
1815*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &params[0]);
1816*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1817*35238bceSAndroid Build Coastguard Worker         params[0] = GL_NEAREST;
1818*35238bceSAndroid Build Coastguard Worker         glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &params[0]);
1819*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1820*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1821*35238bceSAndroid Build Coastguard Worker 
1822*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1823*35238bceSAndroid Build Coastguard Worker     });
1824*35238bceSAndroid Build Coastguard Worker 
1825*35238bceSAndroid Build Coastguard Worker     // glTexParameterfv
1826*35238bceSAndroid Build Coastguard Worker 
1827*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texparameterfv, "Invalid glTexParameterfv() usage", {
1828*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1829*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1830*35238bceSAndroid Build Coastguard Worker         GLfloat params[1] = {GL_LINEAR};
1831*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(0, GL_TEXTURE_MIN_FILTER, &params[0]);
1832*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1833*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, 0, &params[0]);
1834*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1835*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(0, 0, &params[0]);
1836*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1837*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1838*35238bceSAndroid Build Coastguard Worker 
1839*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant "
1840*35238bceSAndroid Build Coastguard Worker                                       "value (based on the value of pname) and does not.");
1841*35238bceSAndroid Build Coastguard Worker         params[0] = 0.0f;
1842*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &params[0]);
1843*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1844*35238bceSAndroid Build Coastguard Worker         params[0] = GL_REPEAT;
1845*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &params[0]);
1846*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1847*35238bceSAndroid Build Coastguard Worker         params[0] = 0.0f;
1848*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &params[0]);
1849*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1850*35238bceSAndroid Build Coastguard Worker         params[0] = GL_NEAREST;
1851*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &params[0]);
1852*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1853*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1854*35238bceSAndroid Build Coastguard Worker 
1855*35238bceSAndroid Build Coastguard Worker         GLuint texture;
1856*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1857*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1858*35238bceSAndroid Build Coastguard Worker 
1859*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1860*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1861*35238bceSAndroid Build Coastguard Worker         params[0] = GL_LINEAR;
1862*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(0, GL_TEXTURE_MIN_FILTER, &params[0]);
1863*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1864*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, 0, &params[0]);
1865*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1866*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(0, 0, &params[0]);
1867*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1868*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1869*35238bceSAndroid Build Coastguard Worker 
1870*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant "
1871*35238bceSAndroid Build Coastguard Worker                                       "value (based on the value of pname) and does not.");
1872*35238bceSAndroid Build Coastguard Worker         params[0] = 0.0f;
1873*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &params[0]);
1874*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1875*35238bceSAndroid Build Coastguard Worker         params[0] = GL_REPEAT;
1876*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &params[0]);
1877*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1878*35238bceSAndroid Build Coastguard Worker         params[0] = 0.0f;
1879*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &params[0]);
1880*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1881*35238bceSAndroid Build Coastguard Worker         params[0] = GL_NEAREST;
1882*35238bceSAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &params[0]);
1883*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1884*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1885*35238bceSAndroid Build Coastguard Worker 
1886*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1887*35238bceSAndroid Build Coastguard Worker     });
1888*35238bceSAndroid Build Coastguard Worker 
1889*35238bceSAndroid Build Coastguard Worker     // glCompressedTexSubImage2D
1890*35238bceSAndroid Build Coastguard Worker 
1891*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage2d, "Invalid glCompressedTexSubImage2D() usage", {
1892*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
1893*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGB8_ETC2, 0, 0);
1894*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1895*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1896*35238bceSAndroid Build Coastguard Worker 
1897*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
1898*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1899*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1900*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0);
1901*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1902*35238bceSAndroid Build Coastguard Worker 
1903*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if format does not match the internal format "
1904*35238bceSAndroid Build Coastguard Worker                                       "of the texture image being modified.");
1905*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_COMPRESSED_RGB8_ETC2, 0, 0);
1906*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1907*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1908*35238bceSAndroid Build Coastguard Worker 
1909*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
1910*35238bceSAndroid Build Coastguard Worker                                   "For ETC2/EAC images GL_INVALID_OPERATION is generated if width is not a multiple of "
1911*35238bceSAndroid Build Coastguard Worker                                   "four, and width + xoffset is not equal to the width of the texture level.");
1912*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 4, 0, 10, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(10, 4),
1913*35238bceSAndroid Build Coastguard Worker                                   0);
1914*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1915*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1916*35238bceSAndroid Build Coastguard Worker 
1917*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
1918*35238bceSAndroid Build Coastguard Worker                                   "For ETC2/EAC images GL_INVALID_OPERATION is generated if height is not a multiple "
1919*35238bceSAndroid Build Coastguard Worker                                   "of four, and height + yoffset is not equal to the height of the texture level.");
1920*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 4, 4, 10, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 10),
1921*35238bceSAndroid Build Coastguard Worker                                   0);
1922*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1923*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1924*35238bceSAndroid Build Coastguard Worker 
1925*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1926*35238bceSAndroid Build Coastguard Worker             "",
1927*35238bceSAndroid Build Coastguard Worker             "For ETC2/EAC images GL_INVALID_OPERATION is generated if xoffset or yoffset is not a multiple of four.");
1928*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 1, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
1929*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1930*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 0, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
1931*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1932*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
1933*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1934*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1935*35238bceSAndroid Build Coastguard Worker 
1936*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
1937*35238bceSAndroid Build Coastguard Worker     });
1938*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage2d_neg_level, "Invalid glCompressedTexSubImage2D() usage", {
1939*35238bceSAndroid Build Coastguard Worker         uint32_t textures[2];
1940*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
1941*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[0]);
1942*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0);
1943*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
1944*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, glCompressedTexImage2D(faceGL, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0,
1945*35238bceSAndroid Build Coastguard Worker                                                       etc2EacDataSize(18, 18), 0););
1946*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1947*35238bceSAndroid Build Coastguard Worker 
1948*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
1949*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
1950*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1951*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1952*35238bceSAndroid Build Coastguard Worker 
1953*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
1954*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, {
1955*35238bceSAndroid Build Coastguard Worker             glCompressedTexSubImage2D(faceGL, -1, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
1956*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_VALUE);
1957*35238bceSAndroid Build Coastguard Worker         });
1958*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1959*35238bceSAndroid Build Coastguard Worker 
1960*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
1961*35238bceSAndroid Build Coastguard Worker     });
1962*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage2d_max_level, "Invalid glCompressedTexSubImage2D() usage", {
1963*35238bceSAndroid Build Coastguard Worker         uint32_t textures[2];
1964*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
1965*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[0]);
1966*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0);
1967*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
1968*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, glCompressedTexImage2D(faceGL, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0,
1969*35238bceSAndroid Build Coastguard Worker                                                       etc2EacDataSize(18, 18), 0););
1970*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1971*35238bceSAndroid Build Coastguard Worker 
1972*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
1973*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
1974*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
1975*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
1976*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1977*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1978*35238bceSAndroid Build Coastguard Worker 
1979*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
1980*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
1981*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxCubemapSize =
1982*35238bceSAndroid Build Coastguard Worker             deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
1983*35238bceSAndroid Build Coastguard Worker         FOR_CUBE_FACES(faceGL, {
1984*35238bceSAndroid Build Coastguard Worker             glCompressedTexSubImage2D(faceGL, log2MaxCubemapSize, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
1985*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_VALUE);
1986*35238bceSAndroid Build Coastguard Worker         });
1987*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
1988*35238bceSAndroid Build Coastguard Worker 
1989*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
1990*35238bceSAndroid Build Coastguard Worker     });
1991*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage2d_neg_offset, "Invalid glCompressedTexSubImage2D() usage", {
1992*35238bceSAndroid Build Coastguard Worker         GLuint texture;
1993*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
1994*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1995*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 8, 8, 0, etc2EacDataSize(8, 8), 0);
1996*35238bceSAndroid Build Coastguard Worker 
1997*35238bceSAndroid Build Coastguard Worker         // \note Both GL_INVALID_VALUE and GL_INVALID_OPERATION are valid here since implementation may
1998*35238bceSAndroid Build Coastguard Worker         //         first check if offsets are valid for certain format and only after that check that they
1999*35238bceSAndroid Build Coastguard Worker         //         are not negative.
2000*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2001*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset or yoffset are negative.");
2002*35238bceSAndroid Build Coastguard Worker 
2003*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -4, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2004*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2005*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, -4, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2006*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2007*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -4, -4, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2008*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2009*35238bceSAndroid Build Coastguard Worker 
2010*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2011*35238bceSAndroid Build Coastguard Worker 
2012*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2013*35238bceSAndroid Build Coastguard Worker     });
2014*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage2d_invalid_offset, "Invalid glCompressedTexSubImage2D() usage", {
2015*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2016*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2017*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
2018*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
2019*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2020*35238bceSAndroid Build Coastguard Worker 
2021*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset + width > "
2022*35238bceSAndroid Build Coastguard Worker                                       "texture_width or yoffset + height > texture_height.");
2023*35238bceSAndroid Build Coastguard Worker 
2024*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 12, 0, 8, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(8, 4),
2025*35238bceSAndroid Build Coastguard Worker                                   0);
2026*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2027*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 12, 4, 8, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 8),
2028*35238bceSAndroid Build Coastguard Worker                                   0);
2029*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2030*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 12, 12, 8, 8, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(8, 8),
2031*35238bceSAndroid Build Coastguard Worker                                   0);
2032*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2033*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2034*35238bceSAndroid Build Coastguard Worker 
2035*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2036*35238bceSAndroid Build Coastguard Worker     });
2037*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage2d_neg_width_height, "Invalid glCompressedTexSubImage2D() usage", {
2038*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2039*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2040*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
2041*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
2042*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2043*35238bceSAndroid Build Coastguard Worker 
2044*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2045*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if width or height is less than 0.");
2046*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -4, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2047*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2048*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2049*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2050*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -4, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2051*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2052*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2053*35238bceSAndroid Build Coastguard Worker 
2054*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2055*35238bceSAndroid Build Coastguard Worker     });
2056*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage2d_invalid_size, "Invalid glCompressedTexImage2D() usage", {
2057*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2058*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2059*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
2060*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
2061*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2062*35238bceSAndroid Build Coastguard Worker 
2063*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if imageSize is not consistent with the format, "
2064*35238bceSAndroid Build Coastguard Worker                                       "dimensions, and contents of the specified compressed image data.");
2065*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0);
2066*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2067*35238bceSAndroid Build Coastguard Worker 
2068*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_COMPRESSED_RGBA8_ETC2_EAC, 4 * 4 * 16 - 1, 0);
2069*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2070*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2071*35238bceSAndroid Build Coastguard Worker 
2072*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2073*35238bceSAndroid Build Coastguard Worker     });
2074*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage2d_invalid_buffer_target, "Invalid glCompressedTexSubImage2D() usage", {
2075*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
2076*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2077*35238bceSAndroid Build Coastguard Worker         std::vector<GLubyte> data(128);
2078*35238bceSAndroid Build Coastguard Worker 
2079*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2080*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
2081*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
2082*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
2083*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
2084*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, 128, &data[0], GL_DYNAMIC_COPY);
2085*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2086*35238bceSAndroid Build Coastguard Worker 
2087*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to "
2088*35238bceSAndroid Build Coastguard Worker                                       "the GL_PIXEL_UNPACK_BUFFER target and...");
2089*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the buffer object's data store is currently mapped.");
2090*35238bceSAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 128, GL_MAP_WRITE_BIT);
2091*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
2092*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2093*35238bceSAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
2094*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2095*35238bceSAndroid Build Coastguard Worker 
2096*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads "
2097*35238bceSAndroid Build Coastguard Worker                                       "required would exceed the data store size.");
2098*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(16, 16),
2099*35238bceSAndroid Build Coastguard Worker                                   0);
2100*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2101*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2102*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2103*35238bceSAndroid Build Coastguard Worker 
2104*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
2105*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2106*35238bceSAndroid Build Coastguard Worker     });
2107*35238bceSAndroid Build Coastguard Worker 
2108*35238bceSAndroid Build Coastguard Worker     // glTexImage3D
2109*35238bceSAndroid Build Coastguard Worker 
2110*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage3d, "Invalid glTexImage3D() usage", {
2111*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
2112*35238bceSAndroid Build Coastguard Worker         glTexImage3D(0, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2113*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2114*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2115*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2116*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2117*35238bceSAndroid Build Coastguard Worker 
2118*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if type is not a type constant.");
2119*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, 0, 0);
2120*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2121*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2122*35238bceSAndroid Build Coastguard Worker 
2123*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if format is not an accepted format constant.");
2124*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, 0, GL_UNSIGNED_BYTE, 0);
2125*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2126*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2127*35238bceSAndroid Build Coastguard Worker 
2128*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2129*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if internalFormat is not one of the accepted resolution and format "
2130*35238bceSAndroid Build Coastguard Worker                 "symbolic constants "
2131*35238bceSAndroid Build Coastguard Worker                 "or GL_INVALID_OPERATION is generated if internalformat, format and type are not compatible.");
2132*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, 0, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2133*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2134*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2135*35238bceSAndroid Build Coastguard Worker 
2136*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if target is GL_TEXTURE_3D and format is "
2137*35238bceSAndroid Build Coastguard Worker                                       "GL_DEPTH_COMPONENT, or GL_DEPTH_STENCIL.");
2138*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_DEPTH_STENCIL, 1, 1, 1, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0);
2139*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2140*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_DEPTH_COMPONENT, 1, 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
2141*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2142*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2143*35238bceSAndroid Build Coastguard Worker 
2144*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2145*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if the combination of internalFormat, format and type is invalid.");
2146*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
2147*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2148*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB5_A1, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
2149*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2150*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB10_A2, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_2_10_10_10_REV, 0);
2151*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2152*35238bceSAndroid Build Coastguard Worker         if (glu::isContextTypeES(m_context.getRenderContext().getType()))
2153*35238bceSAndroid Build Coastguard Worker         {
2154*35238bceSAndroid Build Coastguard Worker             glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2155*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
2156*35238bceSAndroid Build Coastguard Worker             glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32UI, 1, 1, 1, 0, GL_RGBA_INTEGER, GL_INT, 0);
2157*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
2158*35238bceSAndroid Build Coastguard Worker         }
2159*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2160*35238bceSAndroid Build Coastguard Worker     });
2161*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage3d_neg_level, "Invalid glTexImage3D() usage", {
2162*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
2163*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, -1, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
2164*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2165*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, -1, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
2166*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2167*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2168*35238bceSAndroid Build Coastguard Worker     });
2169*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage3d_max_level, "Invalid glTexImage3D() usage", {
2170*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2171*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_3D_TEXTURE_SIZE).");
2172*35238bceSAndroid Build Coastguard Worker         uint32_t log2Max3DTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_3D_TEXTURE_SIZE)) + 1;
2173*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, log2Max3DTextureSize, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
2174*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2175*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2176*35238bceSAndroid Build Coastguard Worker 
2177*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
2178*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
2179*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
2180*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
2181*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2182*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2183*35238bceSAndroid Build Coastguard Worker     });
2184*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage3d_neg_width_height_depth, "Invalid glTexImage3D() usage", {
2185*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
2186*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, -1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2187*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2188*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, -1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2189*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2190*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2191*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2192*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, -1, -1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2193*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2194*35238bceSAndroid Build Coastguard Worker 
2195*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, -1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2196*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2197*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, -1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2198*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2199*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, 1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2200*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2201*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, -1, -1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2202*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2203*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2204*35238bceSAndroid Build Coastguard Worker     });
2205*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage3d_max_width_height_depth, "Invalid glTexImage3D() usage", {
2206*35238bceSAndroid Build Coastguard Worker         int max3DTextureSize = m_context.getContextInfo().getInt(GL_MAX_3D_TEXTURE_SIZE) + 1;
2207*35238bceSAndroid Build Coastguard Worker         int maxTextureSize   = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1;
2208*35238bceSAndroid Build Coastguard Worker         int maxTextureLayers = m_context.getContextInfo().getInt(GL_MAX_ARRAY_TEXTURE_LAYERS) + 1;
2209*35238bceSAndroid Build Coastguard Worker 
2210*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2211*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if width, height or depth is greater than GL_MAX_3D_TEXTURE_SIZE.");
2212*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, max3DTextureSize, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2213*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2214*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, max3DTextureSize, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2215*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2216*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, max3DTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2217*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2218*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, max3DTextureSize, max3DTextureSize, max3DTextureSize, 0, GL_RGBA,
2219*35238bceSAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, 0);
2220*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2221*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2222*35238bceSAndroid Build Coastguard Worker 
2223*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2224*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if width, height or depth is greater than GL_MAX_TEXTURE_SIZE.");
2225*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, maxTextureSize, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2226*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2227*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, maxTextureSize, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2228*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2229*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, 1, maxTextureLayers, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2230*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2231*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, maxTextureSize, maxTextureSize, maxTextureLayers, 0, GL_RGBA,
2232*35238bceSAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, 0);
2233*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2234*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2235*35238bceSAndroid Build Coastguard Worker     });
2236*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage3d_invalid_border, "Invalid glTexImage3D() usage", {
2237*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0 or 1.");
2238*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, 0);
2239*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2240*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, 2, GL_RGB, GL_UNSIGNED_BYTE, 0);
2241*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2242*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 1, 1, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, 0);
2243*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2244*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 1, 1, 1, 2, GL_RGB, GL_UNSIGNED_BYTE, 0);
2245*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2246*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2247*35238bceSAndroid Build Coastguard Worker     });
2248*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(teximage3d_invalid_buffer_target, "Invalid glTexImage3D() usage", {
2249*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
2250*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2251*35238bceSAndroid Build Coastguard Worker         std::vector<GLubyte> data(512);
2252*35238bceSAndroid Build Coastguard Worker 
2253*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
2254*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
2255*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, 512, &data[0], GL_DYNAMIC_COPY);
2256*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2257*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
2258*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2259*35238bceSAndroid Build Coastguard Worker 
2260*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to "
2261*35238bceSAndroid Build Coastguard Worker                                       "the GL_PIXEL_UNPACK_BUFFER target and...");
2262*35238bceSAndroid Build Coastguard Worker 
2263*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the buffer object's data store is currently mapped.");
2264*35238bceSAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 128, GL_MAP_WRITE_BIT);
2265*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2266*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2267*35238bceSAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
2268*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2269*35238bceSAndroid Build Coastguard Worker 
2270*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads "
2271*35238bceSAndroid Build Coastguard Worker                                       "required would exceed the data store size.");
2272*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 64, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2273*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2274*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2275*35238bceSAndroid Build Coastguard Worker 
2276*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...data is not evenly divisible into the number of bytes needed to store in "
2277*35238bceSAndroid Build Coastguard Worker                                       "memory a datum indicated by type.");
2278*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage;
2279*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB5_A1, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, (const GLvoid *)3);
2280*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2281*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2282*35238bceSAndroid Build Coastguard Worker 
2283*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2284*35238bceSAndroid Build Coastguard Worker 
2285*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
2286*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2287*35238bceSAndroid Build Coastguard Worker     });
2288*35238bceSAndroid Build Coastguard Worker 
2289*35238bceSAndroid Build Coastguard Worker     // glTexSubImage3D
2290*35238bceSAndroid Build Coastguard Worker 
2291*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage3d, "Invalid glTexSubImage3D() usage", {
2292*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2293*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2294*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
2295*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2296*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2297*35238bceSAndroid Build Coastguard Worker 
2298*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
2299*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(0, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2300*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2301*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_2D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2302*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2303*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2304*35238bceSAndroid Build Coastguard Worker 
2305*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if format is not an accepted format constant.");
2306*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 4, 4, 4, GL_UNSIGNED_BYTE, 0);
2307*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2308*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2309*35238bceSAndroid Build Coastguard Worker 
2310*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if type is not a type constant.");
2311*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, 0, 0);
2312*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2313*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2314*35238bceSAndroid Build Coastguard Worker 
2315*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if the combination of internalFormat of "
2316*35238bceSAndroid Build Coastguard Worker                                            "the previously specified texture array, format and type is not valid.");
2317*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
2318*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2319*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
2320*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2321*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
2322*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2323*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0);
2324*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2325*35238bceSAndroid Build Coastguard Worker         if (glu::isContextTypeES(m_context.getRenderContext().getType()))
2326*35238bceSAndroid Build Coastguard Worker         {
2327*35238bceSAndroid Build Coastguard Worker             glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_FLOAT, 0);
2328*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
2329*35238bceSAndroid Build Coastguard Worker         }
2330*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
2331*35238bceSAndroid Build Coastguard Worker 
2332*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2333*35238bceSAndroid Build Coastguard Worker     });
2334*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage3d_neg_level, "Invalid glTexSubImage3D() usage", {
2335*35238bceSAndroid Build Coastguard Worker         uint32_t textures[2];
2336*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
2337*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, textures[0]);
2338*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2339*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, textures[1]);
2340*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2341*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2342*35238bceSAndroid Build Coastguard Worker 
2343*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
2344*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, -1, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2345*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2346*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2347*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2348*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2349*35238bceSAndroid Build Coastguard Worker 
2350*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
2351*35238bceSAndroid Build Coastguard Worker     });
2352*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage3d_max_level, "Invalid glTexSubImage3D() usage", {
2353*35238bceSAndroid Build Coastguard Worker         uint32_t textures[2];
2354*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
2355*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, textures[0]);
2356*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2357*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, textures[1]);
2358*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2359*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2360*35238bceSAndroid Build Coastguard Worker 
2361*35238bceSAndroid Build Coastguard Worker         uint32_t log2Max3DTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_3D_TEXTURE_SIZE)) + 1;
2362*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize   = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
2363*35238bceSAndroid Build Coastguard Worker 
2364*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2365*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_3D_TEXTURE_SIZE).");
2366*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, log2Max3DTextureSize, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2367*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2368*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2369*35238bceSAndroid Build Coastguard Worker 
2370*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
2371*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
2372*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2373*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2374*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2375*35238bceSAndroid Build Coastguard Worker 
2376*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
2377*35238bceSAndroid Build Coastguard Worker     });
2378*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage3d_neg_offset, "Invalid glTexSubImage3D() usage", {
2379*35238bceSAndroid Build Coastguard Worker         uint32_t textures[2];
2380*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
2381*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, textures[0]);
2382*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2383*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, textures[1]);
2384*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2385*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2386*35238bceSAndroid Build Coastguard Worker 
2387*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset, yoffset or zoffset are negative.");
2388*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, -1, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2389*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2390*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2391*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2392*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2393*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2394*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, -1, -1, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2395*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2396*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2397*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2398*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2399*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2400*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2401*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2402*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, -1, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2403*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2404*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2405*35238bceSAndroid Build Coastguard Worker 
2406*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
2407*35238bceSAndroid Build Coastguard Worker     });
2408*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage3d_invalid_offset, "Invalid glTexSubImage3D() usage", {
2409*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2410*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2411*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
2412*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2413*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2414*35238bceSAndroid Build Coastguard Worker 
2415*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset + width > texture_width.");
2416*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 2, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2417*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2418*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2419*35238bceSAndroid Build Coastguard Worker 
2420*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if yoffset + height > texture_height.");
2421*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 2, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2422*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2423*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2424*35238bceSAndroid Build Coastguard Worker 
2425*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if zoffset + depth > texture_depth.");
2426*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 2, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2427*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2428*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2429*35238bceSAndroid Build Coastguard Worker 
2430*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2431*35238bceSAndroid Build Coastguard Worker     });
2432*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage3d_neg_width_height, "Invalid glTexSubImage3D() usage", {
2433*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width, height or depth is less than 0.");
2434*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, -1, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2435*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2436*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2437*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2438*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2439*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2440*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, -1, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2441*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2442*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2443*35238bceSAndroid Build Coastguard Worker     });
2444*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texsubimage3d_invalid_buffer_target, "Invalid glTexSubImage3D() usage", {
2445*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
2446*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2447*35238bceSAndroid Build Coastguard Worker         std::vector<GLubyte> data(512);
2448*35238bceSAndroid Build Coastguard Worker 
2449*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2450*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
2451*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 16, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2452*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
2453*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
2454*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, 512, &data[0], GL_DYNAMIC_COPY);
2455*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2456*35238bceSAndroid Build Coastguard Worker 
2457*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to "
2458*35238bceSAndroid Build Coastguard Worker                                       "the GL_PIXEL_UNPACK_BUFFER target and...");
2459*35238bceSAndroid Build Coastguard Worker 
2460*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the buffer object's data store is currently mapped.");
2461*35238bceSAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 512, GL_MAP_WRITE_BIT);
2462*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2463*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2464*35238bceSAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
2465*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2466*35238bceSAndroid Build Coastguard Worker 
2467*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads "
2468*35238bceSAndroid Build Coastguard Worker                                       "required would exceed the data store size.");
2469*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 16, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2470*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2471*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2472*35238bceSAndroid Build Coastguard Worker 
2473*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...data is not evenly divisible into the number of bytes needed to store in "
2474*35238bceSAndroid Build Coastguard Worker                                       "memory a datum indicated by type.");
2475*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage;
2476*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
2477*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA4, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 0);
2478*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
2479*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2480*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, (const GLvoid *)3);
2481*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2482*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2483*35238bceSAndroid Build Coastguard Worker 
2484*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2485*35238bceSAndroid Build Coastguard Worker 
2486*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
2487*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2488*35238bceSAndroid Build Coastguard Worker     });
2489*35238bceSAndroid Build Coastguard Worker 
2490*35238bceSAndroid Build Coastguard Worker     // glCopyTexSubImage3D
2491*35238bceSAndroid Build Coastguard Worker 
2492*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage3d, "Invalid glCopyTexSubImage3D() usage", {
2493*35238bceSAndroid Build Coastguard Worker         GLuint texture;
2494*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2495*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
2496*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2497*35238bceSAndroid Build Coastguard Worker 
2498*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
2499*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(0, 0, 0, 0, 0, 0, 0, 4, 4);
2500*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2501*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2502*35238bceSAndroid Build Coastguard Worker 
2503*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2504*35238bceSAndroid Build Coastguard Worker     });
2505*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage3d_neg_level, "Invalid glCopyTexSubImage3D() usage", {
2506*35238bceSAndroid Build Coastguard Worker         uint32_t textures[2];
2507*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
2508*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, textures[0]);
2509*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2510*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, textures[1]);
2511*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2512*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2513*35238bceSAndroid Build Coastguard Worker 
2514*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
2515*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, -1, 0, 0, 0, 0, 0, 4, 4);
2516*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2517*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 4, 4);
2518*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2519*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2520*35238bceSAndroid Build Coastguard Worker 
2521*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
2522*35238bceSAndroid Build Coastguard Worker     });
2523*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage3d_max_level, "Invalid glCopyTexSubImage3D() usage", {
2524*35238bceSAndroid Build Coastguard Worker         uint32_t log2Max3DTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_3D_TEXTURE_SIZE)) + 1;
2525*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize   = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
2526*35238bceSAndroid Build Coastguard Worker 
2527*35238bceSAndroid Build Coastguard Worker         uint32_t textures[2];
2528*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, &textures[0]);
2529*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, textures[0]);
2530*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2531*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, textures[1]);
2532*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2533*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2534*35238bceSAndroid Build Coastguard Worker 
2535*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2536*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_3D_TEXTURE_SIZE).");
2537*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, log2Max3DTextureSize, 0, 0, 0, 0, 0, 4, 4);
2538*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2539*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2540*35238bceSAndroid Build Coastguard Worker 
2541*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
2542*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
2543*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, 0, 0, 0, 0, 0, 4, 4);
2544*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2545*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2546*35238bceSAndroid Build Coastguard Worker 
2547*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, &textures[0]);
2548*35238bceSAndroid Build Coastguard Worker     });
2549*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage3d_neg_offset, "Invalid glCopyTexSubImage3D() usage", {
2550*35238bceSAndroid Build Coastguard Worker         GLuint texture;
2551*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2552*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
2553*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2554*35238bceSAndroid Build Coastguard Worker 
2555*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset, yoffset or zoffset is negative.");
2556*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, 0, -1, 0, 0, 0, 0, 4, 4);
2557*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2558*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, -1, 0, 0, 0, 4, 4);
2559*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2560*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, -1, 0, 0, 4, 4);
2561*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2562*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, 0, -1, -1, -1, 0, 0, 4, 4);
2563*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2564*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2565*35238bceSAndroid Build Coastguard Worker 
2566*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2567*35238bceSAndroid Build Coastguard Worker     });
2568*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage3d_invalid_offset, "Invalid glCopyTexSubImage3D() usage", {
2569*35238bceSAndroid Build Coastguard Worker         GLuint texture;
2570*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2571*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
2572*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2573*35238bceSAndroid Build Coastguard Worker 
2574*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset + width > texture_width.");
2575*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 1, 0, 0, 0, 0, 4, 4);
2576*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2577*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2578*35238bceSAndroid Build Coastguard Worker 
2579*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if yoffset + height > texture_height.");
2580*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 1, 0, 0, 0, 4, 4);
2581*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2582*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2583*35238bceSAndroid Build Coastguard Worker 
2584*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if zoffset + 1 > texture_depth.");
2585*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 4, 0, 0, 4, 4);
2586*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2587*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2588*35238bceSAndroid Build Coastguard Worker 
2589*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2590*35238bceSAndroid Build Coastguard Worker     });
2591*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage3d_neg_width_height, "Invalid glCopyTexSubImage3D() usage", {
2592*35238bceSAndroid Build Coastguard Worker         GLuint texture;
2593*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2594*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
2595*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2596*35238bceSAndroid Build Coastguard Worker 
2597*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width < 0.");
2598*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, -4, 4);
2599*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2600*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2601*35238bceSAndroid Build Coastguard Worker 
2602*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if height < 0.");
2603*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 4, -4);
2604*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2605*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2606*35238bceSAndroid Build Coastguard Worker 
2607*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2608*35238bceSAndroid Build Coastguard Worker     });
2609*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(copytexsubimage3d_incomplete_framebuffer, "Invalid glCopyTexSubImage3D() usage", {
2610*35238bceSAndroid Build Coastguard Worker         GLuint fbo;
2611*35238bceSAndroid Build Coastguard Worker         GLuint texture[2];
2612*35238bceSAndroid Build Coastguard Worker 
2613*35238bceSAndroid Build Coastguard Worker         glGenTextures(2, texture);
2614*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture[0]);
2615*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2616*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture[1]);
2617*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2618*35238bceSAndroid Build Coastguard Worker         glGenFramebuffers(1, &fbo);
2619*35238bceSAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
2620*35238bceSAndroid Build Coastguard Worker         glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
2621*35238bceSAndroid Build Coastguard Worker 
2622*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound "
2623*35238bceSAndroid Build Coastguard Worker                                            "framebuffer is not framebuffer complete.");
2624*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 4, 4);
2625*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
2626*35238bceSAndroid Build Coastguard Worker         glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 4, 4);
2627*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
2628*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
2629*35238bceSAndroid Build Coastguard Worker 
2630*35238bceSAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
2631*35238bceSAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &fbo);
2632*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(2, texture);
2633*35238bceSAndroid Build Coastguard Worker     });
2634*35238bceSAndroid Build Coastguard Worker 
2635*35238bceSAndroid Build Coastguard Worker     // glCompressedTexImage3D
2636*35238bceSAndroid Build Coastguard Worker 
2637*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage3d, "Invalid glCompressedTexImage3D() usage", {
2638*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
2639*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0);
2640*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2641*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0);
2642*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2643*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2644*35238bceSAndroid Build Coastguard Worker 
2645*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2646*35238bceSAndroid Build Coastguard Worker             "",
2647*35238bceSAndroid Build Coastguard Worker             "GL_INVALID_ENUM is generated if internalformat is not one of the specific compressed internal formats.");
2648*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 0, 0);
2649*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2650*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 0, 0, 0, 0, 0, 0);
2651*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2652*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2653*35238bceSAndroid Build Coastguard Worker     });
2654*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage3d_neg_level, "Invalid glCompressedTexImage3D() usage", {
2655*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
2656*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0);
2657*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2658*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2659*35238bceSAndroid Build Coastguard Worker     });
2660*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage3d_max_level, "Invalid glCompressedTexImage3D() usage", {
2661*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
2662*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
2663*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
2664*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0);
2665*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2666*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2667*35238bceSAndroid Build Coastguard Worker     });
2668*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage3d_neg_width_height_depth, "Invalid glCompressedTexImage3D() usage", {
2669*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width, height or depth is less than 0.");
2670*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0, 0);
2671*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2672*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0, 0);
2673*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2674*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0, 0);
2675*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2676*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, -1, 0, 0, 0);
2677*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2678*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2679*35238bceSAndroid Build Coastguard Worker     });
2680*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage3d_max_width_height_depth, "Invalid glCompressedTexImage3D() usage", {
2681*35238bceSAndroid Build Coastguard Worker         int maxTextureSize   = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1;
2682*35238bceSAndroid Build Coastguard Worker         int maxTextureLayers = m_context.getContextInfo().getInt(GL_MAX_ARRAY_TEXTURE_LAYERS) + 1;
2683*35238bceSAndroid Build Coastguard Worker 
2684*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2685*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if width, height or depth is greater than GL_MAX_TEXTURE_SIZE.");
2686*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, 0, 0, 0, 0, 0);
2687*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2688*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, maxTextureSize, 0, 0, 0, 0);
2689*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2690*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, maxTextureLayers, 0, 0, 0);
2691*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2692*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, maxTextureSize,
2693*35238bceSAndroid Build Coastguard Worker                                maxTextureLayers, 0, 0, 0);
2694*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2695*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2696*35238bceSAndroid Build Coastguard Worker     });
2697*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage3d_invalid_border, "Invalid glCompressedTexImage3D() usage", {
2698*35238bceSAndroid Build Coastguard Worker         bool isES    = glu::isContextTypeES(m_context.getRenderContext().getType());
2699*35238bceSAndroid Build Coastguard Worker         GLenum error = isES ? GL_INVALID_VALUE : GL_INVALID_OPERATION;
2700*35238bceSAndroid Build Coastguard Worker 
2701*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
2702*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, -1, 0, 0);
2703*35238bceSAndroid Build Coastguard Worker         expectError(error);
2704*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 1, 0, 0);
2705*35238bceSAndroid Build Coastguard Worker         expectError(error);
2706*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2707*35238bceSAndroid Build Coastguard Worker     });
2708*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage3d_invalid_size, "Invalid glCompressedTexImage3D() usage", {
2709*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if imageSize is not consistent with the format, "
2710*35238bceSAndroid Build Coastguard Worker                                       "dimensions, and contents of the specified compressed image data.");
2711*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, -1, 0);
2712*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2713*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, 4 * 4 * 8, 0);
2714*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2715*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 1, 0, 4 * 4 * 16, 0);
2716*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2717*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_SIGNED_R11_EAC, 16, 16, 1, 0, 4 * 4 * 16, 0);
2718*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2719*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2720*35238bceSAndroid Build Coastguard Worker     });
2721*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage3d_invalid_buffer_target, "Invalid glCompressedTexImage3D() usage", {
2722*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
2723*35238bceSAndroid Build Coastguard Worker         std::vector<GLubyte> data(512);
2724*35238bceSAndroid Build Coastguard Worker 
2725*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
2726*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
2727*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY);
2728*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2729*35238bceSAndroid Build Coastguard Worker 
2730*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2731*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the "
2732*35238bceSAndroid Build Coastguard Worker                 "GL_PIXEL_UNPACK_BUFFER target and the buffer object's data store is currently mapped.");
2733*35238bceSAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 64, GL_MAP_WRITE_BIT);
2734*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGB8_ETC2, 4, 4, 1, 0, etc2DataSize(4, 4), 0);
2735*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2736*35238bceSAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
2737*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2738*35238bceSAndroid Build Coastguard Worker 
2739*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
2740*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the "
2741*35238bceSAndroid Build Coastguard Worker                                   "GL_PIXEL_UNPACK_BUFFER target and the data would be unpacked from the buffer object "
2742*35238bceSAndroid Build Coastguard Worker                                   "such that the memory reads required would exceed the data store size.");
2743*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 1, 0, etc2DataSize(16, 16), 0);
2744*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2745*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2746*35238bceSAndroid Build Coastguard Worker 
2747*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
2748*35238bceSAndroid Build Coastguard Worker     });
2749*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedteximage3d_invalid_astc_target, "Invalid glCompressedTexImage3D() ASTC 3D targets", {
2750*35238bceSAndroid Build Coastguard Worker         // GLES 3.0.4, Sec 3.8.6, p.147: For example, the
2751*35238bceSAndroid Build Coastguard Worker         // compressed image format might be supported only for 2D
2752*35238bceSAndroid Build Coastguard Worker         // textures ... result in an INVALID_OPERATION error.
2753*35238bceSAndroid Build Coastguard Worker         // Also, if LDR is supported, formats cannot be invalid enums
2754*35238bceSAndroid Build Coastguard Worker 
2755*35238bceSAndroid Build Coastguard Worker         if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_sliced_3d") ||
2756*35238bceSAndroid Build Coastguard Worker             m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_hdr") ||
2757*35238bceSAndroid Build Coastguard Worker             m_context.getContextInfo().isExtensionSupported("GL_OES_texture_compression_astc"))
2758*35238bceSAndroid Build Coastguard Worker         {
2759*35238bceSAndroid Build Coastguard Worker             m_log.writeMessage("Full ASTC supported. No negative API requirements.");
2760*35238bceSAndroid Build Coastguard Worker         }
2761*35238bceSAndroid Build Coastguard Worker         else
2762*35238bceSAndroid Build Coastguard Worker         {
2763*35238bceSAndroid Build Coastguard Worker             const GLuint requiredError =
2764*35238bceSAndroid Build Coastguard Worker                 m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_ldr") ?
2765*35238bceSAndroid Build Coastguard Worker                     GL_INVALID_OPERATION :
2766*35238bceSAndroid Build Coastguard Worker                     GL_INVALID_ENUM;
2767*35238bceSAndroid Build Coastguard Worker 
2768*35238bceSAndroid Build Coastguard Worker             if (requiredError == GL_INVALID_OPERATION)
2769*35238bceSAndroid Build Coastguard Worker                 m_log.writeMessage("GL_INVALID_OPERATION should be generated if using TEXTURE_3D with LDR ASTC.");
2770*35238bceSAndroid Build Coastguard Worker             else
2771*35238bceSAndroid Build Coastguard Worker                 m_log.writeMessage("GL_INVALID_ENUM should be generated if no ASTC extensions are present.");
2772*35238bceSAndroid Build Coastguard Worker 
2773*35238bceSAndroid Build Coastguard Worker             for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_astcFormats); formatNdx++)
2774*35238bceSAndroid Build Coastguard Worker             {
2775*35238bceSAndroid Build Coastguard Worker                 const GLuint format                 = s_astcFormats[formatNdx];
2776*35238bceSAndroid Build Coastguard Worker                 const CompressedTexFormat tcuFormat = mapGLCompressedTexFormat(format);
2777*35238bceSAndroid Build Coastguard Worker                 const IVec3 blockPixels             = getBlockPixelSize(tcuFormat);
2778*35238bceSAndroid Build Coastguard Worker                 const size_t blockBytes             = getBlockSize(tcuFormat);
2779*35238bceSAndroid Build Coastguard Worker                 const vector<uint8_t> unusedData(blockBytes);
2780*35238bceSAndroid Build Coastguard Worker 
2781*35238bceSAndroid Build Coastguard Worker                 glCompressedTexImage3D(GL_TEXTURE_3D, 0, format, blockPixels.x(), blockPixels.y(), blockPixels.z(), 0,
2782*35238bceSAndroid Build Coastguard Worker                                        (int)blockBytes, &unusedData[0]);
2783*35238bceSAndroid Build Coastguard Worker                 expectError(requiredError);
2784*35238bceSAndroid Build Coastguard Worker             }
2785*35238bceSAndroid Build Coastguard Worker         }
2786*35238bceSAndroid Build Coastguard Worker     });
2787*35238bceSAndroid Build Coastguard Worker 
2788*35238bceSAndroid Build Coastguard Worker     // glCompressedTexSubImage3D
2789*35238bceSAndroid Build Coastguard Worker 
2790*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage3d, "Invalid glCompressedTexSubImage3D() usage", {
2791*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
2792*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(0, 0, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2793*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
2794*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2795*35238bceSAndroid Build Coastguard Worker 
2796*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2797*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2798*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
2799*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 1, 0,
2800*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(18, 18), 0);
2801*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2802*35238bceSAndroid Build Coastguard Worker 
2803*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if format does not match the internal format "
2804*35238bceSAndroid Build Coastguard Worker                                       "of the texture image being modified.");
2805*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGB8_ETC2, 0, 0);
2806*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2807*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2808*35238bceSAndroid Build Coastguard Worker 
2809*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if internalformat is an ETC2/EAC format and "
2810*35238bceSAndroid Build Coastguard Worker                                       "target is not GL_TEXTURE_2D_ARRAY.");
2811*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 18, 18, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2812*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(18, 18), 0);
2813*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2814*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2815*35238bceSAndroid Build Coastguard Worker 
2816*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
2817*35238bceSAndroid Build Coastguard Worker                                   "For ETC2/EAC images GL_INVALID_OPERATION is generated if width is not a multiple of "
2818*35238bceSAndroid Build Coastguard Worker                                   "four, and width + xoffset is not equal to the width of the texture level.");
2819*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 4, 0, 0, 10, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2820*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(10, 4), 0);
2821*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2822*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2823*35238bceSAndroid Build Coastguard Worker 
2824*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
2825*35238bceSAndroid Build Coastguard Worker                                   "For ETC2/EAC images GL_INVALID_OPERATION is generated if height is not a multiple "
2826*35238bceSAndroid Build Coastguard Worker                                   "of four, and height + yoffset is not equal to the height of the texture level.");
2827*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 4, 0, 4, 10, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2828*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(4, 10), 0);
2829*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2830*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2831*35238bceSAndroid Build Coastguard Worker 
2832*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2833*35238bceSAndroid Build Coastguard Worker             "",
2834*35238bceSAndroid Build Coastguard Worker             "For ETC2/EAC images GL_INVALID_OPERATION is generated if xoffset or yoffset is not a multiple of four.");
2835*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 1, 0, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2836*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(4, 4), 0);
2837*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2838*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 1, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2839*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(4, 4), 0);
2840*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2841*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 1, 1, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2842*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(4, 4), 0);
2843*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2844*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2845*35238bceSAndroid Build Coastguard Worker 
2846*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2847*35238bceSAndroid Build Coastguard Worker     });
2848*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage3d_neg_level, "Invalid glCompressedTexSubImage3D() usage", {
2849*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2850*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2851*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
2852*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0,
2853*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(16, 16), 0);
2854*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2855*35238bceSAndroid Build Coastguard Worker 
2856*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
2857*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2858*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2859*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2860*35238bceSAndroid Build Coastguard Worker 
2861*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2862*35238bceSAndroid Build Coastguard Worker     });
2863*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage3d_max_level, "Invalid glCompressedTexSubImage3D() usage", {
2864*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2865*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2866*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
2867*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0,
2868*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(16, 16), 0);
2869*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2870*35238bceSAndroid Build Coastguard Worker 
2871*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
2872*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
2873*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
2874*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, 0, 0, 0, 0, 0, 0,
2875*35238bceSAndroid Build Coastguard Worker                                   GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2876*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2877*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2878*35238bceSAndroid Build Coastguard Worker 
2879*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2880*35238bceSAndroid Build Coastguard Worker     });
2881*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage3d_neg_offset, "Invalid glCompressedTexSubImage3D() usage", {
2882*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2883*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2884*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
2885*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0,
2886*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(16, 16), 0);
2887*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2888*35238bceSAndroid Build Coastguard Worker 
2889*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2890*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset, yoffset or zoffset are negative.");
2891*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -4, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2892*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2893*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, -4, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2894*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2895*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, -4, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2896*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2897*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -4, -4, -4, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2898*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2899*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2900*35238bceSAndroid Build Coastguard Worker 
2901*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2902*35238bceSAndroid Build Coastguard Worker     });
2903*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage3d_invalid_offset, "Invalid glCompressedTexSubImage3D() usage", {
2904*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2905*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2906*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
2907*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 4, 4, 1, 0, etc2EacDataSize(4, 4),
2908*35238bceSAndroid Build Coastguard Worker                                0);
2909*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2910*35238bceSAndroid Build Coastguard Worker 
2911*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset + width > "
2912*35238bceSAndroid Build Coastguard Worker                                       "texture_width or yoffset + height > texture_height.");
2913*35238bceSAndroid Build Coastguard Worker 
2914*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 12, 0, 0, 8, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2915*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(8, 4), 0);
2916*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2917*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 12, 0, 4, 8, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2918*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(4, 8), 0);
2919*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2920*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 12, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2921*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(4, 4), 0);
2922*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2923*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 12, 12, 12, 8, 8, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2924*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(8, 8), 0);
2925*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2926*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2927*35238bceSAndroid Build Coastguard Worker 
2928*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2929*35238bceSAndroid Build Coastguard Worker     });
2930*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage3d_neg_width_height_depth, "Invalid glCompressedTexSubImage3D() usage", {
2931*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2932*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2933*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
2934*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0,
2935*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(16, 16), 0);
2936*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2937*35238bceSAndroid Build Coastguard Worker 
2938*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
2939*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if width, height or depth are negative.");
2940*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, -4, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2941*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2942*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, -4, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2943*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2944*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2945*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2946*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, -4, -4, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2947*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2948*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2949*35238bceSAndroid Build Coastguard Worker 
2950*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2951*35238bceSAndroid Build Coastguard Worker     });
2952*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage3d_invalid_size, "Invalid glCompressedTexSubImage3D() usage", {
2953*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2954*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2955*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
2956*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, 4 * 4 * 16, 0);
2957*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2958*35238bceSAndroid Build Coastguard Worker 
2959*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if imageSize is not consistent with the format, "
2960*35238bceSAndroid Build Coastguard Worker                                       "dimensions, and contents of the specified compressed image data.");
2961*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 16, 16, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0);
2962*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2963*35238bceSAndroid Build Coastguard Worker 
2964*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 16, 16, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2965*35238bceSAndroid Build Coastguard Worker                                   4 * 4 * 16 - 1, 0);
2966*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2967*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2968*35238bceSAndroid Build Coastguard Worker 
2969*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
2970*35238bceSAndroid Build Coastguard Worker     });
2971*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compressedtexsubimage3d_invalid_buffer_target, "Invalid glCompressedTexSubImage3D() usage", {
2972*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
2973*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
2974*35238bceSAndroid Build Coastguard Worker         GLsizei bufferSize = etc2EacDataSize(4, 4);
2975*35238bceSAndroid Build Coastguard Worker         std::vector<GLubyte> data(bufferSize);
2976*35238bceSAndroid Build Coastguard Worker 
2977*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
2978*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
2979*35238bceSAndroid Build Coastguard Worker         glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0,
2980*35238bceSAndroid Build Coastguard Worker                                etc2EacDataSize(16, 16), 0);
2981*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
2982*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
2983*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, bufferSize, &data[0], GL_DYNAMIC_COPY);
2984*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2985*35238bceSAndroid Build Coastguard Worker 
2986*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to "
2987*35238bceSAndroid Build Coastguard Worker                                       "the GL_PIXEL_UNPACK_BUFFER target and...");
2988*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the buffer object's data store is currently mapped.");
2989*35238bceSAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, bufferSize, GL_MAP_WRITE_BIT);
2990*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2991*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(4, 4), 0);
2992*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
2993*35238bceSAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
2994*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
2995*35238bceSAndroid Build Coastguard Worker 
2996*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads "
2997*35238bceSAndroid Build Coastguard Worker                                       "required would exceed the data store size.");
2998*35238bceSAndroid Build Coastguard Worker         glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 16, 16, 1, GL_COMPRESSED_RGBA8_ETC2_EAC,
2999*35238bceSAndroid Build Coastguard Worker                                   etc2EacDataSize(16, 16), 0);
3000*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3001*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3002*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3003*35238bceSAndroid Build Coastguard Worker 
3004*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
3005*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
3006*35238bceSAndroid Build Coastguard Worker     });
3007*35238bceSAndroid Build Coastguard Worker 
3008*35238bceSAndroid Build Coastguard Worker     // glTexStorage2D
3009*35238bceSAndroid Build Coastguard Worker 
3010*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texstorage2d, "Invalid glTexStorage2D() usage", {
3011*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
3012*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
3013*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
3014*35238bceSAndroid Build Coastguard Worker 
3015*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
3016*35238bceSAndroid Build Coastguard Worker             "",
3017*35238bceSAndroid Build Coastguard Worker             "GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not a valid sized internal format.");
3018*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, 0, 16, 16);
3019*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3020*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA_INTEGER, 16, 16);
3021*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3022*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3023*35238bceSAndroid Build Coastguard Worker 
3024*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
3025*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target is not one of the accepted target enumerants.");
3026*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(0, 1, GL_RGBA8, 16, 16);
3027*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
3028*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_3D, 1, GL_RGBA8, 16, 16);
3029*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
3030*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 16, 16);
3031*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
3032*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3033*35238bceSAndroid Build Coastguard Worker 
3034*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height are less than 1.");
3035*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 0, 16);
3036*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3037*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 0);
3038*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3039*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 0, 0);
3040*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3041*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3042*35238bceSAndroid Build Coastguard Worker 
3043*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
3044*35238bceSAndroid Build Coastguard Worker     });
3045*35238bceSAndroid Build Coastguard Worker 
3046*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texstorage2d_invalid_binding, "Invalid glTexStorage2D() usage", {
3047*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, 0);
3048*35238bceSAndroid Build Coastguard Worker 
3049*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
3050*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if the default texture object is curently bound to target.");
3051*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
3052*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3053*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3054*35238bceSAndroid Build Coastguard Worker 
3055*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
3056*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
3057*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
3058*35238bceSAndroid Build Coastguard Worker 
3059*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the texture object currently bound to "
3060*35238bceSAndroid Build Coastguard Worker                                       "target already has GL_TEXTURE_IMMUTABLE_FORMAT set to GL_TRUE.");
3061*35238bceSAndroid Build Coastguard Worker         int32_t immutable = -1;
3062*35238bceSAndroid Build Coastguard Worker         glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3063*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE")
3064*35238bceSAndroid Build Coastguard Worker               << TestLog::EndMessage;
3065*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
3066*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
3067*35238bceSAndroid Build Coastguard Worker         glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3068*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE")
3069*35238bceSAndroid Build Coastguard Worker               << TestLog::EndMessage;
3070*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
3071*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3072*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3073*35238bceSAndroid Build Coastguard Worker 
3074*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
3075*35238bceSAndroid Build Coastguard Worker     });
3076*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texstorage2d_invalid_levels, "Invalid glTexStorage2D() usage", {
3077*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
3078*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
3079*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
3080*35238bceSAndroid Build Coastguard Worker 
3081*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if levels is less than 1.");
3082*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 16, 16);
3083*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3084*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0);
3085*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3086*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3087*35238bceSAndroid Build Coastguard Worker 
3088*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
3089*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if levels is greater than floor(log_2(max(width, height))) + 1");
3090*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxSize = deLog2Floor32(deMax32(16, 4)) + 1 + 1;
3091*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, log2MaxSize, GL_RGBA8, 16, 4);
3092*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3093*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, log2MaxSize, GL_RGBA8, 4, 16);
3094*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3095*35238bceSAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, log2MaxSize, GL_RGBA8, 16, 16);
3096*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3097*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3098*35238bceSAndroid Build Coastguard Worker 
3099*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
3100*35238bceSAndroid Build Coastguard Worker     });
3101*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texstorage2d_invalid_astc_target, "ASTC formats require extensions present.", {
3102*35238bceSAndroid Build Coastguard Worker         // GLES 3.0.4, Sec 3.8.4, p.136: If there is no imageSize
3103*35238bceSAndroid Build Coastguard Worker         // for which this command would have been valid, an
3104*35238bceSAndroid Build Coastguard Worker         // INVALID_OPERATION error is generated. Also: If
3105*35238bceSAndroid Build Coastguard Worker         // executing the pseudo-code would result in any other
3106*35238bceSAndroid Build Coastguard Worker         // error, the error is generated and the command will have
3107*35238bceSAndroid Build Coastguard Worker         // no effect.
3108*35238bceSAndroid Build Coastguard Worker         // In conclusion: Expect same errors as with TexImage?D
3109*35238bceSAndroid Build Coastguard Worker 
3110*35238bceSAndroid Build Coastguard Worker         if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
3111*35238bceSAndroid Build Coastguard Worker         {
3112*35238bceSAndroid Build Coastguard Worker             m_log.writeMessage("ASTC supported. No negative API requirements.");
3113*35238bceSAndroid Build Coastguard Worker         }
3114*35238bceSAndroid Build Coastguard Worker         else
3115*35238bceSAndroid Build Coastguard Worker         {
3116*35238bceSAndroid Build Coastguard Worker             // In earlier tests both codes are accepted for invalid target format.
3117*35238bceSAndroid Build Coastguard Worker             m_log.writeMessage(
3118*35238bceSAndroid Build Coastguard Worker                 "GL_INVALID_ENUM or GL_INVALID_VALUE should be generated if no ASTC extensions are present.");
3119*35238bceSAndroid Build Coastguard Worker 
3120*35238bceSAndroid Build Coastguard Worker             for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_astcFormats); formatNdx++)
3121*35238bceSAndroid Build Coastguard Worker             {
3122*35238bceSAndroid Build Coastguard Worker                 const GLuint format                 = s_astcFormats[formatNdx];
3123*35238bceSAndroid Build Coastguard Worker                 const CompressedTexFormat tcuFormat = mapGLCompressedTexFormat(format);
3124*35238bceSAndroid Build Coastguard Worker                 const IVec3 blockPixels             = getBlockPixelSize(tcuFormat);
3125*35238bceSAndroid Build Coastguard Worker                 const int32_t cubeSize = blockPixels.x() * blockPixels.y(); // Divisible by the block size and square
3126*35238bceSAndroid Build Coastguard Worker                 uint32_t texture       = 0;
3127*35238bceSAndroid Build Coastguard Worker 
3128*35238bceSAndroid Build Coastguard Worker                 glGenTextures(1, &texture);
3129*35238bceSAndroid Build Coastguard Worker                 glBindTexture(GL_TEXTURE_2D, texture);
3130*35238bceSAndroid Build Coastguard Worker 
3131*35238bceSAndroid Build Coastguard Worker                 glTexStorage2D(GL_TEXTURE_2D, 1, format, blockPixels.x(), blockPixels.y());
3132*35238bceSAndroid Build Coastguard Worker                 expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3133*35238bceSAndroid Build Coastguard Worker 
3134*35238bceSAndroid Build Coastguard Worker                 glDeleteTextures(1, &texture);
3135*35238bceSAndroid Build Coastguard Worker 
3136*35238bceSAndroid Build Coastguard Worker                 glGenTextures(1, &texture);
3137*35238bceSAndroid Build Coastguard Worker                 glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
3138*35238bceSAndroid Build Coastguard Worker 
3139*35238bceSAndroid Build Coastguard Worker                 glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, format, cubeSize, cubeSize);
3140*35238bceSAndroid Build Coastguard Worker                 expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3141*35238bceSAndroid Build Coastguard Worker 
3142*35238bceSAndroid Build Coastguard Worker                 glDeleteTextures(1, &texture);
3143*35238bceSAndroid Build Coastguard Worker             }
3144*35238bceSAndroid Build Coastguard Worker         }
3145*35238bceSAndroid Build Coastguard Worker     });
3146*35238bceSAndroid Build Coastguard Worker 
3147*35238bceSAndroid Build Coastguard Worker     // glTexStorage3D
3148*35238bceSAndroid Build Coastguard Worker 
3149*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texstorage3d, "Invalid glTexStorage3D() usage", {
3150*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
3151*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
3152*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
3153*35238bceSAndroid Build Coastguard Worker 
3154*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
3155*35238bceSAndroid Build Coastguard Worker             "",
3156*35238bceSAndroid Build Coastguard Worker             "GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not a valid sized internal format.");
3157*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 1, 0, 4, 4, 4);
3158*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3159*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA_INTEGER, 4, 4, 4);
3160*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3161*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3162*35238bceSAndroid Build Coastguard Worker 
3163*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
3164*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if target is not one of the accepted target enumerants.");
3165*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(0, 1, GL_RGBA8, 4, 4, 4);
3166*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
3167*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 4, 4, 4);
3168*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
3169*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 4, 4);
3170*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
3171*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3172*35238bceSAndroid Build Coastguard Worker 
3173*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width, height or depth are less than 1.");
3174*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 0, 4, 4);
3175*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3176*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 4, 0, 4);
3177*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3178*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 0);
3179*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3180*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 0, 0, 0);
3181*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3182*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3183*35238bceSAndroid Build Coastguard Worker 
3184*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
3185*35238bceSAndroid Build Coastguard Worker     });
3186*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texstorage3d_invalid_binding, "Invalid glTexStorage3D() usage", {
3187*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, 0);
3188*35238bceSAndroid Build Coastguard Worker 
3189*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
3190*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if the default texture object is curently bound to target.");
3191*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4);
3192*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3193*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3194*35238bceSAndroid Build Coastguard Worker 
3195*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
3196*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
3197*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
3198*35238bceSAndroid Build Coastguard Worker 
3199*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the texture object currently bound to "
3200*35238bceSAndroid Build Coastguard Worker                                       "target already has GL_TEXTURE_IMMUTABLE_FORMAT set to GL_TRUE.");
3201*35238bceSAndroid Build Coastguard Worker         int32_t immutable = -1;
3202*35238bceSAndroid Build Coastguard Worker         glGetTexParameteriv(GL_TEXTURE_3D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3203*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE")
3204*35238bceSAndroid Build Coastguard Worker               << TestLog::EndMessage;
3205*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4);
3206*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
3207*35238bceSAndroid Build Coastguard Worker         glGetTexParameteriv(GL_TEXTURE_3D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3208*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE")
3209*35238bceSAndroid Build Coastguard Worker               << TestLog::EndMessage;
3210*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4);
3211*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3212*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3213*35238bceSAndroid Build Coastguard Worker 
3214*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
3215*35238bceSAndroid Build Coastguard Worker     });
3216*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texstorage3d_invalid_levels, "Invalid glTexStorage3D() usage", {
3217*35238bceSAndroid Build Coastguard Worker         uint32_t texture;
3218*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &texture);
3219*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture);
3220*35238bceSAndroid Build Coastguard Worker 
3221*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if levels is less than 1.");
3222*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 4, 4, 4);
3223*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3224*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 0, 0, 0);
3225*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
3226*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3227*35238bceSAndroid Build Coastguard Worker 
3228*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
3229*35238bceSAndroid Build Coastguard Worker             "",
3230*35238bceSAndroid Build Coastguard Worker             "GL_INVALID_OPERATION is generated if levels is greater than floor(log_2(max(width, height, depth))) + 1");
3231*35238bceSAndroid Build Coastguard Worker         uint32_t log2MaxSize = deLog2Floor32(8) + 1 + 1;
3232*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 8, 2, 2);
3233*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3234*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 2, 8, 2);
3235*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3236*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 2, 2, 8);
3237*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3238*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 8, 8, 8);
3239*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
3240*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
3241*35238bceSAndroid Build Coastguard Worker 
3242*35238bceSAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
3243*35238bceSAndroid Build Coastguard Worker     });
3244*35238bceSAndroid Build Coastguard Worker 
3245*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(texstorage3d_invalid_astc_target, "Invalid glTexStorage3D() ASTC 3D targets", {
3246*35238bceSAndroid Build Coastguard Worker         // GLES 3.0.4, Sec 3.8.4, p.136: If there is no imageSize
3247*35238bceSAndroid Build Coastguard Worker         // for which this command would have been valid, an
3248*35238bceSAndroid Build Coastguard Worker         // INVALID_OPERATION error is generated. Also: If
3249*35238bceSAndroid Build Coastguard Worker         // executing the pseudo-code would result in any other
3250*35238bceSAndroid Build Coastguard Worker         // error, the error is generated and the command will have
3251*35238bceSAndroid Build Coastguard Worker         // no effect.
3252*35238bceSAndroid Build Coastguard Worker         // In conclusion: Expect same errors as with TexImage?D
3253*35238bceSAndroid Build Coastguard Worker 
3254*35238bceSAndroid Build Coastguard Worker         if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_sliced_3d") ||
3255*35238bceSAndroid Build Coastguard Worker             m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_hdr") ||
3256*35238bceSAndroid Build Coastguard Worker             m_context.getContextInfo().isExtensionSupported("GL_OES_texture_compression_astc"))
3257*35238bceSAndroid Build Coastguard Worker         {
3258*35238bceSAndroid Build Coastguard Worker             m_log.writeMessage("Full ASTC supported. No negative API requirements.");
3259*35238bceSAndroid Build Coastguard Worker         }
3260*35238bceSAndroid Build Coastguard Worker         else
3261*35238bceSAndroid Build Coastguard Worker         {
3262*35238bceSAndroid Build Coastguard Worker             const bool ldrAstcSupported =
3263*35238bceSAndroid Build Coastguard Worker                 m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_ldr");
3264*35238bceSAndroid Build Coastguard Worker             if (ldrAstcSupported)
3265*35238bceSAndroid Build Coastguard Worker                 m_log.writeMessage("GL_INVALID_OPERATION should be generated if using TEXTURE_3D with LDR.");
3266*35238bceSAndroid Build Coastguard Worker             else
3267*35238bceSAndroid Build Coastguard Worker                 // In earlier tests both codes are accepted for invalid target format.
3268*35238bceSAndroid Build Coastguard Worker                 m_log.writeMessage(
3269*35238bceSAndroid Build Coastguard Worker                     "GL_INVALID_ENUM or GL_INVALID_VALUE should be generated if no ASTC extensions are present.");
3270*35238bceSAndroid Build Coastguard Worker 
3271*35238bceSAndroid Build Coastguard Worker             for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_astcFormats); formatNdx++)
3272*35238bceSAndroid Build Coastguard Worker             {
3273*35238bceSAndroid Build Coastguard Worker                 const GLuint format                 = s_astcFormats[formatNdx];
3274*35238bceSAndroid Build Coastguard Worker                 const CompressedTexFormat tcuFormat = mapGLCompressedTexFormat(format);
3275*35238bceSAndroid Build Coastguard Worker                 const IVec3 blockPixels             = getBlockPixelSize(tcuFormat);
3276*35238bceSAndroid Build Coastguard Worker                 uint32_t texture                    = 0;
3277*35238bceSAndroid Build Coastguard Worker 
3278*35238bceSAndroid Build Coastguard Worker                 glGenTextures(1, &texture);
3279*35238bceSAndroid Build Coastguard Worker                 glBindTexture(GL_TEXTURE_3D, texture);
3280*35238bceSAndroid Build Coastguard Worker 
3281*35238bceSAndroid Build Coastguard Worker                 glTexStorage3D(GL_TEXTURE_3D, 1, format, blockPixels.x(), blockPixels.y(), blockPixels.z());
3282*35238bceSAndroid Build Coastguard Worker 
3283*35238bceSAndroid Build Coastguard Worker                 if (ldrAstcSupported)
3284*35238bceSAndroid Build Coastguard Worker                     expectError(GL_INVALID_OPERATION);
3285*35238bceSAndroid Build Coastguard Worker                 else
3286*35238bceSAndroid Build Coastguard Worker                     expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3287*35238bceSAndroid Build Coastguard Worker 
3288*35238bceSAndroid Build Coastguard Worker                 glDeleteTextures(1, &texture);
3289*35238bceSAndroid Build Coastguard Worker             }
3290*35238bceSAndroid Build Coastguard Worker         }
3291*35238bceSAndroid Build Coastguard Worker     });
3292*35238bceSAndroid Build Coastguard Worker }
3293*35238bceSAndroid Build Coastguard Worker 
3294*35238bceSAndroid Build Coastguard Worker } // namespace Functional
3295*35238bceSAndroid Build Coastguard Worker } // namespace gles3
3296*35238bceSAndroid Build Coastguard Worker } // namespace deqp
3297