1/*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 2.0 Module
3 * -------------------------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Negative Texture API tests.
22 *//*--------------------------------------------------------------------*/
23
24#include "es2fNegativeTextureApiTests.hpp"
25#include "es2fApiCase.hpp"
26#include "tcuFormatUtil.hpp"
27#include "tcuCompressedTexture.hpp"
28#include "gluTextureUtil.hpp"
29#include "gluContextInfo.hpp"
30
31#include <vector>
32#include <algorithm>
33
34#include "glwEnums.hpp"
35#include "glwDefs.hpp"
36
37using namespace glw; // GL types
38
39namespace deqp
40{
41namespace gles2
42{
43namespace Functional
44{
45
46using tcu::TestLog;
47using std::vector;
48
49static deUint32 cubeFaceToGLFace (tcu::CubeFace face)
50{
51	switch (face)
52	{
53		case tcu::CUBEFACE_NEGATIVE_X: return GL_TEXTURE_CUBE_MAP_NEGATIVE_X;
54		case tcu::CUBEFACE_POSITIVE_X: return GL_TEXTURE_CUBE_MAP_POSITIVE_X;
55		case tcu::CUBEFACE_NEGATIVE_Y: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
56		case tcu::CUBEFACE_POSITIVE_Y: return GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
57		case tcu::CUBEFACE_NEGATIVE_Z: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
58		case tcu::CUBEFACE_POSITIVE_Z: return GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
59		default:
60			DE_ASSERT(DE_FALSE);
61			return GL_NONE;
62	}
63}
64
65#define FOR_CUBE_FACES(FACE_GL_VAR, BODY)												\
66	do																					\
67	{																					\
68		for (int faceIterTcu = 0; faceIterTcu < tcu::CUBEFACE_LAST; faceIterTcu++)		\
69		{																				\
70			const GLenum FACE_GL_VAR = cubeFaceToGLFace((tcu::CubeFace)faceIterTcu);	\
71			BODY																		\
72		}																				\
73	} while (false)
74
75static void getCompressedTexSubImage2DFormat(const vector<deInt32>& supported, vector<deInt32>& accepted)
76{
77	// Find a supported compressed texture format that is accepted by compressedTexSubImage2D()
78
79	static const GLuint compressedTexSubImage2DFormats[] =
80	{
81		0x83F0,	// GL_COMPRESSED_RGB_S3TC_DXT1_EXT
82		0x83F1,	// GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
83		0x8C00,	// GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
84		0x8C01,	// GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG
85		0x8C02,	// GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
86		0x8C03	// GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
87	};
88
89	for (int i = 0; i < DE_LENGTH_OF_ARRAY(compressedTexSubImage2DFormats); i++)
90	{
91		vector<deInt32>::const_iterator fmt = std::find(supported.begin(), supported.end(), compressedTexSubImage2DFormats[i]);
92		if (fmt != supported.end())
93			accepted.push_back(*fmt);
94	}
95}
96
97NegativeTextureApiTests::NegativeTextureApiTests (Context& context)
98	: TestCaseGroup(context, "texture", "Negative Texture API Cases")
99{
100}
101
102NegativeTextureApiTests::~NegativeTextureApiTests (void)
103{
104}
105
106void NegativeTextureApiTests::init (void)
107{
108	// glActiveTexture
109
110	ES2F_ADD_API_CASE(activetexture_invalid_texture, "Invalid glActiveTexture() usage",
111		{
112			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if texture is not one of GL_TEXTUREi, where i ranges from 0 to (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1).");
113			glActiveTexture(-1);
114			expectError(GL_INVALID_ENUM);
115			int numMaxTextureUnits = m_context.getContextInfo().getInt(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS);
116			glActiveTexture(GL_TEXTURE0 + numMaxTextureUnits);
117			expectError(GL_INVALID_ENUM);
118			m_log << TestLog::EndSection;
119		});
120
121	// glBindTexture
122
123	ES2F_ADD_API_CASE(bindtexture_invalid_target, "Invalid glBindTexture() usage",
124		{
125			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the allowable values.");
126			glBindTexture(0, 1);
127			expectError(GL_INVALID_ENUM);
128			m_log << TestLog::EndSection;
129		});
130	ES2F_ADD_API_CASE(bindtexture_type_mismatch, "Invalid glBindTexture() usage",
131		{
132			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if texture was previously created with a target that doesn't match that of target.");
133			GLuint texture;
134			glGenTextures(1, &texture);
135			glBindTexture(GL_TEXTURE_2D, texture);
136			glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
137			expectError(GL_INVALID_OPERATION);
138			glDeleteTextures(1, &texture);
139			m_log << TestLog::EndSection;
140		});
141
142	// glCompressedTexImage2D
143
144	ES2F_ADD_API_CASE(compressedteximage_2d_invalid_target, "Invalid glCompressedTexImage2D() usage",
145		{
146			vector<deInt32> compressedFormats;
147			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
148			if (!compressedFormats.empty())
149			{
150				m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
151				glCompressedTexImage2D(0, 0, compressedFormats[0], 0, 0, 0, 0, 0);
152				expectError(GL_INVALID_ENUM);
153				m_log << TestLog::EndSection;
154			}
155		});
156	ES2F_ADD_API_CASE(compressedteximage_2d_invalid_format_tex2d, "Invalid glCompressedTexImage2D() usage",
157		{
158			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if internalformat is not a supported format returned in GL_COMPRESSED_TEXTURE_FORMATS.");
159			glCompressedTexImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 0);
160			expectError(GL_INVALID_ENUM);
161			m_log << TestLog::EndSection;
162		});
163	ES2F_ADD_API_CASE(compressedteximage_2d_invalid_format_cube, "Invalid glCompressedTexImage2D() usage",
164		{
165			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if internalformat is not a supported format returned in GL_COMPRESSED_TEXTURE_FORMATS.");
166			glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 0, 0, 0);
167			expectError(GL_INVALID_ENUM);
168			glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 0, 0, 0);
169			expectError(GL_INVALID_ENUM);
170			glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 0, 0, 0);
171			expectError(GL_INVALID_ENUM);
172			glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 0, 0, 0);
173			expectError(GL_INVALID_ENUM);
174			glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 0, 0, 0);
175			expectError(GL_INVALID_ENUM);
176			glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 0, 0, 0);
177			expectError(GL_INVALID_ENUM);
178			m_log << TestLog::EndSection;
179		});
180	ES2F_ADD_API_CASE(compressedteximage2d_neg_level_tex2d, "Invalid glCompressedTexImage2D() usage",
181		{
182			vector<deInt32> compressedFormats;
183			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
184			if (!compressedFormats.empty())
185			{
186				size_t firstNonPalettedFormatNdx = 0;
187				// Negtive values are valid for palette formats
188				if (m_context.getContextInfo().isExtensionSupported("GL_OES_compressed_paletted_texture"))
189				{
190					while (GL_PALETTE4_RGB8_OES <= compressedFormats[firstNonPalettedFormatNdx] &&
191						   GL_PALETTE8_RGB5_A1_OES >= compressedFormats[firstNonPalettedFormatNdx])
192					{
193						++firstNonPalettedFormatNdx;
194					}
195				}
196				if (firstNonPalettedFormatNdx < compressedFormats.size())
197				{
198					m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
199					glCompressedTexImage2D(GL_TEXTURE_2D, -1, compressedFormats[firstNonPalettedFormatNdx], 0, 0, 0, 0, 0);
200					expectError(GL_INVALID_VALUE);
201					m_log << TestLog::EndSection;
202				}
203			}
204		});
205	ES2F_ADD_API_CASE(compressedteximage2d_neg_level_cube, "Invalid glCompressedTexImage2D() usage",
206		{
207			vector<deInt32> compressedFormats;
208			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
209			if (!compressedFormats.empty())
210			{
211				size_t firstNonPalettedFormatNdx = 0;
212				// Negtive values are valid for palette formats
213				if (m_context.getContextInfo().isExtensionSupported("GL_OES_compressed_paletted_texture"))
214				{
215					while (GL_PALETTE4_RGB8_OES <= compressedFormats[firstNonPalettedFormatNdx] &&
216						   GL_PALETTE8_RGB5_A1_OES >= compressedFormats[firstNonPalettedFormatNdx])
217					{
218						++firstNonPalettedFormatNdx;
219					}
220				}
221				if (firstNonPalettedFormatNdx < compressedFormats.size())
222				{
223					m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
224					glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, compressedFormats[firstNonPalettedFormatNdx], 0, 0, 0, 0, 0);
225					expectError(GL_INVALID_VALUE);
226					glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, compressedFormats[firstNonPalettedFormatNdx], 0, 0, 0, 0, 0);
227					expectError(GL_INVALID_VALUE);
228					glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, compressedFormats[firstNonPalettedFormatNdx], 0, 0, 0, 0, 0);
229					expectError(GL_INVALID_VALUE);
230					glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, compressedFormats[firstNonPalettedFormatNdx], 0, 0, 0, 0, 0);
231					expectError(GL_INVALID_VALUE);
232					glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, compressedFormats[firstNonPalettedFormatNdx], 0, 0, 0, 0, 0);
233					expectError(GL_INVALID_VALUE);
234					glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, compressedFormats[firstNonPalettedFormatNdx], 0, 0, 0, 0, 0);
235					expectError(GL_INVALID_VALUE);
236					m_log << TestLog::EndSection;
237				}
238			}
239		});
240	ES2F_ADD_API_CASE(compressedteximage2d_level_max_tex2d, "Invalid glCompressedTexImage2D() usage",
241		{
242			vector<deInt32> compressedFormats;
243			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
244			if (!compressedFormats.empty())
245			{
246				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
247				deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
248				glCompressedTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, compressedFormats[0], 0, 0, 0, 0, 0);
249				expectError(GL_INVALID_VALUE);
250				m_log << TestLog::EndSection;
251			}
252		});
253	ES2F_ADD_API_CASE(compressedteximage2d_level_max_cube_pos, "Invalid glCompressedTexImage2D() usage",
254		{
255			vector<deInt32> compressedFormats;
256			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
257			if (!compressedFormats.empty())
258			{
259				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
260				deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
261				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxTextureSize, compressedFormats[0], 0, 0, 0, 0, 0);
262				expectError(GL_INVALID_VALUE);
263				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxTextureSize, compressedFormats[0], 0, 0, 0, 0, 0);
264				expectError(GL_INVALID_VALUE);
265				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxTextureSize, compressedFormats[0], 0, 0, 0, 0, 0);
266				expectError(GL_INVALID_VALUE);
267				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxTextureSize, compressedFormats[0], 0, 0, 0, 0, 0);
268				expectError(GL_INVALID_VALUE);
269				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxTextureSize, compressedFormats[0], 0, 0, 0, 0, 0);
270				expectError(GL_INVALID_VALUE);
271				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxTextureSize, compressedFormats[0], 0, 0, 0, 0, 0);
272				expectError(GL_INVALID_VALUE);
273				m_log << TestLog::EndSection;
274			}
275		});
276	ES2F_ADD_API_CASE(compressedteximage2d_neg_width_height_tex2d, "Invalid glCompressedTexImage2D() usage",
277		{
278			vector<deInt32> compressedFormats;
279			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
280			if (!compressedFormats.empty())
281			{
282				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
283				glCompressedTexImage2D(GL_TEXTURE_2D, 0, compressedFormats[0], -1, 0, 0, 0, 0);
284				expectError(GL_INVALID_VALUE);
285				glCompressedTexImage2D(GL_TEXTURE_2D, 0, compressedFormats[0], 0, -1, 0, 0, 0);
286				expectError(GL_INVALID_VALUE);
287				glCompressedTexImage2D(GL_TEXTURE_2D, 0, compressedFormats[0], -1, -1, 0, 0, 0);
288				expectError(GL_INVALID_VALUE);
289				m_log << TestLog::EndSection;
290			}
291		});
292	ES2F_ADD_API_CASE(compressedteximage2d_neg_width_height_cube_pos_x, "Invalid glCompressedTexImage2D() usage",
293		{
294			vector<deInt32> compressedFormats;
295			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
296			if (!compressedFormats.empty())
297			{
298				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
299				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, compressedFormats[0], -1, 0, 0, 0, 0);
300				expectError(GL_INVALID_VALUE);
301				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, compressedFormats[0], 0, -1, 0, 0, 0);
302				expectError(GL_INVALID_VALUE);
303				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, compressedFormats[0], -1, -1, 0, 0, 0);
304				expectError(GL_INVALID_VALUE);
305				m_log << TestLog::EndSection;
306			}
307		});
308	ES2F_ADD_API_CASE(compressedteximage2d_neg_width_height_cube_pos_y, "Invalid glCompressedTexImage2D() usage",
309		{
310			vector<deInt32> compressedFormats;
311			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
312			if (!compressedFormats.empty())
313			{
314				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
315				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, compressedFormats[0], -1, 0, 0, 0, 0);
316				expectError(GL_INVALID_VALUE);
317				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, compressedFormats[0], 0, -1, 0, 0, 0);
318				expectError(GL_INVALID_VALUE);
319				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, compressedFormats[0], -1, -1, 0, 0, 0);
320				expectError(GL_INVALID_VALUE);
321				m_log << TestLog::EndSection;
322			}
323		});
324	ES2F_ADD_API_CASE(compressedteximage2d_neg_width_height_cube_pos_z, "Invalid glCompressedTexImage2D() usage",
325		{
326			vector<deInt32> compressedFormats;
327			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
328			if (!compressedFormats.empty())
329			{
330				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
331				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, compressedFormats[0], -1, 0, 0, 0, 0);
332				expectError(GL_INVALID_VALUE);
333				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, compressedFormats[0], 0, -1, 0, 0, 0);
334				expectError(GL_INVALID_VALUE);
335				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, compressedFormats[0], -1, -1, 0, 0, 0);
336				expectError(GL_INVALID_VALUE);
337				m_log << TestLog::EndSection;
338			}
339		});
340	ES2F_ADD_API_CASE(compressedteximage2d_neg_width_height_cube_neg_x, "Invalid glCompressedTexImage2D() usage",
341		{
342			vector<deInt32> compressedFormats;
343			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
344			if (!compressedFormats.empty())
345			{
346				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
347				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, compressedFormats[0], -1, 0, 0, 0, 0);
348				expectError(GL_INVALID_VALUE);
349				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, compressedFormats[0], 0, -1, 0, 0, 0);
350				expectError(GL_INVALID_VALUE);
351				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, compressedFormats[0], -1, -1, 0, 0, 0);
352				expectError(GL_INVALID_VALUE);
353				m_log << TestLog::EndSection;
354			}
355		});
356	ES2F_ADD_API_CASE(compressedteximage2d_neg_width_height_cube_neg_y, "Invalid glCompressedTexImage2D() usage",
357		{
358			vector<deInt32> compressedFormats;
359			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
360			if (!compressedFormats.empty())
361			{
362				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
363				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, compressedFormats[0], -1, 0, 0, 0, 0);
364				expectError(GL_INVALID_VALUE);
365				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, compressedFormats[0], 0, -1, 0, 0, 0);
366				expectError(GL_INVALID_VALUE);
367				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, compressedFormats[0], -1, -1, 0, 0, 0);
368				expectError(GL_INVALID_VALUE);
369				m_log << TestLog::EndSection;
370			}
371		});
372	ES2F_ADD_API_CASE(compressedteximage2d_neg_width_height_cube_neg_z, "Invalid glCompressedTexImage2D() usage",
373		{
374			vector<deInt32> compressedFormats;
375			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
376			if (!compressedFormats.empty())
377			{
378				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
379				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, compressedFormats[0], -1, 0, 0, 0, 0);
380				expectError(GL_INVALID_VALUE);
381				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, compressedFormats[0], 0, -1, 0, 0, 0);
382				expectError(GL_INVALID_VALUE);
383				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, compressedFormats[0], -1, -1, 0, 0, 0);
384				expectError(GL_INVALID_VALUE);
385				m_log << TestLog::EndSection;
386			}
387		});
388	ES2F_ADD_API_CASE(compressedteximage2d_width_height_max_tex2d, "Invalid glCompressedTexImage2D() usage",
389		{
390			vector<deInt32> compressedFormats;
391			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
392			if (!compressedFormats.empty())
393			{
394				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE.");
395				int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1;
396				glCompressedTexImage2D(GL_TEXTURE_2D, 0, compressedFormats[0], maxTextureSize, 0, 0, 0, 0);
397				expectError(GL_INVALID_VALUE);
398				glCompressedTexImage2D(GL_TEXTURE_2D, 0, compressedFormats[0], 0, maxTextureSize, 0, 0, 0);
399				expectError(GL_INVALID_VALUE);
400				glCompressedTexImage2D(GL_TEXTURE_2D, 0, compressedFormats[0], maxTextureSize, maxTextureSize, 0, 0, 0);
401				expectError(GL_INVALID_VALUE);
402				m_log << TestLog::EndSection;
403			}
404		});
405	ES2F_ADD_API_CASE(compressedteximage2d_width_height_max_cube_pos_x, "Invalid glCompressedTexImage2D() usage",
406		{
407			vector<deInt32> compressedFormats;
408			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
409			if (!compressedFormats.empty())
410			{
411				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
412				int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
413				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, compressedFormats[0], maxTextureSize, 0, 0, 0, 0);
414				expectError(GL_INVALID_VALUE);
415				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, compressedFormats[0], 0, maxTextureSize, 0, 0, 0);
416				expectError(GL_INVALID_VALUE);
417				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, compressedFormats[0], maxTextureSize, maxTextureSize, 0, 0, 0);
418				expectError(GL_INVALID_VALUE);
419				m_log << TestLog::EndSection;
420			}
421		});
422	ES2F_ADD_API_CASE(compressedteximage2d_width_height_max_cube_pos_y, "Invalid glCompressedTexImage2D() usage",
423		{
424			vector<deInt32> compressedFormats;
425			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
426			if (!compressedFormats.empty())
427			{
428				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
429				int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
430				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, compressedFormats[0], maxTextureSize, 0, 0, 0, 0);
431				expectError(GL_INVALID_VALUE);
432				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, compressedFormats[0], 0, maxTextureSize, 0, 0, 0);
433				expectError(GL_INVALID_VALUE);
434				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, compressedFormats[0], maxTextureSize, maxTextureSize, 0, 0, 0);
435				expectError(GL_INVALID_VALUE);
436				m_log << TestLog::EndSection;
437			}
438		});
439	ES2F_ADD_API_CASE(compressedteximage2d_width_height_max_cube_pos_z, "Invalid glCompressedTexImage2D() usage",
440		{
441			vector<deInt32> compressedFormats;
442			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
443			if (!compressedFormats.empty())
444			{
445				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
446				int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
447				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, compressedFormats[0], maxTextureSize, 0, 0, 0, 0);
448				expectError(GL_INVALID_VALUE);
449				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, compressedFormats[0], 0, maxTextureSize, 0, 0, 0);
450				expectError(GL_INVALID_VALUE);
451				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, compressedFormats[0], maxTextureSize, maxTextureSize, 0, 0, 0);
452				expectError(GL_INVALID_VALUE);
453				m_log << TestLog::EndSection;
454			}
455		});
456	ES2F_ADD_API_CASE(compressedteximage2d_width_height_max_cube_neg_x, "Invalid glCompressedTexImage2D() usage",
457		{
458			vector<deInt32> compressedFormats;
459			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
460			if (!compressedFormats.empty())
461			{
462				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
463				int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
464				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, compressedFormats[0], maxTextureSize, 0, 0, 0, 0);
465				expectError(GL_INVALID_VALUE);
466				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, compressedFormats[0], 0, maxTextureSize, 0, 0, 0);
467				expectError(GL_INVALID_VALUE);
468				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, compressedFormats[0], maxTextureSize, maxTextureSize, 0, 0, 0);
469				expectError(GL_INVALID_VALUE);
470				m_log << TestLog::EndSection;
471			}
472		});
473	ES2F_ADD_API_CASE(compressedteximage2d_width_height_max_cube_neg_y, "Invalid glCompressedTexImage2D() usage",
474		{
475			vector<deInt32> compressedFormats;
476			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
477			if (!compressedFormats.empty())
478			{
479				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
480				int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
481				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, compressedFormats[0], maxTextureSize, 0, 0, 0, 0);
482				expectError(GL_INVALID_VALUE);
483				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, compressedFormats[0], 0, maxTextureSize, 0, 0, 0);
484				expectError(GL_INVALID_VALUE);
485				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, compressedFormats[0], maxTextureSize, maxTextureSize, 0, 0, 0);
486				expectError(GL_INVALID_VALUE);
487				m_log << TestLog::EndSection;
488			}
489		});
490	ES2F_ADD_API_CASE(compressedteximage2d_width_height_max_cube_neg_z, "Invalid glCompressedTexImage2D() usage",
491		{
492			vector<deInt32> compressedFormats;
493			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
494			if (!compressedFormats.empty())
495			{
496				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
497				int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
498				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, compressedFormats[0], maxTextureSize, 0, 0, 0, 0);
499				expectError(GL_INVALID_VALUE);
500				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, compressedFormats[0], 0, maxTextureSize, 0, 0, 0);
501				expectError(GL_INVALID_VALUE);
502				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, compressedFormats[0], maxTextureSize, maxTextureSize, 0, 0, 0);
503				expectError(GL_INVALID_VALUE);
504				m_log << TestLog::EndSection;
505			}
506		});
507	ES2F_ADD_API_CASE(compressedteximage2d_invalid_border, "Invalid glCompressedTexImage2D() usage",
508		{
509			vector<deInt32> compressedFormats;
510			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
511			if (!compressedFormats.empty())
512			{
513				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
514				glCompressedTexImage2D(GL_TEXTURE_2D, 0, compressedFormats[0], 0, 0, 1, 0, 0);
515				expectError(GL_INVALID_VALUE);
516				glCompressedTexImage2D(GL_TEXTURE_2D, 0, compressedFormats[0], 0, 0, -1, 0, 0);
517				expectError(GL_INVALID_VALUE);
518				m_log << TestLog::EndSection;
519			}
520		});
521
522	ES2F_ADD_API_CASE(compressedteximage2d_invalid_border_cube_pos_x, "Invalid glCompressedTexImage2D() usage",
523		{
524			vector<deInt32> compressedFormats;
525			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
526			if (!compressedFormats.empty())
527			{
528				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
529				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, compressedFormats[0], 0, 0, 1, 0, 0);
530				expectError(GL_INVALID_VALUE);
531				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, compressedFormats[0], 0, 0, -1, 0, 0);
532				expectError(GL_INVALID_VALUE);
533				m_log << TestLog::EndSection;
534			}
535		});
536	ES2F_ADD_API_CASE(compressedteximage2d_invalid_border_cube_pos_y, "Invalid glCompressedTexImage2D() usage",
537		{
538			vector<deInt32> compressedFormats;
539			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
540			if (!compressedFormats.empty())
541			{
542				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
543				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, compressedFormats[0], 0, 0, 1, 0, 0);
544				expectError(GL_INVALID_VALUE);
545				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, compressedFormats[0], 0, 0, -1, 0, 0);
546				expectError(GL_INVALID_VALUE);
547				m_log << TestLog::EndSection;
548			}
549		});
550	ES2F_ADD_API_CASE(compressedteximage2d_invalid_border_cube_pos_z, "Invalid glCompressedTexImage2D() usage",
551		{
552			vector<deInt32> compressedFormats;
553			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
554			if (!compressedFormats.empty())
555			{
556				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
557				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, compressedFormats[0], 0, 0, 1, 0, 0);
558				expectError(GL_INVALID_VALUE);
559				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, compressedFormats[0], 0, 0, -1, 0, 0);
560				expectError(GL_INVALID_VALUE);
561				m_log << TestLog::EndSection;
562			}
563		});
564	ES2F_ADD_API_CASE(compressedteximage2d_invalid_border_cube_neg_x, "Invalid glCompressedTexImage2D() usage",
565		{
566			vector<deInt32> compressedFormats;
567			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
568			if (!compressedFormats.empty())
569			{
570				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
571				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, compressedFormats[0], 0, 0, 1, 0, 0);
572				expectError(GL_INVALID_VALUE);
573				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, compressedFormats[0], 0, 0, -1, 0, 0);
574				expectError(GL_INVALID_VALUE);
575				m_log << TestLog::EndSection;
576			}
577		});
578	ES2F_ADD_API_CASE(compressedteximage2d_invalid_border_cube_neg_y, "Invalid glCompressedTexImage2D() usage",
579		{
580			vector<deInt32> compressedFormats;
581			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
582			if (!compressedFormats.empty())
583			{
584				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
585				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, compressedFormats[0], 0, 0, 1, 0, 0);
586				expectError(GL_INVALID_VALUE);
587				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, compressedFormats[0], 0, 0, -1, 0, 0);
588				expectError(GL_INVALID_VALUE);
589				m_log << TestLog::EndSection;
590			}
591		});
592	ES2F_ADD_API_CASE(compressedteximage2d_invalid_border_cube_neg_z, "Invalid glCompressedTexImage2D() usage",
593		{
594			vector<deInt32> compressedFormats;
595			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
596			if (!compressedFormats.empty())
597			{
598				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
599				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, compressedFormats[0], 0, 0, 1, 0, 0);
600				expectError(GL_INVALID_VALUE);
601				glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, compressedFormats[0], 0, 0, -1, 0, 0);
602				expectError(GL_INVALID_VALUE);
603				m_log << TestLog::EndSection;
604			}
605		});
606	ES2F_ADD_API_CASE(compressedteximage2d_invalid_size, "Invalid glCompressedTexImage2D() usage",
607		{
608			vector<deInt32> compressedFormats;
609			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
610			if (!compressedFormats.empty())
611			{
612				m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if imageSize is not consistent with the format, dimensions, and contents of the specified compressed image data.");
613				glCompressedTexImage2D(GL_TEXTURE_2D, 0, compressedFormats[0], 0, 0, 0, -1, 0);
614				expectError(GL_INVALID_VALUE);
615				m_log << TestLog::EndSection;
616			}
617		});
618
619	// glCopyTexImage2D
620
621	ES2F_ADD_API_CASE(copyteximage2d_invalid_target, "Invalid glCopyTexImage2D() usage",
622		{
623			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
624			glCopyTexImage2D(0, 0, GL_RGB, 0, 0, 64, 64, 0);
625			expectError(GL_INVALID_ENUM);
626			m_log << TestLog::EndSection;
627		});
628	ES2F_ADD_API_CASE(copyteximage2d_invalid_format_tex2d, "Invalid glCopyTexImage2D() usage",
629		{
630			m_log << TestLog::Section("", "GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not an accepted format.");
631			glCopyTexImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 64, 64, 0);
632			expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
633			m_log << TestLog::EndSection;
634		});
635	ES2F_ADD_API_CASE(copyteximage2d_invalid_format_cube, "Invalid glCopyTexImage2D() usage",
636		{
637			m_log << TestLog::Section("", "GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not an accepted format.");
638			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 16, 16, 0);
639			expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
640			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 16, 16, 0);
641			expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
642			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 16, 16, 0);
643			expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
644			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 16, 16, 0);
645			expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
646			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 16, 16, 0);
647			expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
648			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 16, 16, 0);
649			expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
650			m_log << TestLog::EndSection;
651		});
652	ES2F_ADD_API_CASE(copyteximage2d_inequal_width_height_cube, "Invalid glCopyTexImage2D() usage",
653		{
654			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if target is one of the six cube map 2D image targets and the width and height parameters are not equal.");
655			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 16, 17, 0);
656			expectError(GL_INVALID_VALUE);
657			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 16, 17, 0);
658			expectError(GL_INVALID_VALUE);
659			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 16, 17, 0);
660			expectError(GL_INVALID_VALUE);
661			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 16, 17, 0);
662			expectError(GL_INVALID_VALUE);
663			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 16, 17, 0);
664			expectError(GL_INVALID_VALUE);
665			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 16, 17, 0);
666			expectError(GL_INVALID_VALUE);
667			m_log << TestLog::EndSection;
668		});
669	ES2F_ADD_API_CASE(copyteximage2d_neg_level_tex2d, "Invalid glCopyTexImage2D() usage",
670		{
671			m_log << TestLog::Section("", "");
672			glCopyTexImage2D(GL_TEXTURE_2D, -1, GL_RGB, 0, 0, 64, 64, 0);
673			expectError(GL_INVALID_VALUE);
674			m_log << TestLog::EndSection;
675		});
676	ES2F_ADD_API_CASE(copyteximage2d_neg_level_cube, "Invalid glCopyTexImage2D() usage",
677		{
678			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
679			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_RGB, 0, 0, 16, 16, 0);
680			expectError(GL_INVALID_VALUE);
681			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_RGB, 0, 0, 16, 16, 0);
682			expectError(GL_INVALID_VALUE);
683			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_RGB, 0, 0, 16, 16, 0);
684			expectError(GL_INVALID_VALUE);
685			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_RGB, 0, 0, 16, 16, 0);
686			expectError(GL_INVALID_VALUE);
687			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_RGB, 0, 0, 16, 16, 0);
688			expectError(GL_INVALID_VALUE);
689			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_RGB, 0, 0, 16, 16, 0);
690			expectError(GL_INVALID_VALUE);
691			m_log << TestLog::EndSection;
692		});
693	ES2F_ADD_API_CASE(copyteximage2d_level_max_tex2d, "Invalid glCopyTexImage2D() usage",
694		{
695			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
696			deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
697			glCopyTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_RGB, 0, 0, 64, 64, 0);
698			expectError(GL_INVALID_VALUE);
699			m_log << TestLog::EndSection;
700		});
701	ES2F_ADD_API_CASE(copyteximage2d_level_max_cube, "Invalid glCopyTexImage2D() usage",
702		{
703			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
704			deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
705			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxTextureSize, GL_RGB, 0, 0, 16, 16, 0);
706			expectError(GL_INVALID_VALUE);
707			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxTextureSize, GL_RGB, 0, 0, 16, 16, 0);
708			expectError(GL_INVALID_VALUE);
709			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxTextureSize, GL_RGB, 0, 0, 16, 16, 0);
710			expectError(GL_INVALID_VALUE);
711			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxTextureSize, GL_RGB, 0, 0, 16, 16, 0);
712			expectError(GL_INVALID_VALUE);
713			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxTextureSize, GL_RGB, 0, 0, 16, 16, 0);
714			expectError(GL_INVALID_VALUE);
715			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxTextureSize, GL_RGB, 0, 0, 16, 16, 0);
716			expectError(GL_INVALID_VALUE);
717			m_log << TestLog::EndSection;
718		});
719	ES2F_ADD_API_CASE(copyteximage2d_invalid_width_height_tex2d, "Invalid glCopyTexImage2D() usage",
720		{
721			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
722			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, -1, 1, 0);
723			expectError(GL_INVALID_VALUE);
724			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, -1, 0);
725			expectError(GL_INVALID_VALUE);
726			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, -1, -1, 0);
727			expectError(GL_INVALID_VALUE);
728			m_log << TestLog::EndSection;
729		});
730	ES2F_ADD_API_CASE(copyteximage2d_invalid_width_height_cube_pos_x, "Invalid glCopyTexImage2D() usage",
731		{
732			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
733			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, -1, 1, 0);
734			expectError(GL_INVALID_VALUE);
735			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 1, -1, 0);
736			expectError(GL_INVALID_VALUE);
737			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, -1, -1, 0);
738			expectError(GL_INVALID_VALUE);
739			m_log << TestLog::EndSection;
740		});
741	ES2F_ADD_API_CASE(copyteximage2d_invalid_width_height_cube_pos_y, "Invalid glCopyTexImage2D() usage",
742		{
743			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
744			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, -1, 1, 0);
745			expectError(GL_INVALID_VALUE);
746			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 1, -1, 0);
747			expectError(GL_INVALID_VALUE);
748			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, -1, -1, 0);
749			expectError(GL_INVALID_VALUE);
750			m_log << TestLog::EndSection;
751		});
752	ES2F_ADD_API_CASE(copyteximage2d_invalid_width_height_cube_pos_z, "Invalid glCopyTexImage2D() usage",
753		{
754			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
755			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, -1, 1, 0);
756			expectError(GL_INVALID_VALUE);
757			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 1, -1, 0);
758			expectError(GL_INVALID_VALUE);
759			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, -1, -1, 0);
760			expectError(GL_INVALID_VALUE);
761			m_log << TestLog::EndSection;
762		});
763	ES2F_ADD_API_CASE(copyteximage2d_invalid_width_height_cube_neg_x, "Invalid glCopyTexImage2D() usage",
764		{
765			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
766			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, -1, 1, 0);
767			expectError(GL_INVALID_VALUE);
768			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 1, -1, 0);
769			expectError(GL_INVALID_VALUE);
770			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, -1, -1, 0);
771			expectError(GL_INVALID_VALUE);
772			m_log << TestLog::EndSection;
773		});
774	ES2F_ADD_API_CASE(copyteximage2d_invalid_width_height_cube_neg_y, "Invalid glCopyTexImage2D() usage",
775		{
776			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
777			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, -1, 1, 0);
778			expectError(GL_INVALID_VALUE);
779			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 1, -1, 0);
780			expectError(GL_INVALID_VALUE);
781			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, -1, -1, 0);
782			expectError(GL_INVALID_VALUE);
783			m_log << TestLog::EndSection;
784		});
785	ES2F_ADD_API_CASE(copyteximage2d_invalid_width_height_cube_neg_z, "Invalid glCopyTexImage2D() usage",
786		{
787			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
788			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, -1, 1, 0);
789			expectError(GL_INVALID_VALUE);
790			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 1, -1, 0);
791			expectError(GL_INVALID_VALUE);
792			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, -1, -1, 0);
793			expectError(GL_INVALID_VALUE);
794			m_log << TestLog::EndSection;
795		});
796	ES2F_ADD_API_CASE(copyteximage2d_width_height_max_tex2d, "Invalid glCopyTexImage2D() usage",
797		{
798			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE.");
799			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1;
800			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, maxTextureSize, 1, 0);
801			expectError(GL_INVALID_VALUE);
802			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, maxTextureSize, 0);
803			expectError(GL_INVALID_VALUE);
804			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, maxTextureSize, maxTextureSize, 0);
805			expectError(GL_INVALID_VALUE);
806			m_log << TestLog::EndSection;
807		});
808	ES2F_ADD_API_CASE(copyteximage2d_width_height_max_cube_pos_x, "Invalid glCopyTexImage2D() usage",
809		{
810			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
811			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
812			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 1, maxTextureSize, 0);
813			expectError(GL_INVALID_VALUE);
814			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, maxTextureSize, 1, 0);
815			expectError(GL_INVALID_VALUE);
816			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, maxTextureSize, maxTextureSize, 0);
817			expectError(GL_INVALID_VALUE);
818			m_log << TestLog::EndSection;
819		});
820	ES2F_ADD_API_CASE(copyteximage2d_width_height_max_cube_pos_y, "Invalid glCopyTexImage2D() usage",
821		{
822			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
823			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
824			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 1, maxTextureSize, 0);
825			expectError(GL_INVALID_VALUE);
826			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, maxTextureSize, 1, 0);
827			expectError(GL_INVALID_VALUE);
828			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, maxTextureSize, maxTextureSize, 0);
829			expectError(GL_INVALID_VALUE);
830			m_log << TestLog::EndSection;
831		});
832	ES2F_ADD_API_CASE(copyteximage2d_width_height_max_cube_pos_z, "Invalid glCopyTexImage2D() usage",
833		{
834			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
835			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
836			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 1, maxTextureSize, 0);
837			expectError(GL_INVALID_VALUE);
838			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, maxTextureSize, 1, 0);
839			expectError(GL_INVALID_VALUE);
840			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, maxTextureSize, maxTextureSize, 0);
841			expectError(GL_INVALID_VALUE);
842			m_log << TestLog::EndSection;
843		});
844	ES2F_ADD_API_CASE(copyteximage2d_width_height_max_cube_neg_x, "Invalid glCopyTexImage2D() usage",
845		{
846			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
847			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
848			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 1, maxTextureSize, 0);
849			expectError(GL_INVALID_VALUE);
850			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, maxTextureSize, 1, 0);
851			expectError(GL_INVALID_VALUE);
852			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, maxTextureSize, maxTextureSize, 0);
853			expectError(GL_INVALID_VALUE);
854			m_log << TestLog::EndSection;
855		});
856	ES2F_ADD_API_CASE(copyteximage2d_width_height_max_cube_neg_y, "Invalid glCopyTexImage2D() usage",
857		{
858			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
859			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
860			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 1, maxTextureSize, 0);
861			expectError(GL_INVALID_VALUE);
862			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, maxTextureSize, 1, 0);
863			expectError(GL_INVALID_VALUE);
864			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, maxTextureSize, maxTextureSize, 0);
865			expectError(GL_INVALID_VALUE);
866			m_log << TestLog::EndSection;
867		});
868	ES2F_ADD_API_CASE(copyteximage2d_width_height_max_cube_neg_z, "Invalid glCopyTexImage2D() usage",
869		{
870			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
871			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
872			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 1, maxTextureSize, 0);
873			expectError(GL_INVALID_VALUE);
874			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, maxTextureSize, 1, 0);
875			expectError(GL_INVALID_VALUE);
876			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, maxTextureSize, maxTextureSize, 0);
877			expectError(GL_INVALID_VALUE);
878			m_log << TestLog::EndSection;
879		});
880	ES2F_ADD_API_CASE(copyteximage2d_invalid_border_tex2d, "Invalid glCopyTexImage2D() usage",
881		{
882			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
883			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 64, 64, -1);
884			expectError(GL_INVALID_VALUE);
885			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 64, 64, 1);
886			expectError(GL_INVALID_VALUE);
887			m_log << TestLog::EndSection;
888		});
889	ES2F_ADD_API_CASE(copyteximage2d_invalid_border_cube_pos_x, "Invalid glCopyTexImage2D() usage",
890		{
891			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
892			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 16, 16, -1);
893			expectError(GL_INVALID_VALUE);
894			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 16, 16, 1);
895			expectError(GL_INVALID_VALUE);
896			m_log << TestLog::EndSection;
897		});
898	ES2F_ADD_API_CASE(copyteximage2d_invalid_border_cube_pos_y, "Invalid glCopyTexImage2D() usage",
899		{
900			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
901			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 16, 16, -1);
902			expectError(GL_INVALID_VALUE);
903			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 16, 16, 1);
904			expectError(GL_INVALID_VALUE);
905			m_log << TestLog::EndSection;
906		});
907	ES2F_ADD_API_CASE(copyteximage2d_invalid_border_cube_pos_z, "Invalid glCopyTexImage2D() usage",
908		{
909			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
910			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 16, 16, -1);
911			expectError(GL_INVALID_VALUE);
912			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 16, 16, 1);
913			expectError(GL_INVALID_VALUE);
914			m_log << TestLog::EndSection;
915		});
916	ES2F_ADD_API_CASE(copyteximage2d_invalid_border_cube_neg_x, "Invalid glCopyTexImage2D() usage",
917		{
918			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
919			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 16, 16, -1);
920			expectError(GL_INVALID_VALUE);
921			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 16, 16, 1);
922			expectError(GL_INVALID_VALUE);
923			m_log << TestLog::EndSection;
924		});
925	ES2F_ADD_API_CASE(copyteximage2d_invalid_border_cube_neg_y, "Invalid glCopyTexImage2D() usage",
926		{
927			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
928			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 16, 16, -1);
929			expectError(GL_INVALID_VALUE);
930			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 16, 16, 1);
931			expectError(GL_INVALID_VALUE);
932			m_log << TestLog::EndSection;
933		});
934	ES2F_ADD_API_CASE(copyteximage2d_invalid_border_cube_neg_z, "Invalid glCopyTexImage2D() usage",
935		{
936			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
937			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 16, 16, -1);
938			expectError(GL_INVALID_VALUE);
939			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 16, 16, 1);
940			expectError(GL_INVALID_VALUE);
941			m_log << TestLog::EndSection;
942		});
943
944	ES2F_ADD_API_CASE(copyteximage2d_incomplete_framebuffer, "Invalid glCopyTexImage2D() usage",
945		{
946			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
947			GLuint fbo;
948			glGenFramebuffers(1, &fbo);
949			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
950			glCheckFramebufferStatus(GL_FRAMEBUFFER);
951
952			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 64, 64, 0);
953			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
954			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 16, 16, 0);
955			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
956			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 16, 16, 0);
957			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
958			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 16, 16, 0);
959			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
960			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 16, 16, 0);
961			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
962			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 16, 16, 0);
963			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
964			glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 16, 16, 0);
965			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
966
967			glBindFramebuffer(GL_FRAMEBUFFER, 0);
968			glDeleteFramebuffers(1, &fbo);
969			m_log << tcu::TestLog::EndSection;
970		});
971
972	// glCopyTexSubImage2D
973
974	ES2F_ADD_API_CASE(copytexsubimage2d_invalid_target, "Invalid glCopyTexSubImage2D() usage",
975		{
976			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
977			glCopyTexSubImage2D(0, 0, 0, 0, 0, 0, 0, 0);
978			expectError(GL_INVALID_ENUM);
979			m_log << TestLog::EndSection;
980		});
981	ES2F_ADD_API_CASE(copytexsubimage2d_neg_level_tex2d, "Invalid glCopyTexSubImage2D() usage",
982		{
983			GLuint texture;
984			glGenTextures(1, &texture);
985			glBindTexture(GL_TEXTURE_2D, texture);
986			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
987
988			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
989			glCopyTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, 0, 0);
990			expectError(GL_INVALID_VALUE);
991			m_log << TestLog::EndSection;
992
993			glDeleteTextures(1, &texture);
994		});
995	ES2F_ADD_API_CASE(copytexsubimage2d_neg_level_cube, "Invalid glCopyTexSubImage2D() usage",
996		{
997			GLuint texture;
998			glGenTextures(1, &texture);
999			glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
1000			FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL););
1001
1002			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
1003			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, 0, 0, 0, 0, 0, 0);
1004			expectError(GL_INVALID_VALUE);
1005			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, 0, 0, 0, 0, 0, 0);
1006			expectError(GL_INVALID_VALUE);
1007			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, 0, 0, 0, 0, 0, 0);
1008			expectError(GL_INVALID_VALUE);
1009			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, 0, 0, 0, 0, 0, 0);
1010			expectError(GL_INVALID_VALUE);
1011			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, 0, 0, 0, 0, 0, 0);
1012			expectError(GL_INVALID_VALUE);
1013			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, 0, 0, 0, 0, 0, 0);
1014			expectError(GL_INVALID_VALUE);
1015			m_log << TestLog::EndSection;
1016
1017			glDeleteTextures(1, &texture);
1018		});
1019	ES2F_ADD_API_CASE(copytexsubimage2d_level_max_tex2d, "Invalid glCopyTexSubImage2D() usage",
1020		{
1021			GLuint texture;
1022			glGenTextures(1, &texture);
1023			glBindTexture(GL_TEXTURE_2D, texture);
1024			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1025
1026			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
1027			deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
1028			glCopyTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, 0, 0);
1029			expectError(GL_INVALID_VALUE);
1030			m_log << TestLog::EndSection;
1031
1032			glDeleteTextures(1, &texture);
1033		});
1034	ES2F_ADD_API_CASE(copytexsubimage2d_level_max_cube_pos, "Invalid glCopyTexSubImage2D() usage",
1035		{
1036			GLuint texture;
1037			glGenTextures(1, &texture);
1038			glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
1039			FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL););
1040
1041			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_SIZE).");
1042			deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
1043			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxTextureSize, 0, 0, 0, 0, 0, 0);
1044			expectError(GL_INVALID_VALUE);
1045			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxTextureSize, 0, 0, 0, 0, 0, 0);
1046			expectError(GL_INVALID_VALUE);
1047			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxTextureSize, 0, 0, 0, 0, 0, 0);
1048			expectError(GL_INVALID_VALUE);
1049			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxTextureSize, 0, 0, 0, 0, 0, 0);
1050			expectError(GL_INVALID_VALUE);
1051			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxTextureSize, 0, 0, 0, 0, 0, 0);
1052			expectError(GL_INVALID_VALUE);
1053			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxTextureSize, 0, 0, 0, 0, 0, 0);
1054			expectError(GL_INVALID_VALUE);
1055			m_log << TestLog::EndSection;
1056
1057			glDeleteTextures(1, &texture);
1058		});
1059	ES2F_ADD_API_CASE(copytexsubimage2d_neg_offset, "Invalid glCopyTexSubImage2D() usage",
1060		{
1061			GLuint texture;
1062			glGenTextures(1, &texture);
1063			glBindTexture(GL_TEXTURE_2D, texture);
1064			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1065
1066			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset < 0 or yoffset < 0.");
1067			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 0, 0, 0, 0);
1068			expectError(GL_INVALID_VALUE);
1069			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 0, 0, 0, 0);
1070			expectError(GL_INVALID_VALUE);
1071			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, -1, -1, 0, 0, 0, 0);
1072			expectError(GL_INVALID_VALUE);
1073			m_log << TestLog::EndSection;
1074
1075			glDeleteTextures(1, &texture);
1076		});
1077	ES2F_ADD_API_CASE(copytexsubimage2d_offset_allowed, "Invalid glCopyTexSubImage2D() usage",
1078		{
1079			GLuint texture;
1080			glGenTextures(1, &texture);
1081			glBindTexture(GL_TEXTURE_2D, texture);
1082			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1083
1084			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset + width > texture_width or yoffset + height > texture_height.");
1085			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 8, 4, 0, 0, 10, 10);
1086			expectError(GL_INVALID_VALUE);
1087			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 4, 8, 0, 0, 10, 10);
1088			expectError(GL_INVALID_VALUE);
1089			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 8, 8, 0, 0, 10, 10);
1090			expectError(GL_INVALID_VALUE);
1091			m_log << TestLog::EndSection;
1092
1093			glDeleteTextures(1, &texture);
1094		});
1095	ES2F_ADD_API_CASE(copytexsubimage2d_neg_wdt_hgt, "Invalid glCopyTexSubImage2D() usage",
1096		{
1097			GLuint texture;
1098			glGenTextures(1, &texture);
1099			glBindTexture(GL_TEXTURE_2D, texture);
1100			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1101
1102			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1103			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, -1, 0);
1104			expectError(GL_INVALID_VALUE);
1105			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, -1);
1106			expectError(GL_INVALID_VALUE);
1107			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, -1, -1);
1108			expectError(GL_INVALID_VALUE);
1109			m_log << TestLog::EndSection;
1110
1111			glDeleteTextures(1, &texture);
1112		});
1113	ES2F_ADD_API_CASE(copytexsubimage2d_incomplete_framebuffer, "Invalid glCopyTexSubImage2D() usage",
1114		{
1115			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
1116
1117			GLuint texture[2];
1118			GLuint fbo;
1119
1120			glGenTextures			(2, texture);
1121			glBindTexture			(GL_TEXTURE_2D, texture[0]);
1122			glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1123			glBindTexture			(GL_TEXTURE_CUBE_MAP, texture[1]);
1124			glTexImage2D			(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1125			glTexImage2D			(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1126			glTexImage2D			(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1127			glTexImage2D			(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1128			glTexImage2D			(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1129			glTexImage2D			(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1130			expectError(GL_NO_ERROR);
1131
1132			glGenFramebuffers(1, &fbo);
1133			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1134			glCheckFramebufferStatus(GL_FRAMEBUFFER);
1135			expectError(GL_NO_ERROR);
1136
1137			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 0);
1138			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1139			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 0, 0, 0);
1140			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1141			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 0, 0, 0);
1142			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1143			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 0, 0, 0);
1144			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1145			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 0, 0, 0);
1146			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1147			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 0, 0, 0);
1148			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1149			glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 0, 0, 0);
1150			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1151
1152			glBindFramebuffer(GL_FRAMEBUFFER, 0);
1153			glDeleteFramebuffers(1, &fbo);
1154			glDeleteTextures(2, texture);
1155
1156			m_log << tcu::TestLog::EndSection;
1157
1158		});
1159
1160	// glDeleteTextures
1161
1162	ES2F_ADD_API_CASE(deletetextures_invalid_number, "Invalid glDeleteTextures() usage",
1163		{
1164			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
1165			glDeleteTextures(-1,0);
1166			expectError(GL_INVALID_VALUE);
1167			m_log << TestLog::EndSection;
1168		});
1169	ES2F_ADD_API_CASE(deletetextures_invalid_number_bind, "Invalid glDeleteTextures() usage",
1170		{
1171			GLuint texture;
1172			glGenTextures(1, &texture);
1173
1174			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
1175			glBindTexture(GL_TEXTURE_2D, texture);
1176			glDeleteTextures(-1,0);
1177			expectError(GL_INVALID_VALUE);
1178			m_log << TestLog::EndSection;
1179
1180			glDeleteTextures(1, &texture);
1181		});
1182
1183	// glGenerateMipmap
1184
1185	ES2F_ADD_API_CASE(generatemipmap_invalid_target, "Invalid glGenerateMipmap() usage",
1186		{
1187			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP.");
1188			glGenerateMipmap(0);
1189			expectError(GL_INVALID_ENUM);
1190			m_log << TestLog::EndSection;
1191		});
1192	ES2F_ADD_API_CASE(generatemipmap_npot_wdt_hgt, "Invalid glGenerateMipmap() usage",
1193		{
1194			GLuint texture;
1195
1196			if (m_context.getContextInfo().isExtensionSupported("GL_OES_texture_npot"))
1197			{
1198				m_log	<< tcu::TestLog::Message
1199						<< "GL_OES_texture_npot extension removes error condition, skipping test"
1200						<< tcu::TestLog::EndMessage;
1201				return;
1202			}
1203
1204			glActiveTexture(GL_TEXTURE0);
1205			glGenTextures(1, &texture);
1206			glBindTexture(GL_TEXTURE_2D, texture);
1207
1208			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if either the width or height of the zero level array is not a power of two.");
1209			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 257, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1210			glGenerateMipmap(GL_TEXTURE_2D);
1211			expectError(GL_INVALID_OPERATION);
1212			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 257, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1213			glGenerateMipmap(GL_TEXTURE_2D);
1214			expectError(GL_INVALID_OPERATION);
1215			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 257, 257, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1216			glGenerateMipmap(GL_TEXTURE_2D);
1217			expectError(GL_INVALID_OPERATION);
1218			m_log << TestLog::EndSection;
1219
1220			glDeleteTextures(1, &texture);
1221		});
1222	ES2F_ADD_API_CASE(generatemipmap_zero_level_array_compressed, "Invalid glGenerateMipmap() usage",
1223		{
1224			vector<deInt32> compressedFormats;
1225			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, compressedFormats);
1226			if (!compressedFormats.empty())
1227			{
1228				GLuint texture;
1229				glGenTextures(1, &texture);
1230				glBindTexture(GL_TEXTURE_2D, texture);
1231				m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the zero level array is stored in a compressed internal format.");
1232				glCompressedTexImage2D(GL_TEXTURE_2D, 0, compressedFormats[0], 0, 0, 0, 0, 0);
1233				glGenerateMipmap(GL_TEXTURE_2D);
1234				expectError(GL_INVALID_OPERATION);
1235				m_log << TestLog::EndSection;
1236				glDeleteTextures(1, &texture);
1237			}
1238		});
1239	ES2F_ADD_API_CASE(generatemipmap_incomplete_cube, "Invalid glGenerateMipmap() usage",
1240		{
1241			GLuint texture;
1242			glGenTextures(1, &texture);
1243			glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
1244
1245			m_log << TestLog::Section("", "INVALID_OPERATION is generated if the texture bound to target is not cube complete.");
1246			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1247			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1248			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1249			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1250			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1251			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1252			glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
1253			expectError(GL_INVALID_OPERATION);
1254			m_log << TestLog::EndSection;
1255
1256			glDeleteTextures(1, &texture);
1257		});
1258
1259	// glGenTextures
1260
1261	ES2F_ADD_API_CASE(gentextures_invalid_size, "Invalid glGenTextures() usage",
1262		{
1263			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
1264			glGenTextures(-1, 0);
1265			expectError(GL_INVALID_VALUE);
1266			m_log << TestLog::EndSection;
1267		});
1268
1269	// glPixelStorei
1270
1271	ES2F_ADD_API_CASE(pixelstorei_invalid_pname, "Invalid glPixelStorei() usage",
1272		{
1273			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
1274			glPixelStorei(0,1);
1275			expectError(GL_INVALID_ENUM);
1276			m_log << TestLog::EndSection;
1277		});
1278	ES2F_ADD_API_CASE(pixelstorei_invalid_param, "Invalid glPixelStorei() usage",
1279		{
1280			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if alignment is specified as other than 1, 2, 4, or 8.");
1281			glPixelStorei(GL_PACK_ALIGNMENT, 0);
1282			expectError(GL_INVALID_VALUE);
1283			glPixelStorei(GL_UNPACK_ALIGNMENT, 0);
1284			expectError(GL_INVALID_VALUE);
1285			glPixelStorei(GL_PACK_ALIGNMENT, 16);
1286			expectError(GL_INVALID_VALUE);
1287			glPixelStorei(GL_UNPACK_ALIGNMENT, 16);
1288			expectError(GL_INVALID_VALUE);
1289			m_log << TestLog::EndSection;
1290		});
1291
1292	// glTexImage2D
1293
1294	ES2F_ADD_API_CASE(teximage2d_invalid_target, "Invalid glTexImage2D() usage",
1295		{
1296			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
1297			glTexImage2D(0, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1298			expectError(GL_INVALID_ENUM);
1299			m_log << TestLog::EndSection;
1300		});
1301	ES2F_ADD_API_CASE(teximage2d_invalid_format, "Invalid glTexImage2D() usage",
1302		{
1303			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if format or type is not an accepted value.");
1304			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, 0, GL_UNSIGNED_BYTE, 0);
1305			expectError(GL_INVALID_ENUM);
1306			m_log << TestLog::EndSection;
1307		});
1308	ES2F_ADD_API_CASE(teximage2d_invalid_type, "Invalid glTexImage2D() usage",
1309		{
1310			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if format or type is not an accepted value.");
1311			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, 0, 0);
1312			expectError(GL_INVALID_ENUM);
1313			m_log << TestLog::EndSection;
1314		});
1315	ES2F_ADD_API_CASE(teximage2d_inequal_width_height_cube, "Invalid glTexImage2D() usage",
1316		{
1317			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if target is one of the six cube map 2D image targets and the width and height parameters are not equal.");
1318			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1319			expectError(GL_INVALID_VALUE);
1320			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1321			expectError(GL_INVALID_VALUE);
1322			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1323			expectError(GL_INVALID_VALUE);
1324			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1325			expectError(GL_INVALID_VALUE);
1326			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1327			expectError(GL_INVALID_VALUE);
1328			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1329			expectError(GL_INVALID_VALUE);
1330			m_log << TestLog::EndSection;
1331		});
1332	ES2F_ADD_API_CASE(teximage2d_neg_level_tex2d, "Invalid glTexImage2D() usage",
1333		{
1334			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
1335			glTexImage2D(GL_TEXTURE_2D, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1336			expectError(GL_INVALID_VALUE);
1337			m_log << TestLog::EndSection;
1338		});
1339	ES2F_ADD_API_CASE(teximage2d_neg_level_cube, "Invalid glTexImage2D() usage",
1340		{
1341			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
1342			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1343			expectError(GL_INVALID_VALUE);
1344			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1345			expectError(GL_INVALID_VALUE);
1346			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1347			expectError(GL_INVALID_VALUE);
1348			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1349			expectError(GL_INVALID_VALUE);
1350			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1351			expectError(GL_INVALID_VALUE);
1352			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1353			expectError(GL_INVALID_VALUE);
1354			m_log << TestLog::EndSection;
1355		});
1356	ES2F_ADD_API_CASE(teximage2d_level_max_tex2d, "Invalid glTexImage2D() usage",
1357		{
1358			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
1359			deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
1360			glTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1361			expectError(GL_INVALID_VALUE);
1362			m_log << TestLog::EndSection;
1363		});
1364	ES2F_ADD_API_CASE(teximage2d_level_max_cube, "Invalid glTexImage2D() usage",
1365		{
1366			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
1367			deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
1368			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxTextureSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1369			expectError(GL_INVALID_VALUE);
1370			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxTextureSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1371			expectError(GL_INVALID_VALUE);
1372			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxTextureSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1373			expectError(GL_INVALID_VALUE);
1374			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxTextureSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1375			expectError(GL_INVALID_VALUE);
1376			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxTextureSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1377			expectError(GL_INVALID_VALUE);
1378			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxTextureSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1379			expectError(GL_INVALID_VALUE);
1380			m_log << TestLog::EndSection;
1381		});
1382	ES2F_ADD_API_CASE(teximage2d_invalid_internalformat, "Invalid glTexImage2D() usage",
1383		{
1384			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if internalformat is not an accepted format.");
1385			glTexImage2D(GL_TEXTURE_2D, 0, 0, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1386			expectError(GL_INVALID_VALUE);
1387			m_log << TestLog::EndSection;
1388		});
1389	ES2F_ADD_API_CASE(teximage2d_neg_width_height_tex2d, "Invalid glTexImage2D() usage",
1390		{
1391			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1392			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1393			expectError(GL_INVALID_VALUE);
1394			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1395			expectError(GL_INVALID_VALUE);
1396			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1397			expectError(GL_INVALID_VALUE);
1398			m_log << TestLog::EndSection;
1399		});
1400	ES2F_ADD_API_CASE(teximage2d_neg_width_height_cube_pos_x, "Invalid glTexImage2D() usage",
1401		{
1402			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1403			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1404			expectError(GL_INVALID_VALUE);
1405			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1406			expectError(GL_INVALID_VALUE);
1407			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1408			expectError(GL_INVALID_VALUE);
1409			m_log << TestLog::EndSection;
1410		});
1411	ES2F_ADD_API_CASE(teximage2d_neg_width_height_cube_pos_y, "Invalid glTexImage2D() usage",
1412		{
1413			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1414			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1415			expectError(GL_INVALID_VALUE);
1416			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1417			expectError(GL_INVALID_VALUE);
1418			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1419			expectError(GL_INVALID_VALUE);
1420			m_log << TestLog::EndSection;
1421		});
1422	ES2F_ADD_API_CASE(teximage2d_neg_width_height_cube_pos_z, "Invalid glTexImage2D() usage",
1423		{
1424			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1425			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1426			expectError(GL_INVALID_VALUE);
1427			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1428			expectError(GL_INVALID_VALUE);
1429			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1430			expectError(GL_INVALID_VALUE);
1431			m_log << TestLog::EndSection;
1432		});
1433	ES2F_ADD_API_CASE(teximage2d_neg_width_height_cube_neg_x, "Invalid glTexImage2D() usage",
1434		{
1435			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1436			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1437			expectError(GL_INVALID_VALUE);
1438			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1439			expectError(GL_INVALID_VALUE);
1440			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1441			expectError(GL_INVALID_VALUE);
1442			m_log << TestLog::EndSection;
1443		});
1444	ES2F_ADD_API_CASE(teximage2d_neg_width_height_cube_neg_y, "Invalid glTexImage2D() usage",
1445		{
1446			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1447			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1448			expectError(GL_INVALID_VALUE);
1449			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1450			expectError(GL_INVALID_VALUE);
1451			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1452			expectError(GL_INVALID_VALUE);
1453			m_log << TestLog::EndSection;
1454		});
1455	ES2F_ADD_API_CASE(teximage2d_neg_width_height_cube_neg_z, "Invalid glTexImage2D() usage",
1456		{
1457			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1458			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1459			expectError(GL_INVALID_VALUE);
1460			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1461			expectError(GL_INVALID_VALUE);
1462			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1463			expectError(GL_INVALID_VALUE);
1464			m_log << TestLog::EndSection;
1465		});
1466	ES2F_ADD_API_CASE(teximage2d_width_height_max_tex2d, "Invalid glTexImage2D() usage",
1467		{
1468			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE.");
1469			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1;
1470			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, maxTextureSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1471			expectError(GL_INVALID_VALUE);
1472			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1473			expectError(GL_INVALID_VALUE);
1474			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, maxTextureSize, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1475			expectError(GL_INVALID_VALUE);
1476			m_log << TestLog::EndSection;
1477		});
1478	ES2F_ADD_API_CASE(teximage2d_width_height_max_cube_pos_x, "Invalid glTexImage2D() usage",
1479		{
1480			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
1481			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
1482			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, maxTextureSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1483			expectError(GL_INVALID_VALUE);
1484			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1485			expectError(GL_INVALID_VALUE);
1486			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, maxTextureSize, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1487			expectError(GL_INVALID_VALUE);
1488			m_log << TestLog::EndSection;
1489		});
1490	ES2F_ADD_API_CASE(teximage2d_width_height_max_cube_pos_y, "Invalid glTexImage2D() usage",
1491		{
1492			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
1493			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
1494			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, maxTextureSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1495			expectError(GL_INVALID_VALUE);
1496			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1497			expectError(GL_INVALID_VALUE);
1498			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, maxTextureSize, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1499			expectError(GL_INVALID_VALUE);
1500			m_log << TestLog::EndSection;
1501		});
1502	ES2F_ADD_API_CASE(teximage2d_width_height_max_cube_pos_z, "Invalid glTexImage2D() usage",
1503		{
1504			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
1505			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
1506			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, maxTextureSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1507			expectError(GL_INVALID_VALUE);
1508			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1509			expectError(GL_INVALID_VALUE);
1510			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, maxTextureSize, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1511			expectError(GL_INVALID_VALUE);
1512			m_log << TestLog::EndSection;
1513		});
1514	ES2F_ADD_API_CASE(teximage2d_width_height_max_cube_neg_x, "Invalid glTexImage2D() usage",
1515		{
1516			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
1517			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
1518			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, maxTextureSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1519			expectError(GL_INVALID_VALUE);
1520			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1521			expectError(GL_INVALID_VALUE);
1522			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, maxTextureSize, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1523			expectError(GL_INVALID_VALUE);
1524			m_log << TestLog::EndSection;
1525		});
1526	ES2F_ADD_API_CASE(teximage2d_width_height_max_cube_neg_y, "Invalid glTexImage2D() usage",
1527		{
1528			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
1529			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
1530			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, maxTextureSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1531			expectError(GL_INVALID_VALUE);
1532			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1533			expectError(GL_INVALID_VALUE);
1534			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, maxTextureSize, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1535			expectError(GL_INVALID_VALUE);
1536			m_log << TestLog::EndSection;
1537		});
1538	ES2F_ADD_API_CASE(teximage2d_width_height_max_cube_neg_z, "Invalid glTexImage2D() usage",
1539		{
1540			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
1541			int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
1542			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, maxTextureSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1543			expectError(GL_INVALID_VALUE);
1544			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1545			expectError(GL_INVALID_VALUE);
1546			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, maxTextureSize, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1547			expectError(GL_INVALID_VALUE);
1548			m_log << TestLog::EndSection;
1549		});
1550	ES2F_ADD_API_CASE(teximage2d_invalid_border, "Invalid glTexImage2D() usage",
1551		{
1552			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0.");
1553			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1554			expectError(GL_INVALID_VALUE);
1555			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1556			expectError(GL_INVALID_VALUE);
1557			m_log << TestLog::EndSection;
1558		});
1559	ES2F_ADD_API_CASE(teximage2d_format_mismatch, "Invalid glTexImage2D() usage",
1560		{
1561			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if format does not match internalformat.");
1562			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1563			expectError(GL_INVALID_OPERATION);
1564			m_log << TestLog::EndSection;
1565		});
1566	ES2F_ADD_API_CASE(teximage2d_type_format_mismatch, "Invalid glTexImage2D() usage",
1567		{
1568			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if type is GL_UNSIGNED_SHORT_4_4_4_4 or GL_UNSIGNED_SHORT_5_5_5_1 and format is not GL_RGBA.");
1569			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
1570			expectError(GL_INVALID_OPERATION);
1571			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
1572			expectError(GL_INVALID_OPERATION);
1573			m_log << TestLog::EndSection;
1574		});
1575
1576	// glTexSubImage2D
1577
1578	ES2F_ADD_API_CASE(texsubimage2d_invalid_target, "Invalid glTexSubImage2D() usage",
1579		{
1580			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
1581			glTexSubImage2D(0, 0, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1582			expectError(GL_INVALID_ENUM);
1583			m_log << TestLog::EndSection;
1584		});
1585	ES2F_ADD_API_CASE(texsubimage2d_invalid_format, "Invalid glTexSubImage2D() usage",
1586		{
1587			GLuint texture;
1588			glGenTextures(1, &texture);
1589			glBindTexture(GL_TEXTURE_2D, texture);
1590			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1591
1592			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if format or type is not an accepted value.");
1593			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, GL_UNSIGNED_BYTE, 0);
1594			expectError(GL_INVALID_ENUM);
1595			m_log << TestLog::EndSection;
1596
1597			glDeleteTextures(1, &texture);
1598		});
1599	ES2F_ADD_API_CASE(texsubimage2d_invalid_type, "Invalid glTexSubImage2D() usage",
1600		{
1601			GLuint texture;
1602			glGenTextures(1, &texture);
1603			glBindTexture(GL_TEXTURE_2D, texture);
1604			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1605
1606			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if format or type is not an accepted value.");
1607			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_RGB, 0, 0);
1608			expectError(GL_INVALID_ENUM);
1609			m_log << TestLog::EndSection;
1610
1611			glDeleteTextures(1, &texture);
1612		});
1613	ES2F_ADD_API_CASE(texsubimage2d_neg_level_tex2d, "Invalid glTexSubImage2D() usage",
1614		{
1615			GLuint texture;
1616			glGenTextures(1, &texture);
1617			glBindTexture(GL_TEXTURE_2D, texture);
1618			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1619
1620			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
1621			glTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1622			expectError(GL_INVALID_VALUE);
1623			m_log << TestLog::EndSection;
1624
1625			glDeleteTextures(1, &texture);
1626		});
1627	ES2F_ADD_API_CASE(texsubimage2d_neg_level_cube, "Invalid glTexSubImage2D() usage",
1628		{
1629			GLuint texture;
1630			glGenTextures(1, &texture);
1631			glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
1632			FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL););
1633
1634			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
1635			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1636			expectError(GL_INVALID_VALUE);
1637			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1638			expectError(GL_INVALID_VALUE);
1639			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1640			expectError(GL_INVALID_VALUE);
1641			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1642			expectError(GL_INVALID_VALUE);
1643			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1644			expectError(GL_INVALID_VALUE);
1645			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1646			expectError(GL_INVALID_VALUE);
1647			m_log << TestLog::EndSection;
1648
1649			glDeleteTextures(1, &texture);
1650		});
1651	ES2F_ADD_API_CASE(texsubimage2d_level_max_tex2d, "Invalid glTexSubImage2D() usage",
1652		{
1653			GLuint texture;
1654			glGenTextures(1, &texture);
1655			glBindTexture(GL_TEXTURE_2D, texture);
1656			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1657
1658			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
1659			deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
1660			glTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1661			expectError(GL_INVALID_VALUE);
1662			m_log << TestLog::EndSection;
1663
1664			glDeleteTextures(1, &texture);
1665		});
1666	ES2F_ADD_API_CASE(texsubimage2d_level_max_cube, "Invalid glTexSubImage2D() usage",
1667		{
1668			GLuint texture;
1669			glGenTextures(1, &texture);
1670			glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
1671			FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL););
1672
1673			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
1674			deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
1675			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxTextureSize, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1676			expectError(GL_INVALID_VALUE);
1677			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxTextureSize, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1678			expectError(GL_INVALID_VALUE);
1679			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxTextureSize, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1680			expectError(GL_INVALID_VALUE);
1681			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxTextureSize, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1682			expectError(GL_INVALID_VALUE);
1683			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxTextureSize, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1684			expectError(GL_INVALID_VALUE);
1685			glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxTextureSize, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1686			expectError(GL_INVALID_VALUE);
1687			m_log << TestLog::EndSection;
1688
1689			glDeleteTextures(1, &texture);
1690		});
1691	ES2F_ADD_API_CASE(texsubimage2d_neg_offset, "Invalid glTexSubImage2D() usage",
1692		{
1693			GLuint texture;
1694			glGenTextures(1, &texture);
1695			glBindTexture(GL_TEXTURE_2D, texture);
1696			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1697
1698			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset or yoffset are negative.");
1699			glTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1700			expectError(GL_INVALID_VALUE);
1701			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1702			expectError(GL_INVALID_VALUE);
1703			glTexSubImage2D(GL_TEXTURE_2D, 0, -1, -1, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1704			expectError(GL_INVALID_VALUE);
1705			m_log << TestLog::EndSection;
1706
1707			glDeleteTextures(1, &texture);
1708		});
1709	ES2F_ADD_API_CASE(texsubimage2d_offset_allowed, "Invalid glTexSubImage2D() usage",
1710		{
1711			GLuint texture;
1712			glGenTextures(1, &texture);
1713			glBindTexture(GL_TEXTURE_2D, texture);
1714			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1715
1716			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset + width > texture_width or yoffset + height > texture_height.");
1717			glTexSubImage2D(GL_TEXTURE_2D, 0, 8, 4, 10, 10, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1718			expectError(GL_INVALID_VALUE);
1719			glTexSubImage2D(GL_TEXTURE_2D, 0, 4, 8, 10, 10, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1720			expectError(GL_INVALID_VALUE);
1721			glTexSubImage2D(GL_TEXTURE_2D, 0, 8, 8, 10, 10, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1722			expectError(GL_INVALID_VALUE);
1723			m_log << TestLog::EndSection;
1724
1725			glDeleteTextures(1, &texture);
1726		});
1727	ES2F_ADD_API_CASE(texsubimage2d_neg_wdt_hgt, "Invalid glTexSubImage2D() usage",
1728		{
1729			GLuint texture;
1730			glGenTextures(1, &texture);
1731			glBindTexture(GL_TEXTURE_2D, texture);
1732			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1733
1734			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
1735			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1736			expectError(GL_INVALID_VALUE);
1737			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1738			expectError(GL_INVALID_VALUE);
1739			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1740			expectError(GL_INVALID_VALUE);
1741			m_log << TestLog::EndSection;
1742
1743			glDeleteTextures(1, &texture);
1744		});
1745	ES2F_ADD_API_CASE(texsubimage2d_type_format_mismatch, "Invalid glTexSubImage2D() usage",
1746		{
1747			GLuint texture;
1748			glGenTextures(1, &texture);
1749			glBindTexture(GL_TEXTURE_2D, texture);
1750			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1751
1752			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if type is GL_UNSIGNED_SHORT_5_6_5 and format is not GL_RGB");
1753			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, 0);
1754			expectError(GL_INVALID_OPERATION);
1755			m_log << tcu::TestLog::EndSection;
1756
1757			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if type is GL_UNSIGNED_SHORT_4_4_4_4 or GL_UNSIGNED_SHORT_5_5_5_1 and format is not GL_RGBA.");
1758			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
1759			expectError(GL_INVALID_OPERATION);
1760			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
1761			expectError(GL_INVALID_OPERATION);
1762			m_log << tcu::TestLog::EndSection;
1763
1764			glDeleteTextures(1, &texture);
1765		});
1766
1767	// glTexParameteri
1768
1769	ES2F_ADD_API_CASE(texparameteri, "Invalid glTexParameteri() usage",
1770		{
1771			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1772			glTexParameteri(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1773			expectError(GL_INVALID_ENUM);
1774			glTexParameteri(GL_TEXTURE_2D, 0, GL_LINEAR);
1775			expectError(GL_INVALID_ENUM);
1776			glTexParameteri(0, 0, GL_LINEAR);
1777			expectError(GL_INVALID_ENUM);
1778			m_log << TestLog::EndSection;
1779
1780			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not.");
1781			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0);
1782			expectError(GL_INVALID_ENUM);
1783			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT);
1784			expectError(GL_INVALID_ENUM);
1785			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0);
1786			expectError(GL_INVALID_ENUM);
1787			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST);
1788			expectError(GL_INVALID_ENUM);
1789			m_log << TestLog::EndSection;
1790		});
1791	ES2F_ADD_API_CASE(texparameteri_bind, "Invalid glTexParameteri() usage",
1792		{
1793			GLuint texture;
1794			glGenTextures(1, &texture);
1795			glBindTexture(GL_TEXTURE_2D, texture);
1796
1797			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1798			glTexParameteri(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1799			expectError(GL_INVALID_ENUM);
1800			glTexParameteri(GL_TEXTURE_2D, 0, GL_LINEAR);
1801			expectError(GL_INVALID_ENUM);
1802			glTexParameteri(0, 0, GL_LINEAR);
1803			expectError(GL_INVALID_ENUM);
1804			m_log << TestLog::EndSection;
1805
1806			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not.");
1807			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0);
1808			expectError(GL_INVALID_ENUM);
1809			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT);
1810			expectError(GL_INVALID_ENUM);
1811			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0);
1812			expectError(GL_INVALID_ENUM);
1813			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST);
1814			expectError(GL_INVALID_ENUM);
1815			m_log << TestLog::EndSection;
1816
1817			glDeleteTextures(1, &texture);
1818		});
1819
1820	// glTexParameterf
1821
1822	ES2F_ADD_API_CASE(texparameterf, "Invalid glTexParameterf() usage",
1823		{
1824			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1825			glTexParameterf(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1826			expectError(GL_INVALID_ENUM);
1827			glTexParameterf(GL_TEXTURE_2D, 0, GL_LINEAR);
1828			expectError(GL_INVALID_ENUM);
1829			glTexParameterf(0, 0, GL_LINEAR);
1830			expectError(GL_INVALID_ENUM);
1831			m_log << TestLog::EndSection;
1832
1833			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not.");
1834			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0);
1835			expectError(GL_INVALID_ENUM);
1836			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT);
1837			expectError(GL_INVALID_ENUM);
1838			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0);
1839			expectError(GL_INVALID_ENUM);
1840			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST);
1841			expectError(GL_INVALID_ENUM);
1842			m_log << TestLog::EndSection;
1843		});
1844	ES2F_ADD_API_CASE(texparameterf_bind, "Invalid glTexParameterf() usage",
1845		{
1846			GLuint texture;
1847			glGenTextures(1, &texture);
1848			glBindTexture(GL_TEXTURE_2D, texture);
1849
1850			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1851			glTexParameterf(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1852			expectError(GL_INVALID_ENUM);
1853			glTexParameterf(GL_TEXTURE_2D, 0, GL_LINEAR);
1854			expectError(GL_INVALID_ENUM);
1855			glTexParameterf(0, 0, GL_LINEAR);
1856			expectError(GL_INVALID_ENUM);
1857			m_log << TestLog::EndSection;
1858
1859			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not.");
1860			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0);
1861			expectError(GL_INVALID_ENUM);
1862			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT);
1863			expectError(GL_INVALID_ENUM);
1864			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0);
1865			expectError(GL_INVALID_ENUM);
1866			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST);
1867			expectError(GL_INVALID_ENUM);
1868			m_log << TestLog::EndSection;
1869
1870			glDeleteTextures(1, &texture);
1871		});
1872
1873	// glTexParameteriv
1874
1875	ES2F_ADD_API_CASE(texparameteriv, "Invalid glTexParameteriv() usage",
1876		{
1877			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1878			GLint params[1] = {GL_LINEAR};
1879			glTexParameteriv(0, GL_TEXTURE_MIN_FILTER, &params[0]);
1880			expectError(GL_INVALID_ENUM);
1881			glTexParameteriv(GL_TEXTURE_2D, 0, &params[0]);
1882			expectError(GL_INVALID_ENUM);
1883			glTexParameteriv(0, 0, &params[0]);
1884			expectError(GL_INVALID_ENUM);
1885			m_log << TestLog::EndSection;
1886
1887			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not.");
1888			params[0] = 0;
1889			glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &params[0]);
1890			expectError(GL_INVALID_ENUM);
1891			params[0] = GL_REPEAT;
1892			glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &params[0]);
1893			expectError(GL_INVALID_ENUM);
1894			params[0] = 0;
1895			glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &params[0]);
1896			expectError(GL_INVALID_ENUM);
1897			params[0] = GL_NEAREST;
1898			glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &params[0]);
1899			expectError(GL_INVALID_ENUM);
1900			m_log << TestLog::EndSection;
1901		});
1902	ES2F_ADD_API_CASE(texparameteriv_bind, "Invalid glTexParameteriv() usage",
1903		{
1904			GLuint texture;
1905			glGenTextures(1, &texture);
1906			glBindTexture(GL_TEXTURE_2D, texture);
1907
1908			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1909			GLint params[1] = {GL_LINEAR};
1910			glTexParameteriv(0, GL_TEXTURE_MIN_FILTER, &params[0]);
1911			expectError(GL_INVALID_ENUM);
1912			glTexParameteriv(GL_TEXTURE_2D, 0, &params[0]);
1913			expectError(GL_INVALID_ENUM);
1914			glTexParameteriv(0, 0, &params[0]);
1915			expectError(GL_INVALID_ENUM);
1916			m_log << TestLog::EndSection;
1917
1918			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not.");
1919			params[0] = 0;
1920			glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &params[0]);
1921			expectError(GL_INVALID_ENUM);
1922			params[0] = GL_REPEAT;
1923			glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &params[0]);
1924			expectError(GL_INVALID_ENUM);
1925			params[0] = 0;
1926			glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &params[0]);
1927			expectError(GL_INVALID_ENUM);
1928			params[0] = GL_NEAREST;
1929			glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &params[0]);
1930			expectError(GL_INVALID_ENUM);
1931			m_log << TestLog::EndSection;
1932
1933			glDeleteTextures(1, &texture);
1934		});
1935
1936	// glTexParameterfv
1937
1938	ES2F_ADD_API_CASE(texparameterfv, "Invalid glTexParameterfv() usage",
1939		{
1940			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1941			GLfloat params[1] = {GL_LINEAR};
1942			glTexParameterfv(0, GL_TEXTURE_MIN_FILTER, &params[0]);
1943			expectError(GL_INVALID_ENUM);
1944			glTexParameterfv(GL_TEXTURE_2D, 0, &params[0]);
1945			expectError(GL_INVALID_ENUM);
1946			glTexParameterfv(0, 0, &params[0]);
1947			expectError(GL_INVALID_ENUM);
1948			m_log << TestLog::EndSection;
1949
1950			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not.");
1951			params[0] = 0.0f;
1952			glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &params[0]);
1953			expectError(GL_INVALID_ENUM);
1954			params[0] = GL_REPEAT;
1955			glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &params[0]);
1956			expectError(GL_INVALID_ENUM);
1957			params[0] = 0.0f;
1958			glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &params[0]);
1959			expectError(GL_INVALID_ENUM);
1960			params[0] = GL_NEAREST;
1961			glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &params[0]);
1962			expectError(GL_INVALID_ENUM);
1963			m_log << TestLog::EndSection;
1964		});
1965	ES2F_ADD_API_CASE(texparameterfv_bind, "Invalid glTexParameterfv() usage",
1966		{
1967			GLuint texture;
1968			glGenTextures(1, &texture);
1969			glBindTexture(GL_TEXTURE_2D, texture);
1970
1971			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1972			GLfloat params[1] = {GL_LINEAR};
1973			glTexParameterfv(0, GL_TEXTURE_MIN_FILTER, &params[0]);
1974			expectError(GL_INVALID_ENUM);
1975			glTexParameterfv(GL_TEXTURE_2D, 0, &params[0]);
1976			expectError(GL_INVALID_ENUM);
1977			glTexParameterfv(0, 0, &params[0]);
1978			expectError(GL_INVALID_ENUM);
1979			m_log << TestLog::EndSection;
1980
1981			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not.");
1982			params[0] = 0.0f;
1983			glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &params[0]);
1984			expectError(GL_INVALID_ENUM);
1985			params[0] = GL_REPEAT;
1986			glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &params[0]);
1987			expectError(GL_INVALID_ENUM);
1988			params[0] = 0.0f;
1989			glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &params[0]);
1990			expectError(GL_INVALID_ENUM);
1991			params[0] = GL_NEAREST;
1992			glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &params[0]);
1993			expectError(GL_INVALID_ENUM);
1994			m_log << TestLog::EndSection;
1995
1996			glDeleteTextures(1, &texture);
1997		});
1998
1999	// glCompressedTexSubImage2D
2000
2001	ES2F_ADD_API_CASE(compressedtexsubimage2d_invalid_target, "Invalid glCompressedTexSubImage2D() usage",
2002		{
2003			vector<deInt32> supported;
2004			vector<deInt32> accepted;
2005			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, supported);
2006			getCompressedTexSubImage2DFormat(supported, accepted);
2007
2008			if (accepted.empty())
2009			{
2010				m_log << TestLog::Message << "// No suitable compressed formats found, cannot evaluate test." << TestLog::EndMessage;
2011				m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "No suitable compressed formats found");
2012			}
2013			else
2014			{
2015				for (int i = 0; i < (int)accepted.size(); i++)
2016				{
2017					const deInt32	glFormat	= accepted[i];
2018
2019					try
2020					{
2021						const tcu::CompressedTexFormat	format			= glu::mapGLCompressedTexFormat(glFormat);
2022						const tcu::IVec3				blockPixelSize	= tcu::getBlockPixelSize(format);
2023						const int						blockSize		= tcu::getBlockSize(format);
2024						const std::vector<deUint8>		data			(blockSize, 0);
2025						GLuint							texture			= 0;
2026
2027						glGenTextures(1, &texture);
2028						glBindTexture(GL_TEXTURE_2D, texture);
2029						expectError(GL_NO_ERROR);
2030
2031						glCompressedTexImage2D(GL_TEXTURE_2D, 0, glFormat, blockPixelSize.x(), blockPixelSize.y(), 0, blockSize, DE_NULL);
2032						expectError(GL_NO_ERROR);
2033
2034						m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid.");
2035						m_log << TestLog::Message << "// Using texture format " << tcu::toHex(accepted[i]) << TestLog::EndMessage;
2036						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2037						glCompressedTexSubImage2D(0, 0, 0, 0, 0, 0, accepted[i], 0, 0);
2038						expectError(GL_INVALID_ENUM);
2039						m_log << TestLog::EndSection;
2040
2041						glDeleteTextures(1, &texture);
2042						expectError(GL_NO_ERROR);
2043					}
2044					catch (const tcu::InternalError&)
2045					{
2046						m_log << TestLog::Message << "Skipping unknown format: " << glFormat << TestLog::EndMessage;
2047					}
2048				}
2049			}
2050		});
2051	ES2F_ADD_API_CASE(compressedtexsubimage2d_neg_level_tex2d, "Invalid glCompressedTexSubImage2D() usage",
2052		{
2053			vector<deInt32> supported;
2054			vector<deInt32> accepted;
2055			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, supported);
2056			getCompressedTexSubImage2DFormat(supported, accepted);
2057
2058			if (accepted.empty())
2059			{
2060				m_log << TestLog::Message << "// No suitable compressed formats found, cannot evaluate test." << TestLog::EndMessage;
2061				m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "No suitable compressed formats found");
2062			}
2063			else
2064			{
2065				for (int i = 0; i < (int)accepted.size(); i++)
2066				{
2067					const deInt32	glFormat	= accepted[i];
2068
2069					try
2070					{
2071						const tcu::CompressedTexFormat	format			= glu::mapGLCompressedTexFormat(glFormat);
2072						const tcu::IVec3				blockPixelSize	= tcu::getBlockPixelSize(format);
2073						const int						blockSize		= tcu::getBlockSize(format);
2074						const std::vector<deUint8>		data			(blockSize, 0);
2075						GLuint							texture			= 0;
2076
2077						glGenTextures(1, &texture);
2078						glBindTexture(GL_TEXTURE_2D, texture);
2079						expectError(GL_NO_ERROR);
2080
2081						glCompressedTexImage2D(GL_TEXTURE_2D, 0, glFormat, blockPixelSize.x(), blockPixelSize.y(), 0, blockSize, DE_NULL);
2082						expectError(GL_NO_ERROR);
2083
2084						m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
2085						m_log << TestLog::Message << "// Using texture format " << tcu::toHex(accepted[i]) << TestLog::EndMessage;
2086						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2087						//expectError(GL_NO_ERROR);
2088						glCompressedTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, accepted[i], 0, 0);
2089						expectError(GL_INVALID_VALUE);
2090						m_log << TestLog::EndSection;
2091
2092						glDeleteTextures(1, &texture);
2093						expectError(GL_NO_ERROR);
2094					}
2095					catch (const tcu::InternalError&)
2096					{
2097						m_log << TestLog::Message << "Skipping unknown format: " << glFormat << TestLog::EndMessage;
2098					}
2099				}
2100			}
2101		});
2102	ES2F_ADD_API_CASE(compressedtexsubimage2d_neg_level_cube, "Invalid glCompressedTexSubImage2D() usage",
2103		{
2104			vector<deInt32> supported;
2105			vector<deInt32> accepted;
2106			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, supported);
2107			getCompressedTexSubImage2DFormat(supported, accepted);
2108
2109			if (accepted.empty())
2110			{
2111				m_log << TestLog::Message << "// No suitable compressed formats found, cannot evaluate test." << TestLog::EndMessage;
2112				m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "No suitable compressed formats found");
2113			}
2114			else
2115			{
2116				for (int i = 0; i < (int)accepted.size(); i++)
2117				{
2118					const deInt32	glFormat	= accepted[i];
2119
2120					try
2121					{
2122						const tcu::CompressedTexFormat	format			= glu::mapGLCompressedTexFormat(glFormat);
2123						const tcu::IVec3				blockPixelSize	= tcu::getBlockPixelSize(format);
2124						const int						blockSize		= tcu::getBlockSize(format);
2125						const std::vector<deUint8>		data			(blockSize, 0);
2126						GLuint							texture			= 0;
2127
2128						glGenTextures(1, &texture);
2129						glBindTexture(GL_TEXTURE_2D, texture);
2130						expectError(GL_NO_ERROR);
2131
2132						glCompressedTexImage2D(GL_TEXTURE_2D, 0, glFormat, blockPixelSize.x(), blockPixelSize.y(), 0, blockSize, DE_NULL);
2133						expectError(GL_NO_ERROR);
2134
2135						m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0.");
2136						m_log << TestLog::Message << "// Using texture format " << tcu::toHex(accepted[i]) << TestLog::EndMessage;
2137						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, accepted[i], 0, 0, 0, 0, 0);
2138						//expectError(GL_NO_ERROR);
2139						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, 0, 0, 0, 0, accepted[i], 0, 0);
2140						expectError(GL_INVALID_VALUE);
2141						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, accepted[i], 0, 0, 0, 0, 0);
2142						//expectError(GL_NO_ERROR);
2143						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, 0, 0, 0, 0, accepted[i], 0, 0);
2144						expectError(GL_INVALID_VALUE);
2145						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, accepted[i], 0, 0, 0, 0, 0);
2146						//expectError(GL_NO_ERROR);
2147						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, 0, 0, 0, 0, accepted[i], 0, 0);
2148						expectError(GL_INVALID_VALUE);
2149						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, accepted[i], 0, 0, 0, 0, 0);
2150						//expectError(GL_NO_ERROR);
2151						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, 0, 0, 0, 0, accepted[i], 0, 0);
2152						expectError(GL_INVALID_VALUE);
2153						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, accepted[i], 0, 0, 0, 0, 0);
2154						//expectError(GL_NO_ERROR);
2155						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, 0, 0, 0, 0, accepted[i], 0, 0);
2156						expectError(GL_INVALID_VALUE);
2157						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, accepted[i], 0, 0, 0, 0, 0);
2158						//expectError(GL_NO_ERROR);
2159						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, 0, 0, 0, 0, accepted[i], 0, 0);
2160						expectError(GL_INVALID_VALUE);
2161						m_log << TestLog::EndSection;
2162
2163						glDeleteTextures(1, &texture);
2164						expectError(GL_NO_ERROR);
2165					}
2166					catch (const tcu::InternalError&)
2167					{
2168						m_log << TestLog::Message << "Skipping unknown format: " << glFormat << TestLog::EndMessage;
2169					}
2170				}
2171			}
2172		});
2173	ES2F_ADD_API_CASE(compressedtexsubimage2d_level_max_tex2d, "Invalid glCompressedTexSubImage2D() usage",
2174		{
2175			vector<deInt32> supported;
2176			vector<deInt32> accepted;
2177			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, supported);
2178			getCompressedTexSubImage2DFormat(supported, accepted);
2179
2180			if (accepted.empty())
2181			{
2182				m_log << TestLog::Message << "// No suitable compressed formats found, cannot evaluate test." << TestLog::EndMessage;
2183				m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "No suitable compressed formats found");
2184			}
2185			else
2186			{
2187				for (int i = 0; i < (int)accepted.size(); i++)
2188				{
2189					const deInt32	glFormat	= accepted[i];
2190
2191					try
2192					{
2193						const tcu::CompressedTexFormat	format			= glu::mapGLCompressedTexFormat(glFormat);
2194						const tcu::IVec3				blockPixelSize	= tcu::getBlockPixelSize(format);
2195						const int						blockSize		= tcu::getBlockSize(format);
2196						const std::vector<deUint8>		data			(blockSize, 0);
2197						GLuint							texture			= 0;
2198
2199						glGenTextures(1, &texture);
2200						glBindTexture(GL_TEXTURE_2D, texture);
2201						expectError(GL_NO_ERROR);
2202
2203						glCompressedTexImage2D(GL_TEXTURE_2D, 0, glFormat, blockPixelSize.x(), blockPixelSize.y(), 0, blockSize, DE_NULL);
2204						expectError(GL_NO_ERROR);
2205
2206						m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
2207						m_log << TestLog::Message << "// Using texture format " << tcu::toHex(accepted[i]) << TestLog::EndMessage;
2208						deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1;
2209						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2210						//expectError(GL_NO_ERROR);
2211						glCompressedTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, accepted[i], 0, 0);
2212						expectError(GL_INVALID_VALUE);
2213						m_log << TestLog::EndSection;
2214
2215						glDeleteTextures(1, &texture);
2216						expectError(GL_NO_ERROR);
2217					}
2218					catch (const tcu::InternalError&)
2219					{
2220						m_log << TestLog::Message << "Skipping unknown format: " << glFormat << TestLog::EndMessage;
2221					}
2222				}
2223			}
2224		});
2225	ES2F_ADD_API_CASE(compressedtexsubimage2d_level_max_cube, "Invalid glCompressedTexSubImage2D() usage",
2226		{
2227			vector<deInt32> supported;
2228			vector<deInt32> accepted;
2229			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, supported);
2230			getCompressedTexSubImage2DFormat(supported, accepted);
2231
2232			if (accepted.empty())
2233			{
2234				m_log << TestLog::Message << "// No suitable compressed formats found, cannot evaluate test." << TestLog::EndMessage;
2235				m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "No suitable compressed formats found");
2236			}
2237			else
2238			{
2239				for (int i = 0; i < (int)accepted.size(); i++)
2240				{
2241					const deInt32	glFormat	= accepted[i];
2242
2243					try
2244					{
2245						const tcu::CompressedTexFormat	format			= glu::mapGLCompressedTexFormat(glFormat);
2246						const tcu::IVec3				blockPixelSize	= tcu::getBlockPixelSize(format);
2247						const int						blockSize		= tcu::getBlockSize(format);
2248						const std::vector<deUint8>		data			(blockSize, 0);
2249						GLuint							texture			= 0;
2250
2251						glGenTextures(1, &texture);
2252						glBindTexture(GL_TEXTURE_2D, texture);
2253						expectError(GL_NO_ERROR);
2254
2255						glCompressedTexImage2D(GL_TEXTURE_2D, 0, glFormat, blockPixelSize.x(), blockPixelSize.y(), 0, blockSize, DE_NULL);
2256						expectError(GL_NO_ERROR);
2257
2258						m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
2259						m_log << TestLog::Message << "// Using texture format " << tcu::toHex(accepted[i]) << TestLog::EndMessage;
2260						deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
2261						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2262						//expectError(GL_NO_ERROR);
2263						glCompressedTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, accepted[i], 0, 0);
2264						expectError(GL_INVALID_VALUE);
2265						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, accepted[i], 0, 0, 0, 0, 0);
2266						//expectError(GL_NO_ERROR);
2267						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxTextureSize, 0, 0, 0, 0, accepted[i], 0, 0);
2268						expectError(GL_INVALID_VALUE);
2269						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, accepted[i], 0, 0, 0, 0, 0);
2270						//expectError(GL_NO_ERROR);
2271						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxTextureSize, 0, 0, 0, 0, accepted[i], 0, 0);
2272						expectError(GL_INVALID_VALUE);
2273						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, accepted[i], 0, 0, 0, 0, 0);
2274						//expectError(GL_NO_ERROR);
2275						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxTextureSize, 0, 0, 0, 0, accepted[i], 0, 0);
2276						expectError(GL_INVALID_VALUE);
2277						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, accepted[i], 0, 0, 0, 0, 0);
2278						//expectError(GL_NO_ERROR);
2279						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxTextureSize, 0, 0, 0, 0, accepted[i], 0, 0);
2280						expectError(GL_INVALID_VALUE);
2281						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, accepted[i], 0, 0, 0, 0, 0);
2282						//expectError(GL_NO_ERROR);
2283						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxTextureSize, 0, 0, 0, 0, accepted[i], 0, 0);
2284						expectError(GL_INVALID_VALUE);
2285						//glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, accepted[i], 0, 0, 0, 0, 0);
2286						//expectError(GL_NO_ERROR);
2287						glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxTextureSize, 0, 0, 0, 0, accepted[i], 0, 0);
2288						expectError(GL_INVALID_VALUE);
2289						m_log << TestLog::EndSection;
2290
2291						glDeleteTextures(1, &texture);
2292						expectError(GL_NO_ERROR);
2293					}
2294					catch (const tcu::InternalError&)
2295					{
2296						m_log << TestLog::Message << "Skipping unknown format: " << glFormat << TestLog::EndMessage;
2297					}
2298				}
2299			}
2300		});
2301		ES2F_ADD_API_CASE(compressedtexsubimage2d_neg_offset, "Invalid glCompressedTexSubImage2D() usage",
2302		{
2303			vector<deInt32> supported;
2304			vector<deInt32> accepted;
2305			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, supported);
2306			getCompressedTexSubImage2DFormat(supported, accepted);
2307
2308			if (accepted.empty())
2309			{
2310				m_log << TestLog::Message << "// No suitable compressed formats found, cannot evaluate test." << TestLog::EndMessage;
2311				m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "No suitable compressed formats found");
2312			}
2313			else
2314			{
2315				for (int i = 0; i < (int)accepted.size(); i++)
2316				{
2317					const deInt32	glFormat	= accepted[i];
2318
2319					try
2320					{
2321						const tcu::CompressedTexFormat	format			= glu::mapGLCompressedTexFormat(glFormat);
2322						const tcu::IVec3				blockPixelSize	= tcu::getBlockPixelSize(format);
2323						const int						blockSize		= tcu::getBlockSize(format);
2324						const std::vector<deUint8>		data			(blockSize, 0);
2325						GLuint							texture			= 0;
2326
2327						glGenTextures(1, &texture);
2328						glBindTexture(GL_TEXTURE_2D, texture);
2329						expectError(GL_NO_ERROR);
2330
2331						glCompressedTexImage2D(GL_TEXTURE_2D, 0, glFormat, blockPixelSize.x(), blockPixelSize.y(), 0, blockSize, DE_NULL);
2332						expectError(GL_NO_ERROR);
2333
2334						m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset or yoffset are negative.");
2335						m_log << TestLog::Message << "// Using texture format " << tcu::toHex(accepted[i]) << TestLog::EndMessage;
2336						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2337						//expectError(GL_NO_ERROR);
2338						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 0, 0, accepted[i], 0, 0);
2339						expectError(GL_INVALID_VALUE);
2340						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2341						//expectError(GL_NO_ERROR);
2342						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 0, 0, accepted[i], 0, 0);
2343						expectError(GL_INVALID_VALUE);
2344						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2345						//expectError(GL_NO_ERROR);
2346						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -1, -1, 0, 0, accepted[i], 0, 0);
2347						expectError(GL_INVALID_VALUE);
2348						m_log << TestLog::EndSection;
2349
2350						glDeleteTextures(1, &texture);
2351						expectError(GL_NO_ERROR);
2352					}
2353					catch (const tcu::InternalError&)
2354					{
2355						m_log << TestLog::Message << "Skipping unknown format: " << glFormat << TestLog::EndMessage;
2356					}
2357				}
2358			}
2359		});
2360	ES2F_ADD_API_CASE(compressedtexsubimage2d_offset_allowed, "Invalid glCompressedTexSubImage2D() usage",
2361		{
2362			vector<deInt32> supported;
2363			vector<deInt32> accepted;
2364			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, supported);
2365			getCompressedTexSubImage2DFormat(supported, accepted);
2366
2367			if (accepted.empty())
2368			{
2369				m_log << TestLog::Message << "// No suitable compressed formats found, cannot evaluate test." << TestLog::EndMessage;
2370				m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "No suitable compressed formats found");
2371			}
2372			else
2373			{
2374				for (int i = 0; i < (int)accepted.size(); i++)
2375				{
2376					const deInt32	glFormat	= accepted[i];
2377
2378					try
2379					{
2380						const tcu::CompressedTexFormat	format			= glu::mapGLCompressedTexFormat(glFormat);
2381						const tcu::IVec3				blockPixelSize	= tcu::getBlockPixelSize(format);
2382						const int						blockSize		= tcu::getBlockSize(format);
2383						const std::vector<deUint8>		data			(blockSize, 0);
2384						GLuint							texture			= 0;
2385
2386						glGenTextures(1, &texture);
2387						glBindTexture(GL_TEXTURE_2D, texture);
2388						expectError(GL_NO_ERROR);
2389
2390						glCompressedTexImage2D(GL_TEXTURE_2D, 0, glFormat, blockPixelSize.x(), blockPixelSize.y(), 0, blockSize, DE_NULL);
2391						expectError(GL_NO_ERROR);
2392
2393						deUint32 maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
2394						m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset + width > texture_width or yoffset + height > texture_height.");
2395						m_log << TestLog::Message << "// Using texture format " << tcu::toHex(accepted[i]) << TestLog::EndMessage;
2396						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2397						//expectError(GL_NO_ERROR);
2398						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, maxTextureSize, 0, 0, 0, accepted[i], 0, 0);
2399						expectError(GL_INVALID_VALUE);
2400						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2401						//expectError(GL_NO_ERROR);
2402						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, maxTextureSize, 0, 0, accepted[i], 0, 0);
2403						expectError(GL_INVALID_VALUE);
2404						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2405						//expectError(GL_NO_ERROR);
2406						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, maxTextureSize, maxTextureSize, 0, 0, accepted[i], 0, 0);
2407						expectError(GL_INVALID_VALUE);
2408						m_log << TestLog::EndSection;
2409
2410						glDeleteTextures(1, &texture);
2411						expectError(GL_NO_ERROR);
2412					}
2413					catch (const tcu::InternalError&)
2414					{
2415						m_log << TestLog::Message << "Skipping unknown format: " << glFormat << TestLog::EndMessage;
2416					}
2417				}
2418			}
2419		});
2420	ES2F_ADD_API_CASE(compressedtexsubimage2d_neg_wdt_hgt, "Invalid glCompressedTexSubImage2D() usage",
2421		{
2422			vector<deInt32> supported;
2423			vector<deInt32> accepted;
2424			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, supported);
2425			getCompressedTexSubImage2DFormat(supported, accepted);
2426
2427			if (accepted.empty())
2428			{
2429				m_log << TestLog::Message << "// No suitable compressed formats found, cannot evaluate test." << TestLog::EndMessage;
2430				m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "No suitable compressed formats found");
2431			}
2432			else
2433			{
2434				for (int i = 0; i < (int)accepted.size(); i++)
2435				{
2436					const deInt32	glFormat	= accepted[i];
2437
2438					try
2439					{
2440						const tcu::CompressedTexFormat	format			= glu::mapGLCompressedTexFormat(glFormat);
2441						const tcu::IVec3				blockPixelSize	= tcu::getBlockPixelSize(format);
2442						const int						blockSize		= tcu::getBlockSize(format);
2443						const std::vector<deUint8>		data			(blockSize, 0);
2444						GLuint							texture			= 0;
2445
2446						glGenTextures(1, &texture);
2447						glBindTexture(GL_TEXTURE_2D, texture);
2448						expectError(GL_NO_ERROR);
2449
2450						glCompressedTexImage2D(GL_TEXTURE_2D, 0, glFormat, blockPixelSize.x(), blockPixelSize.y(), 0, blockSize, DE_NULL);
2451						expectError(GL_NO_ERROR);
2452
2453						m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0.");
2454						m_log << TestLog::Message << "// Using texture format " << tcu::toHex(accepted[i]) << TestLog::EndMessage;
2455						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2456						//expectError(GL_NO_ERROR);
2457						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, 0, accepted[i], 0, 0);
2458						expectError(GL_INVALID_VALUE);
2459						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2460						//expectError(GL_NO_ERROR);
2461						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, -1, accepted[i], 0, 0);
2462						expectError(GL_INVALID_VALUE);
2463						//glCompressedTexImage2D(GL_TEXTURE_2D, 0, accepted[i], 0, 0, 0, 0, 0);
2464						//expectError(GL_NO_ERROR);
2465						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, -1, accepted[i], 0, 0);
2466						expectError(GL_INVALID_VALUE);
2467						m_log << TestLog::EndSection;
2468
2469						glDeleteTextures(1, &texture);
2470						expectError(GL_NO_ERROR);
2471					}
2472					catch (const tcu::InternalError&)
2473					{
2474						m_log << TestLog::Message << "Skipping unknown format: " << glFormat << TestLog::EndMessage;
2475					}
2476				}
2477			}
2478		});
2479	ES2F_ADD_API_CASE(compressedtexsubimage2d_invalid_size, "Invalid glCompressedTexImage2D() usage",
2480		{
2481			vector<deInt32> supported;
2482			vector<deInt32> accepted;
2483			getSupportedExtensions(GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_COMPRESSED_TEXTURE_FORMATS, supported);
2484			getCompressedTexSubImage2DFormat(supported, accepted);
2485
2486			if (accepted.empty())
2487			{
2488				m_log << TestLog::Message << "// No suitable compressed formats found, cannot evaluate test." << TestLog::EndMessage;
2489				m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "No suitable compressed formats found");
2490			}
2491			else
2492			{
2493				for (int i = 0; i < (int)accepted.size(); i++)
2494				{
2495					const deInt32	glFormat	= accepted[i];
2496
2497					try
2498					{
2499						const tcu::CompressedTexFormat	format			= glu::mapGLCompressedTexFormat(glFormat);
2500						const tcu::IVec3				blockPixelSize	= tcu::getBlockPixelSize(format);
2501						const int						blockSize		= tcu::getBlockSize(format);
2502						const std::vector<deUint8>		data			(blockSize, 0);
2503						GLuint							texture			= 0;
2504
2505						glGenTextures(1, &texture);
2506						glBindTexture(GL_TEXTURE_2D, texture);
2507						expectError(GL_NO_ERROR);
2508
2509						glCompressedTexImage2D(GL_TEXTURE_2D, 0, glFormat, blockPixelSize.x(), blockPixelSize.y(), 0, blockSize, DE_NULL);
2510						expectError(GL_NO_ERROR);
2511
2512						m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if imageSize is not consistent with the format, dimensions, and contents of the specified compressed image data.");
2513						m_log << TestLog::Message << "// Using texture format " << tcu::toHex(glFormat) << TestLog::EndMessage;
2514						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, blockPixelSize.x(), blockPixelSize.y(), glFormat, -1, &data[0]);
2515						expectError(GL_INVALID_VALUE);
2516
2517						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, blockPixelSize.x(), blockPixelSize.y(), glFormat, blockSize / 2, &data[0]);
2518						expectError(GL_INVALID_VALUE);
2519
2520						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, blockPixelSize.x(), blockPixelSize.y(), glFormat, blockSize * 2, &data[0]);
2521						expectError(GL_INVALID_VALUE);
2522
2523						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, blockPixelSize.x(), blockPixelSize.y() * 2, glFormat, blockSize, &data[0]);
2524						expectError(GL_INVALID_VALUE);
2525
2526						glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, blockPixelSize.x() * 2, blockPixelSize.y(), glFormat, blockSize, &data[0]);
2527						expectError(GL_INVALID_VALUE);
2528
2529						m_log << TestLog::EndSection;
2530
2531						glDeleteTextures(1, &texture);
2532						expectError(GL_NO_ERROR);
2533					}
2534					catch (const tcu::InternalError&)
2535					{
2536						m_log << TestLog::Message << "Skipping unknown format: " << glFormat << TestLog::EndMessage;
2537					}
2538				}
2539			}
2540		});
2541}
2542
2543} // Functional
2544} // gles2
2545} // deqp
2546