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 Shader API tests.
22 *//*--------------------------------------------------------------------*/
23
24#include "es31fNegativeShaderApiTests.hpp"
25
26#include "deUniquePtr.hpp"
27
28#include "glwDefs.hpp"
29#include "glwEnums.hpp"
30
31#include "gluShaderProgram.hpp"
32#include "gluCallLogWrapper.hpp"
33
34#include "gluContextInfo.hpp"
35#include "gluRenderContext.hpp"
36
37
38namespace deqp
39{
40namespace gles31
41{
42namespace Functional
43{
44namespace NegativeTestShared
45{
46using tcu::TestLog;
47using glu::CallLogWrapper;
48using namespace glw;
49
50static const char* vertexShaderSource		=	"#version 300 es\n"
51												"void main (void)\n"
52												"{\n"
53												"	gl_Position = vec4(0.0);\n"
54												"}\n\0";
55
56static const char* fragmentShaderSource		=	"#version 300 es\n"
57												"layout(location = 0) out mediump vec4 fragColor;"
58												"void main (void)\n"
59												"{\n"
60												"	fragColor = vec4(0.0);\n"
61												"}\n\0";
62
63static const char* uniformTestVertSource	=	"#version 300 es\n"
64												"uniform mediump vec4 vec4_v;\n"
65												"uniform mediump mat4 mat4_v;\n"
66												"void main (void)\n"
67												"{\n"
68												"	gl_Position = mat4_v * vec4_v;\n"
69												"}\n\0";
70
71static const char* uniformTestFragSource	=	"#version 300 es\n"
72												"uniform mediump ivec4 ivec4_f;\n"
73												"uniform mediump uvec4 uvec4_f;\n"
74												"uniform sampler2D sampler_f;\n"
75												"layout(location = 0) out mediump vec4 fragColor;"
76												"void main (void)\n"
77												"{\n"
78												"	fragColor.xy = (vec4(uvec4_f) + vec4(ivec4_f)).xy;\n"
79												"	fragColor.zw = texture(sampler_f, vec2(0.0, 0.0)).zw;\n"
80												"}\n\0";
81
82static const char* uniformBlockVertSource	=	"#version 300 es\n"
83												"layout(shared) uniform Block { lowp float var; };\n"
84												"void main (void)\n"
85												"{\n"
86												"	gl_Position = vec4(var);\n"
87												"}\n\0";
88
89
90// Shader control commands
91void create_shader (NegativeTestContext& ctx)
92{
93	ctx.beginSection("GL_INVALID_ENUM is generated if shaderType is not an accepted value.");
94	ctx.glCreateShader(-1);
95	ctx.expectError(GL_INVALID_ENUM);
96	ctx.endSection();
97}
98
99void shader_source (NegativeTestContext& ctx)
100{
101	// make notAShader not a shader id
102	const GLuint notAShader = ctx.glCreateShader(GL_VERTEX_SHADER);
103	ctx.glDeleteShader(notAShader);
104
105	ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
106	ctx.glShaderSource(notAShader, 0, 0, 0);
107	ctx.expectError(GL_INVALID_VALUE);
108	ctx.endSection();
109
110	ctx.beginSection("GL_INVALID_VALUE is generated if count is less than 0.");
111	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
112	ctx.glShaderSource(shader, -1, 0, 0);
113	ctx.expectError(GL_INVALID_VALUE);
114	ctx.endSection();
115
116	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
117	GLuint program = ctx.glCreateProgram();
118	ctx.glShaderSource(program, 0, 0, 0);
119	ctx.expectError(GL_INVALID_OPERATION);
120	ctx.endSection();
121
122	ctx.glDeleteProgram(program);
123	ctx.glDeleteShader(shader);
124}
125
126void compile_shader (NegativeTestContext& ctx)
127{
128	const GLuint notAShader = ctx.glCreateShader(GL_VERTEX_SHADER);
129	ctx.glDeleteShader(notAShader);
130
131	ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
132	ctx.glCompileShader(notAShader);
133	ctx.expectError(GL_INVALID_VALUE);
134	ctx.endSection();
135
136	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
137	GLuint program = ctx.glCreateProgram();
138	ctx.glCompileShader(program);
139	ctx.expectError(GL_INVALID_OPERATION);
140	ctx.endSection();
141
142	ctx.glDeleteProgram(program);
143}
144
145void delete_shader (NegativeTestContext& ctx)
146{
147	const GLuint notAShader = ctx.glCreateShader(GL_VERTEX_SHADER);
148	ctx.glDeleteShader(notAShader);
149
150	ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
151	ctx.glDeleteShader(notAShader);
152	ctx.expectError(GL_INVALID_VALUE);
153	ctx.endSection();
154}
155
156void shader_binary (NegativeTestContext& ctx)
157{
158	std::vector<deInt32> binaryFormats;
159	deBool shaderBinarySupported = !binaryFormats.empty();
160	GLuint shaders[2];
161	GLuint shaderPair[2];
162	GLuint nonProgram[2];
163	GLuint shaderProgram[2];
164
165	{
166		deInt32 numFormats = 0x1234;
167		ctx.glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &numFormats);
168
169		if (numFormats == 0)
170			ctx.getLog() << TestLog::Message << "// No supported extensions available." << TestLog::EndMessage;
171		else
172		{
173			binaryFormats.resize(numFormats);
174			ctx.glGetIntegerv(GL_SHADER_BINARY_FORMATS, &binaryFormats[0]);
175		}
176	}
177
178	if (!shaderBinarySupported)
179		ctx.getLog() << TestLog::Message << "// Shader binaries not supported." << TestLog::EndMessage;
180	else
181		ctx.getLog() << TestLog::Message << "// Shader binaries supported" << TestLog::EndMessage;
182
183	shaders[0]			= ctx.glCreateShader(GL_VERTEX_SHADER);
184	shaders[1]			= ctx.glCreateShader(GL_VERTEX_SHADER);
185	shaderPair[0]		= ctx.glCreateShader(GL_VERTEX_SHADER);
186	shaderPair[1]		= ctx.glCreateShader(GL_FRAGMENT_SHADER);
187	nonProgram[0]		= -1;
188	nonProgram[1]		= -1;
189	shaderProgram[0]	= ctx.glCreateShader(GL_VERTEX_SHADER);
190	shaderProgram[1]	= ctx.glCreateProgram();
191
192	ctx.beginSection("GL_INVALID_ENUM is generated if binaryFormat is not an accepted value.");
193	ctx.glShaderBinary(1, &shaders[0], -1, 0, 0);
194	ctx.expectError(GL_INVALID_ENUM);
195	ctx.endSection();
196
197	if (shaderBinarySupported)
198	{
199		ctx.beginSection("GL_INVALID_VALUE is generated if the data pointed to by binary does not match the format specified by binaryFormat.");
200		const GLbyte data = 0x005F;
201		ctx.glShaderBinary(1, &shaders[0], binaryFormats[0], &data, 1);
202		ctx.expectError(GL_INVALID_VALUE);
203		ctx.endSection();
204
205		ctx.beginSection("GL_INVALID_OPERATION is generated if more than one of the handles in shaders refers to the same type of shader, or GL_INVALID_VALUE due to invalid data pointer.");
206		ctx.glShaderBinary(2, &shaders[0], binaryFormats[0], 0, 0);
207		ctx.expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
208		ctx.endSection();
209
210		ctx.beginSection("GL_INVALID_VALUE is generated if count or length is negative.");
211		ctx.glShaderBinary(2, &shaderPair[0], binaryFormats[0], 0, -1);
212		ctx.expectError(GL_INVALID_VALUE);
213		ctx.glShaderBinary(-1, &shaderPair[0], binaryFormats[0], 0, 0);
214		ctx.expectError(GL_INVALID_VALUE);
215		ctx.endSection();
216
217		ctx.beginSection("GL_INVALID_VALUE is generated if shaders contains anything other than shader or program objects.");
218		ctx.glShaderBinary(2, &nonProgram[0], binaryFormats[0], 0, 0);
219		ctx.expectError(GL_INVALID_VALUE);
220		ctx.endSection();
221
222		ctx.beginSection("GL_INVALID_OPERATION is generated if shaders refers to a program object.");
223		ctx.glShaderBinary(2, &shaderProgram[0], binaryFormats[0], 0, 0);
224		ctx.expectError(GL_INVALID_OPERATION);
225		ctx.endSection();
226	}
227
228	ctx.glDeleteShader(shaders[0]);
229	ctx.glDeleteShader(shaders[1]);
230}
231
232void attach_shader (NegativeTestContext& ctx)
233{
234	GLuint shader1 = ctx.glCreateShader(GL_VERTEX_SHADER);
235	GLuint shader2 = ctx.glCreateShader(GL_VERTEX_SHADER);
236	GLuint program = ctx.glCreateProgram();
237
238	const GLuint notAShader = ctx.glCreateShader(GL_VERTEX_SHADER);
239	const GLuint notAProgram = ctx.glCreateProgram();
240
241	ctx.glDeleteShader(notAShader);
242	ctx.glDeleteProgram(notAProgram);
243
244	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
245	ctx.glAttachShader(shader1, shader1);
246	ctx.expectError(GL_INVALID_OPERATION);
247	ctx.endSection();
248
249	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
250	ctx.glAttachShader(program, program);
251	ctx.expectError(GL_INVALID_OPERATION);
252	ctx.glAttachShader(shader1, program);
253	ctx.expectError(GL_INVALID_OPERATION);
254	ctx.endSection();
255
256	ctx.beginSection("GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
257	ctx.glAttachShader(program, notAShader);
258	ctx.expectError(GL_INVALID_VALUE);
259	ctx.glAttachShader(notAProgram, shader1);
260	ctx.expectError(GL_INVALID_VALUE);
261	ctx.glAttachShader(notAProgram, notAShader);
262	ctx.expectError(GL_INVALID_VALUE);
263	ctx.endSection();
264
265	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is already attached to program.");
266	ctx.glAttachShader(program, shader1);
267	ctx.expectError(GL_NO_ERROR);
268	ctx.glAttachShader(program, shader1);
269	ctx.expectError(GL_INVALID_OPERATION);
270	ctx.endSection();
271
272	ctx.beginSection("GL_INVALID_OPERATION is generated if a shader of the same type as shader is already attached to program.");
273	ctx.glAttachShader(program, shader2);
274	ctx.expectError(GL_INVALID_OPERATION);
275	ctx.endSection();
276
277	ctx.glDeleteProgram(program);
278	ctx.glDeleteShader(shader1);
279	ctx.glDeleteShader(shader2);
280}
281
282void detach_shader (NegativeTestContext& ctx)
283{
284	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
285	GLuint program = ctx.glCreateProgram();
286
287	const GLuint notAShader = ctx.glCreateShader(GL_VERTEX_SHADER);
288	const GLuint notAProgram = ctx.glCreateProgram();
289
290	ctx.glDeleteShader(notAShader);
291	ctx.glDeleteProgram(notAProgram);
292
293	ctx.beginSection("GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
294	ctx.glDetachShader(notAProgram, shader);
295	ctx.expectError(GL_INVALID_VALUE);
296	ctx.glDetachShader(program, notAShader);
297	ctx.expectError(GL_INVALID_VALUE);
298	ctx.glDetachShader(notAProgram, notAShader);
299	ctx.expectError(GL_INVALID_VALUE);
300	ctx.endSection();
301
302	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
303	ctx.glDetachShader(shader, shader);
304	ctx.expectError(GL_INVALID_OPERATION);
305	ctx.endSection();
306
307	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
308	ctx.glDetachShader(program, program);
309	ctx.expectError(GL_INVALID_OPERATION);
310	ctx.glDetachShader(shader, program);
311	ctx.expectError(GL_INVALID_OPERATION);
312	ctx.endSection();
313
314	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not attached to program.");
315	ctx.glDetachShader(program, shader);
316	ctx.expectError(GL_INVALID_OPERATION);
317	ctx.endSection();
318
319	ctx.glDeleteProgram(program);
320	ctx.glDeleteShader(shader);
321}
322
323void link_program (NegativeTestContext& ctx)
324{
325	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
326
327	const GLuint notAProgram = ctx.glCreateProgram();
328	ctx.glDeleteProgram(notAProgram);
329
330	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
331	ctx.glLinkProgram(notAProgram);
332	ctx.expectError(GL_INVALID_VALUE);
333	ctx.endSection();
334
335	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
336	ctx.glLinkProgram(shader);
337	ctx.expectError(GL_INVALID_OPERATION);
338	ctx.endSection();
339
340	ctx.glDeleteShader(shader);
341
342	ctx.beginSection("GL_INVALID_OPERATION is generated if program is the currently active program object and transform feedback mode is active.");
343	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
344	deUint32					buf = 0x1234;
345	deUint32					tfID = 0x1234;
346	const char* tfVarying		= "gl_Position";
347
348	ctx.glGenTransformFeedbacks		(1, &tfID);
349	ctx.glGenBuffers				(1, &buf);
350
351	ctx.glUseProgram				(program.getProgram());
352	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
353	ctx.glLinkProgram				(program.getProgram());
354	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
355	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
356	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
357	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
358	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
359	ctx.expectError					(GL_NO_ERROR);
360
361	ctx.glLinkProgram				(program.getProgram());
362	ctx.expectError				(GL_INVALID_OPERATION);
363
364	ctx.glEndTransformFeedback		();
365	ctx.glDeleteTransformFeedbacks	(1, &tfID);
366	ctx.glDeleteBuffers				(1, &buf);
367	ctx.expectError				(GL_NO_ERROR);
368	ctx.endSection();
369}
370
371void use_program (NegativeTestContext& ctx)
372{
373	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
374
375	const GLuint notAProgram = ctx.glCreateProgram();
376	ctx.glDeleteProgram(notAProgram);
377
378	ctx.beginSection("GL_INVALID_VALUE is generated if program is neither 0 nor a value generated by OpenGL.");
379	ctx.glUseProgram(notAProgram);
380	ctx.expectError(GL_INVALID_VALUE);
381	ctx.endSection();
382
383	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
384	ctx.glUseProgram(shader);
385	ctx.expectError(GL_INVALID_OPERATION);
386	ctx.endSection();
387
388	ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback mode is active and not paused.");
389	glu::ShaderProgram			program1(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
390	glu::ShaderProgram			program2(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
391	deUint32					buf = 0x1234;
392	deUint32					tfID = 0x1234;
393	const char* tfVarying		= "gl_Position";
394
395	ctx.glGenTransformFeedbacks		(1, &tfID);
396	ctx.glGenBuffers				(1, &buf);
397
398	ctx.glUseProgram				(program1.getProgram());
399	ctx.glTransformFeedbackVaryings	(program1.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
400	ctx.glLinkProgram				(program1.getProgram());
401	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
402	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
403	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
404	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
405	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
406	ctx.expectError					(GL_NO_ERROR);
407
408	ctx.glUseProgram				(program2.getProgram());
409	ctx.expectError				(GL_INVALID_OPERATION);
410
411	ctx.glPauseTransformFeedback	();
412	ctx.glUseProgram				(program2.getProgram());
413	ctx.expectError				(GL_NO_ERROR);
414
415	ctx.glEndTransformFeedback		();
416	ctx.glDeleteTransformFeedbacks	(1, &tfID);
417	ctx.glDeleteBuffers				(1, &buf);
418	ctx.expectError				(GL_NO_ERROR);
419	ctx.endSection();
420
421	ctx.glUseProgram(0);
422	ctx.glDeleteShader(shader);
423}
424
425void delete_program (NegativeTestContext& ctx)
426{
427	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
428
429	const GLuint notAProgram = ctx.glCreateProgram();
430	ctx.glDeleteProgram(notAProgram);
431
432	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
433	ctx.glDeleteProgram(notAProgram);
434	ctx.expectError(GL_INVALID_VALUE);
435	ctx.endSection();
436
437	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not zero and is the name of a shader object.");
438	ctx.glDeleteProgram(shader);
439	ctx.expectError(GL_INVALID_OPERATION);
440	ctx.endSection();
441
442	ctx.glDeleteShader(shader);
443}
444
445void validate_program (NegativeTestContext& ctx)
446{
447	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
448
449	const GLuint notAProgram = ctx.glCreateProgram();
450	ctx.glDeleteProgram(notAProgram);
451
452	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
453	ctx.glValidateProgram(notAProgram);
454	ctx.expectError(GL_INVALID_VALUE);
455	ctx.endSection();
456
457	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
458	ctx.glValidateProgram(shader);
459	ctx.expectError(GL_INVALID_OPERATION);
460	ctx.endSection();
461
462	ctx.glDeleteShader(shader);
463}
464
465void get_program_binary (NegativeTestContext& ctx)
466{
467	glu::ShaderProgram				program			(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
468	glu::ShaderProgram				programInvalid	(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, ""));
469	GLenum							binaryFormat	= -1;
470	GLsizei							binaryLength	= -1;
471	GLint							binaryPtr		= -1;
472	GLint							bufSize			= -1;
473	GLint							linkStatus		= -1;
474
475	ctx.beginSection("GL_INVALID_OPERATION is generated if bufSize is less than the size of GL_PROGRAM_BINARY_LENGTH for program.");
476	ctx.glGetProgramiv		(program.getProgram(), GL_PROGRAM_BINARY_LENGTH,	&bufSize);
477	ctx.expectError		(GL_NO_ERROR);
478	ctx.glGetProgramiv		(program.getProgram(), GL_LINK_STATUS,				&linkStatus);
479	ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
480	ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
481	ctx.expectError		(GL_NO_ERROR);
482
483	ctx.glGetProgramBinary	(program.getProgram(), 0, &binaryLength, &binaryFormat, &binaryPtr);
484	ctx.expectError		(GL_INVALID_OPERATION);
485	if (bufSize > 0)
486	{
487		ctx.glGetProgramBinary	(program.getProgram(), bufSize-1, &binaryLength, &binaryFormat, &binaryPtr);
488		ctx.expectError		(GL_INVALID_OPERATION);
489	}
490	ctx.endSection();
491
492	ctx.beginSection("GL_INVALID_OPERATION is generated if GL_LINK_STATUS for the program object is false.");
493	ctx.glGetProgramiv		(programInvalid.getProgram(), GL_PROGRAM_BINARY_LENGTH,	&bufSize);
494	ctx.expectError		(GL_NO_ERROR);
495	ctx.glGetProgramiv		(programInvalid.getProgram(), GL_LINK_STATUS,			&linkStatus);
496	ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
497	ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
498	ctx.expectError		(GL_NO_ERROR);
499
500	ctx.glGetProgramBinary	(programInvalid.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryPtr);
501	ctx.expectError		(GL_INVALID_OPERATION);
502	ctx.endSection();
503}
504
505void program_binary (NegativeTestContext& ctx)
506{
507	glu::ShaderProgram		srcProgram		(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
508	GLuint					dstProgram		= ctx.glCreateProgram();
509	GLuint					dummyShader		= ctx.glCreateShader(GL_VERTEX_SHADER);
510	GLenum					binaryFormat	= -1;
511	GLsizei					binaryLength	= -1;
512	std::vector<deUint8>	binaryBuf;
513	GLint					bufSize			= -1;
514	GLint					linkStatus		= -1;
515
516	ctx.glGetProgramiv		(srcProgram.getProgram(), GL_PROGRAM_BINARY_LENGTH,	&bufSize);
517	ctx.glGetProgramiv		(srcProgram.getProgram(), GL_LINK_STATUS,			&linkStatus);
518	ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
519	ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
520
521	TCU_CHECK(bufSize >= 0);
522	if (bufSize > 0)
523	{
524		binaryBuf.resize(bufSize);
525		ctx.glGetProgramBinary	(srcProgram.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryBuf[0]);
526		ctx.expectError			(GL_NO_ERROR);
527
528		ctx.beginSection("GL_INVALID_OPERATION is generated if program is not the name of an existing program object.");
529		ctx.glProgramBinary		(dummyShader, binaryFormat, &binaryBuf[0], binaryLength);
530		ctx.expectError			(GL_INVALID_OPERATION);
531		ctx.endSection();
532
533		ctx.beginSection("GL_INVALID_ENUM is generated if binaryFormat is not a value recognized by the implementation.");
534		ctx.glProgramBinary		(dstProgram, -1, &binaryBuf[0], binaryLength);
535		ctx.expectError			(GL_INVALID_ENUM);
536		ctx.endSection();
537	}
538
539	ctx.glDeleteShader(dummyShader);
540	ctx.glDeleteProgram(dstProgram);
541}
542
543void program_parameteri (NegativeTestContext& ctx)
544{
545	GLuint program	= ctx.glCreateProgram();
546	GLuint shader	= ctx.glCreateShader(GL_VERTEX_SHADER);
547
548	const GLuint notAProgram = ctx.glCreateProgram();
549	ctx.glDeleteProgram(notAProgram);
550
551	ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of an existing program object.");
552	ctx.glProgramParameteri(notAProgram, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
553	ctx.expectError(GL_INVALID_VALUE);
554	ctx.endSection();
555
556	ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object.");
557	ctx.glProgramParameteri(shader, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
558	ctx.expectError(GL_INVALID_OPERATION);
559	ctx.endSection();
560
561	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not GL_PROGRAM_BINARY_RETRIEVABLE_HINT or PROGRAM_SEPARABLE.");
562	ctx.glProgramParameteri(program, -1, GL_TRUE);
563	ctx.expectError(GL_INVALID_ENUM);
564	ctx.endSection();
565
566	ctx.beginSection("GL_INVALID_VALUE is generated if value is not GL_FALSE or GL_TRUE.");
567	ctx.glProgramParameteri(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, 2);
568	ctx.expectError(GL_INVALID_VALUE);
569	ctx.endSection();
570
571	ctx.glDeleteProgram(program);
572	ctx.glDeleteShader(shader);
573}
574
575void gen_samplers (NegativeTestContext& ctx)
576{
577	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
578	GLuint sampler = 0;
579	ctx.glGenSamplers	(-1, &sampler);
580	ctx.expectError	(GL_INVALID_VALUE);
581	ctx.endSection();
582}
583
584void bind_sampler (NegativeTestContext& ctx)
585{
586	int				maxTexImageUnits = 0x1234;
587	GLuint			sampler = 0;
588	ctx.glGetIntegerv	(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTexImageUnits);
589	ctx.glGenSamplers	(1, &sampler);
590
591	ctx.beginSection("GL_INVALID_VALUE is generated if unit is greater than or equal to the value of GL_MAX_COMBIED_TEXTURE_IMAGE_UNITS.");
592	ctx.glBindSampler	(maxTexImageUnits, sampler);
593	ctx.expectError	(GL_INVALID_VALUE);
594	ctx.endSection();
595
596	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not zero or a name previously returned from a call to ctx.glGenSamplers.");
597	ctx.glBindSampler	(1, -1);
598	ctx.expectError	(GL_INVALID_OPERATION);
599	ctx.endSection();
600
601	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler has been deleted by a call to ctx.glDeleteSamplers.");
602	ctx.glDeleteSamplers(1, &sampler);
603	ctx.glBindSampler	(1, sampler);
604	ctx.expectError	(GL_INVALID_OPERATION);
605	ctx.endSection();
606}
607
608void delete_samplers (NegativeTestContext& ctx)
609{
610	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
611	ctx.glDeleteSamplers(-1, 0);
612	ctx.expectError	(GL_INVALID_VALUE);
613	ctx.endSection();
614}
615
616void get_sampler_parameteriv (NegativeTestContext& ctx)
617{
618	int				params = 0x1234;
619	GLuint			sampler = 0;
620	ctx.glGenSamplers	(1, &sampler);
621
622	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object returned from a previous call to ctx.glGenSamplers.");
623	ctx.glGetSamplerParameteriv	(-1, GL_TEXTURE_MAG_FILTER, &params);
624	ctx.expectError			(GL_INVALID_OPERATION);
625	ctx.endSection();
626
627	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
628	ctx.glGetSamplerParameteriv	(sampler, -1, &params);
629	ctx.expectError			(GL_INVALID_ENUM);
630	ctx.endSection();
631
632	ctx.glDeleteSamplers(1, &sampler);
633}
634
635void get_sampler_parameterfv (NegativeTestContext& ctx)
636{
637	float				params	= 0.0f;
638	GLuint				sampler = 0;
639	ctx.glGenSamplers	(1, &sampler);
640
641	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object returned from a previous call to ctx.glGenSamplers.");
642	ctx.glGetSamplerParameterfv	(-1, GL_TEXTURE_MAG_FILTER, &params);
643	ctx.expectError			(GL_INVALID_OPERATION);
644	ctx.endSection();
645
646	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
647	ctx.glGetSamplerParameterfv	(sampler, -1, &params);
648	ctx.expectError			(GL_INVALID_ENUM);
649	ctx.endSection();
650
651	ctx.glDeleteSamplers(1, &sampler);
652}
653
654void get_sampler_parameterIiv (NegativeTestContext& ctx)
655{
656	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
657		throw tcu::NotSupportedError("glGetSamplerParameterIiv is not supported.", DE_NULL, __FILE__, __LINE__);
658
659	GLuint	sampler		= 0x1234;
660	GLint	borderColor	= 0x1234;
661
662	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object returned from a previous call to ctx.glGenSamplers.");
663	ctx.glGetSamplerParameterIiv(sampler, GL_TEXTURE_BORDER_COLOR, &borderColor);
664	ctx.expectError(GL_INVALID_OPERATION);
665	ctx.endSection();
666
667	ctx.glGenSamplers(1, &sampler);
668
669	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
670	ctx.glGetSamplerParameterIiv(sampler, -1, &borderColor);
671	ctx.expectError(GL_INVALID_ENUM);
672	ctx.endSection();
673
674	ctx.glDeleteSamplers(1, &sampler);
675}
676
677void get_sampler_parameterIuiv (NegativeTestContext& ctx)
678{
679	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
680		throw tcu::NotSupportedError("glGetSamplerParameterIuiv is not supported.", DE_NULL, __FILE__, __LINE__);
681
682	GLuint	sampler		= 0x1234;
683	GLuint	borderColor	= 0x1234;
684
685	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object returned from a previous call to ctx.glGenSamplers.");
686	ctx.glGetSamplerParameterIuiv(sampler, GL_TEXTURE_BORDER_COLOR, &borderColor);
687	ctx.expectError(GL_INVALID_OPERATION);
688	ctx.endSection();
689
690	ctx.glGenSamplers(1, &sampler);
691
692	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
693	ctx.glGetSamplerParameterIuiv(sampler, -1, &borderColor);
694	ctx.expectError(GL_INVALID_ENUM);
695	ctx.endSection();
696
697	ctx.glDeleteSamplers(1, &sampler);
698}
699
700void sampler_parameteri (NegativeTestContext& ctx)
701{
702	GLuint sampler = 0;
703
704	ctx.glGenSamplers(1, &sampler);
705
706	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously returned from a call to ctx.glGenSamplers.");
707	ctx.glSamplerParameteri(-1, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
708	ctx.expectError(GL_INVALID_OPERATION);
709	ctx.endSection();
710
711	ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
712	ctx.glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, -1);
713	ctx.expectError(GL_INVALID_ENUM);
714	ctx.endSection();
715
716	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
717	{
718		ctx.beginSection("GL_INVALID_ENUM is generated if glSamplerParameteri is called for a non-scalar parameter.");
719		ctx.glSamplerParameteri(sampler, GL_TEXTURE_BORDER_COLOR, 0);
720		ctx.expectError(GL_INVALID_ENUM);
721		ctx.endSection();
722	}
723
724	ctx.glDeleteSamplers(1, &sampler);
725}
726
727void sampler_parameteriv (NegativeTestContext& ctx)
728{
729	int				params = 0x1234;
730	GLuint			sampler = 0;
731	ctx.glGenSamplers	(1, &sampler);
732
733	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously returned from a call to ctx.glGenSamplers.");
734	params = GL_CLAMP_TO_EDGE;
735	ctx.glSamplerParameteriv	(-1, GL_TEXTURE_WRAP_S, &params);
736	ctx.expectError			(GL_INVALID_OPERATION);
737	ctx.endSection();
738
739	ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
740	params = -1;
741	ctx.glSamplerParameteriv	(sampler, GL_TEXTURE_WRAP_S, &params);
742	ctx.expectError			(GL_INVALID_ENUM);
743	ctx.endSection();
744
745	ctx.glDeleteSamplers(1, &sampler);
746}
747
748void sampler_parameterf (NegativeTestContext& ctx)
749{
750	GLuint sampler = 0;
751
752	ctx.glGenSamplers(1, &sampler);
753
754	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously returned from a call to ctx.glGenSamplers.");
755	ctx.glSamplerParameterf(-1, GL_TEXTURE_MIN_LOD, -1000.0f);
756	ctx.expectError(GL_INVALID_OPERATION);
757	ctx.endSection();
758
759	ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
760	ctx.glSamplerParameterf(sampler, GL_TEXTURE_WRAP_S, -1.0f);
761	ctx.expectError(GL_INVALID_ENUM);
762	ctx.endSection();
763
764	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
765	{
766		ctx.beginSection("GL_INVALID_ENUM is generated if glSamplerParameterf is called for a non-scalar parameter.");
767		ctx.glSamplerParameteri(sampler, GL_TEXTURE_BORDER_COLOR, 0);
768		ctx.expectError(GL_INVALID_ENUM);
769		ctx.endSection();
770	}
771
772	ctx.glDeleteSamplers(1, &sampler);
773}
774
775void sampler_parameterfv (NegativeTestContext& ctx)
776{
777	float			params;
778	GLuint			sampler = 0;
779	ctx.glGenSamplers	(1, &sampler);
780
781	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously returned from a call to ctx.glGenSamplers.");
782	params = -1000.0f;
783	ctx.glSamplerParameterfv	(-1, GL_TEXTURE_WRAP_S, &params);
784	ctx.expectError			(GL_INVALID_OPERATION);
785	ctx.endSection();
786
787	ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
788	params = -1.0f;
789	ctx.glSamplerParameterfv	(sampler, GL_TEXTURE_WRAP_S, &params);
790	ctx.expectError			(GL_INVALID_ENUM);
791	ctx.endSection();
792
793	ctx.glDeleteSamplers(1, &sampler);
794}
795
796void sampler_parameterIiv (NegativeTestContext& ctx)
797{
798	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
799		throw tcu::NotSupportedError("glSamplerParameterIiv is not supported.", DE_NULL, __FILE__, __LINE__);
800
801	GLuint	sampler;
802	GLint	color[]	= {0, 0, 0, 0};
803
804	ctx.glGenSamplers(1, &sampler);
805
806	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously returned from a call to ctx.glGenSamplers.");
807	ctx.glSamplerParameterIiv(-1, GL_TEXTURE_BORDER_COLOR, color);
808	ctx.expectError(GL_INVALID_OPERATION);
809	ctx.endSection();
810
811	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted sampler state name.");
812	ctx.glSamplerParameterIiv(sampler, -1, color);
813	ctx.expectError(GL_INVALID_ENUM);
814	ctx.endSection();
815}
816
817void sampler_parameterIuiv (NegativeTestContext& ctx)
818{
819	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
820		throw tcu::NotSupportedError("glSamplerParameterIuiv is not supported.", DE_NULL, __FILE__, __LINE__);
821
822	GLuint	sampler;
823	GLuint	color[]	= {0, 0, 0, 0};
824
825	ctx.glGenSamplers(1, &sampler);
826
827	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously returned from a call to ctx.glGenSamplers.");
828	ctx.glSamplerParameterIuiv(-1, GL_TEXTURE_BORDER_COLOR, color);
829	ctx.expectError(GL_INVALID_OPERATION);
830	ctx.endSection();
831
832	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted sampler state name.");
833	ctx.glSamplerParameterIuiv(sampler, -1, color);
834	ctx.expectError(GL_INVALID_ENUM);
835	ctx.endSection();
836}
837
838// Shader data commands
839
840void get_attrib_location (NegativeTestContext& ctx)
841{
842	GLuint programEmpty		= ctx.glCreateProgram();
843	GLuint shader			= ctx.glCreateShader(GL_VERTEX_SHADER);
844
845	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
846
847	const GLuint notAProgram = ctx.glCreateProgram();
848	ctx.glDeleteProgram(notAProgram);
849
850	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
851	ctx.glBindAttribLocation		(programEmpty, 0, "test");
852	ctx.glGetAttribLocation			(programEmpty, "test");
853	ctx.expectError				(GL_INVALID_OPERATION);
854	ctx.endSection();
855
856	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a program or shader object.");
857	ctx.glUseProgram				(program.getProgram());
858	ctx.glBindAttribLocation		(program.getProgram(), 0, "test");
859	ctx.expectError				(GL_NO_ERROR);
860	ctx.glGetAttribLocation			(program.getProgram(), "test");
861	ctx.expectError				(GL_NO_ERROR);
862	ctx.glGetAttribLocation			(notAProgram, "test");
863	ctx.expectError				(GL_INVALID_VALUE);
864	ctx.endSection();
865
866	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
867	ctx.glGetAttribLocation			(shader, "test");
868	ctx.expectError				(GL_INVALID_OPERATION);
869	ctx.endSection();
870
871	ctx.glUseProgram				(0);
872	ctx.glDeleteShader				(shader);
873	ctx.glDeleteProgram				(programEmpty);
874}
875
876void get_uniform_location (NegativeTestContext& ctx)
877{
878	GLuint programEmpty = ctx.glCreateProgram();
879	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
880
881	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
882
883	const GLuint notAProgram = ctx.glCreateProgram();
884	ctx.glDeleteProgram(notAProgram);
885
886	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
887	ctx.glGetUniformLocation(programEmpty, "test");
888	ctx.expectError(GL_INVALID_OPERATION);
889	ctx.endSection();
890
891	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
892	ctx.glUseProgram(program.getProgram());
893	ctx.glGetUniformLocation(notAProgram, "test");
894	ctx.expectError(GL_INVALID_VALUE);
895	ctx.endSection();
896
897	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
898	ctx.glGetAttribLocation(shader, "test");
899	ctx.expectError(GL_INVALID_OPERATION);
900	ctx.endSection();
901
902	ctx.glUseProgram(0);
903	ctx.glDeleteProgram(programEmpty);
904	ctx.glDeleteShader(shader);
905}
906
907void bind_attrib_location (NegativeTestContext& ctx)
908{
909	GLuint program = ctx.glCreateProgram();
910	GLuint maxIndex = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
911	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
912
913	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
914	ctx.glBindAttribLocation(program, maxIndex, "test");
915	ctx.expectError(GL_INVALID_VALUE);
916	ctx.endSection();
917
918	ctx.beginSection("GL_INVALID_OPERATION is generated if name starts with the reserved prefix \"gl_\".");
919	ctx.glBindAttribLocation(program, maxIndex-1, "gl_test");
920	ctx.expectError(GL_INVALID_OPERATION);
921	ctx.endSection();
922
923	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
924	ctx.glBindAttribLocation(-1, maxIndex-1, "test");
925	ctx.expectError(GL_INVALID_VALUE);
926	ctx.endSection();
927
928	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
929	ctx.glBindAttribLocation(shader, maxIndex-1, "test");
930	ctx.expectError(GL_INVALID_OPERATION);
931	ctx.endSection();
932
933	ctx.glDeleteProgram(program);
934	ctx.glDeleteShader(shader);
935}
936
937void uniform_block_binding (NegativeTestContext& ctx)
938{
939	GLint				maxUniformBufferBindings	= -1;
940	GLint				numActiveUniforms			= -1;
941	GLint				numActiveBlocks				= -1;
942	GLuint				shader						= -1;
943	glu::ShaderProgram	program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformBlockVertSource, uniformTestFragSource));
944
945	shader = ctx.glCreateShader(GL_VERTEX_SHADER);
946	ctx.glUseProgram(program.getProgram());
947
948	ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
949	ctx.glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORMS, &numActiveUniforms);
950	ctx.glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks);
951	ctx.getLog() << TestLog::Message << "// GL_MAX_UNIFORM_BUFFER_BINDINGS = " << maxUniformBufferBindings << TestLog::EndMessage;
952	ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORMS = "				<< numActiveUniforms		<< TestLog::EndMessage;
953	ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = "		<< numActiveBlocks			<< TestLog::EndMessage;
954	ctx.expectError	(GL_NO_ERROR);
955
956	ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockIndex is not an active uniform block index of program.");
957	ctx.glUniformBlockBinding(program.getProgram(), -1, 0);
958	ctx.expectError(GL_INVALID_VALUE);
959	ctx.glUniformBlockBinding(program.getProgram(), 5, 0);
960	ctx.expectError(GL_INVALID_VALUE);
961	ctx.endSection();
962
963	ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockBinding is greater than or equal to the value of GL_MAX_UNIFORM_BUFFER_BINDINGS.");
964	ctx.glUniformBlockBinding(program.getProgram(), maxUniformBufferBindings, 0);
965	ctx.expectError(GL_INVALID_VALUE);
966	ctx.endSection();
967
968	ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object generated by the GL.");
969	ctx.glUniformBlockBinding(-1, 0, 0);
970	ctx.expectError(GL_INVALID_VALUE);
971	ctx.endSection();
972
973	ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object.");
974	ctx.glUniformBlockBinding(shader, 0, 0);
975	ctx.expectError(GL_INVALID_OPERATION);
976	ctx.endSection();
977
978	ctx.glDeleteShader(shader);
979}
980
981// ctx.glUniform*f
982
983void uniformf_invalid_program (NegativeTestContext& ctx)
984{
985	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
986	ctx.glUseProgram(0);
987	ctx.glUniform1f(-1, 0.0f);
988	ctx.expectError(GL_INVALID_OPERATION);
989	ctx.glUniform2f(-1, 0.0f, 0.0f);
990	ctx.expectError(GL_INVALID_OPERATION);
991	ctx.glUniform3f(-1, 0.0f, 0.0f, 0.0f);
992	ctx.expectError(GL_INVALID_OPERATION);
993	ctx.glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
994	ctx.expectError(GL_INVALID_OPERATION);
995	ctx.endSection();
996}
997
998void uniformf_incompatible_type (NegativeTestContext& ctx)
999{
1000	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1001
1002	ctx.glUseProgram(program.getProgram());
1003	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1004	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
1005	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
1006	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1007	ctx.expectError(GL_NO_ERROR);
1008
1009	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1010	{
1011		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1012		ctx.fail("Failed to retrieve uniform location");
1013	}
1014
1015	ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader does not match the size indicated by the ctx.glUniform command.");
1016	ctx.glUseProgram(program.getProgram());
1017	ctx.glUniform1f(vec4_v, 0.0f);
1018	ctx.expectError(GL_INVALID_OPERATION);
1019	ctx.glUniform2f(vec4_v, 0.0f, 0.0f);
1020	ctx.expectError(GL_INVALID_OPERATION);
1021	ctx.glUniform3f(vec4_v, 0.0f, 0.0f, 0.0f);
1022	ctx.expectError(GL_INVALID_OPERATION);
1023	ctx.glUniform4f(vec4_v, 0.0f, 0.0f, 0.0f, 0.0f);
1024	ctx.expectError(GL_NO_ERROR);
1025	ctx.endSection();
1026
1027	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}f is used to load a uniform variable of type int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4.");
1028	ctx.glUseProgram(program.getProgram());
1029	ctx.glUniform4f(ivec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
1030	ctx.expectError(GL_INVALID_OPERATION);
1031	ctx.glUniform4f(uvec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
1032	ctx.expectError(GL_INVALID_OPERATION);
1033	ctx.endSection();
1034
1035	ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1036	ctx.glUseProgram(program.getProgram());
1037	ctx.glUniform1f(sampler_f, 0.0f);
1038	ctx.expectError(GL_INVALID_OPERATION);
1039	ctx.endSection();
1040
1041	ctx.glUseProgram(0);
1042}
1043
1044void uniformf_invalid_location (NegativeTestContext& ctx)
1045{
1046	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1047
1048	ctx.glUseProgram(program.getProgram());
1049	ctx.expectError(GL_NO_ERROR);
1050
1051	ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current program object and location is not equal to -1.");
1052	ctx.glUseProgram(program.getProgram());
1053	ctx.glUniform1f(-2, 0.0f);
1054	ctx.expectError(GL_INVALID_OPERATION);
1055	ctx.glUniform2f(-2, 0.0f, 0.0f);
1056	ctx.expectError(GL_INVALID_OPERATION);
1057	ctx.glUniform3f(-2, 0.0f, 0.0f, 0.0f);
1058	ctx.expectError(GL_INVALID_OPERATION);
1059	ctx.glUniform4f(-2, 0.0f, 0.0f, 0.0f, 0.0f);
1060	ctx.expectError(GL_INVALID_OPERATION);
1061
1062	ctx.glUseProgram(program.getProgram());
1063	ctx.glUniform1f(-1, 0.0f);
1064	ctx.expectError(GL_NO_ERROR);
1065	ctx.glUniform2f(-1, 0.0f, 0.0f);
1066	ctx.expectError(GL_NO_ERROR);
1067	ctx.glUniform3f(-1, 0.0f, 0.0f, 0.0f);
1068	ctx.expectError(GL_NO_ERROR);
1069	ctx.glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
1070	ctx.expectError(GL_NO_ERROR);
1071	ctx.endSection();
1072
1073	ctx.glUseProgram(0);
1074}
1075
1076// ctx.glUniform*fv
1077
1078void uniformfv_invalid_program (NegativeTestContext& ctx)
1079{
1080	std::vector<GLfloat> data(4);
1081
1082	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1083	ctx.glUseProgram(0);
1084	ctx.glUniform1fv(-1, 1, &data[0]);
1085	ctx.expectError(GL_INVALID_OPERATION);
1086	ctx.glUniform2fv(-1, 1, &data[0]);
1087	ctx.expectError(GL_INVALID_OPERATION);
1088	ctx.glUniform3fv(-1, 1, &data[0]);
1089	ctx.expectError(GL_INVALID_OPERATION);
1090	ctx.glUniform4fv(-1, 1, &data[0]);
1091	ctx.expectError(GL_INVALID_OPERATION);
1092	ctx.endSection();
1093}
1094
1095void uniformfv_incompatible_type (NegativeTestContext& ctx)
1096{
1097	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1098
1099	ctx.glUseProgram(program.getProgram());
1100	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1101	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
1102	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
1103	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1104	ctx.expectError(GL_NO_ERROR);
1105
1106	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1107	{
1108		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1109		ctx.fail("Failed to retrieve uniform location");
1110	}
1111
1112	std::vector<GLfloat> data(4);
1113
1114	ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader does not match the size indicated by the ctx.glUniform command.");
1115	ctx.glUseProgram(program.getProgram());
1116	ctx.glUniform1fv(vec4_v, 1, &data[0]);
1117	ctx.expectError(GL_INVALID_OPERATION);
1118	ctx.glUniform2fv(vec4_v, 1, &data[0]);
1119	ctx.expectError(GL_INVALID_OPERATION);
1120	ctx.glUniform3fv(vec4_v, 1, &data[0]);
1121	ctx.expectError(GL_INVALID_OPERATION);
1122	ctx.glUniform4fv(vec4_v, 1, &data[0]);
1123	ctx.expectError(GL_NO_ERROR);
1124	ctx.endSection();
1125
1126	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}fv is used to load a uniform variable of type int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4.");
1127	ctx.glUseProgram(program.getProgram());
1128	ctx.glUniform4fv(ivec4_f, 1, &data[0]);
1129	ctx.expectError(GL_INVALID_OPERATION);
1130	ctx.glUniform4fv(uvec4_f, 1, &data[0]);
1131	ctx.expectError(GL_INVALID_OPERATION);
1132	ctx.endSection();
1133
1134	ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1135	ctx.glUseProgram(program.getProgram());
1136	ctx.glUniform1fv(sampler_f, 1, &data[0]);
1137	ctx.expectError(GL_INVALID_OPERATION);
1138	ctx.endSection();
1139
1140	ctx.glUseProgram(0);
1141}
1142
1143void uniformfv_invalid_location (NegativeTestContext& ctx)
1144{
1145	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1146
1147	ctx.glUseProgram(program.getProgram());
1148	ctx.expectError(GL_NO_ERROR);
1149
1150	std::vector<GLfloat> data(4);
1151
1152	ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current program object and location is not equal to -1.");
1153	ctx.glUseProgram(program.getProgram());
1154	ctx.glUniform1fv(-2, 1, &data[0]);
1155	ctx.expectError(GL_INVALID_OPERATION);
1156	ctx.glUniform2fv(-2, 1, &data[0]);
1157	ctx.expectError(GL_INVALID_OPERATION);
1158	ctx.glUniform3fv(-2, 1, &data[0]);
1159	ctx.expectError(GL_INVALID_OPERATION);
1160	ctx.glUniform4fv(-2, 1, &data[0]);
1161	ctx.expectError(GL_INVALID_OPERATION);
1162
1163	ctx.glUseProgram(program.getProgram());
1164	ctx.glUniform1fv(-1, 1, &data[0]);
1165	ctx.expectError(GL_NO_ERROR);
1166	ctx.glUniform2fv(-1, 1, &data[0]);
1167	ctx.expectError(GL_NO_ERROR);
1168	ctx.glUniform3fv(-1, 1, &data[0]);
1169	ctx.expectError(GL_NO_ERROR);
1170	ctx.glUniform4fv(-1, 1, &data[0]);
1171	ctx.expectError(GL_NO_ERROR);
1172	ctx.endSection();
1173
1174	ctx.glUseProgram(0);
1175}
1176
1177void uniformfv_invalid_count (NegativeTestContext& ctx)
1178{
1179	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1180
1181	ctx.glUseProgram	(program.getProgram());
1182	GLint vec4_v			= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1183	ctx.expectError(GL_NO_ERROR);
1184
1185	if (vec4_v == -1)
1186	{
1187		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1188		ctx.fail("Failed to retrieve uniform location");
1189	}
1190
1191	std::vector<GLfloat> data(8);
1192
1193	ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1194	ctx.glUseProgram(program.getProgram());
1195	ctx.glUniform1fv(vec4_v, 2, &data[0]);
1196	ctx.expectError(GL_INVALID_OPERATION);
1197	ctx.glUniform2fv(vec4_v, 2, &data[0]);
1198	ctx.expectError(GL_INVALID_OPERATION);
1199	ctx.glUniform3fv(vec4_v, 2, &data[0]);
1200	ctx.expectError(GL_INVALID_OPERATION);
1201	ctx.glUniform4fv(vec4_v, 2, &data[0]);
1202	ctx.expectError(GL_INVALID_OPERATION);
1203	ctx.endSection();
1204
1205	ctx.glUseProgram(0);
1206}
1207
1208// ctx.glUniform*i
1209
1210void uniformi_invalid_program (NegativeTestContext& ctx)
1211{
1212	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1213	ctx.glUseProgram(0);
1214	ctx.glUniform1i(-1, 0);
1215	ctx.expectError(GL_INVALID_OPERATION);
1216	ctx.glUniform2i(-1, 0, 0);
1217	ctx.expectError(GL_INVALID_OPERATION);
1218	ctx.glUniform3i(-1, 0, 0, 0);
1219	ctx.expectError(GL_INVALID_OPERATION);
1220	ctx.glUniform4i(-1, 0, 0, 0, 0);
1221	ctx.expectError(GL_INVALID_OPERATION);
1222	ctx.endSection();
1223}
1224
1225void uniformi_incompatible_type (NegativeTestContext& ctx)
1226{
1227	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1228
1229	ctx.glUseProgram(program.getProgram());
1230	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1231	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
1232	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
1233	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1234	ctx.expectError(GL_NO_ERROR);
1235
1236	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1237	{
1238		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1239		ctx.fail("Failed to retrieve uniform location");
1240	}
1241
1242	ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader does not match the size indicated by the ctx.glUniform command.");
1243	ctx.glUseProgram(program.getProgram());
1244	ctx.glUniform1i(ivec4_f, 0);
1245	ctx.expectError(GL_INVALID_OPERATION);
1246	ctx.glUniform2i(ivec4_f, 0, 0);
1247	ctx.expectError(GL_INVALID_OPERATION);
1248	ctx.glUniform3i(ivec4_f, 0, 0, 0);
1249	ctx.expectError(GL_INVALID_OPERATION);
1250	ctx.glUniform4i(ivec4_f, 0, 0, 0, 0);
1251	ctx.expectError(GL_NO_ERROR);
1252	ctx.endSection();
1253
1254	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}i is used to load a uniform variable of type unsigned int, uvec2, uvec3, uvec4, or an array of these.");
1255	ctx.glUseProgram(program.getProgram());
1256	ctx.glUniform1i(uvec4_f, 0);
1257	ctx.expectError(GL_INVALID_OPERATION);
1258	ctx.glUniform2i(uvec4_f, 0, 0);
1259	ctx.expectError(GL_INVALID_OPERATION);
1260	ctx.glUniform3i(uvec4_f, 0, 0, 0);
1261	ctx.expectError(GL_INVALID_OPERATION);
1262	ctx.glUniform4i(uvec4_f, 0, 0, 0, 0);
1263	ctx.expectError(GL_INVALID_OPERATION);
1264	ctx.endSection();
1265
1266	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}i is used to load a uniform variable of type float, vec2, vec3, or vec4.");
1267	ctx.glUseProgram(program.getProgram());
1268	ctx.glUniform1i(vec4_v, 0);
1269	ctx.expectError(GL_INVALID_OPERATION);
1270	ctx.glUniform2i(vec4_v, 0, 0);
1271	ctx.expectError(GL_INVALID_OPERATION);
1272	ctx.glUniform3i(vec4_v, 0, 0, 0);
1273	ctx.expectError(GL_INVALID_OPERATION);
1274	ctx.glUniform4i(vec4_v, 0, 0, 0, 0);
1275	ctx.expectError(GL_INVALID_OPERATION);
1276	ctx.endSection();
1277
1278	ctx.glUseProgram(0);
1279}
1280
1281void uniformi_invalid_location (NegativeTestContext& ctx)
1282{
1283	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1284
1285	ctx.glUseProgram(program.getProgram());
1286	ctx.expectError(GL_NO_ERROR);
1287
1288	ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current program object and location is not equal to -1.");
1289	ctx.glUseProgram(program.getProgram());
1290	ctx.glUniform1i(-2, 0);
1291	ctx.expectError(GL_INVALID_OPERATION);
1292	ctx.glUniform2i(-2, 0, 0);
1293	ctx.expectError(GL_INVALID_OPERATION);
1294	ctx.glUniform3i(-2, 0, 0, 0);
1295	ctx.expectError(GL_INVALID_OPERATION);
1296	ctx.glUniform4i(-2, 0, 0, 0, 0);
1297	ctx.expectError(GL_INVALID_OPERATION);
1298
1299	ctx.glUseProgram(program.getProgram());
1300	ctx.glUniform1i(-1, 0);
1301	ctx.expectError(GL_NO_ERROR);
1302	ctx.glUniform2i(-1, 0, 0);
1303	ctx.expectError(GL_NO_ERROR);
1304	ctx.glUniform3i(-1, 0, 0, 0);
1305	ctx.expectError(GL_NO_ERROR);
1306	ctx.glUniform4i(-1, 0, 0, 0, 0);
1307	ctx.expectError(GL_NO_ERROR);
1308	ctx.endSection();
1309
1310	ctx.glUseProgram(0);
1311}
1312
1313// ctx.glUniform*iv
1314
1315void uniformiv_invalid_program (NegativeTestContext& ctx)
1316{
1317	std::vector<GLint> data(4);
1318
1319	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1320	ctx.glUseProgram(0);
1321	ctx.glUniform1iv(-1, 1, &data[0]);
1322	ctx.expectError(GL_INVALID_OPERATION);
1323	ctx.glUniform2iv(-1, 1, &data[0]);
1324	ctx.expectError(GL_INVALID_OPERATION);
1325	ctx.glUniform3iv(-1, 1, &data[0]);
1326	ctx.expectError(GL_INVALID_OPERATION);
1327	ctx.glUniform4iv(-1, 1, &data[0]);
1328	ctx.expectError(GL_INVALID_OPERATION);
1329	ctx.endSection();
1330}
1331
1332void uniformiv_incompatible_type (NegativeTestContext& ctx)
1333{
1334	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1335
1336	ctx.glUseProgram(program.getProgram());
1337	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1338	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
1339	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
1340	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1341	ctx.expectError(GL_NO_ERROR);
1342
1343	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1344	{
1345		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1346		ctx.fail("Failed to retrieve uniform location");
1347	}
1348
1349	std::vector<GLint> data(4);
1350
1351	ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader does not match the size indicated by the ctx.glUniform command.");
1352	ctx.glUseProgram(program.getProgram());
1353	ctx.glUniform1iv(ivec4_f, 1, &data[0]);
1354	ctx.expectError(GL_INVALID_OPERATION);
1355	ctx.glUniform2iv(ivec4_f, 1, &data[0]);
1356	ctx.expectError(GL_INVALID_OPERATION);
1357	ctx.glUniform3iv(ivec4_f, 1, &data[0]);
1358	ctx.expectError(GL_INVALID_OPERATION);
1359	ctx.glUniform4iv(ivec4_f, 1, &data[0]);
1360	ctx.expectError(GL_NO_ERROR);
1361	ctx.endSection();
1362
1363	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}iv is used to load a uniform variable of type float, vec2, vec3, or vec4.");
1364	ctx.glUseProgram(program.getProgram());
1365	ctx.glUniform1iv(vec4_v, 1, &data[0]);
1366	ctx.expectError(GL_INVALID_OPERATION);
1367	ctx.glUniform2iv(vec4_v, 1, &data[0]);
1368	ctx.expectError(GL_INVALID_OPERATION);
1369	ctx.glUniform3iv(vec4_v, 1, &data[0]);
1370	ctx.expectError(GL_INVALID_OPERATION);
1371	ctx.glUniform4iv(vec4_v, 1, &data[0]);
1372	ctx.expectError(GL_INVALID_OPERATION);
1373	ctx.endSection();
1374
1375	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}iv is used to load a uniform variable of type unsigned int, uvec2, uvec3 or uvec4.");
1376	ctx.glUseProgram(program.getProgram());
1377	ctx.glUniform1iv(uvec4_f, 1, &data[0]);
1378	ctx.expectError(GL_INVALID_OPERATION);
1379	ctx.glUniform2iv(uvec4_f, 1, &data[0]);
1380	ctx.expectError(GL_INVALID_OPERATION);
1381	ctx.glUniform3iv(uvec4_f, 1, &data[0]);
1382	ctx.expectError(GL_INVALID_OPERATION);
1383	ctx.glUniform4iv(uvec4_f, 1, &data[0]);
1384	ctx.expectError(GL_INVALID_OPERATION);
1385	ctx.endSection();
1386
1387	ctx.glUseProgram(0);
1388}
1389
1390void uniformiv_invalid_location (NegativeTestContext& ctx)
1391{
1392	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1393
1394	ctx.glUseProgram(program.getProgram());
1395	ctx.expectError(GL_NO_ERROR);
1396
1397	std::vector<GLint> data(4);
1398
1399	ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current program object and location is not equal to -1.");
1400	ctx.glUseProgram(program.getProgram());
1401	ctx.glUniform1iv(-2, 1, &data[0]);
1402	ctx.expectError(GL_INVALID_OPERATION);
1403	ctx.glUniform2iv(-2, 1, &data[0]);
1404	ctx.expectError(GL_INVALID_OPERATION);
1405	ctx.glUniform3iv(-2, 1, &data[0]);
1406	ctx.expectError(GL_INVALID_OPERATION);
1407	ctx.glUniform4iv(-2, 1, &data[0]);
1408	ctx.expectError(GL_INVALID_OPERATION);
1409
1410	ctx.glUseProgram(program.getProgram());
1411	ctx.glUniform1iv(-1, 1, &data[0]);
1412	ctx.expectError(GL_NO_ERROR);
1413	ctx.glUniform2iv(-1, 1, &data[0]);
1414	ctx.expectError(GL_NO_ERROR);
1415	ctx.glUniform3iv(-1, 1, &data[0]);
1416	ctx.expectError(GL_NO_ERROR);
1417	ctx.glUniform4iv(-1, 1, &data[0]);
1418	ctx.expectError(GL_NO_ERROR);
1419	ctx.endSection();
1420
1421	ctx.glUseProgram(0);
1422}
1423
1424void uniformiv_invalid_count (NegativeTestContext& ctx)
1425{
1426	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1427
1428	ctx.glUseProgram			(program.getProgram());
1429	GLint ivec4_f			= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1430	ctx.expectError(GL_NO_ERROR);
1431
1432	if (ivec4_f == -1)
1433	{
1434		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1435		ctx.fail("Failed to retrieve uniform location");
1436	}
1437
1438	std::vector<GLint> data(8);
1439
1440	ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1441	ctx.glUseProgram(program.getProgram());
1442	ctx.glUniform1iv(ivec4_f, 2, &data[0]);
1443	ctx.expectError(GL_INVALID_OPERATION);
1444	ctx.glUniform2iv(ivec4_f, 2, &data[0]);
1445	ctx.expectError(GL_INVALID_OPERATION);
1446	ctx.glUniform3iv(ivec4_f, 2, &data[0]);
1447	ctx.expectError(GL_INVALID_OPERATION);
1448	ctx.glUniform4iv(ivec4_f, 2, &data[0]);
1449	ctx.expectError(GL_INVALID_OPERATION);
1450	ctx.endSection();
1451
1452	ctx.glUseProgram(0);
1453}
1454
1455// ctx.glUniform{1234}ui
1456
1457void uniformui_invalid_program (NegativeTestContext& ctx)
1458{
1459	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1460	ctx.glUseProgram(0);
1461	ctx.glUniform1ui(-1, 0);
1462	ctx.expectError(GL_INVALID_OPERATION);
1463	ctx.glUniform2ui(-1, 0, 0);
1464	ctx.expectError(GL_INVALID_OPERATION);
1465	ctx.glUniform3ui(-1, 0, 0, 0);
1466	ctx.expectError(GL_INVALID_OPERATION);
1467	ctx.glUniform4ui(-1, 0, 0, 0, 0);
1468	ctx.expectError(GL_INVALID_OPERATION);
1469	ctx.endSection();
1470}
1471
1472void uniformui_incompatible_type (NegativeTestContext& ctx)
1473{
1474	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1475
1476	ctx.glUseProgram(program.getProgram());
1477	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1478	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
1479	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
1480	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1481	ctx.expectError(GL_NO_ERROR);
1482
1483	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1484	{
1485		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1486		ctx.fail("Failed to retrieve uniform location");
1487	}
1488
1489	ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader does not match the size indicated by the ctx.glUniform command.");
1490	ctx.glUseProgram(program.getProgram());
1491	ctx.glUniform1ui(uvec4_f, 0);
1492	ctx.expectError(GL_INVALID_OPERATION);
1493	ctx.glUniform2ui(uvec4_f, 0, 0);
1494	ctx.expectError(GL_INVALID_OPERATION);
1495	ctx.glUniform3ui(uvec4_f, 0, 0, 0);
1496	ctx.expectError(GL_INVALID_OPERATION);
1497	ctx.glUniform4ui(uvec4_f, 0, 0, 0, 0);
1498	ctx.expectError(GL_NO_ERROR);
1499	ctx.endSection();
1500
1501	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}i is used to load a uniform variable of type int, ivec2, ivec3, ivec4, or an array of these.");
1502	ctx.glUseProgram(program.getProgram());
1503	ctx.glUniform1ui(ivec4_f, 0);
1504	ctx.expectError(GL_INVALID_OPERATION);
1505	ctx.glUniform2ui(ivec4_f, 0, 0);
1506	ctx.expectError(GL_INVALID_OPERATION);
1507	ctx.glUniform3ui(ivec4_f, 0, 0, 0);
1508	ctx.expectError(GL_INVALID_OPERATION);
1509	ctx.glUniform4ui(ivec4_f, 0, 0, 0, 0);
1510	ctx.expectError(GL_INVALID_OPERATION);
1511	ctx.endSection();
1512
1513	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}i is used to load a uniform variable of type float, vec2, vec3, or vec4.");
1514	ctx.glUseProgram(program.getProgram());
1515	ctx.glUniform1ui(vec4_v, 0);
1516	ctx.expectError(GL_INVALID_OPERATION);
1517	ctx.glUniform2ui(vec4_v, 0, 0);
1518	ctx.expectError(GL_INVALID_OPERATION);
1519	ctx.glUniform3ui(vec4_v, 0, 0, 0);
1520	ctx.expectError(GL_INVALID_OPERATION);
1521	ctx.glUniform4ui(vec4_v, 0, 0, 0, 0);
1522	ctx.expectError(GL_INVALID_OPERATION);
1523	ctx.endSection();
1524
1525	ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1526	ctx.glUseProgram(program.getProgram());
1527	ctx.glUniform1ui(sampler_f, 0);
1528	ctx.expectError(GL_INVALID_OPERATION);
1529	ctx.endSection();
1530
1531	ctx.glUseProgram(0);
1532}
1533
1534void uniformui_invalid_location (NegativeTestContext& ctx)
1535{
1536	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1537
1538	ctx.glUseProgram(program.getProgram());
1539	ctx.expectError(GL_NO_ERROR);
1540
1541	ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current program object and location is not equal to -1.");
1542	ctx.glUseProgram(program.getProgram());
1543	ctx.glUniform1i(-2, 0);
1544	ctx.expectError(GL_INVALID_OPERATION);
1545	ctx.glUniform2i(-2, 0, 0);
1546	ctx.expectError(GL_INVALID_OPERATION);
1547	ctx.glUniform3i(-2, 0, 0, 0);
1548	ctx.expectError(GL_INVALID_OPERATION);
1549	ctx.glUniform4i(-2, 0, 0, 0, 0);
1550	ctx.expectError(GL_INVALID_OPERATION);
1551
1552	ctx.glUseProgram(program.getProgram());
1553	ctx.glUniform1i(-1, 0);
1554	ctx.expectError(GL_NO_ERROR);
1555	ctx.glUniform2i(-1, 0, 0);
1556	ctx.expectError(GL_NO_ERROR);
1557	ctx.glUniform3i(-1, 0, 0, 0);
1558	ctx.expectError(GL_NO_ERROR);
1559	ctx.glUniform4i(-1, 0, 0, 0, 0);
1560	ctx.expectError(GL_NO_ERROR);
1561	ctx.endSection();
1562
1563	ctx.glUseProgram(0);
1564}
1565
1566// ctx.glUniform{1234}uiv
1567
1568void uniformuiv_invalid_program (NegativeTestContext& ctx)
1569{
1570	std::vector<GLuint> data(4);
1571
1572	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1573	ctx.glUseProgram(0);
1574	ctx.glUniform1uiv(-1, 1, &data[0]);
1575	ctx.expectError(GL_INVALID_OPERATION);
1576	ctx.glUniform2uiv(-1, 1, &data[0]);
1577	ctx.expectError(GL_INVALID_OPERATION);
1578	ctx.glUniform3uiv(-1, 1, &data[0]);
1579	ctx.expectError(GL_INVALID_OPERATION);
1580	ctx.glUniform4uiv(-1, 1, &data[0]);
1581	ctx.expectError(GL_INVALID_OPERATION);
1582	ctx.endSection();
1583}
1584
1585void uniformuiv_incompatible_type (NegativeTestContext& ctx)
1586{
1587	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1588
1589	ctx.glUseProgram(program.getProgram());
1590	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1591	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
1592	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
1593	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1594	ctx.expectError(GL_NO_ERROR);
1595
1596	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1597	{
1598		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1599		ctx.fail("Failed to retrieve uniform location");
1600	}
1601
1602	std::vector<GLuint> data(4);
1603
1604	ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader does not match the size indicated by the ctx.glUniform command.");
1605	ctx.glUseProgram(program.getProgram());
1606	ctx.glUniform1uiv(uvec4_f, 1, &data[0]);
1607	ctx.expectError(GL_INVALID_OPERATION);
1608	ctx.glUniform2uiv(uvec4_f, 1, &data[0]);
1609	ctx.expectError(GL_INVALID_OPERATION);
1610	ctx.glUniform3uiv(uvec4_f, 1, &data[0]);
1611	ctx.expectError(GL_INVALID_OPERATION);
1612	ctx.glUniform4uiv(uvec4_f, 1, &data[0]);
1613	ctx.expectError(GL_NO_ERROR);
1614	ctx.endSection();
1615
1616	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}uiv is used to load a uniform variable of type float, vec2, vec3, or vec4.");
1617	ctx.glUseProgram(program.getProgram());
1618	ctx.glUniform1uiv(vec4_v, 1, &data[0]);
1619	ctx.expectError(GL_INVALID_OPERATION);
1620	ctx.glUniform2uiv(vec4_v, 1, &data[0]);
1621	ctx.expectError(GL_INVALID_OPERATION);
1622	ctx.glUniform3uiv(vec4_v, 1, &data[0]);
1623	ctx.expectError(GL_INVALID_OPERATION);
1624	ctx.glUniform4uiv(vec4_v, 1, &data[0]);
1625	ctx.expectError(GL_INVALID_OPERATION);
1626	ctx.endSection();
1627
1628	ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}uiv is used to load a uniform variable of type int, ivec2, ivec3 or ivec4.");
1629	ctx.glUseProgram(program.getProgram());
1630	ctx.glUniform1uiv(ivec4_f, 1, &data[0]);
1631	ctx.expectError(GL_INVALID_OPERATION);
1632	ctx.glUniform2uiv(ivec4_f, 1, &data[0]);
1633	ctx.expectError(GL_INVALID_OPERATION);
1634	ctx.glUniform3uiv(ivec4_f, 1, &data[0]);
1635	ctx.expectError(GL_INVALID_OPERATION);
1636	ctx.glUniform4uiv(ivec4_f, 1, &data[0]);
1637	ctx.expectError(GL_INVALID_OPERATION);
1638	ctx.endSection();
1639
1640	ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1641	ctx.glUseProgram(program.getProgram());
1642	ctx.glUniform1uiv(sampler_f, 1, &data[0]);
1643	ctx.expectError(GL_INVALID_OPERATION);
1644	ctx.endSection();
1645
1646	ctx.glUseProgram(0);
1647}
1648
1649void uniformuiv_invalid_location (NegativeTestContext& ctx)
1650{
1651	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1652
1653	ctx.glUseProgram(program.getProgram());
1654	ctx.expectError(GL_NO_ERROR);
1655
1656	std::vector<GLuint> data(4);
1657
1658	ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current program object and location is not equal to -1.");
1659	ctx.glUseProgram(program.getProgram());
1660	ctx.glUniform1uiv(-2, 1, &data[0]);
1661	ctx.expectError(GL_INVALID_OPERATION);
1662	ctx.glUniform2uiv(-2, 1, &data[0]);
1663	ctx.expectError(GL_INVALID_OPERATION);
1664	ctx.glUniform3uiv(-2, 1, &data[0]);
1665	ctx.expectError(GL_INVALID_OPERATION);
1666	ctx.glUniform4uiv(-2, 1, &data[0]);
1667	ctx.expectError(GL_INVALID_OPERATION);
1668
1669	ctx.glUseProgram(program.getProgram());
1670	ctx.glUniform1uiv(-1, 1, &data[0]);
1671	ctx.expectError(GL_NO_ERROR);
1672	ctx.glUniform2uiv(-1, 1, &data[0]);
1673	ctx.expectError(GL_NO_ERROR);
1674	ctx.glUniform3uiv(-1, 1, &data[0]);
1675	ctx.expectError(GL_NO_ERROR);
1676	ctx.glUniform4uiv(-1, 1, &data[0]);
1677	ctx.expectError(GL_NO_ERROR);
1678	ctx.endSection();
1679
1680	ctx.glUseProgram(0);
1681}
1682
1683void uniformuiv_invalid_count (NegativeTestContext& ctx)
1684{
1685	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1686
1687	ctx.glUseProgram			(program.getProgram());
1688	int uvec4_f				= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1689	ctx.expectError(GL_NO_ERROR);
1690
1691	if (uvec4_f == -1)
1692	{
1693		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1694		ctx.fail("Failed to retrieve uniform location");
1695	}
1696
1697	std::vector<GLuint> data(8);
1698
1699	ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1700	ctx.glUseProgram(program.getProgram());
1701	ctx.glUniform1uiv(uvec4_f, 2, &data[0]);
1702	ctx.expectError(GL_INVALID_OPERATION);
1703	ctx.glUniform2uiv(uvec4_f, 2, &data[0]);
1704	ctx.expectError(GL_INVALID_OPERATION);
1705	ctx.glUniform3uiv(uvec4_f, 2, &data[0]);
1706	ctx.expectError(GL_INVALID_OPERATION);
1707	ctx.glUniform4uiv(uvec4_f, 2, &data[0]);
1708	ctx.expectError(GL_INVALID_OPERATION);
1709	ctx.endSection();
1710
1711	ctx.glUseProgram(0);
1712}
1713
1714
1715// ctx.glUniformMatrix*fv
1716
1717void uniform_matrixfv_invalid_program (NegativeTestContext& ctx)
1718{
1719	std::vector<GLfloat> data(16);
1720
1721	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1722	ctx.glUseProgram(0);
1723	ctx.glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1724	ctx.expectError(GL_INVALID_OPERATION);
1725	ctx.glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1726	ctx.expectError(GL_INVALID_OPERATION);
1727	ctx.glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1728	ctx.expectError(GL_INVALID_OPERATION);
1729
1730	ctx.glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1731	ctx.expectError(GL_INVALID_OPERATION);
1732	ctx.glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1733	ctx.expectError(GL_INVALID_OPERATION);
1734	ctx.glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1735	ctx.expectError(GL_INVALID_OPERATION);
1736	ctx.glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1737	ctx.expectError(GL_INVALID_OPERATION);
1738	ctx.glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1739	ctx.expectError(GL_INVALID_OPERATION);
1740	ctx.glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1741	ctx.expectError(GL_INVALID_OPERATION);
1742	ctx.endSection();
1743}
1744
1745void uniform_matrixfv_incompatible_type (NegativeTestContext& ctx)
1746{
1747	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1748
1749	ctx.glUseProgram			(program.getProgram());
1750	GLint mat4_v			= ctx.glGetUniformLocation(program.getProgram(), "mat4_v");	// mat4
1751	GLint sampler_f			= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1752	ctx.expectError(GL_NO_ERROR);
1753
1754	if (mat4_v == -1 || sampler_f == -1)
1755	{
1756		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1757		ctx.fail("Failed to retrieve uniform location");
1758	}
1759
1760	std::vector<GLfloat> data(16);
1761
1762	ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader does not match the size indicated by the ctx.glUniform command.");
1763	ctx.glUseProgram(program.getProgram());
1764	ctx.glUniformMatrix2fv(mat4_v, 1, GL_FALSE, &data[0]);
1765	ctx.expectError(GL_INVALID_OPERATION);
1766	ctx.glUniformMatrix3fv(mat4_v, 1, GL_FALSE, &data[0]);
1767	ctx.expectError(GL_INVALID_OPERATION);
1768	ctx.glUniformMatrix4fv(mat4_v, 1, GL_FALSE, &data[0]);
1769	ctx.expectError(GL_NO_ERROR);
1770
1771	ctx.glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1772	ctx.expectError(GL_INVALID_OPERATION);
1773	ctx.glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1774	ctx.expectError(GL_INVALID_OPERATION);
1775	ctx.glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1776	ctx.expectError(GL_INVALID_OPERATION);
1777	ctx.glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1778	ctx.expectError(GL_INVALID_OPERATION);
1779	ctx.glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1780	ctx.expectError(GL_INVALID_OPERATION);
1781	ctx.glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1782	ctx.expectError(GL_INVALID_OPERATION);
1783	ctx.endSection();
1784
1785	ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1786	ctx.glUseProgram(program.getProgram());
1787	ctx.glUniformMatrix2fv(sampler_f, 1, GL_FALSE, &data[0]);
1788	ctx.expectError(GL_INVALID_OPERATION);
1789	ctx.glUniformMatrix3fv(sampler_f, 1, GL_FALSE, &data[0]);
1790	ctx.expectError(GL_INVALID_OPERATION);
1791	ctx.glUniformMatrix4fv(sampler_f, 1, GL_FALSE, &data[0]);
1792	ctx.expectError(GL_INVALID_OPERATION);
1793
1794	ctx.glUniformMatrix2x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1795	ctx.expectError(GL_INVALID_OPERATION);
1796	ctx.glUniformMatrix3x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1797	ctx.expectError(GL_INVALID_OPERATION);
1798	ctx.glUniformMatrix2x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1799	ctx.expectError(GL_INVALID_OPERATION);
1800	ctx.glUniformMatrix4x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1801	ctx.expectError(GL_INVALID_OPERATION);
1802	ctx.glUniformMatrix3x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1803	ctx.expectError(GL_INVALID_OPERATION);
1804	ctx.glUniformMatrix4x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1805	ctx.expectError(GL_INVALID_OPERATION);
1806	ctx.endSection();
1807
1808	ctx.glUseProgram(0);
1809}
1810
1811void uniform_matrixfv_invalid_location (NegativeTestContext& ctx)
1812{
1813	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1814
1815	ctx.glUseProgram(program.getProgram());
1816	ctx.expectError(GL_NO_ERROR);
1817
1818	std::vector<GLfloat> data(16);
1819
1820	ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current program object and location is not equal to -1.");
1821	ctx.glUseProgram(program.getProgram());
1822	ctx.glUniformMatrix2fv(-2, 1, GL_FALSE, &data[0]);
1823	ctx.expectError(GL_INVALID_OPERATION);
1824	ctx.glUniformMatrix3fv(-2, 1, GL_FALSE, &data[0]);
1825	ctx.expectError(GL_INVALID_OPERATION);
1826	ctx.glUniformMatrix4fv(-2, 1, GL_FALSE, &data[0]);
1827	ctx.expectError(GL_INVALID_OPERATION);
1828
1829	ctx.glUniformMatrix2x3fv(-2, 1, GL_FALSE, &data[0]);
1830	ctx.expectError(GL_INVALID_OPERATION);
1831	ctx.glUniformMatrix3x2fv(-2, 1, GL_FALSE, &data[0]);
1832	ctx.expectError(GL_INVALID_OPERATION);
1833	ctx.glUniformMatrix2x4fv(-2, 1, GL_FALSE, &data[0]);
1834	ctx.expectError(GL_INVALID_OPERATION);
1835	ctx.glUniformMatrix4x2fv(-2, 1, GL_FALSE, &data[0]);
1836	ctx.expectError(GL_INVALID_OPERATION);
1837	ctx.glUniformMatrix3x4fv(-2, 1, GL_FALSE, &data[0]);
1838	ctx.expectError(GL_INVALID_OPERATION);
1839	ctx.glUniformMatrix4x3fv(-2, 1, GL_FALSE, &data[0]);
1840	ctx.expectError(GL_INVALID_OPERATION);
1841
1842	ctx.glUseProgram(program.getProgram());
1843	ctx.glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1844	ctx.expectError(GL_NO_ERROR);
1845	ctx.glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1846	ctx.expectError(GL_NO_ERROR);
1847	ctx.glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1848	ctx.expectError(GL_NO_ERROR);
1849
1850	ctx.glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1851	ctx.expectError(GL_NO_ERROR);
1852	ctx.glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1853	ctx.expectError(GL_NO_ERROR);
1854	ctx.glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1855	ctx.expectError(GL_NO_ERROR);
1856	ctx.glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1857	ctx.expectError(GL_NO_ERROR);
1858	ctx.glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1859	ctx.expectError(GL_NO_ERROR);
1860	ctx.glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1861	ctx.expectError(GL_NO_ERROR);
1862	ctx.endSection();
1863
1864	ctx.glUseProgram(0);
1865}
1866
1867void uniform_matrixfv_invalid_count (NegativeTestContext& ctx)
1868{
1869	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1870
1871	ctx.glUseProgram			(program.getProgram());
1872	GLint mat4_v			= ctx.glGetUniformLocation(program.getProgram(), "mat4_v"); // mat4
1873	ctx.expectError(GL_NO_ERROR);
1874
1875	if (mat4_v == -1)
1876	{
1877		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1878		ctx.fail("Failed to retrieve uniform location");
1879	}
1880
1881	std::vector<GLfloat> data(32);
1882
1883	ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1884	ctx.glUseProgram(program.getProgram());
1885	ctx.glUniformMatrix2fv(mat4_v, 2, GL_FALSE, &data[0]);
1886	ctx.expectError(GL_INVALID_OPERATION);
1887	ctx.glUniformMatrix3fv(mat4_v, 2, GL_FALSE, &data[0]);
1888	ctx.expectError(GL_INVALID_OPERATION);
1889	ctx.glUniformMatrix4fv(mat4_v, 2, GL_FALSE, &data[0]);
1890	ctx.expectError(GL_INVALID_OPERATION);
1891
1892	ctx.glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1893	ctx.expectError(GL_INVALID_OPERATION);
1894	ctx.glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1895	ctx.expectError(GL_INVALID_OPERATION);
1896	ctx.glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1897	ctx.expectError(GL_INVALID_OPERATION);
1898	ctx.glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1899	ctx.expectError(GL_INVALID_OPERATION);
1900	ctx.glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1901	ctx.expectError(GL_INVALID_OPERATION);
1902	ctx.glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1903	ctx.expectError(GL_INVALID_OPERATION);
1904	ctx.endSection();
1905
1906	ctx.glUseProgram(0);
1907}
1908
1909// Transform feedback
1910void gen_transform_feedbacks (NegativeTestContext& ctx)
1911{
1912	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
1913	GLuint id = 0;
1914	ctx.glGenTransformFeedbacks(-1, &id);
1915	ctx.expectError(GL_INVALID_VALUE);
1916	ctx.endSection();
1917}
1918
1919void bind_transform_feedback (NegativeTestContext& ctx)
1920{
1921	GLuint						tfID[2];
1922	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1923	deUint32					buf = 0x1234;
1924	const char* tfVarying		= "gl_Position";
1925
1926	ctx.glGenBuffers				(1, &buf);
1927	ctx.glGenTransformFeedbacks		(2, tfID);
1928
1929	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_TRANSFORM_FEEDBACK.");
1930	ctx.glBindTransformFeedback(-1, tfID[0]);
1931	ctx.expectError(GL_INVALID_ENUM);
1932	ctx.endSection();
1933
1934	ctx.beginSection("GL_INVALID_OPERATION is generated if the transform feedback operation is active on the currently bound transform feedback object, and is not paused.");
1935	ctx.glUseProgram				(program.getProgram());
1936	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1937	ctx.glLinkProgram				(program.getProgram());
1938	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID[0]);
1939	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1940	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1941	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1942	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
1943	ctx.expectError				(GL_NO_ERROR);
1944
1945	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID[1]);
1946	ctx.expectError				(GL_INVALID_OPERATION);
1947
1948	ctx.glEndTransformFeedback		();
1949	ctx.expectError				(GL_NO_ERROR);
1950	ctx.endSection();
1951
1952	ctx.glUseProgram				(0);
1953	ctx.glDeleteBuffers				(1, &buf);
1954	ctx.glDeleteTransformFeedbacks	(2, tfID);
1955	ctx.expectError				(GL_NO_ERROR);
1956
1957	ctx.beginSection("GL_INVALID_OPERATION is generated if id has been deleted with glDeleteTransformFeedback().");
1958	ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
1959	ctx.expectError(GL_INVALID_OPERATION);
1960	ctx.endSection();
1961
1962	ctx.beginSection("GL_INVALID_OPERATION is generated if id is not 0 or a value returned from glGenTransformFeedbacks().");
1963	ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, -1);
1964	ctx.expectError(GL_INVALID_OPERATION);
1965	ctx.endSection();
1966}
1967
1968void delete_transform_feedbacks (NegativeTestContext& ctx)
1969{
1970	GLuint				id			= 0;
1971	GLuint				tfID[2];
1972	deUint32			buf			= 0x1234;
1973	const char*			tfVarying	= "gl_Position";
1974	glu::ShaderProgram	program		(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1975
1976	ctx.glGenBuffers(1, &buf);
1977	ctx.glGenTransformFeedbacks(1, &id);
1978	ctx.glGenTransformFeedbacks(2, tfID);
1979
1980	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
1981	ctx.glDeleteTransformFeedbacks(-1, &id);
1982	ctx.expectError(GL_INVALID_VALUE);
1983	ctx.endSection();
1984
1985	ctx.beginSection("GL_INVALID_OPERATION is generated if the transform feedback operation for any object named by ids is currently active.");
1986	ctx.glUseProgram(program.getProgram());
1987	ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1988	ctx.glLinkProgram(program.getProgram());
1989	ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
1990	ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1991	ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1992	ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1993	ctx.glBeginTransformFeedback(GL_TRIANGLES);
1994	ctx.expectError(GL_NO_ERROR);
1995
1996	ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[1]);
1997	ctx.expectError(GL_INVALID_OPERATION);
1998
1999	ctx.glDeleteTransformFeedbacks(2, tfID);
2000	ctx.expectError(GL_INVALID_OPERATION);
2001
2002	ctx.glEndTransformFeedback();
2003	ctx.expectError(GL_NO_ERROR);
2004	ctx.endSection();
2005
2006
2007	ctx.glDeleteTransformFeedbacks(1, &id);
2008	ctx.glDeleteTransformFeedbacks(2, tfID);
2009	ctx.glDeleteBuffers(1, &buf);
2010
2011}
2012
2013void begin_transform_feedback (NegativeTestContext& ctx)
2014{
2015	GLuint						tfID[2];
2016	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2017	deUint32					buf = 0x1234;
2018	const char* tfVarying		= "gl_Position";
2019
2020	ctx.glGenBuffers				(1, &buf);
2021	ctx.glGenTransformFeedbacks		(2, tfID);
2022
2023	ctx.glUseProgram				(program.getProgram());
2024	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2025	ctx.glLinkProgram				(program.getProgram());
2026	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID[0]);
2027	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
2028	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
2029	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2030	ctx.expectError					(GL_NO_ERROR);
2031
2032	ctx.beginSection("GL_INVALID_ENUM is generated if primitiveMode is not one of GL_POINTS, GL_LINES, or GL_TRIANGLES.");
2033	ctx.glBeginTransformFeedback	(-1);
2034	ctx.expectError					(GL_INVALID_ENUM);
2035	ctx.endSection();
2036
2037	ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is already active.");
2038	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
2039	ctx.expectError					(GL_NO_ERROR);
2040	ctx.glBeginTransformFeedback	(GL_POINTS);
2041	ctx.expectError					(GL_INVALID_OPERATION);
2042	ctx.endSection();
2043
2044	ctx.beginSection("GL_INVALID_OPERATION is generated if any binding point used in transform feedback mode does not have a buffer object bound.");
2045	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
2046	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
2047	ctx.expectError					(GL_INVALID_OPERATION);
2048	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2049	ctx.endSection();
2050
2051	ctx.beginSection("GL_INVALID_OPERATION is generated if no binding points would be used because no program object is active.");
2052	ctx.glUseProgram				(0);
2053	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
2054	ctx.expectError					(GL_INVALID_OPERATION);
2055	ctx.glUseProgram				(program.getProgram());
2056	ctx.endSection();
2057
2058	ctx.beginSection("GL_INVALID_OPERATION is generated if no binding points would be used because the active program object has specified no varying variables to record.");
2059	ctx.glTransformFeedbackVaryings	(program.getProgram(), 0, 0, GL_INTERLEAVED_ATTRIBS);
2060	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
2061	ctx.expectError					(GL_INVALID_OPERATION);
2062	ctx.endSection();
2063
2064	ctx.glEndTransformFeedback		();
2065	ctx.glDeleteBuffers				(1, &buf);
2066	ctx.glDeleteTransformFeedbacks	(2, tfID);
2067	ctx.expectError					(GL_NO_ERROR);
2068}
2069
2070void pause_transform_feedback (NegativeTestContext& ctx)
2071{
2072	GLuint						tfID[2];
2073	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2074	deUint32					buf = 0x1234;
2075	const char* tfVarying		= "gl_Position";
2076
2077	ctx.glGenBuffers				(1, &buf);
2078	ctx.glGenTransformFeedbacks		(2, tfID);
2079
2080	ctx.glUseProgram				(program.getProgram());
2081	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2082	ctx.glLinkProgram				(program.getProgram());
2083	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID[0]);
2084	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
2085	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
2086	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2087	ctx.expectError					(GL_NO_ERROR);
2088
2089	ctx.beginSection("GL_INVALID_OPERATION is generated if the currently bound transform feedback object is not active or is paused.");
2090	ctx.glPauseTransformFeedback	();
2091	ctx.expectError					(GL_INVALID_OPERATION);
2092	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
2093	ctx.glPauseTransformFeedback	();
2094	ctx.expectError					(GL_NO_ERROR);
2095	ctx.glPauseTransformFeedback	();
2096	ctx.expectError					(GL_INVALID_OPERATION);
2097	ctx.endSection();
2098
2099	ctx.glEndTransformFeedback		();
2100	ctx.glDeleteBuffers				(1, &buf);
2101	ctx.glDeleteTransformFeedbacks	(2, tfID);
2102	ctx.expectError					(GL_NO_ERROR);
2103}
2104
2105void resume_transform_feedback (NegativeTestContext& ctx)
2106{
2107	GLuint						tfID[2];
2108	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2109	deUint32					buf = 0x1234;
2110	const char* tfVarying		= "gl_Position";
2111
2112	ctx.glGenBuffers				(1, &buf);
2113	ctx.glGenTransformFeedbacks		(2, tfID);
2114
2115	ctx.glUseProgram				(program.getProgram());
2116	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2117	ctx.glLinkProgram				(program.getProgram());
2118	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID[0]);
2119	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
2120	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
2121	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2122	ctx.expectError					(GL_NO_ERROR);
2123
2124	ctx.beginSection("GL_INVALID_OPERATION is generated if the currently bound transform feedback object is not active or is not paused.");
2125	ctx.glResumeTransformFeedback	();
2126	ctx.expectError					(GL_INVALID_OPERATION);
2127	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
2128	ctx.glResumeTransformFeedback	();
2129	ctx.expectError					(GL_INVALID_OPERATION);
2130	ctx.glPauseTransformFeedback	();
2131	ctx.glResumeTransformFeedback	();
2132	ctx.expectError					(GL_NO_ERROR);
2133	ctx.endSection();
2134
2135	ctx.glEndTransformFeedback		();
2136	ctx.glDeleteBuffers				(1, &buf);
2137	ctx.glDeleteTransformFeedbacks	(2, tfID);
2138	ctx.expectError					(GL_NO_ERROR);
2139}
2140
2141void end_transform_feedback (NegativeTestContext& ctx)
2142{
2143	GLuint						tfID = 0;
2144	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2145	deUint32					buf = 0x1234;
2146	const char* tfVarying		= "gl_Position";
2147
2148	ctx.glGenBuffers				(1, &buf);
2149	ctx.glGenTransformFeedbacks		(1, &tfID);
2150
2151	ctx.glUseProgram				(program.getProgram());
2152	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2153	ctx.glLinkProgram				(program.getProgram());
2154	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
2155	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
2156	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
2157	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2158	ctx.expectError					(GL_NO_ERROR);
2159
2160	ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is not active.");
2161	ctx.glEndTransformFeedback		();
2162	ctx.expectError					(GL_INVALID_OPERATION);
2163	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
2164	ctx.glEndTransformFeedback		();
2165	ctx.expectError					(GL_NO_ERROR);
2166	ctx.endSection();
2167
2168	ctx.glDeleteBuffers				(1, &buf);
2169	ctx.glDeleteTransformFeedbacks	(1, &tfID);
2170	ctx.expectError					(GL_NO_ERROR);
2171}
2172
2173void get_transform_feedback_varying (NegativeTestContext& ctx)
2174{
2175	GLuint					tfID = 0;
2176	glu::ShaderProgram		program			(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2177	glu::ShaderProgram		programInvalid	(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, ""));
2178	const char* tfVarying	= "gl_Position";
2179	int						maxTransformFeedbackVaryings = 0;
2180
2181	GLsizei					length;
2182	GLsizei					size;
2183	GLenum					type;
2184	char					name[32];
2185
2186	const GLuint notAProgram = ctx.glCreateProgram();
2187	ctx.glDeleteProgram(notAProgram);
2188
2189	ctx.glGenTransformFeedbacks				(1, &tfID);
2190
2191	ctx.glTransformFeedbackVaryings			(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2192	ctx.expectError						(GL_NO_ERROR);
2193	ctx.glLinkProgram						(program.getProgram());
2194	ctx.expectError						(GL_NO_ERROR);
2195
2196	ctx.glBindTransformFeedback				(GL_TRANSFORM_FEEDBACK, tfID);
2197	ctx.expectError						(GL_NO_ERROR);
2198
2199	ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object.");
2200	ctx.glGetTransformFeedbackVarying		(notAProgram, 0, 32, &length, &size, &type, &name[0]);
2201	ctx.expectError						(GL_INVALID_VALUE);
2202	ctx.endSection();
2203
2204	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater or equal to the value of GL_TRANSFORM_FEEDBACK_VARYINGS.");
2205	ctx.glGetProgramiv						(program.getProgram(), GL_TRANSFORM_FEEDBACK_VARYINGS, &maxTransformFeedbackVaryings);
2206	ctx.glGetTransformFeedbackVarying		(program.getProgram(), maxTransformFeedbackVaryings, 32, &length, &size, &type, &name[0]);
2207	ctx.expectError						(GL_INVALID_VALUE);
2208	ctx.endSection();
2209
2210	ctx.beginSection("GL_INVALID_OPERATION or GL_INVALID_VALUE is generated program has not been linked.");
2211	ctx.glGetTransformFeedbackVarying		(programInvalid.getProgram(), 0, 32, &length, &size, &type, &name[0]);
2212	ctx.expectError						(GL_INVALID_OPERATION, GL_INVALID_VALUE);
2213	ctx.endSection();
2214
2215	ctx.glDeleteTransformFeedbacks			(1, &tfID);
2216	ctx.expectError						(GL_NO_ERROR);
2217}
2218
2219void transform_feedback_varyings (NegativeTestContext& ctx)
2220{
2221	GLuint										tfID = 0;
2222	GLuint shader								= ctx.glCreateShader(GL_VERTEX_SHADER);
2223	glu::ShaderProgram program					(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2224	const char* tfVarying						= "gl_Position";
2225	GLint maxTransformFeedbackSeparateAttribs	= 0;
2226
2227	const GLuint notAProgram = ctx.glCreateProgram();
2228	ctx.glDeleteProgram(notAProgram);
2229
2230	ctx.glGenTransformFeedbacks				(1, &tfID);
2231	ctx.expectError						(GL_NO_ERROR);
2232
2233	ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object.");
2234	ctx.glTransformFeedbackVaryings			(notAProgram, 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2235	ctx.expectError						(GL_INVALID_VALUE);
2236	ctx.endSection();
2237
2238	ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object.");
2239	ctx.glTransformFeedbackVaryings(shader, 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2240	ctx.expectError(GL_INVALID_OPERATION);
2241	ctx.glDeleteShader(shader);
2242	ctx.endSection();
2243
2244	ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
2245	ctx.glTransformFeedbackVaryings(program.getProgram(), -1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2246	ctx.expectError(GL_INVALID_VALUE);
2247	ctx.endSection();
2248
2249	ctx.beginSection("GL_INVALID_ENUM is generated if bufferMode is not SEPARATE_ATTRIBS or INTERLEAVED_ATTRIBS.");
2250	ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, 0);
2251	ctx.expectError(GL_INVALID_ENUM);
2252	ctx.endSection();
2253
2254	ctx.beginSection("GL_INVALID_VALUE is generated if bufferMode is GL_SEPARATE_ATTRIBS and count is greater than GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.");
2255	ctx.glGetIntegerv						(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTransformFeedbackSeparateAttribs);
2256	ctx.glTransformFeedbackVaryings			(program.getProgram(), maxTransformFeedbackSeparateAttribs+1, &tfVarying, GL_SEPARATE_ATTRIBS);
2257	ctx.expectError						(GL_INVALID_VALUE);
2258	ctx.endSection();
2259
2260	ctx.glDeleteTransformFeedbacks			(1, &tfID);
2261	ctx.expectError						(GL_NO_ERROR);
2262
2263}
2264
2265void link_compute_shader (NegativeTestContext& ctx)
2266{
2267	const char* computeShaderSource		=	"#version 320 es\n"
2268											"void main (void)\n"
2269											"{\n"
2270											"}\n\0";
2271	{
2272		const GLenum shaderTypes[]			=	{
2273													GL_VERTEX_SHADER,
2274													GL_FRAGMENT_SHADER,
2275													GL_GEOMETRY_SHADER,
2276													GL_TESS_CONTROL_SHADER,
2277													GL_TESS_EVALUATION_SHADER
2278												};
2279
2280		ctx.beginSection("Compute Shader linked with shader of other kind.");
2281		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(shaderTypes); ndx++)
2282		{
2283			GLint linkStatus				=	-1;
2284			GLuint program					=	ctx.glCreateProgram();
2285			GLuint computeShader			=	ctx.glCreateShader(GL_COMPUTE_SHADER);
2286			GLuint otherShader				=	ctx.glCreateShader(shaderTypes[ndx]);
2287			const char* otherShaderSource	=	(shaderTypes[ndx] != GL_GEOMETRY_SHADER)	?
2288												computeShaderSource							:
2289												"#version 320 es\n"
2290												"layout(max_vertices = 3) out;\n"
2291												"void main(void){}\n\0";
2292
2293			ctx.glShaderSource(computeShader, 1, &computeShaderSource, DE_NULL);
2294			ctx.glShaderSource(otherShader, 1, &otherShaderSource, DE_NULL);
2295			ctx.glCompileShader(computeShader);
2296			ctx.glCompileShader(otherShader);
2297			ctx.glAttachShader(program, computeShader);
2298			ctx.glAttachShader(program, otherShader);
2299			ctx.glLinkProgram(program);
2300			ctx.glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
2301			ctx.glDeleteShader(otherShader);
2302			ctx.glDeleteShader(computeShader);
2303			ctx.glDeleteProgram(program);
2304			if (linkStatus != GL_FALSE)
2305				ctx.fail("Program should not have linked");
2306		}
2307		ctx.endSection();
2308	}
2309	{
2310		const char* computeShaderSource310	=	"#version 310 es\n"
2311												"void main (void)\n"
2312												"{\n"
2313												"}\n\0";
2314		GLint linkStatus					=	-1;
2315		GLuint program						=	ctx.glCreateProgram();
2316		GLuint computeShader				=	ctx.glCreateShader(GL_COMPUTE_SHADER);
2317		GLuint computeShader310				=	ctx.glCreateShader(GL_FRAGMENT_SHADER);
2318
2319		ctx.glShaderSource(computeShader, 1, &computeShaderSource, DE_NULL);
2320		ctx.glShaderSource(computeShader310, 1, &computeShaderSource310, DE_NULL);
2321		ctx.beginSection("Compute Shader should not be linked with shaders of different version.");
2322		ctx.glCompileShader(computeShader);
2323		ctx.glCompileShader(computeShader310);
2324		ctx.glAttachShader(program, computeShader);
2325		ctx.glAttachShader(program, computeShader310);
2326		ctx.glLinkProgram(program);
2327		ctx.glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
2328		ctx.glDeleteShader(computeShader310);
2329		ctx.glDeleteShader(computeShader);
2330		ctx.glDeleteProgram(program);
2331		if (linkStatus != GL_FALSE)
2332			ctx.fail("Program should not have linked");
2333		ctx.endSection();
2334	}
2335}
2336
2337void compile_compute_shader_helper (NegativeTestContext& ctx, const char* const* computeShaderSource, GLint* compileStatus)
2338{
2339	GLuint shader = ctx.glCreateShader(GL_COMPUTE_SHADER);
2340
2341	*compileStatus = -1;
2342	ctx.glShaderSource(shader, 1, computeShaderSource, DE_NULL);
2343	ctx.glCompileShader(shader);
2344	ctx.glGetShaderiv(shader, GL_COMPILE_STATUS, compileStatus);
2345	ctx.glDeleteShader(shader);
2346}
2347
2348void compile_compute_shader (NegativeTestContext& ctx)
2349{
2350	GLint compileStatus;
2351	ctx.beginSection("Compile Computer Shader");
2352
2353	{
2354		const char* const computeShaderSource		=	"#version 300 es\n"
2355														"void main (void)\n"
2356														"{\n"
2357														"}\n";
2358
2359		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2360		if (compileStatus != GL_FALSE)
2361			ctx.fail("Compute Shader should not have compiled with #version 300 es.");
2362	}
2363	{
2364		const char* const computeShaderSource		=	"#version 310 es\n"
2365														"buffer SSBO { vec4 data }"
2366														"void main (void)\n"
2367														"{\n"
2368														"}\n";
2369
2370		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2371		if (compileStatus != GL_FALSE)
2372			ctx.fail("Compute Shader should not have compiled: incorrect SSBO syntax.");
2373	}
2374	{
2375		const char* const computeShaderSource		=	"#version 310 es\n"
2376														"buffer SSBO { vec4 data;};"
2377														"uniform mat4 data;"
2378														"void main (void)\n"
2379														"{\n"
2380														"}\n";
2381
2382		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2383		if (compileStatus != GL_FALSE)
2384			ctx.fail("Compute Shader should not have compiled: buffer variable redefinition.");
2385	}
2386	{
2387		const char* const computeShaderSource		=	"#version 310 es\n"
2388														"buffer SSBO { vec4 data[]; vec4 moreData;};"
2389														"void main (void)\n"
2390														"{\n"
2391														"}\n";
2392
2393		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2394		if (compileStatus != GL_FALSE)
2395			ctx.fail("Compute Shader should not have compiled: unspecified length buffer member not at the end.");
2396	}
2397	{
2398		const char* const computeShaderSource		=	"#version 310 es\n"
2399														"in vec4 data;"
2400														"void main (void)\n"
2401														"{\n"
2402														"}\n";
2403
2404		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2405		if (compileStatus != GL_FALSE)
2406			ctx.fail("Compute Shader should not have compiled: input qualifier used.");
2407	}
2408	{
2409		const char* const computeShaderSource		=	"#version 310 es\n"
2410														"shared uint data = 0;";
2411
2412		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2413		if (compileStatus != GL_FALSE)
2414			ctx.fail("Compute Shader should not have compiled: shared-qualified variable initialized.");
2415	}
2416	{
2417		const char* const computeShaderSource		=	"#version 310 es\n"
2418														"buffer SSBO { vec4 data; vec4 moreData[];} ssbo;"
2419														"void test (vec4 data[10]) {}"
2420														"void main (void)\n"
2421														"{\n"
2422														"    test(ssbo.moreData);"
2423														"}\n";
2424
2425		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2426		if (compileStatus != GL_FALSE)
2427			ctx.fail("Compute Shader should not have compiled: unspecified length buffer member passed as argument to function.");
2428	}
2429	{
2430		const char* const computeShaderSource		=	"#version 310 es\n"
2431														"buffer SSBO { vec4 data; vec4 moreData[];} ssbo;"
2432														"void main (void)\n"
2433														"{\n"
2434														"    vec4 var = ssbo.moreData[-1];"
2435														"}\n";
2436
2437		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2438		if (compileStatus != GL_FALSE)
2439			ctx.fail("Compute Shader should not have compiled: unspecified length buffer member indexed with negative constant expression.");
2440	}
2441	{
2442		const char* const computeShaderSource		=	"#version 310 es\n"
2443														"layout(binding=-1) buffer SSBO { vec4 data;};"
2444														"void main (void)\n"
2445														"{\n"
2446														"}\n";
2447
2448		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2449		if (compileStatus != GL_FALSE)
2450			ctx.fail("Compute Shader should not have compiled: binding point less than zero.");
2451	}
2452	{
2453		const char* const computeShaderSource		=	"#version 310 es\n"
2454														"layout(binding=1) buffer;"
2455														"layout(binding=2) buffer SSBO { vec4 data;};"
2456														"void main (void)\n"
2457														"{\n"
2458														"}\n";
2459
2460		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2461		if (compileStatus != GL_FALSE)
2462			ctx.fail("Compute Shader should not have compiled: binding point specified for global scope.");
2463	}
2464	{
2465		const char* const computeShaderSource		=	"#version 310 es\n"
2466														"buffer SSBO {"
2467														"	layout(binding=1) vec4 data;"
2468														"	layout(binding=2) vec4 moreData[];"
2469														"} ssbo;"
2470														"void main (void)\n"
2471														"{\n"
2472														"}\n";
2473
2474		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2475		if (compileStatus != GL_FALSE)
2476			ctx.fail("Compute Shader should not have compiled: binding point specified for block member declarations.");
2477	}
2478	{
2479		const char* const computeShaderSource		=	"#version 310 es\n"
2480														"readonly buffer SSBO {vec4 data;} ssbo;"
2481														"void main (void)\n"
2482														"{\n"
2483															"ssbo.data = vec4(1, 1, 1, 1);"
2484														"}\n";
2485
2486		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2487		if (compileStatus != GL_FALSE)
2488			ctx.fail("Compute Shader should not have compiled: writing to buffer block qualified with readonly.");
2489	}
2490	{
2491		const char* const computeShaderSource		=	"#version 310 es\n"
2492														"writeonly buffer SSBO {vec4 data;} ssbo;"
2493														"void main (void)\n"
2494														"{\n"
2495															"vec4 var = ssbo.data;"
2496														"}\n";
2497
2498		compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2499		if (compileStatus != GL_FALSE)
2500			ctx.fail("Compute Shader should not have compiled: reading from buffer block qualified with writeonly.");
2501	}
2502
2503	ctx.endSection();
2504}
2505
2506std::vector<FunctionContainer> getNegativeShaderApiTestFunctions ()
2507{
2508	FunctionContainer funcs[] =
2509	{
2510		{create_shader,							"create_shader",						"Invalid glCreateShader() usage"			   },
2511		{shader_source,							"shader_source",						"Invalid glShaderSource() usage"			   },
2512		{compile_shader,						"compile_shader",						"Invalid glCompileShader() usage"			   },
2513		{delete_shader,							"delete_shader",						"Invalid glDeleteShader() usage"			   },
2514		{shader_binary,							"shader_binary",						"Invalid glShaderBinary() usage"			   },
2515		{attach_shader,							"attach_shader",						"Invalid glAttachShader() usage"			   },
2516		{detach_shader,							"detach_shader",						"Invalid glDetachShader() usage"			   },
2517		{link_program,							"link_program",							"Invalid glLinkProgram() usage"				   },
2518		{use_program,							"use_program",							"Invalid glUseProgram() usage"				   },
2519		{delete_program,						"delete_program",						"Invalid glDeleteProgram() usage"			   },
2520		{validate_program,						"validate_program",						"Invalid glValidateProgram() usage"			   },
2521		{get_program_binary,					"get_program_binary",					"Invalid glGetProgramBinary() usage"		   },
2522		{program_binary,						"program_binary",						"Invalid glProgramBinary() usage"			   },
2523		{program_parameteri,					"program_parameteri",					"Invalid glProgramParameteri() usage"		   },
2524		{gen_samplers,							"gen_samplers",							"Invalid glGenSamplers() usage"				   },
2525		{bind_sampler,							"bind_sampler",							"Invalid glBindSampler() usage"				   },
2526		{delete_samplers,						"delete_samplers",						"Invalid glDeleteSamplers() usage"			   },
2527		{get_sampler_parameteriv,				"get_sampler_parameteriv",				"Invalid glGetSamplerParameteriv() usage"	   },
2528		{get_sampler_parameterfv,				"get_sampler_parameterfv",				"Invalid glGetSamplerParameterfv() usage"	   },
2529		{get_sampler_parameterIiv,				"get_sampler_parameterIiv",				"Invalid glGetSamplerParameterIiv() usage"	   },
2530		{get_sampler_parameterIuiv,				"get_sampler_parameterIuiv",			"Invalid glGetSamplerParameterIuiv() usage"	   },
2531		{sampler_parameteri,					"sampler_parameteri",					"Invalid glSamplerParameteri() usage"		   },
2532		{sampler_parameteriv,					"sampler_parameteriv",					"Invalid glSamplerParameteriv() usage"		   },
2533		{sampler_parameterf,					"sampler_parameterf",					"Invalid glSamplerParameterf() usage"		   },
2534		{sampler_parameterfv,					"sampler_parameterfv",					"Invalid glSamplerParameterfv() usage"		   },
2535		{sampler_parameterIiv,					"sampler_parameterIiv",					"Invalid glSamplerParameterIiv() usage"		   },
2536		{sampler_parameterIuiv,					"sampler_parameterIuiv",				"Invalid glSamplerParameterIuiv() usage"		   },
2537		{get_attrib_location,					"get_attrib_location",					"Invalid glGetAttribLocation() usage"		   },
2538		{get_uniform_location,					"get_uniform_location",					"Invalid glGetUniformLocation() usage"		   },
2539		{bind_attrib_location,					"bind_attrib_location",					"Invalid glBindAttribLocation() usage"		   },
2540		{uniform_block_binding,					"uniform_block_binding",				"Invalid glUniformBlockBinding() usage"		   },
2541		{uniformf_invalid_program,				"uniformf_invalid_program",				"Invalid glUniform{1234}f() usage"			   },
2542		{uniformf_incompatible_type,			"uniformf_incompatible_type",			"Invalid glUniform{1234}f() usage"			   },
2543		{uniformf_invalid_location,				"uniformf_invalid_location",			"Invalid glUniform{1234}f() usage"			   },
2544		{uniformfv_invalid_program,				"uniformfv_invalid_program",			"Invalid glUniform{1234}fv() usage"			   },
2545		{uniformfv_incompatible_type,			"uniformfv_incompatible_type",			"Invalid glUniform{1234}fv() usage"			   },
2546		{uniformfv_invalid_location,			"uniformfv_invalid_location",			"Invalid glUniform{1234}fv() usage"			   },
2547		{uniformfv_invalid_count,				"uniformfv_invalid_count",				"Invalid glUniform{1234}fv() usage"			   },
2548		{uniformi_invalid_program,				"uniformi_invalid_program",				"Invalid glUniform{1234}i() usage"			   },
2549		{uniformi_incompatible_type,			"uniformi_incompatible_type",			"Invalid glUniform{1234}i() usage"			   },
2550		{uniformi_invalid_location,				"uniformi_invalid_location",			"Invalid glUniform{1234}i() usage"			   },
2551		{uniformiv_invalid_program,				"uniformiv_invalid_program",			"Invalid glUniform{1234}iv() usage"			   },
2552		{uniformiv_incompatible_type,			"uniformiv_incompatible_type",			"Invalid glUniform{1234}iv() usage"			   },
2553		{uniformiv_invalid_location,			"uniformiv_invalid_location",			"Invalid glUniform{1234}iv() usage"			   },
2554		{uniformiv_invalid_count,				"uniformiv_invalid_count",				"Invalid glUniform{1234}iv() usage"			   },
2555		{uniformui_invalid_program,				"uniformui_invalid_program",			"Invalid glUniform{234}ui() usage"			   },
2556		{uniformui_incompatible_type,			"uniformui_incompatible_type",			"Invalid glUniform{1234}ui() usage"			   },
2557		{uniformui_invalid_location,			"uniformui_invalid_location",			"Invalid glUniform{1234}ui() usage"			   },
2558		{uniformuiv_invalid_program,			"uniformuiv_invalid_program",			"Invalid glUniform{234}uiv() usage"			   },
2559		{uniformuiv_incompatible_type,			"uniformuiv_incompatible_type",			"Invalid glUniform{1234}uiv() usage"		   },
2560		{uniformuiv_invalid_location,			"uniformuiv_invalid_location",			"Invalid glUniform{1234}uiv() usage"		   },
2561		{uniformuiv_invalid_count,				"uniformuiv_invalid_count",				"Invalid glUniform{1234}uiv() usage"		   },
2562		{uniform_matrixfv_invalid_program,		"uniform_matrixfv_invalid_program",		"Invalid glUniformMatrix{234}fv() usage"	   },
2563		{uniform_matrixfv_incompatible_type,	"uniform_matrixfv_incompatible_type",	"Invalid glUniformMatrix{234}fv() usage"	   },
2564		{uniform_matrixfv_invalid_location,		"uniform_matrixfv_invalid_location",	"Invalid glUniformMatrix{234}fv() usage"	   },
2565		{uniform_matrixfv_invalid_count,		"uniform_matrixfv_invalid_count",		"Invalid glUniformMatrix{234}fv() usage"	   },
2566		{gen_transform_feedbacks,				"gen_transform_feedbacks",				"Invalid glGenTransformFeedbacks() usage"	   },
2567		{bind_transform_feedback,				"bind_transform_feedback",				"Invalid glBindTransformFeedback() usage"	   },
2568		{delete_transform_feedbacks,			"delete_transform_feedbacks",			"Invalid glDeleteTransformFeedbacks() usage"   },
2569		{begin_transform_feedback,				"begin_transform_feedback",				"Invalid glBeginTransformFeedback() usage"	   },
2570		{pause_transform_feedback,				"pause_transform_feedback",				"Invalid glPauseTransformFeedback() usage"	   },
2571		{resume_transform_feedback,				"resume_transform_feedback",			"Invalid glResumeTransformFeedback() usage"	   },
2572		{end_transform_feedback,				"end_transform_feedback",				"Invalid glEndTransformFeedback() usage"	   },
2573		{get_transform_feedback_varying,		"get_transform_feedback_varying",		"Invalid glGetTransformFeedbackVarying() usage"},
2574		{transform_feedback_varyings,			"transform_feedback_varyings",			"Invalid glTransformFeedbackVaryings() usage"  },
2575		{compile_compute_shader,				"compile_compute_shader",				"Invalid Compute Shader compilation"		   },
2576		{link_compute_shader,					"link_compute_shader",					"Invalid Compute Shader linkage"			   },
2577	};
2578
2579	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
2580}
2581
2582} // NegativeTestShared
2583} // Functional
2584} // gles31
2585} // deqp
2586