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