es31fNegativeTextureApiTests.cpp revision 7bf1b814b0216c9793c353fdee3bf295ef9603f2
1/*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 3.1 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 "es31fNegativeTextureApiTests.hpp"
25#include "es31fNegativeTestShared.hpp"
26
27#include "gluCallLogWrapper.hpp"
28#include "gluContextInfo.hpp"
29#include "gluRenderContext.hpp"
30
31#include "glwDefs.hpp"
32#include "glwEnums.hpp"
33
34namespace deqp
35{
36namespace gles31
37{
38namespace Functional
39{
40namespace NegativeTestShared
41{
42
43using tcu::TestLog;
44using glu::CallLogWrapper;
45using namespace glw;
46
47static inline int divRoundUp (int a, int b)
48{
49	return a/b + (a%b != 0 ? 1 : 0);
50}
51
52static inline int etc2DataSize (int width, int height)
53{
54	return (int)(divRoundUp(width, 4) * divRoundUp(height, 4) * sizeof(deUint64));
55}
56
57static inline int etc2EacDataSize (int width, int height)
58{
59	return 2 * etc2DataSize(width, height);
60}
61
62static deUint32 cubeFaceToGLFace (tcu::CubeFace face)
63{
64	switch (face)
65	{
66		case tcu::CUBEFACE_NEGATIVE_X: return GL_TEXTURE_CUBE_MAP_NEGATIVE_X;
67		case tcu::CUBEFACE_POSITIVE_X: return GL_TEXTURE_CUBE_MAP_POSITIVE_X;
68		case tcu::CUBEFACE_NEGATIVE_Y: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
69		case tcu::CUBEFACE_POSITIVE_Y: return GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
70		case tcu::CUBEFACE_NEGATIVE_Z: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
71		case tcu::CUBEFACE_POSITIVE_Z: return GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
72		default:
73			DE_ASSERT(DE_FALSE);
74			return GL_NONE;
75	}
76}
77
78#define FOR_CUBE_FACES(FACE_GL_VAR, BODY)												\
79	do																					\
80	{																					\
81		for (int faceIterTcu = 0; faceIterTcu < tcu::CUBEFACE_LAST; faceIterTcu++)		\
82		{																				\
83			const GLenum FACE_GL_VAR = cubeFaceToGLFace((tcu::CubeFace)faceIterTcu);	\
84			BODY																		\
85		}																				\
86	} while (false)
87
88
89// glActiveTexture
90
91void activetexture (NegativeTestContext& ctx)
92{
93	ctx.beginSection("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).");
94	ctx.glActiveTexture(-1);
95	ctx.expectError(GL_INVALID_ENUM);
96	int numMaxTextureUnits = ctx.getInteger(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS);
97	ctx.glActiveTexture(GL_TEXTURE0 + numMaxTextureUnits);
98	ctx.expectError(GL_INVALID_ENUM);
99	ctx.endSection();
100}
101
102// glBindTexture
103
104void bindtexture (NegativeTestContext& ctx)
105{
106	GLuint texture[5];
107	ctx.glGenTextures(5, texture);
108
109	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the allowable values.");
110	ctx.glBindTexture(0, 1);
111	ctx.expectError(GL_INVALID_ENUM);
112	ctx.glBindTexture(GL_FRAMEBUFFER, 1);
113	ctx.expectError(GL_INVALID_ENUM);
114	ctx.endSection();
115
116	ctx.beginSection("GL_INVALID_OPERATION is generated if texture was previously created with a target that doesn't match that of target.");
117	ctx.glBindTexture(GL_TEXTURE_2D, texture[0]);
118	ctx.expectError(GL_NO_ERROR);
119	ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]);
120	ctx.expectError(GL_INVALID_OPERATION);
121	ctx.glBindTexture(GL_TEXTURE_3D, texture[0]);
122	ctx.expectError(GL_INVALID_OPERATION);
123	ctx.glBindTexture(GL_TEXTURE_2D_ARRAY, texture[0]);
124	ctx.expectError(GL_INVALID_OPERATION);
125
126	ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, texture[1]);
127	ctx.expectError(GL_NO_ERROR);
128	ctx.glBindTexture(GL_TEXTURE_2D, texture[1]);
129	ctx.expectError(GL_INVALID_OPERATION);
130	ctx.glBindTexture(GL_TEXTURE_3D, texture[1]);
131	ctx.expectError(GL_INVALID_OPERATION);
132	ctx.glBindTexture(GL_TEXTURE_2D_ARRAY, texture[1]);
133	ctx.expectError(GL_INVALID_OPERATION);
134
135	ctx.glBindTexture(GL_TEXTURE_3D, texture[2]);
136	ctx.expectError(GL_NO_ERROR);
137	ctx.glBindTexture(GL_TEXTURE_2D, texture[2]);
138	ctx.expectError(GL_INVALID_OPERATION);
139	ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, texture[2]);
140	ctx.expectError(GL_INVALID_OPERATION);
141	ctx.glBindTexture(GL_TEXTURE_2D_ARRAY, texture[2]);
142	ctx.expectError(GL_INVALID_OPERATION);
143
144	ctx.glBindTexture(GL_TEXTURE_2D_ARRAY, texture[3]);
145	ctx.expectError(GL_NO_ERROR);
146	ctx.glBindTexture(GL_TEXTURE_2D, texture[3]);
147	ctx.expectError(GL_INVALID_OPERATION);
148	ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, texture[3]);
149	ctx.expectError(GL_INVALID_OPERATION);
150	ctx.glBindTexture(GL_TEXTURE_3D, texture[3]);
151	ctx.expectError(GL_INVALID_OPERATION);
152
153	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
154	{
155		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, texture[0]);
156		ctx.expectError(GL_INVALID_OPERATION);
157		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, texture[1]);
158		ctx.expectError(GL_INVALID_OPERATION);
159		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, texture[2]);
160		ctx.expectError(GL_INVALID_OPERATION);
161		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, texture[3]);
162		ctx.expectError(GL_INVALID_OPERATION);
163		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, texture[4]);
164		ctx.expectError(GL_NO_ERROR);
165		ctx.glBindTexture(GL_TEXTURE_2D, texture[4]);
166		ctx.expectError(GL_INVALID_OPERATION);
167		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, texture[4]);
168		ctx.expectError(GL_INVALID_OPERATION);
169		ctx.glBindTexture(GL_TEXTURE_3D, texture[4]);
170		ctx.expectError(GL_INVALID_OPERATION);
171		ctx.glBindTexture(GL_TEXTURE_2D_ARRAY, texture[4]);
172		ctx.expectError(GL_INVALID_OPERATION);
173	}
174	ctx.endSection();
175
176	ctx.glDeleteTextures(5, texture);
177}
178
179// glCompressedTexImage2D
180
181void compressedteximage2d_invalid_target (NegativeTestContext& ctx)
182{
183	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
184	ctx.glCompressedTexImage2D(0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
185	ctx.expectError(GL_INVALID_ENUM);
186	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
187	ctx.expectError(GL_INVALID_ENUM);
188	ctx.endSection();
189}
190
191void compressedteximage2d_invalid_format (NegativeTestContext& ctx)
192{
193	ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not a supported format returned in GL_COMPRESSED_TEXTURE_FORMATS.");
194	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 0);
195	ctx.expectError(GL_INVALID_ENUM);
196	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 0, 0, 0);
197	ctx.expectError(GL_INVALID_ENUM);
198	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 0, 0, 0, 0, 0);
199	ctx.expectError(GL_INVALID_ENUM);
200	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 0, 0, 0);
201	ctx.expectError(GL_INVALID_ENUM);
202	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 0, 0, 0);
203	ctx.expectError(GL_INVALID_ENUM);
204	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 0, 0, 0);
205	ctx.expectError(GL_INVALID_ENUM);
206	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 0, 0, 0);
207	ctx.expectError(GL_INVALID_ENUM);
208	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 0, 0, 0);
209	ctx.expectError(GL_INVALID_ENUM);
210	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 0, 0, 0);
211	ctx.expectError(GL_INVALID_ENUM);
212	ctx.endSection();
213}
214
215void compressedteximage2d_neg_level (NegativeTestContext& ctx)
216{
217	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
218	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
219	ctx.expectError(GL_INVALID_VALUE);
220	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
221	ctx.expectError(GL_INVALID_VALUE);
222	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
223	ctx.expectError(GL_INVALID_VALUE);
224	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
225	ctx.expectError(GL_INVALID_VALUE);
226	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
227	ctx.expectError(GL_INVALID_VALUE);
228	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
229	ctx.expectError(GL_INVALID_VALUE);
230	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
231	ctx.expectError(GL_INVALID_VALUE);
232	ctx.endSection();
233}
234
235void compressedteximage2d_max_level (NegativeTestContext& ctx)
236{
237	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE) for a 2d texture target.");
238	deUint32 log2MaxTextureSize = deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
239	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0, etc2DataSize(16, 16), 0);
240	ctx.expectError(GL_INVALID_VALUE);
241	ctx.endSection();
242
243	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE) for a cubemap target.");
244	deUint32 log2MaxCubemapSize = deLog2Floor32(ctx.getInteger(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
245	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
246	ctx.expectError(GL_INVALID_VALUE);
247	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
248	ctx.expectError(GL_INVALID_VALUE);
249	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
250	ctx.expectError(GL_INVALID_VALUE);
251	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
252	ctx.expectError(GL_INVALID_VALUE);
253	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
254	ctx.expectError(GL_INVALID_VALUE);
255	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
256	ctx.expectError(GL_INVALID_VALUE);
257	ctx.endSection();
258}
259
260void compressedteximage2d_neg_width_height (NegativeTestContext& ctx)
261{
262	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than 0.");
263
264	ctx.beginSection("GL_TEXTURE_2D target");
265	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
266	ctx.expectError(GL_INVALID_VALUE);
267	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
268	ctx.expectError(GL_INVALID_VALUE);
269	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
270	ctx.expectError(GL_INVALID_VALUE);
271	ctx.endSection();
272
273	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
274	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
275	ctx.expectError(GL_INVALID_VALUE);
276	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
277	ctx.expectError(GL_INVALID_VALUE);
278	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
279	ctx.expectError(GL_INVALID_VALUE);
280	ctx.endSection();
281
282	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
283	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
284	ctx.expectError(GL_INVALID_VALUE);
285	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
286	ctx.expectError(GL_INVALID_VALUE);
287	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
288	ctx.expectError(GL_INVALID_VALUE);
289	ctx.endSection();
290
291	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
292	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
293	ctx.expectError(GL_INVALID_VALUE);
294	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
295	ctx.expectError(GL_INVALID_VALUE);
296	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
297	ctx.expectError(GL_INVALID_VALUE);
298	ctx.endSection();
299
300	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
301	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
302	ctx.expectError(GL_INVALID_VALUE);
303	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
304	ctx.expectError(GL_INVALID_VALUE);
305	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
306	ctx.expectError(GL_INVALID_VALUE);
307	ctx.endSection();
308
309	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
310	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
311	ctx.expectError(GL_INVALID_VALUE);
312	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
313	ctx.expectError(GL_INVALID_VALUE);
314	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
315	ctx.expectError(GL_INVALID_VALUE);
316	ctx.endSection();
317
318	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
319	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0);
320	ctx.expectError(GL_INVALID_VALUE);
321	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0);
322	ctx.expectError(GL_INVALID_VALUE);
323	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0);
324	ctx.expectError(GL_INVALID_VALUE);
325	ctx.endSection();
326
327	ctx.endSection();
328}
329
330void compressedteximage2d_max_width_height (NegativeTestContext& ctx)
331{
332	int maxTextureSize = ctx.getInteger(GL_MAX_TEXTURE_SIZE) + 1;
333	int maxCubemapSize = ctx.getInteger(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
334	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE.");
335
336	ctx.beginSection("GL_TEXTURE_2D target");
337	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, 1, 0, etc2EacDataSize(maxTextureSize, 1), 0);
338	ctx.expectError(GL_INVALID_VALUE);
339	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxTextureSize, 0, etc2EacDataSize(1, maxTextureSize), 0);
340	ctx.expectError(GL_INVALID_VALUE);
341	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, maxTextureSize, 0, etc2EacDataSize(maxTextureSize, maxTextureSize), 0);
342	ctx.expectError(GL_INVALID_VALUE);
343	ctx.endSection();
344
345	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
346	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0);
347	ctx.expectError(GL_INVALID_VALUE);
348	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0);
349	ctx.expectError(GL_INVALID_VALUE);
350	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
351	ctx.expectError(GL_INVALID_VALUE);
352	ctx.endSection();
353
354	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
355	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0);
356	ctx.expectError(GL_INVALID_VALUE);
357	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0);
358	ctx.expectError(GL_INVALID_VALUE);
359	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
360	ctx.expectError(GL_INVALID_VALUE);
361	ctx.endSection();
362
363	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
364	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0);
365	ctx.expectError(GL_INVALID_VALUE);
366	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0);
367	ctx.expectError(GL_INVALID_VALUE);
368	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
369	ctx.expectError(GL_INVALID_VALUE);
370	ctx.endSection();
371
372	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
373	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0);
374	ctx.expectError(GL_INVALID_VALUE);
375	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0);
376	ctx.expectError(GL_INVALID_VALUE);
377	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
378	ctx.expectError(GL_INVALID_VALUE);
379	ctx.endSection();
380
381	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
382	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0);
383	ctx.expectError(GL_INVALID_VALUE);
384	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0);
385	ctx.expectError(GL_INVALID_VALUE);
386	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
387	ctx.expectError(GL_INVALID_VALUE);
388	ctx.endSection();
389
390	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
391	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0);
392	ctx.expectError(GL_INVALID_VALUE);
393	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0);
394	ctx.expectError(GL_INVALID_VALUE);
395	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0);
396	ctx.expectError(GL_INVALID_VALUE);
397	ctx.endSection();
398
399	ctx.endSection();
400}
401
402void compressedteximage2d_invalid_border (NegativeTestContext& ctx)
403{
404	ctx.beginSection("GL_INVALID_VALUE is generated if border is not 0.");
405
406	ctx.beginSection("GL_TEXTURE_2D target");
407	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
408	ctx.expectError(GL_INVALID_VALUE);
409	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
410	ctx.expectError(GL_INVALID_VALUE);
411	ctx.endSection();
412
413	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
414	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
415	ctx.expectError(GL_INVALID_VALUE);
416	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
417	ctx.expectError(GL_INVALID_VALUE);
418	ctx.endSection();
419
420	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
421	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
422	ctx.expectError(GL_INVALID_VALUE);
423	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
424	ctx.expectError(GL_INVALID_VALUE);
425	ctx.endSection();
426
427	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
428	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
429	ctx.expectError(GL_INVALID_VALUE);
430	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
431	ctx.expectError(GL_INVALID_VALUE);
432	ctx.endSection();
433
434	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
435	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
436	ctx.expectError(GL_INVALID_VALUE);
437	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
438	ctx.expectError(GL_INVALID_VALUE);
439	ctx.endSection();
440
441	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
442	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
443	ctx.expectError(GL_INVALID_VALUE);
444	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
445	ctx.expectError(GL_INVALID_VALUE);
446	ctx.endSection();
447
448	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
449	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
450	ctx.expectError(GL_INVALID_VALUE);
451	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
452	ctx.expectError(GL_INVALID_VALUE);
453	ctx.endSection();
454
455	ctx.endSection();
456}
457
458void compressedteximage2d_invalid_size (NegativeTestContext& ctx)
459{
460	ctx.beginSection("GL_INVALID_VALUE is generated if imageSize is not consistent with the format, dimensions, and contents of the specified compressed image data.");
461	// Subtracting 1 to the imageSize field to deviate from the expected size. Removing the -1 would cause the imageSize to be correct.
462	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_R11_EAC, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 8 - 1, 0);
463	ctx.expectError(GL_INVALID_VALUE);
464	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SIGNED_R11_EAC, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 8 - 1, 0);
465	ctx.expectError(GL_INVALID_VALUE);
466	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RG11_EAC, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 16 - 1, 0);
467	ctx.expectError(GL_INVALID_VALUE);
468	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SIGNED_RG11_EAC, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 16 - 1, 0);
469	ctx.expectError(GL_INVALID_VALUE);
470	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 8 - 1, 0);
471	ctx.expectError(GL_INVALID_VALUE);
472	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ETC2, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 8 - 1, 0);
473	ctx.expectError(GL_INVALID_VALUE);
474	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 8 - 1, 0);
475	ctx.expectError(GL_INVALID_VALUE);
476	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 8 - 1, 0);
477	ctx.expectError(GL_INVALID_VALUE);
478	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 16 - 1, 0);
479	ctx.expectError(GL_INVALID_VALUE);
480	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 16 - 1, 0);
481	ctx.expectError(GL_INVALID_VALUE);
482
483	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
484	{
485	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_4x4, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 16 - 1, 0);
486	    ctx.expectError(GL_INVALID_VALUE);
487	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_5x4, 1, 1, 0, divRoundUp(1, 5) * divRoundUp(1, 4) * 16 - 1, 0);
488	    ctx.expectError(GL_INVALID_VALUE);
489	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_5x5, 1, 1, 0, divRoundUp(1, 5) * divRoundUp(1, 5) * 16 - 1, 0);
490	    ctx.expectError(GL_INVALID_VALUE);
491	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_6x5, 1, 1, 0, divRoundUp(1, 6) * divRoundUp(1, 5) * 16 - 1, 0);
492	    ctx.expectError(GL_INVALID_VALUE);
493	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_6x6, 1, 1, 0, divRoundUp(1, 6) * divRoundUp(1, 6) * 16 - 1, 0);
494	    ctx.expectError(GL_INVALID_VALUE);
495	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_8x5, 1, 1, 0, divRoundUp(1, 8) * divRoundUp(1, 5) * 16 - 1, 0);
496	    ctx.expectError(GL_INVALID_VALUE);
497	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_8x6, 1, 1, 0, divRoundUp(1, 8) * divRoundUp(1, 6) * 16 - 1, 0);
498	    ctx.expectError(GL_INVALID_VALUE);
499	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_8x8, 1, 1, 0, divRoundUp(1, 8) * divRoundUp(1, 8) * 16 - 1, 0);
500	    ctx.expectError(GL_INVALID_VALUE);
501	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_10x5, 1, 1, 0, divRoundUp(1, 10) * divRoundUp(1, 5) * 16 - 1, 0);
502	    ctx.expectError(GL_INVALID_VALUE);
503	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_10x6, 1, 1, 0, divRoundUp(1, 10) * divRoundUp(1, 6) * 16 - 1, 0);
504	    ctx.expectError(GL_INVALID_VALUE);
505	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_10x8, 1, 1, 0, divRoundUp(1, 10) * divRoundUp(1, 8) * 16 - 1, 0);
506	    ctx.expectError(GL_INVALID_VALUE);
507	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_10x10, 1, 1, 0, divRoundUp(1, 10) * divRoundUp(1, 10) * 16 - 1, 0);
508	    ctx.expectError(GL_INVALID_VALUE);
509	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_12x10, 1, 1, 0, divRoundUp(1, 12) * divRoundUp(1, 10) * 16 - 1, 0);
510	    ctx.expectError(GL_INVALID_VALUE);
511	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_12x12, 1, 1, 0, divRoundUp(1, 12) * divRoundUp(1, 12) * 16 - 1, 0);
512	    ctx.expectError(GL_INVALID_VALUE);
513	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 16 - 1, 0);
514	    ctx.expectError(GL_INVALID_VALUE);
515	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4, 1, 1, 0, divRoundUp(1, 5) * divRoundUp(1, 4) * 16 - 1, 0);
516	    ctx.expectError(GL_INVALID_VALUE);
517	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5, 1, 1, 0, divRoundUp(1, 5) * divRoundUp(1, 5) * 16 - 1, 0);
518	    ctx.expectError(GL_INVALID_VALUE);
519	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5, 1, 1, 0, divRoundUp(1, 6) * divRoundUp(1, 5) * 16 - 1, 0);
520	    ctx.expectError(GL_INVALID_VALUE);
521	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6, 1, 1, 0, divRoundUp(1, 6) * divRoundUp(1, 6) * 16 - 1, 0);
522	    ctx.expectError(GL_INVALID_VALUE);
523	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5, 1, 1, 0, divRoundUp(1, 8) * divRoundUp(1, 5) * 16 - 1, 0);
524	    ctx.expectError(GL_INVALID_VALUE);
525	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6, 1, 1, 0, divRoundUp(1, 8) * divRoundUp(1, 6) * 16 - 1, 0);
526	    ctx.expectError(GL_INVALID_VALUE);
527	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8, 1, 1, 0, divRoundUp(1, 8) * divRoundUp(1, 8) * 16 - 1, 0);
528	    ctx.expectError(GL_INVALID_VALUE);
529	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5, 1, 1, 0, divRoundUp(1, 10) * divRoundUp(1, 5) * 16 - 1, 0);
530	    ctx.expectError(GL_INVALID_VALUE);
531	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6, 1, 1, 0, divRoundUp(1, 10) * divRoundUp(1, 6) * 16 - 1, 0);
532	    ctx.expectError(GL_INVALID_VALUE);
533	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8, 1, 1, 0, divRoundUp(1, 10) * divRoundUp(1, 8) * 16 - 1, 0);
534	    ctx.expectError(GL_INVALID_VALUE);
535	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10, 1, 1, 0, divRoundUp(1, 10) * divRoundUp(1, 10) * 16 - 1, 0);
536	    ctx.expectError(GL_INVALID_VALUE);
537	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10, 1, 1, 0, divRoundUp(1, 12) * divRoundUp(1, 10) * 16 - 1, 0);
538	    ctx.expectError(GL_INVALID_VALUE);
539	    ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12, 1, 1, 0, divRoundUp(1, 12) * divRoundUp(1, 12) * 16 - 1, 0);
540	    ctx.expectError(GL_INVALID_VALUE);
541	}
542	ctx.endSection();
543}
544
545void compressedteximage2d_neg_size (NegativeTestContext& ctx)
546{
547	ctx.beginSection("GL_INVALID_VALUE is generated if imageSize is negative.");
548	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_R11_EAC, 0, 0, 0, -1, 0);
549	ctx.expectError(GL_INVALID_VALUE);
550	ctx.endSection();
551}
552
553void compressedteximage2d_invalid_width_height (NegativeTestContext& ctx)
554{
555	ctx.beginSection("GL_INVALID_VALUE is generated if target is a cube map face and width and height are not equal.");
556
557	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
558	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_R11_EAC, 1, 2, 0, divRoundUp(1, 4) * divRoundUp(2, 4) * 8, 0);
559	ctx.expectError(GL_INVALID_VALUE);
560	ctx.endSection();
561
562	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
563	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_R11_EAC, 1, 2, 0, divRoundUp(1, 4) * divRoundUp(2, 4) * 8, 0);
564	ctx.expectError(GL_INVALID_VALUE);
565	ctx.endSection();
566
567	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
568	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_R11_EAC, 1, 2, 0, divRoundUp(1, 4) * divRoundUp(2, 4) * 8, 0);
569	ctx.expectError(GL_INVALID_VALUE);
570	ctx.endSection();
571
572	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
573	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_R11_EAC, 1, 2, 0, divRoundUp(1, 4) * divRoundUp(2, 4) * 8, 0);
574	ctx.expectError(GL_INVALID_VALUE);
575	ctx.endSection();
576
577	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
578	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_R11_EAC, 1, 2, 0, divRoundUp(1, 4) * divRoundUp(2, 4) * 8, 0);
579	ctx.expectError(GL_INVALID_VALUE);
580	ctx.endSection();
581
582	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
583	ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_R11_EAC, 1, 2, 0, divRoundUp(1, 4) * divRoundUp(2, 4) * 8, 0);
584	ctx.expectError(GL_INVALID_VALUE);
585	ctx.endSection();
586
587	ctx.endSection();
588}
589
590void compressedteximage2d_invalid_buffer_target (NegativeTestContext& ctx)
591{
592	deUint32				buf = 1234;
593	std::vector<GLubyte>	data(64);
594
595	ctx.glGenBuffers			(1, &buf);
596	ctx.glBindBuffer			(GL_PIXEL_UNPACK_BUFFER, buf);
597	ctx.glBufferData			(GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY);
598	ctx.expectError				(GL_NO_ERROR);
599
600	ctx.beginSection("GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and the buffer object's data store is currently mapped.");
601	ctx.glMapBufferRange		(GL_PIXEL_UNPACK_BUFFER, 0, 32, GL_MAP_WRITE_BIT);
602	ctx.glCompressedTexImage2D	(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 4, 4, 0, etc2DataSize(4, 4), 0);
603	ctx.expectError				(GL_INVALID_OPERATION);
604	ctx.glUnmapBuffer			(GL_PIXEL_UNPACK_BUFFER);
605	ctx.endSection();
606
607	ctx.beginSection("GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size.");
608	ctx.glCompressedTexImage2D	(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0, etc2DataSize(16, 16), 0);
609	ctx.expectError				(GL_INVALID_OPERATION);
610	ctx.endSection();
611
612	ctx.glDeleteBuffers			(1, &buf);
613}
614
615// glCopyTexImage2D
616
617void copyteximage2d_invalid_target (NegativeTestContext& ctx)
618{
619	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
620	ctx.glCopyTexImage2D(0, 0, GL_RGB, 0, 0, 64, 64, 0);
621	ctx.expectError(GL_INVALID_ENUM);
622	ctx.endSection();
623}
624
625void copyteximage2d_invalid_format (NegativeTestContext& ctx)
626{
627	ctx.beginSection("GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not an accepted format.");
628	ctx.glCopyTexImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 64, 64, 0);
629	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
630	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 16, 16, 0);
631	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
632	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 16, 16, 0);
633	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
634	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 16, 16, 0);
635	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
636	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 16, 16, 0);
637	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
638	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 16, 16, 0);
639	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
640	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 16, 16, 0);
641	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
642	ctx.endSection();
643}
644
645void copyteximage2d_inequal_width_height_cube (NegativeTestContext& ctx)
646{
647	ctx.beginSection("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.");
648	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 16, 17, 0);
649	ctx.expectError(GL_INVALID_VALUE);
650	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 16, 17, 0);
651	ctx.expectError(GL_INVALID_VALUE);
652	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 16, 17, 0);
653	ctx.expectError(GL_INVALID_VALUE);
654	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 16, 17, 0);
655	ctx.expectError(GL_INVALID_VALUE);
656	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 16, 17, 0);
657	ctx.expectError(GL_INVALID_VALUE);
658	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 16, 17, 0);
659	ctx.expectError(GL_INVALID_VALUE);
660	ctx.endSection();
661}
662
663void copyteximage2d_neg_level (NegativeTestContext& ctx)
664{
665	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
666	ctx.glCopyTexImage2D(GL_TEXTURE_2D, -1, GL_RGB, 0, 0, 64, 64, 0);
667	ctx.expectError(GL_INVALID_VALUE);
668	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_RGB, 0, 0, 16, 16, 0);
669	ctx.expectError(GL_INVALID_VALUE);
670	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_RGB, 0, 0, 16, 16, 0);
671	ctx.expectError(GL_INVALID_VALUE);
672	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_RGB, 0, 0, 16, 16, 0);
673	ctx.expectError(GL_INVALID_VALUE);
674	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_RGB, 0, 0, 16, 16, 0);
675	ctx.expectError(GL_INVALID_VALUE);
676	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_RGB, 0, 0, 16, 16, 0);
677	ctx.expectError(GL_INVALID_VALUE);
678	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_RGB, 0, 0, 16, 16, 0);
679	ctx.expectError(GL_INVALID_VALUE);
680	ctx.endSection();
681}
682
683void copyteximage2d_max_level (NegativeTestContext& ctx)
684{
685	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
686	deUint32 log2MaxTextureSize = deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
687	ctx.glCopyTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_RGB, 0, 0, 64, 64, 0);
688	ctx.expectError(GL_INVALID_VALUE);
689	ctx.endSection();
690
691	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
692	deUint32 log2MaxCubemapSize = deLog2Floor32(ctx.getInteger(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
693	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
694	ctx.expectError(GL_INVALID_VALUE);
695	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
696	ctx.expectError(GL_INVALID_VALUE);
697	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
698	ctx.expectError(GL_INVALID_VALUE);
699	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
700	ctx.expectError(GL_INVALID_VALUE);
701	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
702	ctx.expectError(GL_INVALID_VALUE);
703	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0);
704	ctx.expectError(GL_INVALID_VALUE);
705	ctx.endSection();
706}
707
708void copyteximage2d_neg_width_height (NegativeTestContext& ctx)
709{
710	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than 0.");
711
712	ctx.beginSection("GL_TEXTURE_2D target");
713	ctx.glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, -1, 1, 0);
714	ctx.expectError(GL_INVALID_VALUE);
715	ctx.glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, -1, 0);
716	ctx.expectError(GL_INVALID_VALUE);
717	ctx.glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, -1, -1, 0);
718	ctx.expectError(GL_INVALID_VALUE);
719	ctx.endSection();
720
721	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
722	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, -1, 1, 0);
723	ctx.expectError(GL_INVALID_VALUE);
724	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 1, -1, 0);
725	ctx.expectError(GL_INVALID_VALUE);
726	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, -1, -1, 0);
727	ctx.expectError(GL_INVALID_VALUE);
728	ctx.endSection();
729
730	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
731	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, -1, 1, 0);
732	ctx.expectError(GL_INVALID_VALUE);
733	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 1, -1, 0);
734	ctx.expectError(GL_INVALID_VALUE);
735	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, -1, -1, 0);
736	ctx.expectError(GL_INVALID_VALUE);
737	ctx.endSection();
738
739	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
740	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, -1, 1, 0);
741	ctx.expectError(GL_INVALID_VALUE);
742	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 1, -1, 0);
743	ctx.expectError(GL_INVALID_VALUE);
744	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, -1, -1, 0);
745	ctx.expectError(GL_INVALID_VALUE);
746	ctx.endSection();
747
748	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
749	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, -1, 1, 0);
750	ctx.expectError(GL_INVALID_VALUE);
751	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 1, -1, 0);
752	ctx.expectError(GL_INVALID_VALUE);
753	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, -1, -1, 0);
754	ctx.expectError(GL_INVALID_VALUE);
755	ctx.endSection();
756
757	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
758	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, -1, 1, 0);
759	ctx.expectError(GL_INVALID_VALUE);
760	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 1, -1, 0);
761	ctx.expectError(GL_INVALID_VALUE);
762	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, -1, -1, 0);
763	ctx.expectError(GL_INVALID_VALUE);
764	ctx.endSection();
765
766	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
767	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, -1, 1, 0);
768	ctx.expectError(GL_INVALID_VALUE);
769	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 1, -1, 0);
770	ctx.expectError(GL_INVALID_VALUE);
771	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, -1, -1, 0);
772	ctx.expectError(GL_INVALID_VALUE);
773	ctx.endSection();
774
775	ctx.endSection();
776}
777
778void copyteximage2d_max_width_height (NegativeTestContext& ctx)
779{
780	int maxTextureSize = ctx.getInteger(GL_MAX_TEXTURE_SIZE) + 1;
781	int maxCubemapSize = ctx.getInteger(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
782
783	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE.");
784
785	ctx.beginSection("GL_TEXTURE_2D target");
786	ctx.glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, maxTextureSize, 1, 0);
787	ctx.expectError(GL_INVALID_VALUE);
788	ctx.glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, maxTextureSize, 0);
789	ctx.expectError(GL_INVALID_VALUE);
790	ctx.glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, maxTextureSize, maxTextureSize, 0);
791	ctx.expectError(GL_INVALID_VALUE);
792	ctx.endSection();
793
794	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
795	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
796	ctx.expectError(GL_INVALID_VALUE);
797	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
798	ctx.expectError(GL_INVALID_VALUE);
799	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
800	ctx.expectError(GL_INVALID_VALUE);
801	ctx.endSection();
802
803	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
804	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
805	ctx.expectError(GL_INVALID_VALUE);
806	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
807	ctx.expectError(GL_INVALID_VALUE);
808	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
809	ctx.expectError(GL_INVALID_VALUE);
810	ctx.endSection();
811
812	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
813	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
814	ctx.expectError(GL_INVALID_VALUE);
815	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
816	ctx.expectError(GL_INVALID_VALUE);
817	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
818	ctx.expectError(GL_INVALID_VALUE);
819	ctx.endSection();
820
821	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
822	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
823	ctx.expectError(GL_INVALID_VALUE);
824	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
825	ctx.expectError(GL_INVALID_VALUE);
826	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
827	ctx.expectError(GL_INVALID_VALUE);
828	ctx.endSection();
829
830	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
831	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
832	ctx.expectError(GL_INVALID_VALUE);
833	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
834	ctx.expectError(GL_INVALID_VALUE);
835	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
836	ctx.expectError(GL_INVALID_VALUE);
837	ctx.endSection();
838
839	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
840	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0);
841	ctx.expectError(GL_INVALID_VALUE);
842	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0);
843	ctx.expectError(GL_INVALID_VALUE);
844	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0);
845	ctx.expectError(GL_INVALID_VALUE);
846	ctx.endSection();
847
848	ctx.endSection();
849}
850
851void copyteximage2d_invalid_border (NegativeTestContext& ctx)
852{
853	ctx.beginSection("GL_INVALID_VALUE is generated if border is not 0.");
854
855	ctx.beginSection("GL_TEXTURE_2D target");
856	ctx.glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 0, 0, -1);
857	ctx.expectError(GL_INVALID_VALUE);
858	ctx.glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 0, 0, 1);
859	ctx.expectError(GL_INVALID_VALUE);
860	ctx.endSection();
861
862	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
863	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 0, 0, -1);
864	ctx.expectError(GL_INVALID_VALUE);
865	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 0, 0, 1);
866	ctx.expectError(GL_INVALID_VALUE);
867	ctx.endSection();
868
869	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
870	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 0, 0, -1);
871	ctx.expectError(GL_INVALID_VALUE);
872	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 0, 0, 1);
873	ctx.expectError(GL_INVALID_VALUE);
874	ctx.endSection();
875
876	ctx.beginSection("GL_TEXTURE_2D target");
877	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 0, 0, -1);
878	ctx.expectError(GL_INVALID_VALUE);
879	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 0, 0, 1);
880	ctx.expectError(GL_INVALID_VALUE);
881	ctx.endSection();
882
883	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
884	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 0, 0, -1);
885	ctx.expectError(GL_INVALID_VALUE);
886	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 0, 0, 1);
887	ctx.expectError(GL_INVALID_VALUE);
888	ctx.endSection();
889
890	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
891	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 0, 0, -1);
892	ctx.expectError(GL_INVALID_VALUE);
893	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 0, 0, 1);
894	ctx.expectError(GL_INVALID_VALUE);
895	ctx.endSection();
896
897	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
898	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 0, 0, -1);
899	ctx.expectError(GL_INVALID_VALUE);
900	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 0, 0, 1);
901	ctx.expectError(GL_INVALID_VALUE);
902	ctx.endSection();
903
904	ctx.endSection();
905}
906
907void copyteximage2d_incomplete_framebuffer (NegativeTestContext& ctx)
908{
909	GLuint fbo = 0x1234;
910	ctx.glGenFramebuffers		(1, &fbo);
911	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
912	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
913
914	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
915	ctx.glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, 0, 0, 0);
916	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
917	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA8, 0, 0, 0, 0, 0);
918	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
919	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA8, 0, 0, 0, 0, 0);
920	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
921	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA8, 0, 0, 0, 0, 0);
922	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
923	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA8, 0, 0, 0, 0, 0);
924	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
925	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, 0, 0, 0, 0, 0);
926	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
927	ctx.glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA8, 0, 0, 0, 0, 0);
928	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
929	ctx.endSection();
930
931	ctx.glBindFramebuffer	(GL_FRAMEBUFFER, 0);
932	ctx.glDeleteFramebuffers(1, &fbo);
933}
934
935void copytexsubimage2d_invalid_target (NegativeTestContext& ctx)
936{
937	GLuint texture = 0x1234;
938	ctx.glGenTextures	(1, &texture);
939	ctx.glBindTexture	(GL_TEXTURE_2D, texture);
940	ctx.glTexImage2D	(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
941
942	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
943	ctx.glCopyTexSubImage2D(0, 0, 0, 0, 0, 0, 4, 4);
944	ctx.expectError(GL_INVALID_ENUM);
945	ctx.endSection();
946
947	ctx.glDeleteTextures(1, &texture);
948}
949void copytexsubimage2d_read_buffer_is_none (NegativeTestContext& ctx)
950{
951	GLuint texture = 0x1234;
952	ctx.glGenTextures	(1, &texture);
953	ctx.glBindTexture	(GL_TEXTURE_2D, texture);
954	ctx.glTexImage2D	(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
955
956	ctx.beginSection("GL_INVALID_OPERATION is generated if the read buffer is NONE");
957	ctx.glReadBuffer(GL_NONE);
958	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4);
959	ctx.expectError(GL_INVALID_OPERATION);
960	ctx.endSection();
961
962	ctx.glDeleteTextures(1, &texture);
963}
964
965void copytexsubimage2d_texture_internalformat (NegativeTestContext& ctx)
966{
967	GLuint texture = 0x1234;
968	ctx.glGenTextures	(1, &texture);
969	ctx.glBindTexture	(GL_TEXTURE_2D, texture);
970	ctx.glTexImage2D	(GL_TEXTURE_2D, 0, GL_RGB9_E5, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
971
972	ctx.beginSection("GL_INVALID_OPERATION is generated if internal format of the texture is GL_RGB9_E5");
973	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4);
974	ctx.expectError(GL_INVALID_OPERATION);
975	ctx.endSection();
976
977	ctx.glDeleteTextures(1, &texture);
978}
979
980void copytexsubimage2d_neg_level (NegativeTestContext& ctx)
981{
982	GLuint textures[2];
983	ctx.glGenTextures	(2, &textures[0]);
984	ctx.glBindTexture	(GL_TEXTURE_2D, textures[0]);
985	ctx.glTexImage2D	(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
986	ctx.glBindTexture	(GL_TEXTURE_CUBE_MAP, textures[1]);
987	FOR_CUBE_FACES(faceGL, ctx.glTexImage2D(faceGL, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0););
988
989	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
990	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, 4, 4);
991	ctx.expectError(GL_INVALID_VALUE);
992	FOR_CUBE_FACES(faceGL,
993	{
994		ctx.glCopyTexSubImage2D(faceGL, -1, 0, 0, 0, 0, 4, 4);
995		ctx.expectError(GL_INVALID_VALUE);
996	});
997	ctx.endSection();
998
999	ctx.glDeleteTextures(2, &textures[0]);
1000}
1001
1002void copytexsubimage2d_max_level (NegativeTestContext& ctx)
1003{
1004	GLuint textures[2];
1005	ctx.glGenTextures	(2, &textures[0]);
1006	ctx.glBindTexture	(GL_TEXTURE_2D, textures[0]);
1007	ctx.glTexImage2D	(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1008	ctx.glBindTexture	(GL_TEXTURE_CUBE_MAP, textures[1]);
1009	FOR_CUBE_FACES(faceGL, ctx.glTexImage2D(faceGL, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0););
1010
1011	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE) for 2D texture targets.");
1012	deUint32 log2MaxTextureSize = deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
1013	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, 4, 4);
1014	ctx.expectError(GL_INVALID_VALUE);
1015	ctx.endSection();
1016
1017	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_SIZE) for cubemap targets.");
1018	deUint32 log2MaxCubemapSize = deLog2Floor32(ctx.getInteger(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
1019	FOR_CUBE_FACES(faceGL,
1020	{
1021		ctx.glCopyTexSubImage2D(faceGL, log2MaxCubemapSize, 0, 0, 0, 0, 4, 4);
1022		ctx.expectError(GL_INVALID_VALUE);
1023	});
1024	ctx.endSection();
1025
1026	ctx.glDeleteTextures(2, &textures[0]);
1027}
1028
1029void copytexsubimage2d_neg_offset (NegativeTestContext& ctx)
1030{
1031	GLuint texture = 0x1234;
1032	ctx.glGenTextures	(1, &texture);
1033	ctx.glBindTexture	(GL_TEXTURE_2D, texture);
1034	ctx.glTexImage2D	(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1035
1036	ctx.beginSection("GL_INVALID_VALUE is generated if xoffset < 0 or yoffset < 0.");
1037	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 0, 0, 4, 4);
1038	ctx.expectError(GL_INVALID_VALUE);
1039	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 0, 0, 4, 4);
1040	ctx.expectError(GL_INVALID_VALUE);
1041	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, -1, -1, 0, 0, 4, 4);
1042	ctx.expectError(GL_INVALID_VALUE);
1043	ctx.endSection();
1044
1045	ctx.glDeleteTextures(1, &texture);
1046}
1047
1048void copytexsubimage2d_invalid_offset (NegativeTestContext& ctx)
1049{
1050	GLuint texture = 0x1234;
1051	ctx.glGenTextures	(1, &texture);
1052	ctx.glBindTexture	(GL_TEXTURE_2D, texture);
1053	ctx.glTexImage2D	(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1054
1055	ctx.beginSection("GL_INVALID_VALUE is generated if xoffset + width > texture_width or yoffset + height > texture_height.");
1056	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 14, 0, 0, 0, 4, 4);
1057	ctx.expectError(GL_INVALID_VALUE);
1058	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 14, 0, 0, 4, 4);
1059	ctx.expectError(GL_INVALID_VALUE);
1060	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 14, 14, 0, 0, 4, 4);
1061	ctx.expectError(GL_INVALID_VALUE);
1062	ctx.endSection();
1063
1064	ctx.glDeleteTextures(1, &texture);
1065}
1066
1067void copytexsubimage2d_neg_width_height (NegativeTestContext& ctx)
1068{
1069	GLuint texture = 0x1234;
1070	ctx.glGenTextures	(1, &texture);
1071	ctx.glBindTexture	(GL_TEXTURE_2D, texture);
1072	ctx.glTexImage2D	(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1073
1074	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than 0.");
1075	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, -1, 0);
1076	ctx.expectError(GL_INVALID_VALUE);
1077	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, -1);
1078	ctx.expectError(GL_INVALID_VALUE);
1079	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, -1, -1);
1080	ctx.expectError(GL_INVALID_VALUE);
1081	ctx.endSection();
1082
1083	ctx.glDeleteTextures(1, &texture);
1084}
1085
1086void copytexsubimage2d_incomplete_framebuffer (NegativeTestContext& ctx)
1087{
1088	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
1089
1090	GLuint texture[2];
1091	GLuint fbo = 0x1234;
1092
1093	ctx.glGenTextures			(2, texture);
1094	ctx.glBindTexture			(GL_TEXTURE_2D, texture[0]);
1095	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1096	ctx.glBindTexture			(GL_TEXTURE_CUBE_MAP, texture[1]);
1097	ctx.glTexImage2D			(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1098	ctx.glTexImage2D			(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1099	ctx.glTexImage2D			(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1100	ctx.glTexImage2D			(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1101	ctx.glTexImage2D			(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1102	ctx.glTexImage2D			(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1103	ctx.expectError(GL_NO_ERROR);
1104
1105	ctx.glGenFramebuffers(1, &fbo);
1106	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1107	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
1108	ctx.expectError(GL_NO_ERROR);
1109
1110	ctx.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 0);
1111	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1112	ctx.glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 0, 0, 0);
1113	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1114	ctx.glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 0, 0, 0);
1115	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1116	ctx.glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 0, 0, 0);
1117	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1118	ctx.glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 0, 0, 0);
1119	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1120	ctx.glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 0, 0, 0);
1121	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1122	ctx.glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 0, 0, 0);
1123	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1124
1125	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
1126	ctx.glDeleteFramebuffers(1, &fbo);
1127	ctx.glDeleteTextures(2, texture);
1128
1129	ctx.endSection();
1130}
1131
1132// glDeleteTextures
1133
1134void deletetextures (NegativeTestContext& ctx)
1135{
1136	GLuint texture = 0x1234;
1137	ctx.glGenTextures(1, &texture);
1138
1139	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
1140	ctx.glDeleteTextures(-1, 0);
1141	ctx.expectError(GL_INVALID_VALUE);
1142
1143	ctx.glBindTexture(GL_TEXTURE_2D, texture);
1144	ctx.glDeleteTextures(-1, 0);
1145	ctx.expectError(GL_INVALID_VALUE);
1146	ctx.endSection();
1147
1148	ctx.glDeleteTextures(1, &texture);
1149}
1150
1151// glGenerateMipmap
1152
1153void generatemipmap (NegativeTestContext& ctx)
1154{
1155	GLuint texture[2];
1156	ctx.glGenTextures(2, texture);
1157
1158	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP.");
1159	ctx.glGenerateMipmap(0);
1160	ctx.expectError(GL_INVALID_ENUM);
1161	ctx.endSection();
1162
1163	ctx.beginSection("INVALID_OPERATION is generated if the texture bound to target is not cube complete.");
1164	ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]);
1165	ctx.glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);
1166	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1167	ctx.glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
1168	ctx.expectError(GL_INVALID_OPERATION);
1169
1170	ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]);
1171	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1172	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1173	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1174	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1175	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1176	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1177	ctx.glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
1178	ctx.expectError(GL_INVALID_OPERATION);
1179	ctx.endSection();
1180
1181	ctx.beginSection("GL_INVALID_OPERATION is generated if the zero level array is stored in a compressed internal format.");
1182	ctx.glBindTexture(GL_TEXTURE_2D, texture[1]);
1183	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
1184	ctx.glGenerateMipmap(GL_TEXTURE_2D);
1185	ctx.expectError(GL_INVALID_OPERATION);
1186	ctx.endSection();
1187
1188	ctx.beginSection("GL_INVALID_OPERATION is generated if the level base array was not specified with an unsized internal format or a sized internal format that is both color-renderable and texture-filterable.");
1189	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8_SNORM, 0, 0, 0, GL_RGB, GL_BYTE, 0);
1190	ctx.glGenerateMipmap(GL_TEXTURE_2D);
1191	ctx.expectError(GL_INVALID_OPERATION);
1192	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_R8I, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, 0);
1193	ctx.glGenerateMipmap(GL_TEXTURE_2D);
1194	ctx.expectError(GL_INVALID_OPERATION);
1195
1196	if (!(ctx.getContextInfo().isExtensionSupported("GL_EXT_color_buffer_float") && ctx.getContextInfo().isExtensionSupported("GL_OES_texture_float_linear")))
1197	{
1198		ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 0, 0, 0, GL_RGBA, GL_FLOAT, 0);
1199		ctx.glGenerateMipmap(GL_TEXTURE_2D);
1200		ctx.expectError(GL_INVALID_OPERATION);
1201	}
1202
1203	ctx.endSection();
1204
1205	ctx.glDeleteTextures(2, texture);
1206}
1207
1208// glGenTextures
1209
1210void gentextures (NegativeTestContext& ctx)
1211{
1212	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
1213	ctx.glGenTextures(-1, 0);
1214	ctx.expectError(GL_INVALID_VALUE);
1215	ctx.endSection();
1216}
1217
1218// glPixelStorei
1219
1220void pixelstorei (NegativeTestContext& ctx)
1221{
1222	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
1223	ctx.glPixelStorei(0,1);
1224	ctx.expectError(GL_INVALID_ENUM);
1225	ctx.endSection();
1226
1227	ctx.beginSection("GL_INVALID_VALUE is generated if a negative row length, pixel skip, or row skip value is specified, or if alignment is specified as other than 1, 2, 4, or 8.");
1228	ctx.glPixelStorei(GL_PACK_ROW_LENGTH, -1);
1229	ctx.expectError(GL_INVALID_VALUE);
1230	ctx.glPixelStorei(GL_PACK_SKIP_ROWS, -1);
1231	ctx.expectError(GL_INVALID_VALUE);
1232	ctx.glPixelStorei(GL_PACK_SKIP_PIXELS, -1);
1233	ctx.expectError(GL_INVALID_VALUE);
1234	ctx.glPixelStorei(GL_UNPACK_ROW_LENGTH, -1);
1235	ctx.expectError(GL_INVALID_VALUE);
1236	ctx.glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, -1);
1237	ctx.expectError(GL_INVALID_VALUE);
1238	ctx.glPixelStorei(GL_UNPACK_SKIP_ROWS, -1);
1239	ctx.expectError(GL_INVALID_VALUE);
1240	ctx.glPixelStorei(GL_UNPACK_SKIP_PIXELS, -1);
1241	ctx.expectError(GL_INVALID_VALUE);
1242	ctx.glPixelStorei(GL_UNPACK_SKIP_IMAGES, -1);
1243	ctx.expectError(GL_INVALID_VALUE);
1244	ctx.glPixelStorei(GL_PACK_ALIGNMENT, 0);
1245	ctx.expectError(GL_INVALID_VALUE);
1246	ctx.glPixelStorei(GL_UNPACK_ALIGNMENT, 0);
1247	ctx.expectError(GL_INVALID_VALUE);
1248	ctx.glPixelStorei(GL_PACK_ALIGNMENT, 16);
1249	ctx.expectError(GL_INVALID_VALUE);
1250	ctx.glPixelStorei(GL_UNPACK_ALIGNMENT, 16);
1251	ctx.expectError(GL_INVALID_VALUE);
1252	ctx.endSection();
1253}
1254
1255// glTexImage2D
1256
1257void teximage2d (NegativeTestContext& ctx)
1258{
1259	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
1260	ctx.glTexImage2D(0, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1261	ctx.expectError(GL_INVALID_ENUM);
1262	ctx.endSection();
1263
1264	ctx.beginSection("GL_INVALID_ENUM is generated if type is not a type constant.");
1265	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, 0, 0);
1266	ctx.expectError(GL_INVALID_ENUM);
1267	ctx.endSection();
1268
1269	ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of internalFormat, format and type is invalid.");
1270	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1271	ctx.expectError(GL_INVALID_OPERATION);
1272	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
1273	ctx.expectError(GL_INVALID_OPERATION);
1274	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
1275	ctx.expectError(GL_INVALID_OPERATION);
1276	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB10_A2, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_2_10_10_10_REV, 0);
1277	ctx.expectError(GL_INVALID_OPERATION);
1278	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32UI, 1, 1, 0, GL_RGBA_INTEGER, GL_INT, 0);
1279	ctx.expectError(GL_INVALID_OPERATION);
1280	ctx.endSection();
1281}
1282
1283void teximage2d_inequal_width_height_cube (NegativeTestContext& ctx)
1284{
1285	ctx.beginSection("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.");
1286	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1287	ctx.expectError(GL_INVALID_VALUE);
1288	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1289	ctx.expectError(GL_INVALID_VALUE);
1290	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1291	ctx.expectError(GL_INVALID_VALUE);
1292	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1293	ctx.expectError(GL_INVALID_VALUE);
1294	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1295	ctx.expectError(GL_INVALID_VALUE);
1296	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1297	ctx.expectError(GL_INVALID_VALUE);
1298	ctx.endSection();
1299}
1300
1301void teximage2d_neg_level (NegativeTestContext& ctx)
1302{
1303	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
1304	ctx.glTexImage2D(GL_TEXTURE_2D, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1305	ctx.expectError(GL_INVALID_VALUE);
1306	ctx.endSection();
1307
1308	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
1309	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1310	ctx.expectError(GL_INVALID_VALUE);
1311	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1312	ctx.expectError(GL_INVALID_VALUE);
1313	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1314	ctx.expectError(GL_INVALID_VALUE);
1315	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1316	ctx.expectError(GL_INVALID_VALUE);
1317	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1318	ctx.expectError(GL_INVALID_VALUE);
1319	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1320	ctx.expectError(GL_INVALID_VALUE);
1321	ctx.endSection();
1322}
1323
1324void teximage2d_max_level (NegativeTestContext& ctx)
1325{
1326	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
1327	deUint32 log2MaxTextureSize = deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
1328	ctx.glTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1329	ctx.expectError(GL_INVALID_VALUE);
1330	ctx.endSection();
1331
1332	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
1333	deUint32 log2MaxCubemapSize = deLog2Floor32(ctx.getInteger(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
1334	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1335	ctx.expectError(GL_INVALID_VALUE);
1336	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1337	ctx.expectError(GL_INVALID_VALUE);
1338	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1339	ctx.expectError(GL_INVALID_VALUE);
1340	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1341	ctx.expectError(GL_INVALID_VALUE);
1342	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1343	ctx.expectError(GL_INVALID_VALUE);
1344	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1345	ctx.expectError(GL_INVALID_VALUE);
1346	ctx.endSection();
1347}
1348
1349void teximage2d_neg_width_height (NegativeTestContext& ctx)
1350{
1351	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than 0.");
1352
1353	ctx.beginSection("GL_TEXTURE_2D target");
1354	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1355	ctx.expectError(GL_INVALID_VALUE);
1356	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1357	ctx.expectError(GL_INVALID_VALUE);
1358	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1359	ctx.expectError(GL_INVALID_VALUE);
1360	ctx.endSection();
1361
1362	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
1363	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1364	ctx.expectError(GL_INVALID_VALUE);
1365	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1366	ctx.expectError(GL_INVALID_VALUE);
1367	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1368	ctx.expectError(GL_INVALID_VALUE);
1369	ctx.endSection();
1370
1371	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
1372	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1373	ctx.expectError(GL_INVALID_VALUE);
1374	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1375	ctx.expectError(GL_INVALID_VALUE);
1376	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1377	ctx.expectError(GL_INVALID_VALUE);
1378	ctx.endSection();
1379
1380	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
1381	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1382	ctx.expectError(GL_INVALID_VALUE);
1383	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1384	ctx.expectError(GL_INVALID_VALUE);
1385	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1386	ctx.expectError(GL_INVALID_VALUE);
1387	ctx.endSection();
1388
1389	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
1390	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1391	ctx.expectError(GL_INVALID_VALUE);
1392	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1393	ctx.expectError(GL_INVALID_VALUE);
1394	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1395	ctx.expectError(GL_INVALID_VALUE);
1396	ctx.endSection();
1397
1398	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
1399	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1400	ctx.expectError(GL_INVALID_VALUE);
1401	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1402	ctx.expectError(GL_INVALID_VALUE);
1403	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1404	ctx.expectError(GL_INVALID_VALUE);
1405	ctx.endSection();
1406
1407	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
1408	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1409	ctx.expectError(GL_INVALID_VALUE);
1410	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1411	ctx.expectError(GL_INVALID_VALUE);
1412	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1413	ctx.expectError(GL_INVALID_VALUE);
1414	ctx.endSection();
1415
1416	ctx.endSection();
1417}
1418
1419void teximage2d_max_width_height (NegativeTestContext& ctx)
1420{
1421	int maxTextureSize = ctx.getInteger(GL_MAX_TEXTURE_SIZE) + 1;
1422	int maxCubemapSize = ctx.getInteger(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1;
1423
1424	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE.");
1425	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, maxTextureSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1426	ctx.expectError(GL_INVALID_VALUE);
1427	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1428	ctx.expectError(GL_INVALID_VALUE);
1429	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, maxTextureSize, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1430	ctx.expectError(GL_INVALID_VALUE);
1431	ctx.endSection();
1432
1433	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE.");
1434
1435	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
1436	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1437	ctx.expectError(GL_INVALID_VALUE);
1438	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1439	ctx.expectError(GL_INVALID_VALUE);
1440	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1441	ctx.expectError(GL_INVALID_VALUE);
1442	ctx.endSection();
1443
1444	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
1445	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1446	ctx.expectError(GL_INVALID_VALUE);
1447	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1448	ctx.expectError(GL_INVALID_VALUE);
1449	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1450	ctx.expectError(GL_INVALID_VALUE);
1451	ctx.endSection();
1452
1453	ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
1454	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1455	ctx.expectError(GL_INVALID_VALUE);
1456	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1457	ctx.expectError(GL_INVALID_VALUE);
1458	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1459	ctx.expectError(GL_INVALID_VALUE);
1460	ctx.endSection();
1461
1462	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
1463	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1464	ctx.expectError(GL_INVALID_VALUE);
1465	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1466	ctx.expectError(GL_INVALID_VALUE);
1467	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1468	ctx.expectError(GL_INVALID_VALUE);
1469	ctx.endSection();
1470
1471	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
1472	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1473	ctx.expectError(GL_INVALID_VALUE);
1474	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1475	ctx.expectError(GL_INVALID_VALUE);
1476	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1477	ctx.expectError(GL_INVALID_VALUE);
1478	ctx.endSection();
1479
1480	ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
1481	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1482	ctx.expectError(GL_INVALID_VALUE);
1483	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1484	ctx.expectError(GL_INVALID_VALUE);
1485	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1486	ctx.expectError(GL_INVALID_VALUE);
1487	ctx.endSection();
1488
1489	ctx.endSection();
1490}
1491
1492void teximage2d_invalid_border (NegativeTestContext& ctx)
1493{
1494	ctx.beginSection("GL_INVALID_VALUE is generated if border is not 0.");
1495	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1496	ctx.expectError(GL_INVALID_VALUE);
1497	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1498	ctx.expectError(GL_INVALID_VALUE);
1499	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1500	ctx.expectError(GL_INVALID_VALUE);
1501	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1502	ctx.expectError(GL_INVALID_VALUE);
1503	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1504	ctx.expectError(GL_INVALID_VALUE);
1505	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1506	ctx.expectError(GL_INVALID_VALUE);
1507	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1508	ctx.expectError(GL_INVALID_VALUE);
1509	ctx.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0);
1510	ctx.expectError(GL_INVALID_VALUE);
1511	ctx.endSection();
1512}
1513
1514void teximage2d_invalid_buffer_target (NegativeTestContext& ctx)
1515{
1516	deUint32				buf = 0x1234;
1517	deUint32				texture = 0x1234;
1518	std::vector<GLubyte>	data(64);
1519
1520	ctx.glGenBuffers			(1, &buf);
1521	ctx.glBindBuffer			(GL_PIXEL_UNPACK_BUFFER, buf);
1522	ctx.glBufferData			(GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY);
1523	ctx.glGenTextures			(1, &texture);
1524	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
1525	ctx.expectError				(GL_NO_ERROR);
1526
1527	ctx.beginSection("GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and...");
1528	ctx.beginSection("...the buffer object's data store is currently mapped.");
1529	ctx.glMapBufferRange		(GL_PIXEL_UNPACK_BUFFER, 0, 32, GL_MAP_WRITE_BIT);
1530	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1531	ctx.expectError				(GL_INVALID_OPERATION);
1532	ctx.glUnmapBuffer			(GL_PIXEL_UNPACK_BUFFER);
1533	ctx.endSection();
1534
1535	ctx.beginSection("...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size.");
1536	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1537	ctx.expectError				(GL_INVALID_OPERATION);
1538	ctx.endSection();
1539
1540	ctx.beginSection("...data is not evenly divisible into the number of bytes needed to store in memory a datum indicated by type.");
1541	ctx.getLog() << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage;
1542	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGB5_A1, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, (const GLvoid*)3);
1543	ctx.expectError				(GL_INVALID_OPERATION);
1544	ctx.endSection();
1545	ctx.endSection();
1546
1547	ctx.glDeleteBuffers			(1, &buf);
1548	ctx.glDeleteTextures		(1, &texture);
1549}
1550
1551// glTexSubImage2D
1552
1553void texsubimage2d (NegativeTestContext& ctx)
1554{
1555	deUint32			texture = 0x1234;
1556	ctx.glGenTextures		(1, &texture);
1557	ctx.glBindTexture		(GL_TEXTURE_2D, texture);
1558	ctx.glTexImage2D		(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1559	ctx.expectError			(GL_NO_ERROR);
1560
1561	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
1562	ctx.glTexSubImage2D(0, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1563	ctx.expectError(GL_INVALID_ENUM);
1564	ctx.endSection();
1565
1566	ctx.beginSection("GL_INVALID_ENUM is generated if format is not an accepted format constant.");
1567	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 4, 4, GL_UNSIGNED_BYTE, 0);
1568	ctx.expectError(GL_INVALID_ENUM);
1569	ctx.endSection();
1570
1571	ctx.beginSection("GL_INVALID_ENUM is generated if type is not a type constant.");
1572	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, 0, 0);
1573	ctx.expectError(GL_INVALID_ENUM);
1574	ctx.endSection();
1575
1576	ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of internalFormat of the previously specified texture array, format and type is not valid.");
1577	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, 0);
1578	ctx.expectError(GL_INVALID_OPERATION);
1579	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
1580	ctx.expectError(GL_INVALID_OPERATION);
1581	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
1582	ctx.expectError(GL_INVALID_OPERATION);
1583	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
1584	ctx.expectError(GL_INVALID_OPERATION);
1585	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0);
1586	ctx.expectError(GL_INVALID_OPERATION);
1587	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_FLOAT, 0);
1588	ctx.expectError(GL_INVALID_OPERATION);
1589	ctx.endSection();
1590
1591	ctx.glDeleteTextures	(1, &texture);
1592}
1593
1594void texsubimage2d_neg_level (NegativeTestContext& ctx)
1595{
1596	deUint32			textures[2];
1597	ctx.glGenTextures		(2, &textures[0]);
1598	ctx.glBindTexture		(GL_TEXTURE_2D, textures[0]);
1599	ctx.glTexImage2D		(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1600	ctx.glBindTexture		(GL_TEXTURE_2D, textures[1]);
1601	FOR_CUBE_FACES(faceGL, ctx.glTexImage2D(faceGL, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0););
1602	ctx.expectError			(GL_NO_ERROR);
1603
1604	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
1605	ctx.glTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1606	ctx.expectError(GL_INVALID_VALUE);
1607	ctx.endSection();
1608
1609	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
1610	FOR_CUBE_FACES(faceGL,
1611	{
1612		ctx.glTexSubImage2D(faceGL, -1, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1613		ctx.expectError(GL_INVALID_VALUE);
1614	});
1615	ctx.endSection();
1616
1617	ctx.glDeleteTextures(2, &textures[0]);
1618}
1619
1620void texsubimage2d_max_level (NegativeTestContext& ctx)
1621{
1622	deUint32			textures[2];
1623	ctx.glGenTextures		(2, &textures[0]);
1624	ctx.glBindTexture		(GL_TEXTURE_2D, textures[0]);
1625	ctx.glTexImage2D		(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1626	ctx.glBindTexture		(GL_TEXTURE_CUBE_MAP, textures[1]);
1627	FOR_CUBE_FACES(faceGL, ctx.glTexImage2D(faceGL, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0););
1628	ctx.expectError			(GL_NO_ERROR);
1629
1630	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
1631	deUint32 log2MaxTextureSize = deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
1632	ctx.glTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1633	ctx.expectError(GL_INVALID_VALUE);
1634	ctx.endSection();
1635
1636	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
1637	deUint32 log2MaxCubemapSize = deLog2Floor32(ctx.getInteger(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
1638	FOR_CUBE_FACES(faceGL,
1639	{
1640		ctx.glTexSubImage2D(faceGL, log2MaxCubemapSize, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1641		ctx.expectError(GL_INVALID_VALUE);
1642	});
1643	ctx.endSection();
1644
1645	ctx.glDeleteTextures(2, &textures[0]);
1646}
1647
1648void texsubimage2d_neg_offset (NegativeTestContext& ctx)
1649{
1650	deUint32 texture = 0x1234;
1651	ctx.glGenTextures(1, &texture);
1652	ctx.glBindTexture(GL_TEXTURE_2D, texture);
1653	ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1654	ctx.expectError(GL_NO_ERROR);
1655
1656	ctx.beginSection("GL_INVALID_VALUE is generated if xoffset or yoffset are negative.");
1657	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1658	ctx.expectError(GL_INVALID_VALUE);
1659	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1660	ctx.expectError(GL_INVALID_VALUE);
1661	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, -1, -1, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
1662	ctx.expectError(GL_INVALID_VALUE);
1663	ctx.endSection();
1664
1665	ctx.glDeleteTextures(1, &texture);
1666}
1667
1668void texsubimage2d_invalid_offset (NegativeTestContext& ctx)
1669{
1670	deUint32			texture = 0x1234;
1671	ctx.glGenTextures		(1, &texture);
1672	ctx.glBindTexture		(GL_TEXTURE_2D, texture);
1673	ctx.glTexImage2D		(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1674	ctx.expectError			(GL_NO_ERROR);
1675
1676	ctx.beginSection("GL_INVALID_VALUE is generated if xoffset + width > texture_width or yoffset + height > texture_height.");
1677	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 30, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1678	ctx.expectError(GL_INVALID_VALUE);
1679	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 30, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1680	ctx.expectError(GL_INVALID_VALUE);
1681	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 30, 30, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1682	ctx.expectError(GL_INVALID_VALUE);
1683	ctx.endSection();
1684
1685	ctx.glDeleteTextures	(1, &texture);
1686}
1687
1688void texsubimage2d_neg_width_height (NegativeTestContext& ctx)
1689{
1690	deUint32			texture = 0x1234;
1691	ctx.glGenTextures		(1, &texture);
1692	ctx.glBindTexture		(GL_TEXTURE_2D, texture);
1693	ctx.glTexImage2D		(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1694	ctx.expectError			(GL_NO_ERROR);
1695
1696	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than 0.");
1697	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1698	ctx.expectError(GL_INVALID_VALUE);
1699	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1700	ctx.expectError(GL_INVALID_VALUE);
1701	ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1702	ctx.expectError(GL_INVALID_VALUE);
1703	ctx.endSection();
1704
1705	ctx.glDeleteTextures	(1, &texture);
1706}
1707
1708void texsubimage2d_invalid_buffer_target (NegativeTestContext& ctx)
1709{
1710	deUint32				buf = 0x1234;
1711	deUint32				texture = 0x1234;
1712	std::vector<GLubyte>	data(64);
1713
1714	ctx.glGenTextures			(1, &texture);
1715	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
1716	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1717	ctx.glGenBuffers			(1, &buf);
1718	ctx.glBindBuffer			(GL_PIXEL_UNPACK_BUFFER, buf);
1719	ctx.glBufferData			(GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY);
1720	ctx.expectError				(GL_NO_ERROR);
1721
1722	ctx.beginSection("GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and...");
1723	ctx.beginSection("...the buffer object's data store is currently mapped.");
1724	ctx.glMapBufferRange		(GL_PIXEL_UNPACK_BUFFER, 0, 32, GL_MAP_WRITE_BIT);
1725	ctx.glTexSubImage2D			(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1726	ctx.expectError				(GL_INVALID_OPERATION);
1727	ctx.glUnmapBuffer			(GL_PIXEL_UNPACK_BUFFER);
1728	ctx.endSection();
1729
1730	ctx.beginSection("...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size.");
1731	ctx.glTexSubImage2D			(GL_TEXTURE_2D, 0, 0, 0, 32, 32, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1732	ctx.expectError				(GL_INVALID_OPERATION);
1733	ctx.endSection();
1734
1735	ctx.beginSection("...data is not evenly divisible into the number of bytes needed to store in memory a datum indicated by type.");
1736	ctx.getLog() << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage;
1737	ctx.glBindBuffer			(GL_PIXEL_UNPACK_BUFFER, 0);
1738	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 0);
1739	ctx.glBindBuffer			(GL_PIXEL_UNPACK_BUFFER, buf);
1740	ctx.expectError				(GL_NO_ERROR);
1741	ctx.glTexSubImage2D			(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, (const GLvoid*)3);
1742	ctx.expectError				(GL_INVALID_OPERATION);
1743	ctx.endSection();
1744	ctx.endSection();
1745
1746	ctx.glDeleteBuffers			(1, &buf);
1747	ctx.glDeleteTextures		(1, &texture);
1748}
1749
1750// glTexParameteri
1751
1752void texparameteri (NegativeTestContext& ctx)
1753{
1754	GLuint texture = 0x1234;
1755	GLint textureMode = -1;
1756
1757	ctx.glGenTextures(1, &texture);
1758	ctx.glBindTexture(GL_TEXTURE_2D, texture);
1759
1760	ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1761	ctx.glTexParameteri(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1762	ctx.expectError(GL_INVALID_ENUM);
1763	ctx.glTexParameteri(GL_TEXTURE_2D, 0, GL_LINEAR);
1764	ctx.expectError(GL_INVALID_ENUM);
1765	ctx.glTexParameteri(0, 0, GL_LINEAR);
1766	ctx.expectError(GL_INVALID_ENUM);
1767	ctx.endSection();
1768
1769	ctx.beginSection("GL_INVALID_ENUM is generated if pname is enum and the value of param(s) is not a valid value.");
1770	ctx.glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, textureMode);
1771	ctx.expectError(GL_INVALID_ENUM);
1772	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, textureMode);
1773	ctx.expectError(GL_INVALID_ENUM);
1774	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, textureMode);
1775	ctx.expectError(GL_INVALID_ENUM);
1776	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, textureMode);
1777	ctx.expectError(GL_INVALID_ENUM);
1778	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, textureMode);
1779	ctx.expectError(GL_INVALID_ENUM);
1780	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, textureMode);
1781	ctx.expectError(GL_INVALID_ENUM);
1782	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, textureMode);
1783	ctx.expectError(GL_INVALID_ENUM);
1784	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, textureMode);
1785	ctx.expectError(GL_INVALID_ENUM);
1786	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, textureMode);
1787	ctx.expectError(GL_INVALID_ENUM);
1788	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, textureMode);
1789	ctx.expectError(GL_INVALID_ENUM);
1790	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, textureMode);
1791	ctx.expectError(GL_INVALID_ENUM);
1792	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, textureMode);
1793	ctx.expectError(GL_INVALID_ENUM);
1794	ctx.endSection();
1795
1796	ctx.beginSection("GL_INVALID_VALUE is generated if pname is GL_TEXTURE_BASE_LEVEL or GL_TEXTURE_MAX_LEVEL and param(s) is negative.");
1797	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, -1);
1798	ctx.expectError(GL_INVALID_VALUE);
1799	ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, -1);
1800	ctx.expectError(GL_INVALID_VALUE);
1801	ctx.endSection();
1802
1803	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
1804	{
1805		ctx.beginSection("GL_INVALID_ENUM is generated if pname is a non-scalar parameter.");
1806		ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, 0);
1807		ctx.expectError(GL_INVALID_ENUM);
1808		ctx.endSection();
1809	}
1810
1811	ctx.beginSection("GL_INVALID_ENUM error is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname is not valid.");
1812	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BORDER_COLOR, textureMode);
1813	ctx.expectError(GL_INVALID_ENUM);
1814	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, textureMode);
1815	ctx.expectError(GL_INVALID_ENUM);
1816	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, textureMode);
1817	ctx.expectError(GL_INVALID_ENUM);
1818	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_S, textureMode);
1819	ctx.expectError(GL_INVALID_ENUM);
1820	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_T, textureMode);
1821	ctx.expectError(GL_INVALID_ENUM);
1822	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_R, textureMode);
1823	ctx.expectError(GL_INVALID_ENUM);
1824	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_LOD, textureMode);
1825	ctx.expectError(GL_INVALID_ENUM);
1826	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LOD, textureMode);
1827	ctx.expectError(GL_INVALID_ENUM);
1828	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_MODE, textureMode);
1829	ctx.expectError(GL_INVALID_ENUM);
1830	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_FUNC, textureMode);
1831	ctx.expectError(GL_INVALID_ENUM);
1832
1833	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
1834	{
1835		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, textureMode);
1836		ctx.expectError(GL_INVALID_ENUM);
1837		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_FILTER, textureMode);
1838		ctx.expectError(GL_INVALID_ENUM);
1839		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAG_FILTER, textureMode);
1840		ctx.expectError(GL_INVALID_ENUM);
1841		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_S, textureMode);
1842		ctx.expectError(GL_INVALID_ENUM);
1843		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_T, textureMode);
1844		ctx.expectError(GL_INVALID_ENUM);
1845		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_R, textureMode);
1846		ctx.expectError(GL_INVALID_ENUM);
1847		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_LOD, textureMode);
1848		ctx.expectError(GL_INVALID_ENUM);
1849		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAX_LOD, textureMode);
1850		ctx.expectError(GL_INVALID_ENUM);
1851		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_MODE, textureMode);
1852		ctx.expectError(GL_INVALID_ENUM);
1853		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_FUNC, textureMode);
1854		ctx.expectError(GL_INVALID_ENUM);
1855	}
1856	ctx.endSection();
1857
1858	ctx.beginSection("GL_INVALID_OPERATION is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname GL_TEXTURE_BASE_LEVEL is not 0.");
1859	ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL, 1);
1860	ctx.expectError(GL_INVALID_OPERATION);
1861
1862	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
1863	{
1864		ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
1865		ctx.expectError(GL_INVALID_OPERATION);
1866	}
1867	ctx.endSection();
1868
1869	ctx.glDeleteTextures(1, &texture);
1870}
1871
1872// glTexParameterf
1873
1874void texparameterf (NegativeTestContext& ctx)
1875{
1876	GLuint texture = 0x1234;
1877	GLfloat textureMode = -1.0f;
1878	ctx.glGenTextures(1, &texture);
1879	ctx.glBindTexture(GL_TEXTURE_2D, texture);
1880
1881	ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
1882	ctx.glTexParameterf(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1883	ctx.expectError(GL_INVALID_ENUM);
1884	ctx.glTexParameterf(GL_TEXTURE_2D, 0, GL_LINEAR);
1885	ctx.expectError(GL_INVALID_ENUM);
1886	ctx.glTexParameterf(0, 0, GL_LINEAR);
1887	ctx.expectError(GL_INVALID_ENUM);
1888	ctx.endSection();
1889
1890	ctx.beginSection("GL_INVALID_ENUM is generated if pname is enum and the value of param(s) is not a valid value.");
1891	ctx.glTexParameterf(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, textureMode);
1892	ctx.expectError(GL_INVALID_ENUM);
1893	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, textureMode);
1894	ctx.expectError(GL_INVALID_ENUM);
1895	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, textureMode);
1896	ctx.expectError(GL_INVALID_ENUM);
1897	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, textureMode);
1898	ctx.expectError(GL_INVALID_ENUM);
1899	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, textureMode);
1900	ctx.expectError(GL_INVALID_ENUM);
1901	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, textureMode);
1902	ctx.expectError(GL_INVALID_ENUM);
1903	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, textureMode);
1904	ctx.expectError(GL_INVALID_ENUM);
1905	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, textureMode);
1906	ctx.expectError(GL_INVALID_ENUM);
1907	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, textureMode);
1908	ctx.expectError(GL_INVALID_ENUM);
1909	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, textureMode);
1910	ctx.expectError(GL_INVALID_ENUM);
1911	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, textureMode);
1912	ctx.expectError(GL_INVALID_ENUM);
1913	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, textureMode);
1914	ctx.expectError(GL_INVALID_ENUM);
1915	ctx.endSection();
1916
1917	ctx.beginSection("GL_INVALID_VALUE is generated if pname is GL_TEXTURE_BASE_LEVEL or GL_TEXTURE_MAX_LEVEL and param(s) is negative.");
1918	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, -1.0f);
1919	ctx.expectError(GL_INVALID_VALUE);
1920	ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, -1.0f);
1921	ctx.expectError(GL_INVALID_VALUE);
1922	ctx.endSection();
1923
1924	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
1925	{
1926		ctx.beginSection("GL_INVALID_ENUM is generated if pname is a non-scalar parameter.");
1927		ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, 0.0f);
1928		ctx.expectError(GL_INVALID_ENUM);
1929		ctx.endSection();
1930	}
1931
1932	ctx.beginSection("GL_INVALID_ENUM error is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname is not valid.");
1933	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BORDER_COLOR, textureMode);
1934	ctx.expectError(GL_INVALID_ENUM);
1935	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, textureMode);
1936	ctx.expectError(GL_INVALID_ENUM);
1937	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, textureMode);
1938	ctx.expectError(GL_INVALID_ENUM);
1939	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_S, textureMode);
1940	ctx.expectError(GL_INVALID_ENUM);
1941	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_T, textureMode);
1942	ctx.expectError(GL_INVALID_ENUM);
1943	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_R, textureMode);
1944	ctx.expectError(GL_INVALID_ENUM);
1945	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_LOD, textureMode);
1946	ctx.expectError(GL_INVALID_ENUM);
1947	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LOD, textureMode);
1948	ctx.expectError(GL_INVALID_ENUM);
1949	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_MODE, textureMode);
1950	ctx.expectError(GL_INVALID_ENUM);
1951	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_FUNC, textureMode);
1952	ctx.expectError(GL_INVALID_ENUM);
1953
1954	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
1955	{
1956		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, textureMode);
1957		ctx.expectError(GL_INVALID_ENUM);
1958		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_FILTER, textureMode);
1959		ctx.expectError(GL_INVALID_ENUM);
1960		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAG_FILTER, textureMode);
1961		ctx.expectError(GL_INVALID_ENUM);
1962		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_S, textureMode);
1963		ctx.expectError(GL_INVALID_ENUM);
1964		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_T, textureMode);
1965		ctx.expectError(GL_INVALID_ENUM);
1966		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_R, textureMode);
1967		ctx.expectError(GL_INVALID_ENUM);
1968		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_LOD, textureMode);
1969		ctx.expectError(GL_INVALID_ENUM);
1970		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAX_LOD, textureMode);
1971		ctx.expectError(GL_INVALID_ENUM);
1972		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_MODE, textureMode);
1973		ctx.expectError(GL_INVALID_ENUM);
1974		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_FUNC, textureMode);
1975		ctx.expectError(GL_INVALID_ENUM);
1976	}
1977	ctx.endSection();
1978
1979	ctx.beginSection("GL_INVALID_OPERATION is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname GL_TEXTURE_BASE_LEVEL is not 0.");
1980	ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL, 1.0f);
1981	ctx.expectError(GL_INVALID_OPERATION);
1982
1983	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
1984	{
1985		ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL, 1.0f);
1986		ctx.expectError(GL_INVALID_OPERATION);
1987	}
1988	ctx.endSection();
1989
1990	ctx.glDeleteTextures(1, &texture);
1991}
1992
1993// glTexParameteriv
1994
1995void texparameteriv (NegativeTestContext& ctx)
1996{
1997	GLint params[1] = {GL_LINEAR};
1998	GLuint texture = 0x1234;
1999	ctx.glGenTextures(1, &texture);
2000	ctx.glBindTexture(GL_TEXTURE_2D, texture);
2001
2002	ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
2003	ctx.glTexParameteriv(0, GL_TEXTURE_MIN_FILTER, &params[0]);
2004	ctx.expectError(GL_INVALID_ENUM);
2005	ctx.glTexParameteriv(GL_TEXTURE_2D, 0, &params[0]);
2006	ctx.expectError(GL_INVALID_ENUM);
2007	ctx.glTexParameteriv(0, 0, &params[0]);
2008	ctx.expectError(GL_INVALID_ENUM);
2009	ctx.endSection();
2010
2011	ctx.beginSection("GL_INVALID_ENUM is generated if pname is enum and the value of param(s) is not a valid value.");
2012	params[0] = -1;
2013	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, &params[0]);
2014	ctx.expectError(GL_INVALID_ENUM);
2015	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, &params[0]);
2016	ctx.expectError(GL_INVALID_ENUM);
2017	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, &params[0]);
2018	ctx.expectError(GL_INVALID_ENUM);
2019	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &params[0]);
2020	ctx.expectError(GL_INVALID_ENUM);
2021	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &params[0]);
2022	ctx.expectError(GL_INVALID_ENUM);
2023	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, &params[0]);
2024	ctx.expectError(GL_INVALID_ENUM);
2025	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, &params[0]);
2026	ctx.expectError(GL_INVALID_ENUM);
2027	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, &params[0]);
2028	ctx.expectError(GL_INVALID_ENUM);
2029	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, &params[0]);
2030	ctx.expectError(GL_INVALID_ENUM);
2031	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &params[0]);
2032	ctx.expectError(GL_INVALID_ENUM);
2033	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &params[0]);
2034	ctx.expectError(GL_INVALID_ENUM);
2035	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, &params[0]);
2036	ctx.expectError(GL_INVALID_ENUM);
2037	ctx.endSection();
2038
2039	ctx.beginSection("GL_INVALID_VALUE is generated if pname is GL_TEXTURE_BASE_LEVEL or GL_TEXTURE_MAX_LEVEL and param(s) is negative.");
2040	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, &params[0]);
2041	ctx.expectError(GL_INVALID_VALUE);
2042	ctx.glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &params[0]);
2043	ctx.expectError(GL_INVALID_VALUE);
2044	ctx.endSection();
2045
2046	ctx.beginSection("GL_INVALID_ENUM error is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname is not valid.");
2047	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BORDER_COLOR, &params[0]);
2048	ctx.expectError(GL_INVALID_ENUM);
2049	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, &params[0]);
2050	ctx.expectError(GL_INVALID_ENUM);
2051	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, &params[0]);
2052	ctx.expectError(GL_INVALID_ENUM);
2053	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_S, &params[0]);
2054	ctx.expectError(GL_INVALID_ENUM);
2055	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_T, &params[0]);
2056	ctx.expectError(GL_INVALID_ENUM);
2057	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_R, &params[0]);
2058	ctx.expectError(GL_INVALID_ENUM);
2059	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_LOD, &params[0]);
2060	ctx.expectError(GL_INVALID_ENUM);
2061	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LOD, &params[0]);
2062	ctx.expectError(GL_INVALID_ENUM);
2063	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_MODE, &params[0]);
2064	ctx.expectError(GL_INVALID_ENUM);
2065	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_FUNC, &params[0]);
2066	ctx.expectError(GL_INVALID_ENUM);
2067
2068	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
2069	{
2070		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, &params[0]);
2071		ctx.expectError(GL_INVALID_ENUM);
2072		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_FILTER, &params[0]);
2073		ctx.expectError(GL_INVALID_ENUM);
2074		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAG_FILTER, &params[0]);
2075		ctx.expectError(GL_INVALID_ENUM);
2076		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_S, &params[0]);
2077		ctx.expectError(GL_INVALID_ENUM);
2078		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_T, &params[0]);
2079		ctx.expectError(GL_INVALID_ENUM);
2080		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_R, &params[0]);
2081		ctx.expectError(GL_INVALID_ENUM);
2082		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_LOD, &params[0]);
2083		ctx.expectError(GL_INVALID_ENUM);
2084		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAX_LOD, &params[0]);
2085		ctx.expectError(GL_INVALID_ENUM);
2086		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_MODE, &params[0]);
2087		ctx.expectError(GL_INVALID_ENUM);
2088		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_FUNC, &params[0]);
2089		ctx.expectError(GL_INVALID_ENUM);
2090	}
2091	ctx.endSection();
2092
2093	ctx.beginSection("GL_INVALID_OPERATION is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname GL_TEXTURE_BASE_LEVEL is not 0.");
2094	params[0] = 1;
2095	ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL, &params[0]);
2096	ctx.expectError(GL_INVALID_OPERATION);
2097
2098	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
2099	{
2100		params[0] = 1;
2101		ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL, &params[0]);
2102		ctx.expectError(GL_INVALID_OPERATION);
2103	}
2104	ctx.endSection();
2105
2106	ctx.glDeleteTextures(1, &texture);
2107}
2108
2109// glTexParameterfv
2110
2111void texparameterfv (NegativeTestContext& ctx)
2112{
2113	GLfloat params[1] = {GL_LINEAR};
2114	GLuint texture = 0x1234;
2115	ctx.glGenTextures(1, &texture);
2116	ctx.glBindTexture(GL_TEXTURE_2D, texture);
2117
2118	ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values.");
2119	params[0] = GL_LINEAR;
2120	ctx.glTexParameterfv(0, GL_TEXTURE_MIN_FILTER, &params[0]);
2121	ctx.expectError(GL_INVALID_ENUM);
2122	ctx.glTexParameterfv(GL_TEXTURE_2D, 0, &params[0]);
2123	ctx.expectError(GL_INVALID_ENUM);
2124	ctx.glTexParameterfv(0, 0, &params[0]);
2125	ctx.expectError(GL_INVALID_ENUM);
2126	ctx.endSection();
2127
2128	ctx.beginSection("GL_INVALID_ENUM is generated if pname is enum and the value of param(s) is not a valid value.");
2129	params[0] = -1.0f;
2130	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, &params[0]);
2131	ctx.expectError(GL_INVALID_ENUM);
2132	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, &params[0]);
2133	ctx.expectError(GL_INVALID_ENUM);
2134	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, &params[0]);
2135	ctx.expectError(GL_INVALID_ENUM);
2136	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &params[0]);
2137	ctx.expectError(GL_INVALID_ENUM);
2138	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &params[0]);
2139	ctx.expectError(GL_INVALID_ENUM);
2140	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, &params[0]);
2141	ctx.expectError(GL_INVALID_ENUM);
2142	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, &params[0]);
2143	ctx.expectError(GL_INVALID_ENUM);
2144	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, &params[0]);
2145	ctx.expectError(GL_INVALID_ENUM);
2146	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, &params[0]);
2147	ctx.expectError(GL_INVALID_ENUM);
2148	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &params[0]);
2149	ctx.expectError(GL_INVALID_ENUM);
2150	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &params[0]);
2151	ctx.expectError(GL_INVALID_ENUM);
2152	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, &params[0]);
2153	ctx.expectError(GL_INVALID_ENUM);
2154	ctx.endSection();
2155
2156	ctx.beginSection("GL_INVALID_VALUE is generated if pname is GL_TEXTURE_BASE_LEVEL or GL_TEXTURE_MAX_LEVEL and param(s) is negative.");
2157	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, &params[0]);
2158	ctx.expectError(GL_INVALID_VALUE);
2159	ctx.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &params[0]);
2160	ctx.expectError(GL_INVALID_VALUE);
2161	ctx.endSection();
2162
2163	ctx.beginSection("GL_INVALID_ENUM error is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname is not valid.");
2164	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BORDER_COLOR, &params[0]);
2165	ctx.expectError(GL_INVALID_ENUM);
2166	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, &params[0]);
2167	ctx.expectError(GL_INVALID_ENUM);
2168	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, &params[0]);
2169	ctx.expectError(GL_INVALID_ENUM);
2170	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_S, &params[0]);
2171	ctx.expectError(GL_INVALID_ENUM);
2172	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_T, &params[0]);
2173	ctx.expectError(GL_INVALID_ENUM);
2174	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_R, &params[0]);
2175	ctx.expectError(GL_INVALID_ENUM);
2176	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_LOD, &params[0]);
2177	ctx.expectError(GL_INVALID_ENUM);
2178	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LOD, &params[0]);
2179	ctx.expectError(GL_INVALID_ENUM);
2180	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_MODE, &params[0]);
2181	ctx.expectError(GL_INVALID_ENUM);
2182	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_FUNC, &params[0]);
2183	ctx.expectError(GL_INVALID_ENUM);
2184
2185	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
2186	{
2187		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, &params[0]);
2188		ctx.expectError(GL_INVALID_ENUM);
2189		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_FILTER, &params[0]);
2190		ctx.expectError(GL_INVALID_ENUM);
2191		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAG_FILTER, &params[0]);
2192		ctx.expectError(GL_INVALID_ENUM);
2193		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_S, &params[0]);
2194		ctx.expectError(GL_INVALID_ENUM);
2195		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_T, &params[0]);
2196		ctx.expectError(GL_INVALID_ENUM);
2197		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_R, &params[0]);
2198		ctx.expectError(GL_INVALID_ENUM);
2199		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_LOD, &params[0]);
2200		ctx.expectError(GL_INVALID_ENUM);
2201		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAX_LOD, &params[0]);
2202		ctx.expectError(GL_INVALID_ENUM);
2203		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_MODE, &params[0]);
2204		ctx.expectError(GL_INVALID_ENUM);
2205		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_FUNC, &params[0]);
2206		ctx.expectError(GL_INVALID_ENUM);
2207	}
2208	ctx.endSection();
2209
2210	ctx.beginSection("GL_INVALID_OPERATION is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname GL_TEXTURE_BASE_LEVEL is not 0.");
2211	params[0] = 1.0f;
2212	ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL, &params[0]);
2213	ctx.expectError(GL_INVALID_OPERATION);
2214
2215	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
2216	{
2217		params[0] = 1.0f;
2218		ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL, &params[0]);
2219		ctx.expectError(GL_INVALID_OPERATION);
2220	}
2221	ctx.endSection();
2222
2223	ctx.glDeleteTextures(1, &texture);
2224}
2225
2226// glTexParameterIiv
2227
2228void texparameterIiv (NegativeTestContext& ctx)
2229{
2230	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
2231		throw tcu::NotSupportedError("glTexParameterIiv is not supported.", DE_NULL, __FILE__, __LINE__);
2232
2233	GLint textureMode[] = { GL_DEPTH_COMPONENT, GL_STENCIL_INDEX };
2234	ctx.beginSection("GL_INVALID_ENUM is generated if target is not a valid target.");
2235	ctx.glTexParameterIiv(0, GL_DEPTH_STENCIL_TEXTURE_MODE, textureMode);
2236	ctx.expectError(GL_INVALID_ENUM);
2237	ctx.endSection();
2238
2239	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not a valid parameter.");
2240	ctx.glTexParameterIiv(GL_TEXTURE_2D, 0, textureMode);
2241	ctx.expectError(GL_INVALID_ENUM);
2242	ctx.endSection();
2243
2244	ctx.beginSection("GL_INVALID_ENUM is generated if pname is enum and the value of param(s) is not a valid value.");
2245	textureMode[0] = -1;
2246	textureMode[1] = -1;
2247	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, textureMode);
2248	ctx.expectError(GL_INVALID_ENUM);
2249	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, textureMode);
2250	ctx.expectError(GL_INVALID_ENUM);
2251	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, textureMode);
2252	ctx.expectError(GL_INVALID_ENUM);
2253	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, textureMode);
2254	ctx.expectError(GL_INVALID_ENUM);
2255	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, textureMode);
2256	ctx.expectError(GL_INVALID_ENUM);
2257	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, textureMode);
2258	ctx.expectError(GL_INVALID_ENUM);
2259	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, textureMode);
2260	ctx.expectError(GL_INVALID_ENUM);
2261	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, textureMode);
2262	ctx.expectError(GL_INVALID_ENUM);
2263	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, textureMode);
2264	ctx.expectError(GL_INVALID_ENUM);
2265	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, textureMode);
2266	ctx.expectError(GL_INVALID_ENUM);
2267	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, textureMode);
2268	ctx.expectError(GL_INVALID_ENUM);
2269	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, textureMode);
2270	ctx.expectError(GL_INVALID_ENUM);
2271	ctx.endSection();
2272
2273	ctx.beginSection("GL_INVALID_VALUE is generated if pname is GL_TEXTURE_BASE_LEVEL or GL_TEXTURE_MAX_LEVEL and param(s) is negative.");
2274	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, textureMode);
2275	ctx.expectError(GL_INVALID_VALUE);
2276	ctx.glTexParameterIiv(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, textureMode);
2277	ctx.expectError(GL_INVALID_VALUE);
2278	ctx.endSection();
2279
2280	ctx.beginSection("GL_INVALID_ENUM error is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname is not valid.");
2281	textureMode[0] = 0;
2282	textureMode[1] = 0;
2283	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BORDER_COLOR, textureMode);
2284	ctx.expectError(GL_INVALID_ENUM);
2285	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, textureMode);
2286	ctx.expectError(GL_INVALID_ENUM);
2287	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, textureMode);
2288	ctx.expectError(GL_INVALID_ENUM);
2289	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_S, textureMode);
2290	ctx.expectError(GL_INVALID_ENUM);
2291	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_T, textureMode);
2292	ctx.expectError(GL_INVALID_ENUM);
2293	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_R, textureMode);
2294	ctx.expectError(GL_INVALID_ENUM);
2295	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_LOD, textureMode);
2296	ctx.expectError(GL_INVALID_ENUM);
2297	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LOD, textureMode);
2298	ctx.expectError(GL_INVALID_ENUM);
2299	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_MODE, textureMode);
2300	ctx.expectError(GL_INVALID_ENUM);
2301	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_FUNC, textureMode);
2302	ctx.expectError(GL_INVALID_ENUM);
2303
2304	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, textureMode);
2305	ctx.expectError(GL_INVALID_ENUM);
2306	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_FILTER, textureMode);
2307	ctx.expectError(GL_INVALID_ENUM);
2308	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAG_FILTER, textureMode);
2309	ctx.expectError(GL_INVALID_ENUM);
2310	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_S, textureMode);
2311	ctx.expectError(GL_INVALID_ENUM);
2312	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_T, textureMode);
2313	ctx.expectError(GL_INVALID_ENUM);
2314	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_R, textureMode);
2315	ctx.expectError(GL_INVALID_ENUM);
2316	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_LOD, textureMode);
2317	ctx.expectError(GL_INVALID_ENUM);
2318	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAX_LOD, textureMode);
2319	ctx.expectError(GL_INVALID_ENUM);
2320	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_MODE, textureMode);
2321	ctx.expectError(GL_INVALID_ENUM);
2322	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_FUNC, textureMode);
2323	ctx.expectError(GL_INVALID_ENUM);
2324	ctx.endSection();
2325
2326	ctx.beginSection("GL_INVALID_OPERATION is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname GL_TEXTURE_BASE_LEVEL is not 0.");
2327	textureMode[0] = 1;
2328	textureMode[1] = 1;
2329	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL, textureMode);
2330	ctx.expectError(GL_INVALID_OPERATION);
2331	ctx.glTexParameterIiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL, textureMode);
2332	ctx.expectError(GL_INVALID_OPERATION);
2333	ctx.endSection();
2334}
2335
2336// glTexParameterIuiv
2337
2338void texparameterIuiv (NegativeTestContext& ctx)
2339{
2340	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
2341		throw tcu::NotSupportedError("glTexParameterIuiv is not supported.", DE_NULL, __FILE__, __LINE__);
2342
2343	GLuint textureMode[] = { GL_DEPTH_COMPONENT, GL_STENCIL_INDEX };
2344	ctx.beginSection("GL_INVALID_ENUM is generated if target is not a valid target.");
2345	ctx.glTexParameterIuiv(0, GL_DEPTH_STENCIL_TEXTURE_MODE, textureMode);
2346	ctx.expectError(GL_INVALID_ENUM);
2347	ctx.endSection();
2348
2349	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not a valid parameter.");
2350	ctx.glTexParameterIuiv(GL_TEXTURE_2D, 0, textureMode);
2351	ctx.expectError(GL_INVALID_ENUM);
2352	ctx.endSection();
2353
2354	ctx.beginSection("GL_INVALID_ENUM is generated if pname is enum and the value of param(s) is not a valid value.");
2355	textureMode[0] = GL_DONT_CARE;
2356	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, textureMode);
2357	ctx.expectError(GL_INVALID_ENUM);
2358	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, textureMode);
2359	ctx.expectError(GL_INVALID_ENUM);
2360	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, textureMode);
2361	ctx.expectError(GL_INVALID_ENUM);
2362	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, textureMode);
2363	ctx.expectError(GL_INVALID_ENUM);
2364	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, textureMode);
2365	ctx.expectError(GL_INVALID_ENUM);
2366	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, textureMode);
2367	ctx.expectError(GL_INVALID_ENUM);
2368	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, textureMode);
2369	ctx.expectError(GL_INVALID_ENUM);
2370	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, textureMode);
2371	ctx.expectError(GL_INVALID_ENUM);
2372	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, textureMode);
2373	ctx.expectError(GL_INVALID_ENUM);
2374	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, textureMode);
2375	ctx.expectError(GL_INVALID_ENUM);
2376	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, textureMode);
2377	ctx.expectError(GL_INVALID_ENUM);
2378	ctx.glTexParameterIuiv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, textureMode);
2379	ctx.expectError(GL_INVALID_ENUM);
2380	ctx.endSection();
2381
2382	ctx.beginSection("GL_INVALID_ENUM error is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname is not valid.");
2383	textureMode[0] = 0;
2384	textureMode[1] = 0;
2385	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BORDER_COLOR, textureMode);
2386	ctx.expectError(GL_INVALID_ENUM);
2387	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, textureMode);
2388	ctx.expectError(GL_INVALID_ENUM);
2389	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, textureMode);
2390	ctx.expectError(GL_INVALID_ENUM);
2391	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_S, textureMode);
2392	ctx.expectError(GL_INVALID_ENUM);
2393	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_T, textureMode);
2394	ctx.expectError(GL_INVALID_ENUM);
2395	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_R, textureMode);
2396	ctx.expectError(GL_INVALID_ENUM);
2397	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_LOD, textureMode);
2398	ctx.expectError(GL_INVALID_ENUM);
2399	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LOD, textureMode);
2400	ctx.expectError(GL_INVALID_ENUM);
2401	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_MODE, textureMode);
2402	ctx.expectError(GL_INVALID_ENUM);
2403	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_FUNC, textureMode);
2404	ctx.expectError(GL_INVALID_ENUM);
2405
2406	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, textureMode);
2407	ctx.expectError(GL_INVALID_ENUM);
2408	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_FILTER, textureMode);
2409	ctx.expectError(GL_INVALID_ENUM);
2410	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAG_FILTER, textureMode);
2411	ctx.expectError(GL_INVALID_ENUM);
2412	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_S, textureMode);
2413	ctx.expectError(GL_INVALID_ENUM);
2414	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_T, textureMode);
2415	ctx.expectError(GL_INVALID_ENUM);
2416	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_WRAP_R, textureMode);
2417	ctx.expectError(GL_INVALID_ENUM);
2418	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MIN_LOD, textureMode);
2419	ctx.expectError(GL_INVALID_ENUM);
2420	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAX_LOD, textureMode);
2421	ctx.expectError(GL_INVALID_ENUM);
2422	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_MODE, textureMode);
2423	ctx.expectError(GL_INVALID_ENUM);
2424	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_COMPARE_FUNC, textureMode);
2425	ctx.expectError(GL_INVALID_ENUM);
2426	ctx.endSection();
2427
2428	ctx.beginSection("GL_INVALID_OPERATION is generated if target is GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY and pname GL_TEXTURE_BASE_LEVEL is not 0.");
2429	textureMode[0] = 1;
2430	textureMode[1] = 1;
2431	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL, textureMode);
2432	ctx.expectError(GL_INVALID_OPERATION);
2433	ctx.glTexParameterIuiv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL, textureMode);
2434	ctx.expectError(GL_INVALID_OPERATION);
2435	ctx.endSection();
2436}
2437
2438// glCompressedTexSubImage2D
2439
2440void compressedtexsubimage2d (NegativeTestContext& ctx)
2441{
2442	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
2443	ctx.glCompressedTexSubImage2D(0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGB8_ETC2, 0, 0);
2444	ctx.expectError(GL_INVALID_ENUM);
2445	ctx.endSection();
2446
2447	deUint32				texture = 0x1234;
2448	ctx.glGenTextures			(1, &texture);
2449	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
2450	ctx.glCompressedTexImage2D	(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0);
2451	ctx.expectError				(GL_NO_ERROR);
2452
2453	ctx.beginSection("GL_INVALID_OPERATION is generated if format does not match the internal format of the texture image being modified.");
2454	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_COMPRESSED_RGB8_ETC2, 0, 0);
2455	ctx.expectError(GL_INVALID_OPERATION);
2456	ctx.endSection();
2457
2458	ctx.beginSection("For ETC2/EAC images GL_INVALID_OPERATION is generated if width is not a multiple of four, and width + xoffset is not equal to the width of the texture level.");
2459	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 4, 0, 10, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(10, 4), 0);
2460	ctx.expectError(GL_INVALID_OPERATION);
2461	ctx.endSection();
2462
2463	ctx.beginSection("For ETC2/EAC images GL_INVALID_OPERATION is generated if height is not a multiple of four, and height + yoffset is not equal to the height of the texture level.");
2464	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 4, 4, 10, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 10), 0);
2465	ctx.expectError(GL_INVALID_OPERATION);
2466	ctx.endSection();
2467
2468	ctx.beginSection("For ETC2/EAC images GL_INVALID_OPERATION is generated if xoffset or yoffset is not a multiple of four.");
2469	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 1, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
2470	ctx.expectError(GL_INVALID_OPERATION);
2471	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 0, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
2472	ctx.expectError(GL_INVALID_OPERATION);
2473	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
2474	ctx.expectError(GL_INVALID_OPERATION);
2475	ctx.endSection();
2476
2477	ctx.glDeleteTextures		(1, &texture);
2478}
2479
2480void compressedtexsubimage2d_neg_level (NegativeTestContext& ctx)
2481{
2482	deUint32				textures[2];
2483	ctx.glGenTextures			(2, &textures[0]);
2484	ctx.glBindTexture			(GL_TEXTURE_2D, textures[0]);
2485	ctx.glCompressedTexImage2D	(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0);
2486	ctx.glBindTexture			(GL_TEXTURE_CUBE_MAP, textures[1]);
2487	FOR_CUBE_FACES(faceGL, ctx.glCompressedTexImage2D(faceGL, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0););
2488	ctx.expectError				(GL_NO_ERROR);
2489
2490	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
2491	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2492	ctx.expectError(GL_INVALID_VALUE);
2493	ctx.endSection();
2494
2495	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
2496	FOR_CUBE_FACES(faceGL,
2497	{
2498		ctx.glCompressedTexSubImage2D(faceGL, -1, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2499		ctx.expectError(GL_INVALID_VALUE);
2500	});
2501	ctx.endSection();
2502
2503	ctx.glDeleteTextures(2, &textures[0]);
2504}
2505
2506void compressedtexsubimage2d_max_level (NegativeTestContext& ctx)
2507{
2508	deUint32				textures[2];
2509	ctx.glGenTextures			(2, &textures[0]);
2510	ctx.glBindTexture			(GL_TEXTURE_2D, textures[0]);
2511	ctx.glCompressedTexImage2D	(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0);
2512	ctx.glBindTexture			(GL_TEXTURE_CUBE_MAP, textures[1]);
2513	FOR_CUBE_FACES(faceGL, ctx.glCompressedTexImage2D(faceGL, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0););
2514	ctx.expectError				(GL_NO_ERROR);
2515
2516	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
2517	deUint32 log2MaxTextureSize = deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
2518	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2519	ctx.expectError(GL_INVALID_VALUE);
2520	ctx.endSection();
2521
2522	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
2523	deUint32 log2MaxCubemapSize = deLog2Floor32(ctx.getInteger(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
2524	FOR_CUBE_FACES(faceGL,
2525	{
2526		ctx.glCompressedTexSubImage2D(faceGL, log2MaxCubemapSize, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2527		ctx.expectError(GL_INVALID_VALUE);
2528	});
2529	ctx.endSection();
2530
2531	ctx.glDeleteTextures(2, &textures[0]);
2532}
2533
2534void compressedtexsubimage2d_neg_offset (NegativeTestContext& ctx)
2535{
2536	GLuint texture = 0x1234;
2537	ctx.glGenTextures(1, &texture);
2538	ctx.glBindTexture(GL_TEXTURE_2D, texture);
2539	ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 8, 8, 0, etc2EacDataSize(8, 8), 0);
2540
2541	// \note Both GL_INVALID_VALUE and GL_INVALID_OPERATION are valid here since implementation may
2542	//		 first check if offsets are valid for certain format and only after that check that they
2543	//		 are not negative.
2544	ctx.beginSection("GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset or yoffset are negative.");
2545
2546	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -4, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2547	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2548	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, -4, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2549	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2550	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -4, -4, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2551	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2552
2553	ctx.endSection();
2554
2555	ctx.glDeleteTextures(1, &texture);
2556}
2557
2558void compressedtexsubimage2d_invalid_offset (NegativeTestContext& ctx)
2559{
2560	deUint32				texture = 0x1234;
2561	ctx.glGenTextures			(1, &texture);
2562	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
2563	ctx.glCompressedTexImage2D	(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
2564	ctx.expectError				(GL_NO_ERROR);
2565
2566	ctx.beginSection("GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset + width > texture_width or yoffset + height > texture_height.");
2567
2568	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 12, 0, 8, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(8, 4), 0);
2569	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2570	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 12, 4, 8, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 8), 0);
2571	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2572	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 12, 12, 8, 8, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(8, 8), 0);
2573	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2574	ctx.endSection();
2575
2576	ctx.glDeleteTextures		(1, &texture);
2577}
2578
2579void compressedtexsubimage2d_neg_width_height (NegativeTestContext& ctx)
2580{
2581	deUint32				texture = 0x1234;
2582	ctx.glGenTextures			(1, &texture);
2583	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
2584	ctx.glCompressedTexImage2D	(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
2585	ctx.expectError				(GL_NO_ERROR);
2586
2587	ctx.beginSection("GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if width or height is less than 0.");
2588	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -4, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2589	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2590	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2591	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2592	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -4, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
2593	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
2594	ctx.endSection();
2595
2596	ctx.glDeleteTextures(1,		&texture);
2597}
2598
2599void compressedtexsubimage2d_invalid_size (NegativeTestContext& ctx)
2600{
2601	deUint32				texture = 0x1234;
2602	ctx.glGenTextures			(1, &texture);
2603	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
2604	ctx.glCompressedTexImage2D	(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
2605	ctx.expectError				(GL_NO_ERROR);
2606
2607	ctx.beginSection("GL_INVALID_VALUE is generated if imageSize is not consistent with the format, dimensions, and contents of the specified compressed image data.");
2608	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0);
2609	ctx.expectError(GL_INVALID_VALUE);
2610
2611	ctx.glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_COMPRESSED_RGBA8_ETC2_EAC, 4*4*16-1, 0);
2612	ctx.expectError(GL_INVALID_VALUE);
2613	ctx.endSection();
2614
2615	ctx.glDeleteTextures		(1, &texture);
2616}
2617
2618void compressedtexsubimage2d_invalid_buffer_target (NegativeTestContext& ctx)
2619{
2620	deUint32					buf = 0x1234;
2621	deUint32					texture = 0x1234;
2622	std::vector<GLubyte>		data(128);
2623
2624	ctx.glGenTextures				(1, &texture);
2625	ctx.glBindTexture				(GL_TEXTURE_2D, texture);
2626	ctx.glCompressedTexImage2D		(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0);
2627	ctx.glGenBuffers				(1, &buf);
2628	ctx.glBindBuffer				(GL_PIXEL_UNPACK_BUFFER, buf);
2629	ctx.glBufferData				(GL_PIXEL_UNPACK_BUFFER, 128, &data[0], GL_DYNAMIC_COPY);
2630	ctx.expectError					(GL_NO_ERROR);
2631
2632	ctx.beginSection("GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and...");
2633	ctx.beginSection("...the buffer object's data store is currently mapped.");
2634	ctx.glMapBufferRange			(GL_PIXEL_UNPACK_BUFFER, 0, 128, GL_MAP_WRITE_BIT);
2635	ctx.glCompressedTexSubImage2D	(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
2636	ctx.expectError					(GL_INVALID_OPERATION);
2637	ctx.glUnmapBuffer				(GL_PIXEL_UNPACK_BUFFER);
2638	ctx.endSection();
2639
2640	ctx.beginSection("...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size.");
2641	ctx.glCompressedTexSubImage2D	(GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(16, 16), 0);
2642	ctx.expectError					(GL_INVALID_OPERATION);
2643	ctx.endSection();
2644	ctx.endSection();
2645
2646	ctx.glDeleteBuffers			(1, &buf);
2647	ctx.glDeleteTextures		(1, &texture);
2648}
2649
2650// glTexImage3D
2651
2652void teximage3d (NegativeTestContext& ctx)
2653{
2654	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
2655	ctx.glTexImage3D(0, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2656	ctx.expectError(GL_INVALID_ENUM);
2657	ctx.glTexImage3D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2658	ctx.expectError(GL_INVALID_ENUM);
2659	ctx.endSection();
2660
2661	ctx.beginSection("GL_INVALID_ENUM is generated if type is not a type constant.");
2662	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, 0, 0);
2663	ctx.expectError(GL_INVALID_ENUM);
2664	ctx.endSection();
2665
2666	ctx.beginSection("GL_INVALID_ENUM is generated if format is not an accepted format constant.");
2667	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, 0, GL_UNSIGNED_BYTE, 0);
2668	ctx.expectError(GL_INVALID_ENUM);
2669	ctx.endSection();
2670
2671	ctx.beginSection("GL_INVALID_VALUE is generated if internalFormat is not one of the accepted resolution and format symbolic constants.");
2672	ctx.glTexImage3D(GL_TEXTURE_3D, 0, 0, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2673	ctx.expectError(GL_INVALID_VALUE);
2674	ctx.endSection();
2675
2676	ctx.beginSection("GL_INVALID_OPERATION is generated if target is GL_TEXTURE_3D and format is GL_DEPTH_COMPONENT, or GL_DEPTH_STENCIL.");
2677	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_BYTE, 0);
2678	ctx.expectError(GL_INVALID_OPERATION);
2679	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
2680	ctx.expectError(GL_INVALID_OPERATION);
2681	ctx.endSection();
2682
2683	ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of internalFormat, format and type is invalid.");
2684	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2685	ctx.expectError(GL_INVALID_OPERATION);
2686	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
2687	ctx.expectError(GL_INVALID_OPERATION);
2688	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB5_A1, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
2689	ctx.expectError(GL_INVALID_OPERATION);
2690	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB10_A2, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_2_10_10_10_REV, 0);
2691	ctx.expectError(GL_INVALID_OPERATION);
2692	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32UI, 1, 1, 1, 0, GL_RGBA_INTEGER, GL_INT, 0);
2693	ctx.expectError(GL_INVALID_OPERATION);
2694	ctx.endSection();
2695
2696	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
2697	{
2698		ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TEXTURE_CUBE_MAP_ARRAY and width and height are not equal.");
2699		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 2, 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2700		ctx.expectError(GL_INVALID_VALUE);
2701		ctx.endSection();
2702
2703		ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TEXTURE_CUBE_MAP_ARRAY and depth is not a multiple of six.");
2704		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2705		ctx.expectError(GL_INVALID_VALUE);
2706		ctx.endSection();
2707	}
2708}
2709
2710void teximage3d_neg_level (NegativeTestContext& ctx)
2711{
2712	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
2713	ctx.glTexImage3D(GL_TEXTURE_3D, -1, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
2714	ctx.expectError(GL_INVALID_VALUE);
2715	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, -1, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
2716	ctx.expectError(GL_INVALID_VALUE);
2717
2718	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
2719	{
2720		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, -1, GL_RGBA, 1, 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2721		ctx.expectError(GL_INVALID_VALUE);
2722	}
2723
2724	ctx.endSection();
2725
2726}
2727
2728void teximage3d_max_level (NegativeTestContext& ctx)
2729{
2730	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_3D_TEXTURE_SIZE).");
2731	deUint32 log2Max3DTextureSize = deLog2Floor32(ctx.getInteger(GL_MAX_3D_TEXTURE_SIZE)) + 1;
2732	ctx.glTexImage3D(GL_TEXTURE_3D, log2Max3DTextureSize, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
2733	ctx.expectError(GL_INVALID_VALUE);
2734	ctx.endSection();
2735
2736	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
2737	deUint32 log2MaxTextureSize = deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
2738	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
2739	ctx.expectError(GL_INVALID_VALUE);
2740	ctx.endSection();
2741}
2742
2743void teximage3d_neg_width_height_depth (NegativeTestContext& ctx)
2744{
2745	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than 0.");
2746	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, -1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2747	ctx.expectError(GL_INVALID_VALUE);
2748	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, -1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2749	ctx.expectError(GL_INVALID_VALUE);
2750	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2751	ctx.expectError(GL_INVALID_VALUE);
2752	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, -1, -1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2753	ctx.expectError(GL_INVALID_VALUE);
2754
2755	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, -1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2756	ctx.expectError(GL_INVALID_VALUE);
2757	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, -1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2758	ctx.expectError(GL_INVALID_VALUE);
2759	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, 1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2760	ctx.expectError(GL_INVALID_VALUE);
2761	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, -1, -1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2762	ctx.expectError(GL_INVALID_VALUE);
2763
2764	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
2765	{
2766		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, -1, 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2767		ctx.expectError(GL_INVALID_VALUE);
2768		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 1, -1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2769		ctx.expectError(GL_INVALID_VALUE);
2770		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 1, 1, -6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2771		ctx.expectError(GL_INVALID_VALUE);
2772		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, -1, -1, -6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2773		ctx.expectError(GL_INVALID_VALUE);
2774	}
2775	ctx.endSection();
2776}
2777
2778void teximage3d_max_width_height_depth (NegativeTestContext& ctx)
2779{
2780	int max3DTextureSize	= ctx.getInteger(GL_MAX_3D_TEXTURE_SIZE) + 1;
2781	int maxTextureSize		= ctx.getInteger(GL_MAX_TEXTURE_SIZE) + 1;
2782
2783	ctx.beginSection("GL_INVALID_VALUE is generated if width, height or depth is greater than GL_MAX_3D_TEXTURE_SIZE.");
2784	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, max3DTextureSize, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2785	ctx.expectError(GL_INVALID_VALUE);
2786	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, max3DTextureSize, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2787	ctx.expectError(GL_INVALID_VALUE);
2788	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, max3DTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2789	ctx.expectError(GL_INVALID_VALUE);
2790	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, max3DTextureSize, max3DTextureSize, max3DTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2791	ctx.expectError(GL_INVALID_VALUE);
2792	ctx.endSection();
2793
2794	ctx.beginSection("GL_INVALID_VALUE is generated if width, height or depth is greater than GL_MAX_TEXTURE_SIZE.");
2795	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, maxTextureSize, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2796	ctx.expectError(GL_INVALID_VALUE);
2797	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, maxTextureSize, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2798	ctx.expectError(GL_INVALID_VALUE);
2799	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, 1, maxTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2800	ctx.expectError(GL_INVALID_VALUE);
2801	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, maxTextureSize, maxTextureSize, maxTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2802	ctx.expectError(GL_INVALID_VALUE);
2803	ctx.endSection();
2804}
2805
2806void teximage3d_invalid_border (NegativeTestContext& ctx)
2807{
2808	ctx.beginSection("GL_INVALID_VALUE is generated if border is not 0 or 1.");
2809	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, 0);
2810	ctx.expectError(GL_INVALID_VALUE);
2811	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, 2, GL_RGB, GL_UNSIGNED_BYTE, 0);
2812	ctx.expectError(GL_INVALID_VALUE);
2813	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 1, 1, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, 0);
2814	ctx.expectError(GL_INVALID_VALUE);
2815	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 1, 1, 1, 2, GL_RGB, GL_UNSIGNED_BYTE, 0);
2816	ctx.expectError(GL_INVALID_VALUE);
2817
2818	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
2819	{
2820		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA, 1, 1, 6, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2821		ctx.expectError(GL_INVALID_VALUE);
2822		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA, 1, 1, 6, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2823		ctx.expectError(GL_INVALID_VALUE);
2824	}
2825
2826	ctx.endSection();
2827}
2828
2829void teximage3d_invalid_buffer_target (NegativeTestContext& ctx)
2830{
2831	deUint32				buf = 0x1234;
2832	deUint32				texture = 0x1234;
2833	std::vector<GLubyte>	data(512);
2834
2835	ctx.glGenBuffers			(1, &buf);
2836	ctx.glBindBuffer			(GL_PIXEL_UNPACK_BUFFER, buf);
2837	ctx.glBufferData			(GL_PIXEL_UNPACK_BUFFER, 512, &data[0], GL_DYNAMIC_COPY);
2838	ctx.glGenTextures			(1, &texture);
2839	ctx.glBindTexture			(GL_TEXTURE_3D, texture);
2840	ctx.expectError				(GL_NO_ERROR);
2841
2842	ctx.beginSection("GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and...");
2843
2844	ctx.beginSection("...the buffer object's data store is currently mapped.");
2845	ctx.glMapBufferRange		(GL_PIXEL_UNPACK_BUFFER, 0, 128, GL_MAP_WRITE_BIT);
2846	ctx.glTexImage3D			(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2847	ctx.expectError				(GL_INVALID_OPERATION);
2848	ctx.glUnmapBuffer			(GL_PIXEL_UNPACK_BUFFER);
2849	ctx.endSection();
2850
2851	ctx.beginSection("...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size.");
2852	ctx.glTexImage3D			(GL_TEXTURE_3D, 0, GL_RGBA, 64, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2853	ctx.expectError				(GL_INVALID_OPERATION);
2854	ctx.endSection();
2855
2856	ctx.beginSection("...data is not evenly divisible into the number of bytes needed to store in memory a datum indicated by type.");
2857	ctx.getLog() << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage;
2858	ctx.glTexImage3D			(GL_TEXTURE_3D, 0, GL_RGB5_A1, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, (const GLvoid*)3);
2859	ctx.expectError				(GL_INVALID_OPERATION);
2860	ctx.endSection();
2861
2862	ctx.endSection();
2863
2864	ctx.glDeleteBuffers			(1, &buf);
2865	ctx.glDeleteTextures		(1, &texture);
2866}
2867
2868// glTexSubImage3D
2869
2870void texsubimage3d (NegativeTestContext& ctx)
2871{
2872	deUint32			texture = 0x1234;
2873	ctx.glGenTextures		(1, &texture);
2874	ctx.glBindTexture		(GL_TEXTURE_3D, texture);
2875	ctx.glTexImage3D		(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2876	ctx.expectError			(GL_NO_ERROR);
2877
2878	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
2879	ctx.glTexSubImage3D(0, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2880	ctx.expectError(GL_INVALID_ENUM);
2881	ctx.glTexSubImage3D(GL_TEXTURE_2D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2882	ctx.expectError(GL_INVALID_ENUM);
2883	ctx.endSection();
2884
2885	ctx.beginSection("GL_INVALID_ENUM is generated if format is not an accepted format constant.");
2886	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 4, 4, 4, GL_UNSIGNED_BYTE, 0);
2887	ctx.expectError(GL_INVALID_ENUM);
2888	ctx.endSection();
2889
2890	ctx.beginSection("GL_INVALID_ENUM is generated if type is not a type constant.");
2891	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, 0, 0);
2892	ctx.expectError(GL_INVALID_ENUM);
2893	ctx.endSection();
2894
2895	ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of internalFormat of the previously specified texture array, format and type is not valid.");
2896	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
2897	ctx.expectError(GL_INVALID_OPERATION);
2898	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
2899	ctx.expectError(GL_INVALID_OPERATION);
2900	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
2901	ctx.expectError(GL_INVALID_OPERATION);
2902	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0);
2903	ctx.expectError(GL_INVALID_OPERATION);
2904	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_FLOAT, 0);
2905	ctx.expectError(GL_INVALID_OPERATION);
2906	ctx.endSection();
2907
2908	ctx.glDeleteTextures	(1, &texture);
2909}
2910
2911void texsubimage3d_neg_level (NegativeTestContext& ctx)
2912{
2913	deUint32			textures[3];
2914	ctx.glGenTextures		(3, &textures[0]);
2915	ctx.glBindTexture		(GL_TEXTURE_3D, textures[0]);
2916	ctx.glTexImage3D		(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2917	ctx.glBindTexture		(GL_TEXTURE_2D_ARRAY, textures[1]);
2918	ctx.glTexImage3D		(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2919	ctx.glBindTexture		(GL_TEXTURE_CUBE_MAP_ARRAY, textures[2]);
2920	ctx.glTexImage3D		(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 4, 4, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2921	ctx.expectError			(GL_NO_ERROR);
2922
2923	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
2924	ctx.glTexSubImage3D(GL_TEXTURE_3D, -1, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2925	ctx.expectError(GL_INVALID_VALUE);
2926	ctx.glTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2927	ctx.expectError(GL_INVALID_VALUE);
2928
2929	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
2930	{
2931		ctx.glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, -1, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2932		ctx.expectError(GL_INVALID_VALUE);
2933	}
2934
2935	ctx.endSection();
2936
2937	ctx.glDeleteTextures	(3, &textures[0]);
2938}
2939
2940void texsubimage3d_max_level (NegativeTestContext& ctx)
2941{
2942	deUint32			textures[2];
2943	ctx.glGenTextures		(2, &textures[0]);
2944	ctx.glBindTexture		(GL_TEXTURE_3D, textures[0]);
2945	ctx.glTexImage3D		(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2946	ctx.glBindTexture		(GL_TEXTURE_2D_ARRAY, textures[1]);
2947	ctx.glTexImage3D		(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2948	ctx.expectError			(GL_NO_ERROR);
2949
2950	deUint32 log2Max3DTextureSize	= deLog2Floor32(ctx.getInteger(GL_MAX_3D_TEXTURE_SIZE)) + 1;
2951	deUint32 log2MaxTextureSize		= deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
2952
2953	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_3D_TEXTURE_SIZE).");
2954	ctx.glTexSubImage3D(GL_TEXTURE_3D, log2Max3DTextureSize, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2955	ctx.expectError(GL_INVALID_VALUE);
2956	ctx.endSection();
2957
2958	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
2959	ctx.glTexSubImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2960	ctx.expectError(GL_INVALID_VALUE);
2961	ctx.endSection();
2962
2963	ctx.glDeleteTextures	(2, &textures[0]);
2964}
2965
2966void texsubimage3d_neg_offset (NegativeTestContext& ctx)
2967{
2968	deUint32			textures[3];
2969	ctx.glGenTextures		(3, &textures[0]);
2970	ctx.glBindTexture		(GL_TEXTURE_3D, textures[0]);
2971	ctx.glTexImage3D		(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2972	ctx.glBindTexture		(GL_TEXTURE_2D_ARRAY, textures[1]);
2973	ctx.glTexImage3D		(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2974	ctx.glBindTexture		(GL_TEXTURE_CUBE_MAP_ARRAY, textures[2]);
2975	ctx.glTexImage3D		(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 4, 4, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2976	ctx.expectError			(GL_NO_ERROR);
2977
2978	ctx.beginSection("GL_INVALID_VALUE is generated if xoffset, yoffset or zoffset are negative.");
2979	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, -1, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2980	ctx.expectError(GL_INVALID_VALUE);
2981	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2982	ctx.expectError(GL_INVALID_VALUE);
2983	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2984	ctx.expectError(GL_INVALID_VALUE);
2985	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, -1, -1, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2986	ctx.expectError(GL_INVALID_VALUE);
2987	ctx.glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2988	ctx.expectError(GL_INVALID_VALUE);
2989	ctx.glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2990	ctx.expectError(GL_INVALID_VALUE);
2991	ctx.glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2992	ctx.expectError(GL_INVALID_VALUE);
2993	ctx.glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, -1, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2994	ctx.expectError(GL_INVALID_VALUE);
2995
2996	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
2997	{
2998		ctx.glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, -1, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2999		ctx.expectError(GL_INVALID_VALUE);
3000		ctx.glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3001		ctx.expectError(GL_INVALID_VALUE);
3002		ctx.glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3003		ctx.expectError(GL_INVALID_VALUE);
3004		ctx.glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, -1, -1, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3005		ctx.expectError(GL_INVALID_VALUE);
3006	}
3007
3008	ctx.endSection();
3009
3010	ctx.glDeleteTextures	(3, &textures[0]);
3011}
3012
3013void texsubimage3d_invalid_offset (NegativeTestContext& ctx)
3014{
3015	deUint32			texture = 0x1234;
3016	ctx.glGenTextures		(1, &texture);
3017	ctx.glBindTexture		(GL_TEXTURE_3D, texture);
3018	ctx.glTexImage3D		(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3019	ctx.expectError			(GL_NO_ERROR);
3020
3021	ctx.beginSection("GL_INVALID_VALUE is generated if xoffset + width > texture_width.");
3022	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 2, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3023	ctx.expectError(GL_INVALID_VALUE);
3024	ctx.endSection();
3025
3026	ctx.beginSection("GL_INVALID_VALUE is generated if yoffset + height > texture_height.");
3027	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 2, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3028	ctx.expectError(GL_INVALID_VALUE);
3029	ctx.endSection();
3030
3031	ctx.beginSection("GL_INVALID_VALUE is generated if zoffset + depth > texture_depth.");
3032	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 2, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3033	ctx.expectError(GL_INVALID_VALUE);
3034	ctx.endSection();
3035
3036	ctx.glDeleteTextures	(1, &texture);
3037}
3038
3039void texsubimage3d_neg_width_height (NegativeTestContext& ctx)
3040{
3041	ctx.beginSection("GL_INVALID_VALUE is generated if width, height or depth is less than 0.");
3042	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, -1, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3043	ctx.expectError(GL_INVALID_VALUE);
3044	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3045	ctx.expectError(GL_INVALID_VALUE);
3046	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3047	ctx.expectError(GL_INVALID_VALUE);
3048	ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, -1, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3049	ctx.expectError(GL_INVALID_VALUE);
3050
3051	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
3052	{
3053		ctx.glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, -1, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3054		ctx.expectError(GL_INVALID_VALUE);
3055		ctx.glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, 0, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3056		ctx.expectError(GL_INVALID_VALUE);
3057		ctx.glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, 0, 0, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3058		ctx.expectError(GL_INVALID_VALUE);
3059		ctx.glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, -1, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3060		ctx.expectError(GL_INVALID_VALUE);
3061	}
3062
3063	ctx.endSection();
3064}
3065
3066void texsubimage3d_invalid_buffer_target (NegativeTestContext& ctx)
3067{
3068	deUint32				buf = 0x1234;
3069	deUint32				texture = 0x1234;
3070	std::vector<GLubyte>	data(512);
3071
3072	ctx.glGenTextures			(1, &texture);
3073	ctx.glBindTexture			(GL_TEXTURE_3D, texture);
3074	ctx.glTexImage3D			(GL_TEXTURE_3D, 0, GL_RGBA, 16, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3075	ctx.glGenBuffers			(1, &buf);
3076	ctx.glBindBuffer			(GL_PIXEL_UNPACK_BUFFER, buf);
3077	ctx.glBufferData			(GL_PIXEL_UNPACK_BUFFER, 512, &data[0], GL_DYNAMIC_COPY);
3078	ctx.expectError				(GL_NO_ERROR);
3079
3080	ctx.beginSection("GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and...");
3081
3082	ctx.beginSection("...the buffer object's data store is currently mapped.");
3083	ctx.glMapBufferRange		(GL_PIXEL_UNPACK_BUFFER, 0, 512, GL_MAP_WRITE_BIT);
3084	ctx.glTexSubImage3D			(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3085	ctx.expectError				(GL_INVALID_OPERATION);
3086	ctx.glUnmapBuffer			(GL_PIXEL_UNPACK_BUFFER);
3087	ctx.endSection();
3088
3089	ctx.beginSection("...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size.");
3090	ctx.glTexSubImage3D			(GL_TEXTURE_3D, 0, 0, 0, 0, 16, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3091	ctx.expectError				(GL_INVALID_OPERATION);
3092	ctx.endSection();
3093
3094	ctx.beginSection("...data is not evenly divisible into the number of bytes needed to store in memory a datum indicated by type.");
3095	ctx.getLog() << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage;
3096	ctx.glBindBuffer			(GL_PIXEL_UNPACK_BUFFER, 0);
3097	ctx.glTexImage3D			(GL_TEXTURE_3D, 0, GL_RGBA4, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 0);
3098	ctx.glBindBuffer			(GL_PIXEL_UNPACK_BUFFER, buf);
3099	ctx.expectError				(GL_NO_ERROR);
3100	ctx.glTexSubImage3D			(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, (const GLvoid*)3);
3101	ctx.expectError				(GL_INVALID_OPERATION);
3102	ctx.endSection();
3103
3104	ctx.endSection();
3105
3106	ctx.glDeleteBuffers			(1, &buf);
3107	ctx.glDeleteTextures		(1, &texture);
3108}
3109
3110// glCopyTexSubImage3D
3111
3112void copytexsubimage3d (NegativeTestContext& ctx)
3113{
3114	GLuint texture = 0x1234;
3115	ctx.glGenTextures	(1, &texture);
3116	ctx.glBindTexture	(GL_TEXTURE_3D, texture);
3117	ctx.glTexImage3D	(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3118
3119	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
3120	ctx.glCopyTexSubImage3D(0, 0, 0, 0, 0, 0, 0, 4, 4);
3121	ctx.expectError(GL_INVALID_ENUM);
3122	ctx.endSection();
3123
3124	ctx.glDeleteTextures(1, &texture);
3125}
3126
3127void copytexsubimage3d_neg_level (NegativeTestContext& ctx)
3128{
3129	deUint32	textures[3];
3130	ctx.glGenTextures(3, &textures[0]);
3131	ctx.glBindTexture(GL_TEXTURE_3D, textures[0]);
3132	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3133	ctx.glBindTexture(GL_TEXTURE_2D_ARRAY, textures[1]);
3134	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3135	ctx.expectError(GL_NO_ERROR);
3136
3137	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
3138	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, -1, 0, 0, 0, 0, 0, 4, 4);
3139	ctx.expectError(GL_INVALID_VALUE);
3140	ctx.glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 4, 4);
3141	ctx.expectError(GL_INVALID_VALUE);
3142
3143	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
3144	{
3145		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[2]);
3146		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 4, 4, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3147		ctx.expectError(GL_NO_ERROR);
3148		ctx.glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, -1, 0, 0, 0, 0, 0, 4, 4);
3149		ctx.expectError(GL_INVALID_VALUE);
3150	}
3151
3152	ctx.endSection();
3153
3154	ctx.glDeleteTextures(3, &textures[0]);
3155}
3156
3157void copytexsubimage3d_max_level (NegativeTestContext& ctx)
3158{
3159	deUint32	log2Max3DTextureSize		= deLog2Floor32(ctx.getInteger(GL_MAX_3D_TEXTURE_SIZE)) + 1;
3160	deUint32	log2MaxTextureSize			= deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
3161	deUint32	log2MaxCubeMapTextureSize	= deLog2Floor32(ctx.getInteger(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1;
3162
3163	deUint32	textures[3];
3164	ctx.glGenTextures(3, &textures[0]);
3165	ctx.glBindTexture(GL_TEXTURE_3D, textures[0]);
3166	ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3167	ctx.glBindTexture(GL_TEXTURE_2D_ARRAY, textures[1]);
3168	ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3169	ctx.expectError(GL_NO_ERROR);
3170
3171	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_3D_TEXTURE_SIZE).");
3172	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, log2Max3DTextureSize, 0, 0, 0, 0, 0, 4, 4);
3173	ctx.expectError(GL_INVALID_VALUE);
3174	ctx.endSection();
3175
3176	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
3177	ctx.glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, 0, 0, 0, 0, 0, 4, 4);
3178	ctx.expectError(GL_INVALID_VALUE);
3179	ctx.endSection();
3180
3181	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
3182	{
3183		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[2]);
3184		ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 4, 4, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3185		ctx.expectError(GL_NO_ERROR);
3186		ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE).");
3187		ctx.glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, log2MaxCubeMapTextureSize, 0, 0, 0, 0, 0, 4, 4);
3188		ctx.expectError(GL_INVALID_VALUE);
3189		ctx.endSection();
3190	}
3191
3192	ctx.glDeleteTextures(3, &textures[0]);
3193}
3194
3195void copytexsubimage3d_neg_offset (NegativeTestContext& ctx)
3196{
3197	GLuint texture = 0x1234;
3198	ctx.glGenTextures	(1, &texture);
3199	ctx.glBindTexture	(GL_TEXTURE_3D, texture);
3200	ctx.glTexImage3D	(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3201
3202	ctx.beginSection("GL_INVALID_VALUE is generated if xoffset, yoffset or zoffset is negative.");
3203	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, 0, -1, 0,  0, 0, 0, 4, 4);
3204	ctx.expectError(GL_INVALID_VALUE);
3205	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, -1, 0, 0, 0, 4, 4);
3206	ctx.expectError(GL_INVALID_VALUE);
3207	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, -1, 0, 0, 4, 4);
3208	ctx.expectError(GL_INVALID_VALUE);
3209	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, 0, -1, -1, -1, 0, 0, 4, 4);
3210	ctx.expectError(GL_INVALID_VALUE);
3211	ctx.endSection();
3212
3213	ctx.glDeleteTextures(1, &texture);
3214}
3215
3216void copytexsubimage3d_invalid_offset (NegativeTestContext& ctx)
3217{
3218	GLuint texture = 0x1234;
3219	ctx.glGenTextures	(1, &texture);
3220	ctx.glBindTexture	(GL_TEXTURE_3D, texture);
3221	ctx.glTexImage3D	(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3222
3223	ctx.beginSection("GL_INVALID_VALUE is generated if xoffset + width > texture_width.");
3224	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 1, 0, 0, 0, 0, 4, 4);
3225	ctx.expectError(GL_INVALID_VALUE);
3226	ctx.endSection();
3227
3228	ctx.beginSection("GL_INVALID_VALUE is generated if yoffset + height > texture_height.");
3229	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 1, 0, 0, 0, 4, 4);
3230	ctx.expectError(GL_INVALID_VALUE);
3231	ctx.endSection();
3232
3233	ctx.beginSection("GL_INVALID_VALUE is generated if zoffset + 1 > texture_depth.");
3234	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 4, 0, 0, 4, 4);
3235	ctx.expectError(GL_INVALID_VALUE);
3236	ctx.endSection();
3237
3238	ctx.glDeleteTextures(1, &texture);
3239}
3240
3241void copytexsubimage3d_neg_width_height (NegativeTestContext& ctx)
3242{
3243	GLuint texture = 0x1234;
3244	ctx.glGenTextures	(1, &texture);
3245	ctx.glBindTexture	(GL_TEXTURE_3D, texture);
3246	ctx.glTexImage3D	(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3247
3248	ctx.beginSection("GL_INVALID_VALUE is generated if width < 0.");
3249	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, -4, 4);
3250	ctx.expectError(GL_INVALID_VALUE);
3251	ctx.endSection();
3252
3253	ctx.beginSection("GL_INVALID_VALUE is generated if height < 0.");
3254	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 4, -4);
3255	ctx.expectError(GL_INVALID_VALUE);
3256	ctx.endSection();
3257
3258	ctx.glDeleteTextures(1, &texture);
3259}
3260
3261void copytexsubimage3d_incomplete_framebuffer (NegativeTestContext& ctx)
3262{
3263	GLuint fbo = 0x1234;
3264	GLuint texture[2];
3265
3266	ctx.glGenTextures			(2, texture);
3267	ctx.glBindTexture			(GL_TEXTURE_3D, texture[0]);
3268	ctx.glTexImage3D			(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3269	ctx.glBindTexture			(GL_TEXTURE_2D_ARRAY, texture[1]);
3270	ctx.glTexImage3D			(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3271	ctx.glGenFramebuffers		(1, &fbo);
3272	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, fbo);
3273	ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
3274
3275	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
3276	ctx.glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 4, 4);
3277	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
3278	ctx.glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 4, 4);
3279	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
3280	ctx.endSection();
3281
3282	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
3283	ctx.glDeleteFramebuffers(1, &fbo);
3284	ctx.glDeleteTextures(2, texture);
3285}
3286
3287// glCompressedTexImage3D
3288
3289void compressedteximage3d (NegativeTestContext& ctx)
3290{
3291	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
3292	ctx.glCompressedTexImage3D(0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0);
3293	ctx.expectError(GL_INVALID_ENUM);
3294	ctx.glCompressedTexImage3D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0);
3295	ctx.expectError(GL_INVALID_ENUM);
3296	ctx.endSection();
3297
3298	ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not one of the specific compressed internal formats.");
3299	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 0, 0);
3300	ctx.expectError(GL_INVALID_ENUM);
3301	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 0, 0, 0, 0, 0, 0);
3302	ctx.expectError(GL_INVALID_ENUM);
3303	ctx.endSection();
3304}
3305
3306void compressedteximage3d_neg_level (NegativeTestContext& ctx)
3307{
3308	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
3309	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0);
3310	ctx.expectError(GL_INVALID_VALUE);
3311	ctx.endSection();
3312}
3313
3314void compressedteximage3d_max_level (NegativeTestContext& ctx)
3315{
3316	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
3317	deUint32 log2MaxTextureSize = deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
3318	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0);
3319	ctx.expectError(GL_INVALID_VALUE);
3320	ctx.endSection();
3321}
3322
3323void compressedteximage3d_neg_width_height_depth (NegativeTestContext& ctx)
3324{
3325	ctx.beginSection("GL_INVALID_VALUE is generated if width, height or depth is less than 0.");
3326	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0, 0);
3327	ctx.expectError(GL_INVALID_VALUE);
3328	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0, 0);
3329	ctx.expectError(GL_INVALID_VALUE);
3330	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0, 0);
3331	ctx.expectError(GL_INVALID_VALUE);
3332	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, -1, 0, 0, 0);
3333	ctx.expectError(GL_INVALID_VALUE);
3334	ctx.endSection();
3335}
3336
3337void compressedteximage3d_max_width_height_depth (NegativeTestContext& ctx)
3338{
3339	int maxTextureSize = ctx.getInteger(GL_MAX_TEXTURE_SIZE) + 1;
3340
3341	ctx.beginSection("GL_INVALID_VALUE is generated if width, height or depth is greater than GL_MAX_TEXTURE_SIZE.");
3342	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, 0, 0, 0, 0, 0);
3343	ctx.expectError(GL_INVALID_VALUE);
3344	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, maxTextureSize, 0, 0, 0, 0);
3345	ctx.expectError(GL_INVALID_VALUE);
3346	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, maxTextureSize, 0, 0, 0);
3347	ctx.expectError(GL_INVALID_VALUE);
3348	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, maxTextureSize, maxTextureSize, 0, 0, 0);
3349	ctx.expectError(GL_INVALID_VALUE);
3350	ctx.endSection();
3351}
3352
3353void compressedteximage3d_invalid_border (NegativeTestContext& ctx)
3354{
3355	ctx.beginSection("GL_INVALID_VALUE is generated if border is not 0.");
3356	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, -1, 0, 0);
3357	ctx.expectError(GL_INVALID_VALUE);
3358	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 1, 0, 0);
3359	ctx.expectError(GL_INVALID_VALUE);
3360	ctx.endSection();
3361}
3362
3363void compressedteximage3d_invalid_size (NegativeTestContext& ctx)
3364{
3365	ctx.beginSection("GL_INVALID_VALUE is generated if imageSize is not consistent with the format, dimensions, and contents of the specified compressed image data.");
3366	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, -1, 0);
3367	ctx.expectError(GL_INVALID_VALUE);
3368	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, 4*4*8, 0);
3369	ctx.expectError(GL_INVALID_VALUE);
3370	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 1, 0, 4*4*16, 0);
3371	ctx.expectError(GL_INVALID_VALUE);
3372	ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_SIGNED_R11_EAC, 16, 16, 1, 0, 4*4*16, 0);
3373	ctx.expectError(GL_INVALID_VALUE);
3374	ctx.endSection();
3375}
3376
3377void compressedteximage3d_invalid_width_height (NegativeTestContext& ctx)
3378{
3379	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
3380	{
3381		const int				width		= 4;
3382		const int				height		= 6;
3383		const int				depth		= 6;
3384		const int				blockSize	= 16;
3385		const int				imageSize	= divRoundUp(width, 4) * divRoundUp(height, 4) * depth * blockSize;
3386		std::vector<GLubyte>	data		(imageSize);
3387		ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TEXTURE_CUBE_MAP_ARRAY and width and height are not equal.");
3388		ctx.glCompressedTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_COMPRESSED_RGB8_ETC2, width, height, depth, 0, imageSize, &data[0]);
3389		ctx.expectError(GL_INVALID_VALUE);
3390		ctx.endSection();
3391	}
3392}
3393
3394void compressedteximage3d_invalid_format (NegativeTestContext& ctx)
3395{
3396	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
3397	{
3398		const int				width		= 4;
3399		const int				height		= 4;
3400		const int				depth		= 6;
3401		const int				blockSize	= 16;
3402		const int				imageSize	= divRoundUp(width, 4) * divRoundUp(height, 4) * depth * blockSize;
3403		std::vector<GLubyte>	data		(imageSize);
3404		ctx.beginSection("GL_INVALID_OPERATION is generated if target is GL_TEXTURE_CUBE_MAP_ARRAY and the internal format does not support cube map array textures.");
3405		ctx.glCompressedTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, width, height, depth, 0, imageSize, &data[0]);
3406		ctx.expectError(GL_INVALID_OPERATION);
3407		ctx.endSection();
3408	}
3409}
3410
3411void compressedteximage3d_invalid_buffer_target (NegativeTestContext& ctx)
3412{
3413	deUint32				buf = 0x1234;
3414	std::vector<GLubyte>	data(512);
3415
3416	ctx.glGenBuffers			(1, &buf);
3417	ctx.glBindBuffer			(GL_PIXEL_UNPACK_BUFFER, buf);
3418	ctx.glBufferData			(GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY);
3419	ctx.expectError				(GL_NO_ERROR);
3420
3421	ctx.beginSection("GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and the buffer object's data store is currently mapped.");
3422	ctx.glMapBufferRange		(GL_PIXEL_UNPACK_BUFFER, 0, 64, GL_MAP_WRITE_BIT);
3423	ctx.glCompressedTexImage3D	(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGB8_ETC2, 4, 4, 1, 0, etc2DataSize(4, 4), 0);
3424	ctx.expectError				(GL_INVALID_OPERATION);
3425	ctx.glUnmapBuffer			(GL_PIXEL_UNPACK_BUFFER);
3426	ctx.endSection();
3427
3428	ctx.beginSection("GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size.");
3429	ctx.glCompressedTexImage3D	(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 1, 0, etc2DataSize(16, 16), 0);
3430	ctx.expectError				(GL_INVALID_OPERATION);
3431	ctx.endSection();
3432
3433	ctx.glDeleteBuffers			(1, &buf);
3434}
3435
3436// glCompressedTexSubImage3D
3437
3438void compressedtexsubimage3d (NegativeTestContext& ctx)
3439{
3440	ctx.beginSection("GL_INVALID_ENUM is generated if target is invalid.");
3441	ctx.glCompressedTexSubImage3D(0, 0, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3442	ctx.expectError(GL_INVALID_ENUM);
3443	ctx.endSection();
3444
3445	deUint32				texture = 0x1234;
3446	ctx.glGenTextures			(1, &texture);
3447	ctx.glBindTexture			(GL_TEXTURE_2D_ARRAY, texture);
3448	ctx.glCompressedTexImage3D	(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 1, 0, etc2EacDataSize(18, 18), 0);
3449	ctx.expectError				(GL_NO_ERROR);
3450
3451	ctx.beginSection("GL_INVALID_OPERATION is generated if format does not match the internal format of the texture image being modified.");
3452	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGB8_ETC2, 0, 0);
3453	ctx.expectError(GL_INVALID_OPERATION);
3454	ctx.endSection();
3455
3456	ctx.beginSection("GL_INVALID_OPERATION is generated if internalformat is an ETC2/EAC format and target is not GL_TEXTURE_2D_ARRAY.");
3457	ctx.glCompressedTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 18, 18, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(18, 18), 0);
3458	ctx.expectError(GL_INVALID_OPERATION);
3459	ctx.endSection();
3460
3461	ctx.beginSection("For ETC2/EAC images GL_INVALID_OPERATION is generated if width is not a multiple of four, and width + xoffset is not equal to the width of the texture level.");
3462	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 4, 0, 0, 10, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(10, 4), 0);
3463	ctx.expectError(GL_INVALID_OPERATION);
3464	ctx.endSection();
3465
3466	ctx.beginSection("For ETC2/EAC images GL_INVALID_OPERATION is generated if height is not a multiple of four, and height + yoffset is not equal to the height of the texture level.");
3467	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 4, 0, 4, 10, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 10), 0);
3468	ctx.expectError(GL_INVALID_OPERATION);
3469	ctx.endSection();
3470
3471	ctx.beginSection("For ETC2/EAC images GL_INVALID_OPERATION is generated if xoffset or yoffset is not a multiple of four.");
3472	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 1, 0, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
3473	ctx.expectError(GL_INVALID_OPERATION);
3474	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 1, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
3475	ctx.expectError(GL_INVALID_OPERATION);
3476	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 1, 1, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
3477	ctx.expectError(GL_INVALID_OPERATION);
3478	ctx.endSection();
3479
3480	ctx.glDeleteTextures		(1, &texture);
3481}
3482
3483void compressedtexsubimage3d_neg_level (NegativeTestContext& ctx)
3484{
3485	deUint32				texture = 0x1234;
3486	ctx.glGenTextures			(1, &texture);
3487	ctx.glBindTexture			(GL_TEXTURE_2D_ARRAY, texture);
3488	ctx.glCompressedTexImage3D	(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, etc2EacDataSize(16, 16), 0);
3489	ctx.expectError				(GL_NO_ERROR);
3490
3491	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0.");
3492	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3493	ctx.expectError(GL_INVALID_VALUE);
3494	ctx.endSection();
3495
3496	ctx.glDeleteTextures		(1, &texture);
3497}
3498
3499void compressedtexsubimage3d_max_level (NegativeTestContext& ctx)
3500{
3501	deUint32				texture = 0x1234;
3502	ctx.glGenTextures			(1, &texture);
3503	ctx.glBindTexture			(GL_TEXTURE_2D_ARRAY, texture);
3504	ctx.glCompressedTexImage3D	(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, etc2EacDataSize(16, 16), 0);
3505	ctx.expectError				(GL_NO_ERROR);
3506
3507	ctx.beginSection("GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE).");
3508	deUint32 log2MaxTextureSize = deLog2Floor32(ctx.getInteger(GL_MAX_TEXTURE_SIZE)) + 1;
3509	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3510	ctx.expectError(GL_INVALID_VALUE);
3511	ctx.endSection();
3512
3513	ctx.glDeleteTextures		(1, &texture);
3514}
3515
3516void compressedtexsubimage3d_neg_offset (NegativeTestContext& ctx)
3517{
3518	deUint32				texture = 0x1234;
3519	ctx.glGenTextures			(1, &texture);
3520	ctx.glBindTexture			(GL_TEXTURE_2D_ARRAY, texture);
3521	ctx.glCompressedTexImage3D	(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, etc2EacDataSize(16, 16), 0);
3522	ctx.expectError				(GL_NO_ERROR);
3523
3524	ctx.beginSection("GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset, yoffset or zoffset are negative.");
3525	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -4, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3526	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3527	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, -4, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3528	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3529	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, -4, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3530	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3531	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -4, -4, -4, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3532	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3533	ctx.endSection();
3534
3535	ctx.glDeleteTextures		(1, &texture);
3536}
3537
3538void compressedtexsubimage3d_invalid_offset (NegativeTestContext& ctx)
3539{
3540	deUint32				texture = 0x1234;
3541	ctx.glGenTextures			(1, &texture);
3542	ctx.glBindTexture			(GL_TEXTURE_2D_ARRAY, texture);
3543	ctx.glCompressedTexImage3D	(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 4, 4, 1, 0, etc2EacDataSize(4, 4), 0);
3544	ctx.expectError				(GL_NO_ERROR);
3545
3546	ctx.beginSection("GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset + width > texture_width or yoffset + height > texture_height.");
3547
3548	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 12, 0, 0, 8, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(8, 4), 0);
3549	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3550	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 12, 0, 4, 8, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 8), 0);
3551	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3552	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 12, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
3553	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3554	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 12, 12, 12, 8, 8, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(8, 8), 0);
3555	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3556	ctx.endSection();
3557
3558	ctx.glDeleteTextures		(1, &texture);
3559}
3560
3561void compressedtexsubimage3d_neg_width_height_depth (NegativeTestContext& ctx)
3562{
3563	deUint32				texture = 0x1234;
3564	ctx.glGenTextures			(1, &texture);
3565	ctx.glBindTexture			(GL_TEXTURE_2D_ARRAY, texture);
3566	ctx.glCompressedTexImage3D	(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, etc2EacDataSize(16, 16), 0);
3567	ctx.expectError				(GL_NO_ERROR);
3568
3569	ctx.beginSection("GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if width, height or depth are negative.");
3570	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, -4, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3571	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3572	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, -4, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3573	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3574	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3575	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3576	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, -4, -4, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0);
3577	ctx.expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION);
3578	ctx.endSection();
3579
3580	ctx.glDeleteTextures		(1, &texture);
3581}
3582
3583void compressedtexsubimage3d_invalid_size (NegativeTestContext& ctx)
3584{
3585	deUint32				texture = 0x1234;
3586	ctx.glGenTextures			(1, &texture);
3587	ctx.glBindTexture			(GL_TEXTURE_2D_ARRAY, texture);
3588	ctx.glCompressedTexImage3D	(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, 4*4*16, 0);
3589	ctx.expectError				(GL_NO_ERROR);
3590
3591	ctx.beginSection("GL_INVALID_VALUE is generated if imageSize is not consistent with the format, dimensions, and contents of the specified compressed image data.");
3592	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 16, 16, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0);
3593	ctx.expectError(GL_INVALID_VALUE);
3594
3595	ctx.glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 16, 16, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, 4*4*16-1, 0);
3596	ctx.expectError(GL_INVALID_VALUE);
3597	ctx.endSection();
3598
3599	ctx.glDeleteTextures		(1, &texture);
3600}
3601
3602void compressedtexsubimage3d_invalid_buffer_target (NegativeTestContext& ctx)
3603{
3604	deUint32						buf = 0x1234;
3605	deUint32						texture = 0x1234;
3606	GLsizei							bufferSize =  etc2EacDataSize(4, 4);
3607	std::vector<GLubyte>			data(bufferSize);
3608
3609	ctx.glGenTextures				(1, &texture);
3610	ctx.glBindTexture				(GL_TEXTURE_2D_ARRAY, texture);
3611	ctx.glCompressedTexImage3D		(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, etc2EacDataSize(16, 16), 0);
3612	ctx.glGenBuffers				(1, &buf);
3613	ctx.glBindBuffer				(GL_PIXEL_UNPACK_BUFFER, buf);
3614	ctx.glBufferData				(GL_PIXEL_UNPACK_BUFFER, bufferSize, &data[0], GL_DYNAMIC_COPY);
3615	ctx.expectError					(GL_NO_ERROR);
3616
3617	ctx.beginSection("GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and...");
3618	ctx.beginSection("...the buffer object's data store is currently mapped.");
3619	ctx.glMapBufferRange			(GL_PIXEL_UNPACK_BUFFER, 0, bufferSize, GL_MAP_WRITE_BIT);
3620	ctx.glCompressedTexSubImage3D	(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0);
3621	ctx.expectError					(GL_INVALID_OPERATION);
3622	ctx.glUnmapBuffer				(GL_PIXEL_UNPACK_BUFFER);
3623	ctx.endSection();
3624
3625	ctx.beginSection("...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size.");
3626	ctx.glCompressedTexSubImage3D	(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 16, 16, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(16, 16), 0);
3627	ctx.expectError					(GL_INVALID_OPERATION);
3628	ctx.endSection();
3629	ctx.endSection();
3630
3631	ctx.glDeleteBuffers			(1, &buf);
3632	ctx.glDeleteTextures		(1, &texture);
3633}
3634
3635// glTexStorage2D
3636
3637void texstorage2d (NegativeTestContext& ctx)
3638{
3639	deUint32  textures[] = {0x1234, 0x1234};
3640
3641	ctx.glGenTextures(2, textures);
3642	ctx.glBindTexture(GL_TEXTURE_2D, textures[0]);
3643	ctx.expectError(GL_NO_ERROR);
3644
3645	ctx.beginSection("GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not a valid sized internal format.");
3646	ctx.glTexStorage2D(GL_TEXTURE_2D, 1, 0, 16, 16);
3647	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3648	ctx.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA_INTEGER, 16, 16);
3649	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3650	ctx.endSection();
3651
3652	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted target enumerants.");
3653	ctx.glTexStorage2D(0, 1, GL_RGBA8, 16, 16);
3654	ctx.expectError(GL_INVALID_ENUM);
3655	ctx.glTexStorage2D(GL_TEXTURE_3D, 1, GL_RGBA8, 16, 16);
3656	ctx.expectError(GL_INVALID_ENUM);
3657	ctx.glTexStorage2D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 16, 16);
3658	ctx.expectError(GL_INVALID_ENUM);
3659	ctx.endSection();
3660
3661	ctx.beginSection("GL_INVALID_VALUE is generated if width or height are less than 1.");
3662	ctx.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 0, 16);
3663	ctx.expectError(GL_INVALID_VALUE);
3664	ctx.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 0);
3665	ctx.expectError(GL_INVALID_VALUE);
3666	ctx.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 0, 0);
3667	ctx.expectError(GL_INVALID_VALUE);
3668
3669	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
3670	{
3671		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
3672		ctx.expectError(GL_NO_ERROR);
3673		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 0, 16);
3674		ctx.expectError(GL_INVALID_VALUE);
3675		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 16, 0);
3676		ctx.expectError(GL_INVALID_VALUE);
3677		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 0, 0);
3678		ctx.expectError(GL_INVALID_VALUE);
3679	}
3680	ctx.endSection();
3681
3682	ctx.glDeleteTextures(2, textures);
3683}
3684
3685void texstorage2d_invalid_binding (NegativeTestContext& ctx)
3686{
3687	deUint32	textures[]	= {0x1234, 0x1234};
3688	deInt32		immutable	= 0x1234;
3689	const bool	isES32		= contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
3690
3691	ctx.beginSection("GL_INVALID_OPERATION is generated if the default texture object is curently bound to target.");
3692	ctx.glBindTexture(GL_TEXTURE_2D, 0);
3693	ctx.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
3694	ctx.expectError(GL_INVALID_OPERATION);
3695
3696	if (isES32)
3697	{
3698		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
3699		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 16, 16);
3700		ctx.expectError(GL_INVALID_OPERATION);
3701	}
3702	ctx.endSection();
3703
3704	ctx.glGenTextures(2, textures);
3705
3706	ctx.beginSection("GL_INVALID_OPERATION is generated if the texture object currently bound to target already has GL_TEXTURE_IMMUTABLE_FORMAT set to GL_TRUE.");
3707	ctx.glBindTexture(GL_TEXTURE_2D, textures[0]);
3708	ctx.glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3709	ctx.getLog() << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
3710	ctx.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
3711	ctx.expectError(GL_NO_ERROR);
3712	ctx.glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3713	ctx.getLog() << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
3714	ctx.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
3715	ctx.expectError(GL_INVALID_OPERATION);
3716
3717	if (isES32)
3718	{
3719		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
3720		ctx.glGetTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3721		ctx.getLog() << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
3722		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 16, 16);
3723		ctx.expectError(GL_NO_ERROR);
3724		ctx.glGetTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3725		ctx.getLog() << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
3726		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 16, 16);
3727		ctx.expectError(GL_INVALID_OPERATION);
3728	}
3729	ctx.endSection();
3730
3731	ctx.glDeleteTextures(2, textures);
3732}
3733
3734void texstorage2d_invalid_levels (NegativeTestContext& ctx)
3735{
3736	deUint32	textures[]	= {0x1234, 0x1234};
3737	deUint32	log2MaxSize	= deLog2Floor32(deMax32(16, 4)) + 1 + 1;
3738	const bool	isES32		= contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
3739
3740	ctx.glGenTextures(2, textures);
3741	ctx.glBindTexture(GL_TEXTURE_2D, textures[0]);
3742
3743	if (isES32)
3744		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
3745
3746	ctx.expectError(GL_NO_ERROR);
3747
3748	ctx.beginSection("GL_INVALID_VALUE is generated if levels is less than 1.");
3749	ctx.glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 16, 16);
3750	ctx.expectError(GL_INVALID_VALUE);
3751	ctx.glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0);
3752	ctx.expectError(GL_INVALID_VALUE);
3753
3754	if (isES32)
3755	{
3756		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, 0, GL_RGBA8, 16, 16);
3757		ctx.expectError(GL_INVALID_VALUE);
3758		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, 0, GL_RGBA8, 0, 0);
3759		ctx.expectError(GL_INVALID_VALUE);
3760	}
3761	ctx.endSection();
3762
3763	ctx.beginSection("GL_INVALID_OPERATION is generated if levels is greater than floor(log_2(max(width, height))) + 1");
3764	ctx.glTexStorage2D(GL_TEXTURE_2D, log2MaxSize, GL_RGBA8, 16, 4);
3765	ctx.expectError(GL_INVALID_OPERATION);
3766	ctx.glTexStorage2D(GL_TEXTURE_2D, log2MaxSize, GL_RGBA8, 4, 16);
3767	ctx.expectError(GL_INVALID_OPERATION);
3768	ctx.glTexStorage2D(GL_TEXTURE_2D, log2MaxSize, GL_RGBA8, 16, 16);
3769	ctx.expectError(GL_INVALID_OPERATION);
3770
3771	if (isES32)
3772	{
3773		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, log2MaxSize, GL_RGBA8, 16, 4);
3774		ctx.expectError(GL_INVALID_OPERATION);
3775		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, log2MaxSize, GL_RGBA8, 4, 16);
3776		ctx.expectError(GL_INVALID_OPERATION);
3777		ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, log2MaxSize, GL_RGBA8, 16, 16);
3778		ctx.expectError(GL_INVALID_OPERATION);
3779	}
3780	ctx.endSection();
3781
3782	ctx.glDeleteTextures(2, textures);
3783}
3784
3785// glTexStorage3D
3786
3787void texstorage3d (NegativeTestContext& ctx)
3788{
3789	deUint32 textures[] = {0x1234, 0x1234};
3790
3791	ctx.glGenTextures(2, textures);
3792	ctx.glBindTexture(GL_TEXTURE_3D, textures[0]);
3793	ctx.expectError(GL_NO_ERROR);
3794
3795	ctx.beginSection("GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not a valid sized internal format.");
3796	ctx.glTexStorage3D(GL_TEXTURE_3D, 1, 0, 4, 4, 4);
3797	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3798	ctx.glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA_INTEGER, 4, 4, 4);
3799	ctx.expectError(GL_INVALID_ENUM, GL_INVALID_VALUE);
3800	ctx.endSection();
3801
3802	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted target enumerants.");
3803	ctx.glTexStorage3D(0, 1, GL_RGBA8, 4, 4, 4);
3804	ctx.expectError(GL_INVALID_ENUM);
3805	ctx.glTexStorage3D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 4, 4, 4);
3806	ctx.expectError(GL_INVALID_ENUM);
3807	ctx.glTexStorage3D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 4, 4);
3808	ctx.expectError(GL_INVALID_ENUM);
3809	ctx.endSection();
3810
3811	ctx.beginSection("GL_INVALID_VALUE is generated if width, height or depth are less than 1.");
3812	ctx.glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 0, 4, 4);
3813	ctx.expectError(GL_INVALID_VALUE);
3814	ctx.glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 4, 0, 4);
3815	ctx.expectError(GL_INVALID_VALUE);
3816	ctx.glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 0);
3817	ctx.expectError(GL_INVALID_VALUE);
3818	ctx.glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 0, 0, 0);
3819	ctx.expectError(GL_INVALID_VALUE);
3820
3821	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
3822	{
3823		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[1]);
3824		ctx.expectError(GL_NO_ERROR);
3825		ctx.glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 0, 4, 4);
3826		ctx.expectError(GL_INVALID_VALUE);
3827		ctx.glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 4, 0, 4);
3828		ctx.expectError(GL_INVALID_VALUE);
3829		ctx.glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 4, 4, 0);
3830		ctx.expectError(GL_INVALID_VALUE);
3831		ctx.glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 0, 0, 0);
3832		ctx.expectError(GL_INVALID_VALUE);
3833	}
3834	ctx.endSection();
3835
3836	ctx.glDeleteTextures(2, textures);
3837}
3838
3839void texstorage3d_invalid_binding (NegativeTestContext& ctx)
3840{
3841	deUint32	textures[]	= {0x1234, 0x1234};
3842	deInt32		immutable	= 0x1234;
3843
3844	ctx.beginSection("GL_INVALID_OPERATION is generated if the default texture object is curently bound to target.");
3845	ctx.glBindTexture	(GL_TEXTURE_3D, 0);
3846	ctx.glTexStorage3D	(GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4);
3847	ctx.expectError		(GL_INVALID_OPERATION);
3848
3849	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
3850	{
3851		ctx.glBindTexture	(GL_TEXTURE_CUBE_MAP_ARRAY, 0);
3852		ctx.glTexStorage3D	(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 4, 4, 6);
3853		ctx.expectError		(GL_INVALID_OPERATION);
3854	}
3855	ctx.endSection();
3856
3857	ctx.glGenTextures	(2, textures);
3858
3859	ctx.beginSection("GL_INVALID_OPERATION is generated if the texture object currently bound to target already has GL_TEXTURE_IMMUTABLE_FORMAT set to GL_TRUE.");
3860	ctx.glBindTexture	(GL_TEXTURE_3D, textures[0]);
3861	ctx.glGetTexParameteriv(GL_TEXTURE_3D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3862	ctx.getLog() << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
3863	ctx.glTexStorage3D	(GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4);
3864	ctx.expectError		(GL_NO_ERROR);
3865	ctx.glGetTexParameteriv(GL_TEXTURE_3D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3866	ctx.getLog() << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
3867	ctx.glTexStorage3D	(GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4);
3868	ctx.expectError		(GL_INVALID_OPERATION);
3869
3870	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
3871	{
3872		ctx.glBindTexture	(GL_TEXTURE_CUBE_MAP_ARRAY, textures[1]);
3873		ctx.glGetTexParameteriv(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3874		ctx.getLog() << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
3875		ctx.glTexStorage3D	(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 4, 4, 6);
3876		ctx.expectError		(GL_NO_ERROR);
3877		ctx.glGetTexParameteriv(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
3878		ctx.getLog() << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
3879		ctx.glTexStorage3D	(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 4, 4, 6);
3880		ctx.expectError		(GL_INVALID_OPERATION);
3881	}
3882	ctx.endSection();
3883
3884	ctx.glDeleteTextures(2, textures);
3885}
3886
3887void texstorage3d_invalid_levels (NegativeTestContext& ctx)
3888{
3889	deUint32	textures[]	= {0x1234, 0x1234};
3890	deUint32	log2MaxSize	= deLog2Floor32(8) + 1 + 1;
3891	const bool	isES32		= contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
3892	ctx.glGenTextures(2, textures);
3893	ctx.glBindTexture(GL_TEXTURE_3D, textures[0]);
3894
3895	ctx.beginSection("GL_INVALID_VALUE is generated if levels is less than 1.");
3896	ctx.glTexStorage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 4, 4, 4);
3897	ctx.expectError(GL_INVALID_VALUE);
3898	ctx.glTexStorage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 0, 0, 0);
3899	ctx.expectError(GL_INVALID_VALUE);
3900
3901	if (isES32 || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
3902	{
3903		ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[1]);
3904		ctx.glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA8, 4, 4, 6);
3905		ctx.expectError(GL_INVALID_VALUE);
3906		ctx.glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA8, 0, 0, 6);
3907		ctx.expectError(GL_INVALID_VALUE);
3908	}
3909	ctx.endSection();
3910
3911	ctx.beginSection("GL_INVALID_OPERATION is generated if levels is greater than floor(log_2(max(width, height, depth))) + 1");
3912	ctx.glTexStorage3D	(GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 8, 2, 2);
3913	ctx.expectError		(GL_INVALID_OPERATION);
3914	ctx.glTexStorage3D	(GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 2, 8, 2);
3915	ctx.expectError		(GL_INVALID_OPERATION);
3916	ctx.glTexStorage3D	(GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 2, 2, 8);
3917	ctx.expectError		(GL_INVALID_OPERATION);
3918	ctx.glTexStorage3D	(GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 8, 8, 8);
3919	ctx.expectError		(GL_INVALID_OPERATION);
3920
3921	if (isES32 || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
3922	{
3923		ctx.glTexStorage3D	(GL_TEXTURE_CUBE_MAP_ARRAY, log2MaxSize, GL_RGBA8, 2, 2, 6);
3924		ctx.expectError		(GL_INVALID_OPERATION);
3925		ctx.glTexStorage3D	(GL_TEXTURE_CUBE_MAP_ARRAY, log2MaxSize, GL_RGBA8, 8, 8, 6);
3926		ctx.expectError		(GL_INVALID_OPERATION);
3927	}
3928	ctx.endSection();
3929
3930	ctx.glDeleteTextures(2, textures);
3931}
3932
3933std::vector<FunctionContainer> getNegativeTextureApiTestFunctions()
3934{
3935	FunctionContainer funcs[] =
3936	{
3937		{activetexture,									"activetexture",									"Invalid glActiveTexture() usage"		   },
3938		{bindtexture,									"bindtexture",										"Invalid glBindTexture() usage"			   },
3939		{compressedteximage2d_invalid_target,			"compressedteximage2d_invalid_target",				"Invalid glCompressedTexImage2D() usage"   },
3940		{compressedteximage2d_invalid_format,			"compressedteximage2d_invalid_format",				"Invalid glCompressedTexImage2D() usage"   },
3941		{compressedteximage2d_neg_level,				"compressedteximage2d_neg_level",					"Invalid glCompressedTexImage2D() usage"   },
3942		{compressedteximage2d_max_level,				"compressedteximage2d_max_level",					"Invalid glCompressedTexImage2D() usage"   },
3943		{compressedteximage2d_neg_width_height,			"compressedteximage2d_neg_width_height",			"Invalid glCompressedTexImage2D() usage"   },
3944		{compressedteximage2d_max_width_height,			"compressedteximage2d_max_width_height",			"Invalid glCompressedTexImage2D() usage"   },
3945		{compressedteximage2d_invalid_border,			"compressedteximage2d_invalid_border",				"Invalid glCompressedTexImage2D() usage"   },
3946		{compressedteximage2d_invalid_size,				"compressedteximage2d_invalid_size",				"Invalid glCompressedTexImage2D() usage"   },
3947		{compressedteximage2d_neg_size,					"compressedteximage2d_neg_size",					"Invalid glCompressedTexImage2D() usage"   },
3948		{compressedteximage2d_invalid_width_height,		"compressedteximage2d_invalid_width_height",		"Invalid glCompressedTexImage2D() usage"   },
3949		{compressedteximage2d_invalid_buffer_target,	"compressedteximage2d_invalid_buffer_target",		"Invalid glCompressedTexImage2D() usage"   },
3950		{copyteximage2d_invalid_target,					"copyteximage2d_invalid_target",					"Invalid glCopyTexImage2D() usage"		   },
3951		{copyteximage2d_invalid_format,					"copyteximage2d_invalid_format",					"Invalid glCopyTexImage2D() usage"		   },
3952		{copyteximage2d_inequal_width_height_cube,		"copyteximage2d_inequal_width_height_cube",			"Invalid glCopyTexImage2D() usage"		   },
3953		{copyteximage2d_neg_level,						"copyteximage2d_neg_level",							"Invalid glCopyTexImage2D() usage"		   },
3954		{copyteximage2d_max_level,						"copyteximage2d_max_level",							"Invalid glCopyTexImage2D() usage"		   },
3955		{copyteximage2d_neg_width_height,				"copyteximage2d_neg_width_height",					"Invalid glCopyTexImage2D() usage"		   },
3956		{copyteximage2d_max_width_height,				"copyteximage2d_max_width_height",					"Invalid glCopyTexImage2D() usage"		   },
3957		{copyteximage2d_invalid_border,					"copyteximage2d_invalid_border",					"Invalid glCopyTexImage2D() usage"		   },
3958		{copyteximage2d_incomplete_framebuffer,			"copyteximage2d_incomplete_framebuffer",			"Invalid glCopyTexImage2D() usage"		   },
3959		{copytexsubimage2d_invalid_target,				"copytexsubimage2d_invalid_target",					"Invalid glCopyTexSubImage2D() usage"	   },
3960		{copytexsubimage2d_read_buffer_is_none,			"copytexsubimage2d_read_buffer_is_none",			"Invalid glCopyTexSubImage2D() usage"	   },
3961		{copytexsubimage2d_texture_internalformat,		"copytexsubimage2d_texture_internalformat",			"Invalid glCopyTexSubImage2D() usage"	   },
3962		{copytexsubimage2d_neg_level,					"copytexsubimage2d_neg_level",						"Invalid glCopyTexSubImage2D() usage"	   },
3963		{copytexsubimage2d_max_level,					"copytexsubimage2d_max_level",						"Invalid glCopyTexSubImage2D() usage"	   },
3964		{copytexsubimage2d_neg_offset,					"copytexsubimage2d_neg_offset",						"Invalid glCopyTexSubImage2D() usage"	   },
3965		{copytexsubimage2d_invalid_offset,				"copytexsubimage2d_invalid_offset",					"Invalid glCopyTexSubImage2D() usage"	   },
3966		{copytexsubimage2d_neg_width_height,			"copytexsubimage2d_neg_width_height",				"Invalid glCopyTexSubImage2D() usage"	   },
3967		{copytexsubimage2d_incomplete_framebuffer,		"copytexsubimage2d_incomplete_framebuffer",			"Invalid glCopyTexSubImage2D() usage"	   },
3968		{deletetextures,								"deletetextures",									"Invalid glDeleteTextures() usage"		   },
3969		{generatemipmap,								"generatemipmap",									"Invalid glGenerateMipmap() usage"		   },
3970		{gentextures,									"gentextures",										"Invalid glGenTextures() usage"			   },
3971		{pixelstorei,									"pixelstorei",										"Invalid glPixelStorei() usage"			   },
3972		{teximage2d,									"teximage2d",										"Invalid glTexImage2D() usage"			   },
3973		{teximage2d_inequal_width_height_cube,			"teximage2d_inequal_width_height_cube",				"Invalid glTexImage2D() usage"			   },
3974		{teximage2d_neg_level,							"teximage2d_neg_level",								"Invalid glTexImage2D() usage"			   },
3975		{teximage2d_max_level,							"teximage2d_max_level",								"Invalid glTexImage2D() usage"			   },
3976		{teximage2d_neg_width_height,					"teximage2d_neg_width_height",						"Invalid glTexImage2D() usage"			   },
3977		{teximage2d_max_width_height,					"teximage2d_max_width_height",						"Invalid glTexImage2D() usage"			   },
3978		{teximage2d_invalid_border,						"teximage2d_invalid_border",						"Invalid glTexImage2D() usage"			   },
3979		{teximage2d_invalid_buffer_target,				"teximage2d_invalid_buffer_target",					"Invalid glTexImage2D() usage"			   },
3980		{texsubimage2d,									"texsubimage2d",									"Invalid glTexSubImage2D() usage"		   },
3981		{texsubimage2d_neg_level,						"texsubimage2d_neg_level",							"Invalid glTexSubImage2D() usage"		   },
3982		{texsubimage2d_max_level,						"texsubimage2d_max_level",							"Invalid glTexSubImage2D() usage"		   },
3983		{texsubimage2d_neg_offset,						"texsubimage2d_neg_offset",							"Invalid glTexSubImage2D() usage"		   },
3984		{texsubimage2d_invalid_offset,					"texsubimage2d_invalid_offset",						"Invalid glTexSubImage2D() usage"		   },
3985		{texsubimage2d_neg_width_height,				"texsubimage2d_neg_width_height",					"Invalid glTexSubImage2D() usage"		   },
3986		{texsubimage2d_invalid_buffer_target,			"texsubimage2d_invalid_buffer_target",				"Invalid glTexSubImage2D() usage"		   },
3987		{texparameteri,									"texparameteri",									"Invalid glTexParameteri() usage"		   },
3988		{texparameterf,									"texparameterf",									"Invalid glTexParameterf() usage"		   },
3989		{texparameteriv,								"texparameteriv",									"Invalid glTexParameteriv() usage"		   },
3990		{texparameterfv,								"texparameterfv",									"Invalid glTexParameterfv() usage"		   },
3991		{texparameterIiv,								"texparameterIiv",									"Invalid glTexParameterIiv() usage"		   },
3992		{texparameterIuiv,								"texparameterIuiv",									"Invalid glTexParameterIuiv() usage"	   },
3993		{compressedtexsubimage2d,						"compressedtexsubimage2d",							"Invalid glCompressedTexSubImage2D() usage"},
3994		{compressedtexsubimage2d_neg_level,				"compressedtexsubimage2d_neg_level",				"Invalid glCompressedTexSubImage2D() usage"},
3995		{compressedtexsubimage2d_max_level,				"compressedtexsubimage2d_max_level",				"Invalid glCompressedTexSubImage2D() usage"},
3996		{compressedtexsubimage2d_neg_offset,			"compressedtexsubimage2d_neg_offset",				"Invalid glCompressedTexSubImage2D() usage"},
3997		{compressedtexsubimage2d_invalid_offset,		"compressedtexsubimage2d_invalid_offset",			"Invalid glCompressedTexSubImage2D() usage"},
3998		{compressedtexsubimage2d_neg_width_height,		"compressedtexsubimage2d_neg_width_height",			"Invalid glCompressedTexSubImage2D() usage"},
3999		{compressedtexsubimage2d_invalid_size,			"compressedtexsubimage2d_invalid_size",				"Invalid glCompressedTexImage2D() usage"   },
4000		{compressedtexsubimage2d_invalid_buffer_target,	"compressedtexsubimage2d_invalid_buffer_target",	"Invalid glCompressedTexSubImage2D() usage"},
4001		{teximage3d,									"teximage3d",										"Invalid glTexImage3D() usage"			   },
4002		{teximage3d_neg_level,							"teximage3d_neg_level",								"Invalid glTexImage3D() usage"			   },
4003		{teximage3d_max_level,							"teximage3d_max_level",								"Invalid glTexImage3D() usage"			   },
4004		{teximage3d_neg_width_height_depth,				"teximage3d_neg_width_height_depth",				"Invalid glTexImage3D() usage"			   },
4005		{teximage3d_max_width_height_depth,				"teximage3d_max_width_height_depth",				"Invalid glTexImage3D() usage"			   },
4006		{teximage3d_invalid_border,						"teximage3d_invalid_border",						"Invalid glTexImage3D() usage"			   },
4007		{teximage3d_invalid_buffer_target,				"teximage3d_invalid_buffer_target",					"Invalid glTexImage3D() usage"			   },
4008		{texsubimage3d,									"texsubimage3d",									"Invalid glTexSubImage3D() usage"		   },
4009		{texsubimage3d_neg_level,						"texsubimage3d_neg_level",							"Invalid glTexSubImage3D() usage"		   },
4010		{texsubimage3d_max_level,						"texsubimage3d_max_level",							"Invalid glTexSubImage3D() usage"		   },
4011		{texsubimage3d_neg_offset,						"texsubimage3d_neg_offset",							"Invalid glTexSubImage3D() usage"		   },
4012		{texsubimage3d_invalid_offset,					"texsubimage3d_invalid_offset",						"Invalid glTexSubImage3D() usage"		   },
4013		{texsubimage3d_neg_width_height,				"texsubimage3d_neg_width_height",					"Invalid glTexSubImage3D() usage"		   },
4014		{texsubimage3d_invalid_buffer_target,			"texsubimage3d_invalid_buffer_target",				"Invalid glTexSubImage3D() usage"		   },
4015		{copytexsubimage3d,								"copytexsubimage3d",								"Invalid glCopyTexSubImage3D() usage"	   },
4016		{copytexsubimage3d_neg_level,					"copytexsubimage3d_neg_level",						"Invalid glCopyTexSubImage3D() usage"	   },
4017		{copytexsubimage3d_max_level,					"copytexsubimage3d_max_level",						"Invalid glCopyTexSubImage3D() usage"	   },
4018		{copytexsubimage3d_neg_offset,					"copytexsubimage3d_neg_offset",						"Invalid glCopyTexSubImage3D() usage"	   },
4019		{copytexsubimage3d_invalid_offset,				"copytexsubimage3d_invalid_offset",					"Invalid glCopyTexSubImage3D() usage"	   },
4020		{copytexsubimage3d_neg_width_height,			"copytexsubimage3d_neg_width_height",				"Invalid glCopyTexSubImage3D() usage"	   },
4021		{copytexsubimage3d_incomplete_framebuffer,		"copytexsubimage3d_incomplete_framebuffer",			"Invalid glCopyTexSubImage3D() usage"	   },
4022		{compressedteximage3d,							"compressedteximage3d",								"Invalid glCompressedTexImage3D() usage"   },
4023		{compressedteximage3d_neg_level,				"compressedteximage3d_neg_level",					"Invalid glCompressedTexImage3D() usage"   },
4024		{compressedteximage3d_max_level,				"compressedteximage3d_max_level",					"Invalid glCompressedTexImage3D() usage"   },
4025		{compressedteximage3d_neg_width_height_depth,	"compressedteximage3d_neg_width_height_depth",		"Invalid glCompressedTexImage3D() usage"   },
4026		{compressedteximage3d_max_width_height_depth,	"compressedteximage3d_max_width_height_depth",		"Invalid glCompressedTexImage3D() usage"   },
4027		{compressedteximage3d_invalid_border,			"compressedteximage3d_invalid_border",				"Invalid glCompressedTexImage3D() usage"   },
4028		{compressedteximage3d_invalid_size,				"compressedteximage3d_invalid_size",				"Invalid glCompressedTexImage3D() usage"   },
4029		{compressedteximage3d_invalid_width_height,		"compressedteximage3d_invalid_width_height",		"Invalid glCompressedTexImage3D() usage"   },
4030		{compressedteximage3d_invalid_format,			"compressedteximage3d_invalid_format",				"Invalid glCompressedTexImage3D() usage"   },
4031		{compressedteximage3d_invalid_buffer_target,	"compressedteximage3d_invalid_buffer_target",		"Invalid glCompressedTexImage3D() usage"   },
4032		{compressedtexsubimage3d,						"compressedtexsubimage3d",							"Invalid glCompressedTexSubImage3D() usage"},
4033		{compressedtexsubimage3d_neg_level,				"compressedtexsubimage3d_neg_level",				"Invalid glCompressedTexSubImage3D() usage"},
4034		{compressedtexsubimage3d_max_level,				"compressedtexsubimage3d_max_level",				"Invalid glCompressedTexSubImage3D() usage"},
4035		{compressedtexsubimage3d_neg_offset,			"compressedtexsubimage3d_neg_offset",				"Invalid glCompressedTexSubImage3D() usage"},
4036		{compressedtexsubimage3d_invalid_offset,		"compressedtexsubimage3d_invalid_offset",			"Invalid glCompressedTexSubImage3D() usage"},
4037		{compressedtexsubimage3d_neg_width_height_depth,"compressedtexsubimage3d_neg_width_height_depth",	"Invalid glCompressedTexSubImage3D() usage"},
4038		{compressedtexsubimage3d_invalid_size,			"compressedtexsubimage3d_invalid_size",				"Invalid glCompressedTexSubImage3D() usage"},
4039		{compressedtexsubimage3d_invalid_buffer_target,	"compressedtexsubimage3d_invalid_buffer_target",	"Invalid glCompressedTexSubImage3D() usage"},
4040		{texstorage2d,									"texstorage2d",										"Invalid glTexStorage2D() usage"		   },
4041		{texstorage2d_invalid_binding,					"texstorage2d_invalid_binding",						"Invalid glTexStorage2D() usage"		   },
4042		{texstorage2d_invalid_levels,					"texstorage2d_invalid_levels",						"Invalid glTexStorage2D() usage"		   },
4043		{texstorage3d,									"texstorage3d",										"Invalid glTexStorage3D() usage"		   },
4044		{texstorage3d_invalid_binding,					"texstorage3d_invalid_binding",						"Invalid glTexStorage3D() usage"		   },
4045		{texstorage3d_invalid_levels,					"texstorage3d_invalid_levels",						"Invalid glTexStorage3D() usage"		   },
4046	};
4047
4048	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
4049}
4050
4051} // NegativeTestShared
4052} // Functional
4053} // gles31
4054} // deqp
4055