es31fNegativeShaderApiTests.cpp revision a43f5b2bbe423890ad95b7ec8af8c197d4c891b0
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
35
36namespace deqp
37{
38namespace gles31
39{
40namespace Functional
41{
42namespace NegativeTestShared
43{
44using tcu::TestLog;
45using glu::CallLogWrapper;
46using namespace glw;
47
48static const char* vertexShaderSource		=	"#version 300 es\n"
49												"void main (void)\n"
50												"{\n"
51												"	gl_Position = vec4(0.0);\n"
52												"}\n\0";
53
54static const char* fragmentShaderSource		=	"#version 300 es\n"
55												"layout(location = 0) out mediump vec4 fragColor;"
56												"void main (void)\n"
57												"{\n"
58												"	fragColor = vec4(0.0);\n"
59												"}\n\0";
60
61static const char* uniformTestVertSource	=	"#version 300 es\n"
62												"uniform mediump vec4 vec4_v;\n"
63												"uniform mediump mat4 mat4_v;\n"
64												"void main (void)\n"
65												"{\n"
66												"	gl_Position = mat4_v * vec4_v;\n"
67												"}\n\0";
68
69static const char* uniformTestFragSource	=	"#version 300 es\n"
70												"uniform mediump ivec4 ivec4_f;\n"
71												"uniform mediump uvec4 uvec4_f;\n"
72												"uniform sampler2D sampler_f;\n"
73												"layout(location = 0) out mediump vec4 fragColor;"
74												"void main (void)\n"
75												"{\n"
76												"	fragColor.xy = (vec4(uvec4_f) + vec4(ivec4_f)).xy;\n"
77												"	fragColor.zw = texture(sampler_f, vec2(0.0, 0.0)).zw;\n"
78												"}\n\0";
79
80static const char* uniformBlockVertSource	=	"#version 300 es\n"
81												"layout(shared) uniform Block { lowp float var; };\n"
82												"void main (void)\n"
83												"{\n"
84												"	gl_Position = vec4(var);\n"
85												"}\n\0";
86
87
88// Shader control commands
89void create_shader (NegativeTestContext& ctx)
90{
91	ctx.beginSection("GL_INVALID_ENUM is generated if shaderType is not an accepted value.");
92	ctx.glCreateShader(-1);
93	ctx.expectError(GL_INVALID_ENUM);
94	ctx.endSection();
95}
96
97void shader_source (NegativeTestContext& ctx)
98{
99	// make notAShader not a shader id
100	const GLuint notAShader = ctx.glCreateShader(GL_VERTEX_SHADER);
101	ctx.glDeleteShader(notAShader);
102
103	ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
104	ctx.glShaderSource(notAShader, 0, 0, 0);
105	ctx.expectError(GL_INVALID_VALUE);
106	ctx.endSection();
107
108	ctx.beginSection("GL_INVALID_VALUE is generated if count is less than 0.");
109	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
110	ctx.glShaderSource(shader, -1, 0, 0);
111	ctx.expectError(GL_INVALID_VALUE);
112	ctx.endSection();
113
114	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
115	GLuint program = ctx.glCreateProgram();
116	ctx.glShaderSource(program, 0, 0, 0);
117	ctx.expectError(GL_INVALID_OPERATION);
118	ctx.endSection();
119
120	ctx.glDeleteProgram(program);
121	ctx.glDeleteShader(shader);
122}
123
124void compile_shader (NegativeTestContext& ctx)
125{
126	// \note Shader compilation must be supported.
127
128	ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
129	ctx.glCompileShader(9);
130	ctx.expectError(GL_INVALID_VALUE);
131	ctx.endSection();
132
133	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
134	GLuint program = ctx.glCreateProgram();
135	ctx.glCompileShader(program);
136	ctx.expectError(GL_INVALID_OPERATION);
137	ctx.endSection();
138
139	ctx.glDeleteProgram(program);
140}
141
142void delete_shader (NegativeTestContext& ctx)
143{
144	ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
145	ctx.glDeleteShader(9);
146	ctx.expectError(GL_INVALID_VALUE);
147	ctx.endSection();
148}
149
150void shader_binary (NegativeTestContext& ctx)
151{
152	std::vector<deInt32> binaryFormats;
153
154	{
155		deInt32 numFormats = 0x1234;
156		ctx.glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &numFormats);
157
158		if (numFormats == 0)
159			ctx.getLog() << TestLog::Message << "// No supported extensions available." << TestLog::EndMessage;
160		else
161		{
162			binaryFormats.resize(numFormats);
163			ctx.glGetIntegerv(GL_SHADER_BINARY_FORMATS, &binaryFormats[0]);
164		}
165	}
166
167	deBool shaderBinarySupported = !binaryFormats.empty();
168	if (!shaderBinarySupported)
169		ctx.getLog() << TestLog::Message << "// Shader binaries not supported." << TestLog::EndMessage;
170	else
171		ctx.getLog() << TestLog::Message << "// Shader binaries supported" << TestLog::EndMessage;
172
173	GLuint shaders[2];
174	shaders[0]		= ctx.glCreateShader(GL_VERTEX_SHADER);
175	shaders[1]		= ctx.glCreateShader(GL_VERTEX_SHADER);
176
177	ctx.beginSection("GL_INVALID_ENUM is generated if binaryFormat is not an accepted value.");
178	ctx.glShaderBinary(1, &shaders[0], -1, 0, 0);
179	ctx.expectError(GL_INVALID_ENUM);
180	ctx.endSection();
181
182	if (shaderBinarySupported)
183	{
184		ctx.beginSection("GL_INVALID_VALUE is generated if the data pointed to by binary does not match the format specified by binaryFormat.");
185		const GLbyte data = 0x005F;
186		ctx.glShaderBinary(1, &shaders[0], binaryFormats[0], &data, 1);
187		ctx.expectError(GL_INVALID_VALUE);
188		ctx.endSection();
189
190		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.");
191		ctx.glShaderBinary(2, &shaders[0], binaryFormats[0], 0, 0);
192		ctx.expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
193		ctx.endSection();
194	}
195
196	ctx.glDeleteShader(shaders[0]);
197	ctx.glDeleteShader(shaders[1]);
198}
199
200void attach_shader (NegativeTestContext& ctx)
201{
202	GLuint shader1 = ctx.glCreateShader(GL_VERTEX_SHADER);
203	GLuint shader2 = ctx.glCreateShader(GL_VERTEX_SHADER);
204	GLuint program = ctx.glCreateProgram();
205
206	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
207	ctx.glAttachShader(shader1, shader1);
208	ctx.expectError(GL_INVALID_OPERATION);
209	ctx.endSection();
210
211	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
212	ctx.glAttachShader(program, program);
213	ctx.expectError(GL_INVALID_OPERATION);
214	ctx.glAttachShader(shader1, program);
215	ctx.expectError(GL_INVALID_OPERATION);
216	ctx.endSection();
217
218	ctx.beginSection("GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
219	ctx.glAttachShader(program, -1);
220	ctx.expectError(GL_INVALID_VALUE);
221	ctx.glAttachShader(-1, shader1);
222	ctx.expectError(GL_INVALID_VALUE);
223	ctx.glAttachShader(-1, -1);
224	ctx.expectError(GL_INVALID_VALUE);
225	ctx.endSection();
226
227	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is already attached to program.");
228	ctx.glAttachShader(program, shader1);
229	ctx.expectError(GL_NO_ERROR);
230	ctx.glAttachShader(program, shader1);
231	ctx.expectError(GL_INVALID_OPERATION);
232	ctx.endSection();
233
234	ctx.beginSection("GL_INVALID_OPERATION is generated if a shader of the same type as shader is already attached to program.");
235	ctx.glAttachShader(program, shader2);
236	ctx.expectError(GL_INVALID_OPERATION);
237	ctx.endSection();
238
239	ctx.glDeleteProgram(program);
240	ctx.glDeleteShader(shader1);
241	ctx.glDeleteShader(shader2);
242}
243
244void detach_shader (NegativeTestContext& ctx)
245{
246	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
247	GLuint program = ctx.glCreateProgram();
248
249	ctx.beginSection("GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
250	ctx.glDetachShader(-1, shader);
251	ctx.expectError(GL_INVALID_VALUE);
252	ctx.glDetachShader(program, -1);
253	ctx.expectError(GL_INVALID_VALUE);
254	ctx.glDetachShader(-1, -1);
255	ctx.expectError(GL_INVALID_VALUE);
256	ctx.endSection();
257
258	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
259	ctx.glDetachShader(shader, shader);
260	ctx.expectError(GL_INVALID_OPERATION);
261	ctx.endSection();
262
263	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
264	ctx.glDetachShader(program, program);
265	ctx.expectError(GL_INVALID_OPERATION);
266	ctx.glDetachShader(shader, program);
267	ctx.expectError(GL_INVALID_OPERATION);
268	ctx.endSection();
269
270	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not attached to program.");
271	ctx.glDetachShader(program, shader);
272	ctx.expectError(GL_INVALID_OPERATION);
273	ctx.endSection();
274
275	ctx.glDeleteProgram(program);
276	ctx.glDeleteShader(shader);
277}
278
279void link_program (NegativeTestContext& ctx)
280{
281	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
282
283	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
284	ctx.glLinkProgram(-1);
285	ctx.expectError(GL_INVALID_VALUE);
286	ctx.endSection();
287
288	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
289	ctx.glLinkProgram(shader);
290	ctx.expectError(GL_INVALID_OPERATION);
291	ctx.endSection();
292
293	ctx.glDeleteShader(shader);
294
295	ctx.beginSection("GL_INVALID_OPERATION is generated if program is the currently active program object and transform feedback mode is active.");
296	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
297	deUint32					buf = 0x1234;
298	deUint32					tfID = 0x1234;
299	const char* tfVarying		= "gl_Position";
300
301	ctx.glGenTransformFeedbacks		(1, &tfID);
302	ctx.glGenBuffers				(1, &buf);
303
304	ctx.glUseProgram				(program.getProgram());
305	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
306	ctx.glLinkProgram				(program.getProgram());
307	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
308	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
309	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
310	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
311	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
312	ctx.expectError					(GL_NO_ERROR);
313
314	ctx.glLinkProgram				(program.getProgram());
315	ctx.expectError				(GL_INVALID_OPERATION);
316
317	ctx.glEndTransformFeedback		();
318	ctx.glDeleteTransformFeedbacks	(1, &tfID);
319	ctx.glDeleteBuffers				(1, &buf);
320	ctx.expectError				(GL_NO_ERROR);
321	ctx.endSection();
322}
323
324void use_program (NegativeTestContext& ctx)
325{
326	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
327
328	ctx.beginSection("GL_INVALID_VALUE is generated if program is neither 0 nor a value generated by OpenGL.");
329	ctx.glUseProgram(-1);
330	ctx.expectError(GL_INVALID_VALUE);
331	ctx.endSection();
332
333	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
334	ctx.glUseProgram(shader);
335	ctx.expectError(GL_INVALID_OPERATION);
336	ctx.endSection();
337
338	ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback mode is active and not paused.");
339	glu::ShaderProgram			program1(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
340	glu::ShaderProgram			program2(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
341	deUint32					buf = 0x1234;
342	deUint32					tfID = 0x1234;
343	const char* tfVarying		= "gl_Position";
344
345	ctx.glGenTransformFeedbacks		(1, &tfID);
346	ctx.glGenBuffers				(1, &buf);
347
348	ctx.glUseProgram				(program1.getProgram());
349	ctx.glTransformFeedbackVaryings	(program1.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
350	ctx.glLinkProgram				(program1.getProgram());
351	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
352	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
353	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
354	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
355	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
356	ctx.expectError					(GL_NO_ERROR);
357
358	ctx.glUseProgram				(program2.getProgram());
359	ctx.expectError				(GL_INVALID_OPERATION);
360
361	ctx.glPauseTransformFeedback	();
362	ctx.glUseProgram				(program2.getProgram());
363	ctx.expectError				(GL_NO_ERROR);
364
365	ctx.glEndTransformFeedback		();
366	ctx.glDeleteTransformFeedbacks	(1, &tfID);
367	ctx.glDeleteBuffers				(1, &buf);
368	ctx.expectError				(GL_NO_ERROR);
369	ctx.endSection();
370
371	ctx.glUseProgram(0);
372	ctx.glDeleteShader(shader);
373}
374
375void delete_program (NegativeTestContext& ctx)
376{
377	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
378	ctx.glDeleteProgram(-1);
379	ctx.expectError(GL_INVALID_VALUE);
380	ctx.endSection();
381}
382
383void validate_program (NegativeTestContext& ctx)
384{
385	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
386
387	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
388	ctx.glValidateProgram(-1);
389	ctx.expectError(GL_INVALID_VALUE);
390	ctx.endSection();
391
392	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
393	ctx.glValidateProgram(shader);
394	ctx.expectError(GL_INVALID_OPERATION);
395	ctx.endSection();
396
397	ctx.glDeleteShader(shader);
398}
399
400void get_program_binary (NegativeTestContext& ctx)
401{
402	glu::ShaderProgram				program			(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
403	glu::ShaderProgram				programInvalid	(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, ""));
404	GLenum							binaryFormat	= -1;
405	GLsizei							binaryLength	= -1;
406	GLint							binaryPtr		= -1;
407	GLint							bufSize			= -1;
408	GLint							linkStatus		= -1;
409
410	ctx.beginSection("GL_INVALID_OPERATION is generated if bufSize is less than the size of GL_PROGRAM_BINARY_LENGTH for program.");
411	ctx.glGetProgramiv		(program.getProgram(), GL_PROGRAM_BINARY_LENGTH,	&bufSize);
412	ctx.expectError		(GL_NO_ERROR);
413	ctx.glGetProgramiv		(program.getProgram(), GL_LINK_STATUS,				&linkStatus);
414	ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
415	ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
416	ctx.expectError		(GL_NO_ERROR);
417
418	ctx.glGetProgramBinary	(program.getProgram(), 0, &binaryLength, &binaryFormat, &binaryPtr);
419	ctx.expectError		(GL_INVALID_OPERATION);
420	if (bufSize > 0)
421	{
422		ctx.glGetProgramBinary	(program.getProgram(), bufSize-1, &binaryLength, &binaryFormat, &binaryPtr);
423		ctx.expectError		(GL_INVALID_OPERATION);
424	}
425	ctx.endSection();
426
427	ctx.beginSection("GL_INVALID_OPERATION is generated if GL_LINK_STATUS for the program object is false.");
428	ctx.glGetProgramiv		(programInvalid.getProgram(), GL_PROGRAM_BINARY_LENGTH,	&bufSize);
429	ctx.expectError		(GL_NO_ERROR);
430	ctx.glGetProgramiv		(programInvalid.getProgram(), GL_LINK_STATUS,			&linkStatus);
431	ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
432	ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
433	ctx.expectError		(GL_NO_ERROR);
434
435	ctx.glGetProgramBinary	(programInvalid.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryPtr);
436	ctx.expectError		(GL_INVALID_OPERATION);
437	ctx.endSection();
438}
439
440void program_binary (NegativeTestContext& ctx)
441{
442	glu::ShaderProgram		srcProgram		(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
443	GLuint					dstProgram		= ctx.glCreateProgram();
444	GLuint					dummyShader		= ctx.glCreateShader(GL_VERTEX_SHADER);
445	GLenum					binaryFormat	= -1;
446	GLsizei					binaryLength	= -1;
447	std::vector<deUint8>	binaryBuf;
448	GLint					bufSize			= -1;
449	GLint					linkStatus		= -1;
450
451	ctx.glGetProgramiv		(srcProgram.getProgram(), GL_PROGRAM_BINARY_LENGTH,	&bufSize);
452	ctx.glGetProgramiv		(srcProgram.getProgram(), GL_LINK_STATUS,			&linkStatus);
453	ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
454	ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
455	TCU_CHECK(bufSize > 0);
456	binaryBuf.resize(bufSize);
457	ctx.glGetProgramBinary	(srcProgram.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryBuf[0]);
458	ctx.expectError		(GL_NO_ERROR);
459
460	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not the name of an existing program object.");
461	ctx.glProgramBinary		(dummyShader, binaryFormat, &binaryBuf[0], binaryLength);
462	ctx.expectError		(GL_INVALID_OPERATION);
463	ctx.endSection();
464
465	ctx.beginSection("GL_INVALID_ENUM is generated if binaryFormat is not a value recognized by the implementation.");
466	ctx.glProgramBinary		(dstProgram, -1, &binaryBuf[0], binaryLength);
467	ctx.expectError		(GL_INVALID_ENUM);
468	ctx.endSection();
469
470	ctx.glDeleteShader(dummyShader);
471	ctx.glDeleteProgram(dstProgram);
472}
473
474void program_parameteri (NegativeTestContext& ctx)
475{
476	GLuint	program	= ctx.glCreateProgram();
477
478	ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of an existing program object.");
479	ctx.glProgramParameteri		(0, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
480	ctx.expectError			(GL_INVALID_VALUE);
481	ctx.endSection();
482
483	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not GL_PROGRAM_BINARY_RETRIEVABLE_HINT.");
484	ctx.glProgramParameteri		(program, -1, GL_TRUE);
485	ctx.expectError			(GL_INVALID_ENUM);
486	ctx.endSection();
487
488	ctx.beginSection("GL_INVALID_VALUE is generated if value is not GL_FALSE or GL_TRUE.");
489	ctx.glProgramParameteri		(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, 2);
490	ctx.expectError			(GL_INVALID_VALUE);
491	ctx.endSection();
492
493	ctx.glDeleteProgram(program);
494}
495
496void gen_samplers (NegativeTestContext& ctx)
497{
498	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
499	GLuint sampler = 0;
500	ctx.glGenSamplers	(-1, &sampler);
501	ctx.expectError	(GL_INVALID_VALUE);
502	ctx.endSection();
503}
504
505void bind_sampler (NegativeTestContext& ctx)
506{
507	int				maxTexImageUnits = 0x1234;
508	GLuint			sampler = 0;
509	ctx.glGetIntegerv	(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTexImageUnits);
510	ctx.glGenSamplers	(1, &sampler);
511
512	ctx.beginSection("GL_INVALID_VALUE is generated if unit is greater than or equal to the value of GL_MAX_COMBIED_TEXTURE_IMAGE_UNITS.");
513	ctx.glBindSampler	(maxTexImageUnits, sampler);
514	ctx.expectError	(GL_INVALID_VALUE);
515	ctx.endSection();
516
517	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not zero or a name previously returned from a call to ctx.glGenSamplers.");
518	ctx.glBindSampler	(1, -1);
519	ctx.expectError	(GL_INVALID_OPERATION);
520	ctx.endSection();
521
522	ctx.beginSection("GL_INVALID_OPERATION is generated if sampler has been deleted by a call to ctx.glDeleteSamplers.");
523	ctx.glDeleteSamplers(1, &sampler);
524	ctx.glBindSampler	(1, sampler);
525	ctx.expectError	(GL_INVALID_OPERATION);
526	ctx.endSection();
527}
528
529void delete_samplers (NegativeTestContext& ctx)
530{
531	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
532	ctx.glDeleteSamplers(-1, 0);
533	ctx.expectError	(GL_INVALID_VALUE);
534	ctx.endSection();
535}
536
537void get_sampler_parameteriv (NegativeTestContext& ctx)
538{
539	int				params = 0x1234;
540	GLuint			sampler = 0;
541	ctx.glGenSamplers	(1, &sampler);
542
543	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.");
544	ctx.glGetSamplerParameteriv	(-1, GL_TEXTURE_MAG_FILTER, &params);
545	ctx.expectError			(GL_INVALID_OPERATION);
546	ctx.endSection();
547
548	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
549	ctx.glGetSamplerParameteriv	(sampler, -1, &params);
550	ctx.expectError			(GL_INVALID_ENUM);
551	ctx.endSection();
552
553	ctx.glDeleteSamplers(1, &sampler);
554}
555
556void get_sampler_parameterfv (NegativeTestContext& ctx)
557{
558	float			params;
559	GLuint			sampler = 0;
560	ctx.glGenSamplers	(1, &sampler);
561
562	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.");
563	ctx.glGetSamplerParameterfv	(-1, GL_TEXTURE_MAG_FILTER, &params);
564	ctx.expectError			(GL_INVALID_OPERATION);
565	ctx.endSection();
566
567	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
568	ctx.glGetSamplerParameterfv	(sampler, -1, &params);
569	ctx.expectError			(GL_INVALID_ENUM);
570	ctx.endSection();
571
572	ctx.glDeleteSamplers(1, &sampler);
573}
574
575void sampler_parameteri (NegativeTestContext& ctx)
576{
577	GLuint			sampler = 0;
578	ctx.glGenSamplers	(1, &sampler);
579
580	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.");
581	ctx.glSamplerParameteri		(-1, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
582	ctx.expectError			(GL_INVALID_OPERATION);
583	ctx.endSection();
584
585	ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
586	ctx.glSamplerParameteri		(sampler, GL_TEXTURE_WRAP_S, -1);
587	ctx.expectError			(GL_INVALID_ENUM);
588	ctx.endSection();
589
590	ctx.glDeleteSamplers(1, &sampler);
591}
592
593void sampler_parameteriv (NegativeTestContext& ctx)
594{
595	int				params = 0x1234;
596	GLuint			sampler = 0;
597	ctx.glGenSamplers	(1, &sampler);
598
599	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.");
600	params = GL_CLAMP_TO_EDGE;
601	ctx.glSamplerParameteriv	(-1, GL_TEXTURE_WRAP_S, &params);
602	ctx.expectError			(GL_INVALID_OPERATION);
603	ctx.endSection();
604
605	ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
606	params = -1;
607	ctx.glSamplerParameteriv	(sampler, GL_TEXTURE_WRAP_S, &params);
608	ctx.expectError			(GL_INVALID_ENUM);
609	ctx.endSection();
610
611	ctx.glDeleteSamplers(1, &sampler);
612}
613
614void sampler_parameterf (NegativeTestContext& ctx)
615{
616	GLuint			sampler = 0;
617	ctx.glGenSamplers	(1, &sampler);
618
619	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.");
620	ctx.glSamplerParameterf		(-1, GL_TEXTURE_MIN_LOD, -1000.0f);
621	ctx.expectError			(GL_INVALID_OPERATION);
622	ctx.endSection();
623
624	ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
625	ctx.glSamplerParameterf		(sampler, GL_TEXTURE_WRAP_S, -1.0f);
626	ctx.expectError			(GL_INVALID_ENUM);
627	ctx.endSection();
628
629	ctx.glDeleteSamplers(1, &sampler);
630}
631
632void sampler_parameterfv (NegativeTestContext& ctx)
633{
634	float			params;
635	GLuint			sampler = 0;
636	ctx.glGenSamplers	(1, &sampler);
637
638	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.");
639	params = -1000.0f;
640	ctx.glSamplerParameterfv	(-1, GL_TEXTURE_WRAP_S, &params);
641	ctx.expectError			(GL_INVALID_OPERATION);
642	ctx.endSection();
643
644	ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
645	params = -1.0f;
646	ctx.glSamplerParameterfv	(sampler, GL_TEXTURE_WRAP_S, &params);
647	ctx.expectError			(GL_INVALID_ENUM);
648	ctx.endSection();
649
650	ctx.glDeleteSamplers(1, &sampler);
651}
652
653// Shader data commands
654
655void get_attrib_location (NegativeTestContext& ctx)
656{
657	GLuint programEmpty		= ctx.glCreateProgram();
658	GLuint shader			= ctx.glCreateShader(GL_VERTEX_SHADER);
659
660	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
661
662	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
663	ctx.glBindAttribLocation		(programEmpty, 0, "test");
664	ctx.glGetAttribLocation			(programEmpty, "test");
665	ctx.expectError				(GL_INVALID_OPERATION);
666	ctx.endSection();
667
668	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a program or shader object.");
669	ctx.glUseProgram				(program.getProgram());
670	ctx.glBindAttribLocation		(program.getProgram(), 0, "test");
671	ctx.expectError				(GL_NO_ERROR);
672	ctx.glGetAttribLocation			(program.getProgram(), "test");
673	ctx.expectError				(GL_NO_ERROR);
674	ctx.glGetAttribLocation			(-2, "test");
675	ctx.expectError				(GL_INVALID_VALUE);
676	ctx.endSection();
677
678	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
679	ctx.glGetAttribLocation			(shader, "test");
680	ctx.expectError				(GL_INVALID_OPERATION);
681	ctx.endSection();
682
683	ctx.glUseProgram				(0);
684	ctx.glDeleteShader				(shader);
685	ctx.glDeleteProgram				(programEmpty);
686}
687
688void get_uniform_location (NegativeTestContext& ctx)
689{
690	GLuint programEmpty = ctx.glCreateProgram();
691	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
692
693	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
694
695	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
696	ctx.glGetUniformLocation(programEmpty, "test");
697	ctx.expectError(GL_INVALID_OPERATION);
698	ctx.endSection();
699
700	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
701	ctx.glUseProgram(program.getProgram());
702	ctx.glGetUniformLocation(-2, "test");
703	ctx.expectError(GL_INVALID_VALUE);
704	ctx.endSection();
705
706	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
707	ctx.glGetAttribLocation(shader, "test");
708	ctx.expectError(GL_INVALID_OPERATION);
709	ctx.endSection();
710
711	ctx.glUseProgram(0);
712	ctx.glDeleteProgram(programEmpty);
713	ctx.glDeleteShader(shader);
714}
715
716void bind_attrib_location (NegativeTestContext& ctx)
717{
718	GLuint program = ctx.glCreateProgram();
719	GLuint maxIndex = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
720	GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
721
722	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
723	ctx.glBindAttribLocation(program, maxIndex, "test");
724	ctx.expectError(GL_INVALID_VALUE);
725	ctx.endSection();
726
727	ctx.beginSection("GL_INVALID_OPERATION is generated if name starts with the reserved prefix \"gl_\".");
728	ctx.glBindAttribLocation(program, maxIndex-1, "gl_test");
729	ctx.expectError(GL_INVALID_OPERATION);
730	ctx.endSection();
731
732	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
733	ctx.glBindAttribLocation(-1, maxIndex-1, "test");
734	ctx.expectError(GL_INVALID_VALUE);
735	ctx.endSection();
736
737	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
738	ctx.glBindAttribLocation(shader, maxIndex-1, "test");
739	ctx.expectError(GL_INVALID_OPERATION);
740	ctx.endSection();
741
742	ctx.glDeleteProgram(program);
743	ctx.glDeleteShader(shader);
744}
745
746void uniform_block_binding (NegativeTestContext& ctx)
747{
748	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformBlockVertSource, uniformTestFragSource));
749
750	ctx.glUseProgram	(program.getProgram());
751
752	GLint			maxUniformBufferBindings	= -1;
753	GLint			numActiveUniforms			= -1;
754	GLint			numActiveBlocks				= -1;
755	ctx.glGetIntegerv	(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
756	ctx.glGetProgramiv	(program.getProgram(), GL_ACTIVE_UNIFORMS,			&numActiveUniforms);
757	ctx.glGetProgramiv	(program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS,	&numActiveBlocks);
758	ctx.getLog() << TestLog::Message << "// GL_MAX_UNIFORM_BUFFER_BINDINGS = " << maxUniformBufferBindings << TestLog::EndMessage;
759	ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORMS = "				<< numActiveUniforms		<< TestLog::EndMessage;
760	ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = "		<< numActiveBlocks			<< TestLog::EndMessage;
761	ctx.expectError	(GL_NO_ERROR);
762
763	ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockIndex is not an active uniform block index of program.");
764	ctx.glUniformBlockBinding(program.getProgram(), -1, 0);
765	ctx.expectError(GL_INVALID_VALUE);
766	ctx.glUniformBlockBinding(program.getProgram(), 5, 0);
767	ctx.expectError(GL_INVALID_VALUE);
768	ctx.endSection();
769
770	ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockBinding is greater than or equal to the value of GL_MAX_UNIFORM_BUFFER_BINDINGS.");
771	ctx.glUniformBlockBinding(program.getProgram(), maxUniformBufferBindings, 0);
772	ctx.expectError(GL_INVALID_VALUE);
773	ctx.endSection();
774
775	ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object generated by the GL.");
776	ctx.glUniformBlockBinding(-1, 0, 0);
777	ctx.expectError(GL_INVALID_VALUE);
778	ctx.endSection();
779}
780
781// ctx.glUniform*f
782
783void uniformf_invalid_program (NegativeTestContext& ctx)
784{
785	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
786	ctx.glUseProgram(0);
787	ctx.glUniform1f(-1, 0.0f);
788	ctx.expectError(GL_INVALID_OPERATION);
789	ctx.glUniform2f(-1, 0.0f, 0.0f);
790	ctx.expectError(GL_INVALID_OPERATION);
791	ctx.glUniform3f(-1, 0.0f, 0.0f, 0.0f);
792	ctx.expectError(GL_INVALID_OPERATION);
793	ctx.glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
794	ctx.expectError(GL_INVALID_OPERATION);
795	ctx.endSection();
796}
797
798void uniformf_incompatible_type (NegativeTestContext& ctx)
799{
800	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
801
802	ctx.glUseProgram(program.getProgram());
803	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
804	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
805	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
806	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
807	ctx.expectError(GL_NO_ERROR);
808
809	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
810	{
811		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
812		ctx.fail("Failed to retrieve uniform location");
813	}
814
815	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.");
816	ctx.glUseProgram(program.getProgram());
817	ctx.glUniform1f(vec4_v, 0.0f);
818	ctx.expectError(GL_INVALID_OPERATION);
819	ctx.glUniform2f(vec4_v, 0.0f, 0.0f);
820	ctx.expectError(GL_INVALID_OPERATION);
821	ctx.glUniform3f(vec4_v, 0.0f, 0.0f, 0.0f);
822	ctx.expectError(GL_INVALID_OPERATION);
823	ctx.glUniform4f(vec4_v, 0.0f, 0.0f, 0.0f, 0.0f);
824	ctx.expectError(GL_NO_ERROR);
825	ctx.endSection();
826
827	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.");
828	ctx.glUseProgram(program.getProgram());
829	ctx.glUniform4f(ivec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
830	ctx.expectError(GL_INVALID_OPERATION);
831	ctx.glUniform4f(uvec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
832	ctx.expectError(GL_INVALID_OPERATION);
833	ctx.endSection();
834
835	ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
836	ctx.glUseProgram(program.getProgram());
837	ctx.glUniform1f(sampler_f, 0.0f);
838	ctx.expectError(GL_INVALID_OPERATION);
839	ctx.endSection();
840
841	ctx.glUseProgram(0);
842}
843
844void uniformf_invalid_location (NegativeTestContext& ctx)
845{
846	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
847
848	ctx.glUseProgram(program.getProgram());
849	ctx.expectError(GL_NO_ERROR);
850
851	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.");
852	ctx.glUseProgram(program.getProgram());
853	ctx.glUniform1f(-2, 0.0f);
854	ctx.expectError(GL_INVALID_OPERATION);
855	ctx.glUniform2f(-2, 0.0f, 0.0f);
856	ctx.expectError(GL_INVALID_OPERATION);
857	ctx.glUniform3f(-2, 0.0f, 0.0f, 0.0f);
858	ctx.expectError(GL_INVALID_OPERATION);
859	ctx.glUniform4f(-2, 0.0f, 0.0f, 0.0f, 0.0f);
860	ctx.expectError(GL_INVALID_OPERATION);
861
862	ctx.glUseProgram(program.getProgram());
863	ctx.glUniform1f(-1, 0.0f);
864	ctx.expectError(GL_NO_ERROR);
865	ctx.glUniform2f(-1, 0.0f, 0.0f);
866	ctx.expectError(GL_NO_ERROR);
867	ctx.glUniform3f(-1, 0.0f, 0.0f, 0.0f);
868	ctx.expectError(GL_NO_ERROR);
869	ctx.glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
870	ctx.expectError(GL_NO_ERROR);
871	ctx.endSection();
872
873	ctx.glUseProgram(0);
874}
875
876// ctx.glUniform*fv
877
878void uniformfv_invalid_program (NegativeTestContext& ctx)
879{
880	std::vector<GLfloat> data(4);
881
882	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
883	ctx.glUseProgram(0);
884	ctx.glUniform1fv(-1, 1, &data[0]);
885	ctx.expectError(GL_INVALID_OPERATION);
886	ctx.glUniform2fv(-1, 1, &data[0]);
887	ctx.expectError(GL_INVALID_OPERATION);
888	ctx.glUniform3fv(-1, 1, &data[0]);
889	ctx.expectError(GL_INVALID_OPERATION);
890	ctx.glUniform4fv(-1, 1, &data[0]);
891	ctx.expectError(GL_INVALID_OPERATION);
892	ctx.endSection();
893}
894
895void uniformfv_incompatible_type (NegativeTestContext& ctx)
896{
897	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
898
899	ctx.glUseProgram(program.getProgram());
900	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
901	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
902	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
903	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
904	ctx.expectError(GL_NO_ERROR);
905
906	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
907	{
908		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
909		ctx.fail("Failed to retrieve uniform location");
910	}
911
912	std::vector<GLfloat> data(4);
913
914	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.");
915	ctx.glUseProgram(program.getProgram());
916	ctx.glUniform1fv(vec4_v, 1, &data[0]);
917	ctx.expectError(GL_INVALID_OPERATION);
918	ctx.glUniform2fv(vec4_v, 1, &data[0]);
919	ctx.expectError(GL_INVALID_OPERATION);
920	ctx.glUniform3fv(vec4_v, 1, &data[0]);
921	ctx.expectError(GL_INVALID_OPERATION);
922	ctx.glUniform4fv(vec4_v, 1, &data[0]);
923	ctx.expectError(GL_NO_ERROR);
924	ctx.endSection();
925
926	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.");
927	ctx.glUseProgram(program.getProgram());
928	ctx.glUniform4fv(ivec4_f, 1, &data[0]);
929	ctx.expectError(GL_INVALID_OPERATION);
930	ctx.glUniform4fv(uvec4_f, 1, &data[0]);
931	ctx.expectError(GL_INVALID_OPERATION);
932	ctx.endSection();
933
934	ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
935	ctx.glUseProgram(program.getProgram());
936	ctx.glUniform1fv(sampler_f, 1, &data[0]);
937	ctx.expectError(GL_INVALID_OPERATION);
938	ctx.endSection();
939
940	ctx.glUseProgram(0);
941}
942
943void uniformfv_invalid_location (NegativeTestContext& ctx)
944{
945	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
946
947	ctx.glUseProgram(program.getProgram());
948	ctx.expectError(GL_NO_ERROR);
949
950	std::vector<GLfloat> data(4);
951
952	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.");
953	ctx.glUseProgram(program.getProgram());
954	ctx.glUniform1fv(-2, 1, &data[0]);
955	ctx.expectError(GL_INVALID_OPERATION);
956	ctx.glUniform2fv(-2, 1, &data[0]);
957	ctx.expectError(GL_INVALID_OPERATION);
958	ctx.glUniform3fv(-2, 1, &data[0]);
959	ctx.expectError(GL_INVALID_OPERATION);
960	ctx.glUniform4fv(-2, 1, &data[0]);
961	ctx.expectError(GL_INVALID_OPERATION);
962
963	ctx.glUseProgram(program.getProgram());
964	ctx.glUniform1fv(-1, 1, &data[0]);
965	ctx.expectError(GL_NO_ERROR);
966	ctx.glUniform2fv(-1, 1, &data[0]);
967	ctx.expectError(GL_NO_ERROR);
968	ctx.glUniform3fv(-1, 1, &data[0]);
969	ctx.expectError(GL_NO_ERROR);
970	ctx.glUniform4fv(-1, 1, &data[0]);
971	ctx.expectError(GL_NO_ERROR);
972	ctx.endSection();
973
974	ctx.glUseProgram(0);
975}
976
977void uniformfv_invalid_count (NegativeTestContext& ctx)
978{
979	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
980
981	ctx.glUseProgram	(program.getProgram());
982	GLint vec4_v			= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
983	ctx.expectError(GL_NO_ERROR);
984
985	if (vec4_v == -1)
986	{
987		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
988		ctx.fail("Failed to retrieve uniform location");
989	}
990
991	std::vector<GLfloat> data(8);
992
993	ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
994	ctx.glUseProgram(program.getProgram());
995	ctx.glUniform1fv(vec4_v, 2, &data[0]);
996	ctx.expectError(GL_INVALID_OPERATION);
997	ctx.glUniform2fv(vec4_v, 2, &data[0]);
998	ctx.expectError(GL_INVALID_OPERATION);
999	ctx.glUniform3fv(vec4_v, 2, &data[0]);
1000	ctx.expectError(GL_INVALID_OPERATION);
1001	ctx.glUniform4fv(vec4_v, 2, &data[0]);
1002	ctx.expectError(GL_INVALID_OPERATION);
1003	ctx.endSection();
1004
1005	ctx.glUseProgram(0);
1006}
1007
1008// ctx.glUniform*i
1009
1010void uniformi_invalid_program (NegativeTestContext& ctx)
1011{
1012	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1013	ctx.glUseProgram(0);
1014	ctx.glUniform1i(-1, 0);
1015	ctx.expectError(GL_INVALID_OPERATION);
1016	ctx.glUniform2i(-1, 0, 0);
1017	ctx.expectError(GL_INVALID_OPERATION);
1018	ctx.glUniform3i(-1, 0, 0, 0);
1019	ctx.expectError(GL_INVALID_OPERATION);
1020	ctx.glUniform4i(-1, 0, 0, 0, 0);
1021	ctx.expectError(GL_INVALID_OPERATION);
1022	ctx.endSection();
1023}
1024
1025void uniformi_incompatible_type (NegativeTestContext& ctx)
1026{
1027	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1028
1029	ctx.glUseProgram(program.getProgram());
1030	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1031	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
1032	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
1033	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1034	ctx.expectError(GL_NO_ERROR);
1035
1036	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1037	{
1038		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1039		ctx.fail("Failed to retrieve uniform location");
1040	}
1041
1042	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.");
1043	ctx.glUseProgram(program.getProgram());
1044	ctx.glUniform1i(ivec4_f, 0);
1045	ctx.expectError(GL_INVALID_OPERATION);
1046	ctx.glUniform2i(ivec4_f, 0, 0);
1047	ctx.expectError(GL_INVALID_OPERATION);
1048	ctx.glUniform3i(ivec4_f, 0, 0, 0);
1049	ctx.expectError(GL_INVALID_OPERATION);
1050	ctx.glUniform4i(ivec4_f, 0, 0, 0, 0);
1051	ctx.expectError(GL_NO_ERROR);
1052	ctx.endSection();
1053
1054	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.");
1055	ctx.glUseProgram(program.getProgram());
1056	ctx.glUniform1i(uvec4_f, 0);
1057	ctx.expectError(GL_INVALID_OPERATION);
1058	ctx.glUniform2i(uvec4_f, 0, 0);
1059	ctx.expectError(GL_INVALID_OPERATION);
1060	ctx.glUniform3i(uvec4_f, 0, 0, 0);
1061	ctx.expectError(GL_INVALID_OPERATION);
1062	ctx.glUniform4i(uvec4_f, 0, 0, 0, 0);
1063	ctx.expectError(GL_INVALID_OPERATION);
1064	ctx.endSection();
1065
1066	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.");
1067	ctx.glUseProgram(program.getProgram());
1068	ctx.glUniform1i(vec4_v, 0);
1069	ctx.expectError(GL_INVALID_OPERATION);
1070	ctx.glUniform2i(vec4_v, 0, 0);
1071	ctx.expectError(GL_INVALID_OPERATION);
1072	ctx.glUniform3i(vec4_v, 0, 0, 0);
1073	ctx.expectError(GL_INVALID_OPERATION);
1074	ctx.glUniform4i(vec4_v, 0, 0, 0, 0);
1075	ctx.expectError(GL_INVALID_OPERATION);
1076	ctx.endSection();
1077
1078	ctx.glUseProgram(0);
1079}
1080
1081void uniformi_invalid_location (NegativeTestContext& ctx)
1082{
1083	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1084
1085	ctx.glUseProgram(program.getProgram());
1086	ctx.expectError(GL_NO_ERROR);
1087
1088	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.");
1089	ctx.glUseProgram(program.getProgram());
1090	ctx.glUniform1i(-2, 0);
1091	ctx.expectError(GL_INVALID_OPERATION);
1092	ctx.glUniform2i(-2, 0, 0);
1093	ctx.expectError(GL_INVALID_OPERATION);
1094	ctx.glUniform3i(-2, 0, 0, 0);
1095	ctx.expectError(GL_INVALID_OPERATION);
1096	ctx.glUniform4i(-2, 0, 0, 0, 0);
1097	ctx.expectError(GL_INVALID_OPERATION);
1098
1099	ctx.glUseProgram(program.getProgram());
1100	ctx.glUniform1i(-1, 0);
1101	ctx.expectError(GL_NO_ERROR);
1102	ctx.glUniform2i(-1, 0, 0);
1103	ctx.expectError(GL_NO_ERROR);
1104	ctx.glUniform3i(-1, 0, 0, 0);
1105	ctx.expectError(GL_NO_ERROR);
1106	ctx.glUniform4i(-1, 0, 0, 0, 0);
1107	ctx.expectError(GL_NO_ERROR);
1108	ctx.endSection();
1109
1110	ctx.glUseProgram(0);
1111}
1112
1113// ctx.glUniform*iv
1114
1115void uniformiv_invalid_program (NegativeTestContext& ctx)
1116{
1117	std::vector<GLint> data(4);
1118
1119	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1120	ctx.glUseProgram(0);
1121	ctx.glUniform1iv(-1, 1, &data[0]);
1122	ctx.expectError(GL_INVALID_OPERATION);
1123	ctx.glUniform2iv(-1, 1, &data[0]);
1124	ctx.expectError(GL_INVALID_OPERATION);
1125	ctx.glUniform3iv(-1, 1, &data[0]);
1126	ctx.expectError(GL_INVALID_OPERATION);
1127	ctx.glUniform4iv(-1, 1, &data[0]);
1128	ctx.expectError(GL_INVALID_OPERATION);
1129	ctx.endSection();
1130}
1131
1132void uniformiv_incompatible_type (NegativeTestContext& ctx)
1133{
1134	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1135
1136	ctx.glUseProgram(program.getProgram());
1137	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1138	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
1139	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
1140	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1141	ctx.expectError(GL_NO_ERROR);
1142
1143	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1144	{
1145		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1146		ctx.fail("Failed to retrieve uniform location");
1147	}
1148
1149	std::vector<GLint> data(4);
1150
1151	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.");
1152	ctx.glUseProgram(program.getProgram());
1153	ctx.glUniform1iv(ivec4_f, 1, &data[0]);
1154	ctx.expectError(GL_INVALID_OPERATION);
1155	ctx.glUniform2iv(ivec4_f, 1, &data[0]);
1156	ctx.expectError(GL_INVALID_OPERATION);
1157	ctx.glUniform3iv(ivec4_f, 1, &data[0]);
1158	ctx.expectError(GL_INVALID_OPERATION);
1159	ctx.glUniform4iv(ivec4_f, 1, &data[0]);
1160	ctx.expectError(GL_NO_ERROR);
1161	ctx.endSection();
1162
1163	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.");
1164	ctx.glUseProgram(program.getProgram());
1165	ctx.glUniform1iv(vec4_v, 1, &data[0]);
1166	ctx.expectError(GL_INVALID_OPERATION);
1167	ctx.glUniform2iv(vec4_v, 1, &data[0]);
1168	ctx.expectError(GL_INVALID_OPERATION);
1169	ctx.glUniform3iv(vec4_v, 1, &data[0]);
1170	ctx.expectError(GL_INVALID_OPERATION);
1171	ctx.glUniform4iv(vec4_v, 1, &data[0]);
1172	ctx.expectError(GL_INVALID_OPERATION);
1173	ctx.endSection();
1174
1175	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.");
1176	ctx.glUseProgram(program.getProgram());
1177	ctx.glUniform1iv(uvec4_f, 1, &data[0]);
1178	ctx.expectError(GL_INVALID_OPERATION);
1179	ctx.glUniform2iv(uvec4_f, 1, &data[0]);
1180	ctx.expectError(GL_INVALID_OPERATION);
1181	ctx.glUniform3iv(uvec4_f, 1, &data[0]);
1182	ctx.expectError(GL_INVALID_OPERATION);
1183	ctx.glUniform4iv(uvec4_f, 1, &data[0]);
1184	ctx.expectError(GL_INVALID_OPERATION);
1185	ctx.endSection();
1186
1187	ctx.glUseProgram(0);
1188}
1189
1190void uniformiv_invalid_location (NegativeTestContext& ctx)
1191{
1192	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1193
1194	ctx.glUseProgram(program.getProgram());
1195	ctx.expectError(GL_NO_ERROR);
1196
1197	std::vector<GLint> data(4);
1198
1199	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.");
1200	ctx.glUseProgram(program.getProgram());
1201	ctx.glUniform1iv(-2, 1, &data[0]);
1202	ctx.expectError(GL_INVALID_OPERATION);
1203	ctx.glUniform2iv(-2, 1, &data[0]);
1204	ctx.expectError(GL_INVALID_OPERATION);
1205	ctx.glUniform3iv(-2, 1, &data[0]);
1206	ctx.expectError(GL_INVALID_OPERATION);
1207	ctx.glUniform4iv(-2, 1, &data[0]);
1208	ctx.expectError(GL_INVALID_OPERATION);
1209
1210	ctx.glUseProgram(program.getProgram());
1211	ctx.glUniform1iv(-1, 1, &data[0]);
1212	ctx.expectError(GL_NO_ERROR);
1213	ctx.glUniform2iv(-1, 1, &data[0]);
1214	ctx.expectError(GL_NO_ERROR);
1215	ctx.glUniform3iv(-1, 1, &data[0]);
1216	ctx.expectError(GL_NO_ERROR);
1217	ctx.glUniform4iv(-1, 1, &data[0]);
1218	ctx.expectError(GL_NO_ERROR);
1219	ctx.endSection();
1220
1221	ctx.glUseProgram(0);
1222}
1223
1224void uniformiv_invalid_count (NegativeTestContext& ctx)
1225{
1226	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1227
1228	ctx.glUseProgram			(program.getProgram());
1229	GLint ivec4_f			= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1230	ctx.expectError(GL_NO_ERROR);
1231
1232	if (ivec4_f == -1)
1233	{
1234		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1235		ctx.fail("Failed to retrieve uniform location");
1236	}
1237
1238	std::vector<GLint> data(8);
1239
1240	ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1241	ctx.glUseProgram(program.getProgram());
1242	ctx.glUniform1iv(ivec4_f, 2, &data[0]);
1243	ctx.expectError(GL_INVALID_OPERATION);
1244	ctx.glUniform2iv(ivec4_f, 2, &data[0]);
1245	ctx.expectError(GL_INVALID_OPERATION);
1246	ctx.glUniform3iv(ivec4_f, 2, &data[0]);
1247	ctx.expectError(GL_INVALID_OPERATION);
1248	ctx.glUniform4iv(ivec4_f, 2, &data[0]);
1249	ctx.expectError(GL_INVALID_OPERATION);
1250	ctx.endSection();
1251
1252	ctx.glUseProgram(0);
1253}
1254
1255// ctx.glUniform{1234}ui
1256
1257void uniformui_invalid_program (NegativeTestContext& ctx)
1258{
1259	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1260	ctx.glUseProgram(0);
1261	ctx.glUniform1ui(-1, 0);
1262	ctx.expectError(GL_INVALID_OPERATION);
1263	ctx.glUniform2ui(-1, 0, 0);
1264	ctx.expectError(GL_INVALID_OPERATION);
1265	ctx.glUniform3ui(-1, 0, 0, 0);
1266	ctx.expectError(GL_INVALID_OPERATION);
1267	ctx.glUniform4ui(-1, 0, 0, 0, 0);
1268	ctx.expectError(GL_INVALID_OPERATION);
1269	ctx.endSection();
1270}
1271
1272void uniformui_incompatible_type (NegativeTestContext& ctx)
1273{
1274	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1275
1276	ctx.glUseProgram(program.getProgram());
1277	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1278	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
1279	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
1280	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1281	ctx.expectError(GL_NO_ERROR);
1282
1283	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1284	{
1285		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1286		ctx.fail("Failed to retrieve uniform location");
1287	}
1288
1289	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.");
1290	ctx.glUseProgram(program.getProgram());
1291	ctx.glUniform1ui(uvec4_f, 0);
1292	ctx.expectError(GL_INVALID_OPERATION);
1293	ctx.glUniform2ui(uvec4_f, 0, 0);
1294	ctx.expectError(GL_INVALID_OPERATION);
1295	ctx.glUniform3ui(uvec4_f, 0, 0, 0);
1296	ctx.expectError(GL_INVALID_OPERATION);
1297	ctx.glUniform4ui(uvec4_f, 0, 0, 0, 0);
1298	ctx.expectError(GL_NO_ERROR);
1299	ctx.endSection();
1300
1301	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.");
1302	ctx.glUseProgram(program.getProgram());
1303	ctx.glUniform1ui(ivec4_f, 0);
1304	ctx.expectError(GL_INVALID_OPERATION);
1305	ctx.glUniform2ui(ivec4_f, 0, 0);
1306	ctx.expectError(GL_INVALID_OPERATION);
1307	ctx.glUniform3ui(ivec4_f, 0, 0, 0);
1308	ctx.expectError(GL_INVALID_OPERATION);
1309	ctx.glUniform4ui(ivec4_f, 0, 0, 0, 0);
1310	ctx.expectError(GL_INVALID_OPERATION);
1311	ctx.endSection();
1312
1313	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.");
1314	ctx.glUseProgram(program.getProgram());
1315	ctx.glUniform1ui(vec4_v, 0);
1316	ctx.expectError(GL_INVALID_OPERATION);
1317	ctx.glUniform2ui(vec4_v, 0, 0);
1318	ctx.expectError(GL_INVALID_OPERATION);
1319	ctx.glUniform3ui(vec4_v, 0, 0, 0);
1320	ctx.expectError(GL_INVALID_OPERATION);
1321	ctx.glUniform4ui(vec4_v, 0, 0, 0, 0);
1322	ctx.expectError(GL_INVALID_OPERATION);
1323	ctx.endSection();
1324
1325	ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1326	ctx.glUseProgram(program.getProgram());
1327	ctx.glUniform1ui(sampler_f, 0);
1328	ctx.expectError(GL_INVALID_OPERATION);
1329	ctx.endSection();
1330
1331	ctx.glUseProgram(0);
1332}
1333
1334void uniformui_invalid_location (NegativeTestContext& ctx)
1335{
1336	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1337
1338	ctx.glUseProgram(program.getProgram());
1339	ctx.expectError(GL_NO_ERROR);
1340
1341	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.");
1342	ctx.glUseProgram(program.getProgram());
1343	ctx.glUniform1i(-2, 0);
1344	ctx.expectError(GL_INVALID_OPERATION);
1345	ctx.glUniform2i(-2, 0, 0);
1346	ctx.expectError(GL_INVALID_OPERATION);
1347	ctx.glUniform3i(-2, 0, 0, 0);
1348	ctx.expectError(GL_INVALID_OPERATION);
1349	ctx.glUniform4i(-2, 0, 0, 0, 0);
1350	ctx.expectError(GL_INVALID_OPERATION);
1351
1352	ctx.glUseProgram(program.getProgram());
1353	ctx.glUniform1i(-1, 0);
1354	ctx.expectError(GL_NO_ERROR);
1355	ctx.glUniform2i(-1, 0, 0);
1356	ctx.expectError(GL_NO_ERROR);
1357	ctx.glUniform3i(-1, 0, 0, 0);
1358	ctx.expectError(GL_NO_ERROR);
1359	ctx.glUniform4i(-1, 0, 0, 0, 0);
1360	ctx.expectError(GL_NO_ERROR);
1361	ctx.endSection();
1362
1363	ctx.glUseProgram(0);
1364}
1365
1366// ctx.glUniform{1234}uiv
1367
1368void uniformuiv_invalid_program (NegativeTestContext& ctx)
1369{
1370	std::vector<GLuint> data(4);
1371
1372	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1373	ctx.glUseProgram(0);
1374	ctx.glUniform1uiv(-1, 1, &data[0]);
1375	ctx.expectError(GL_INVALID_OPERATION);
1376	ctx.glUniform2uiv(-1, 1, &data[0]);
1377	ctx.expectError(GL_INVALID_OPERATION);
1378	ctx.glUniform3uiv(-1, 1, &data[0]);
1379	ctx.expectError(GL_INVALID_OPERATION);
1380	ctx.glUniform4uiv(-1, 1, &data[0]);
1381	ctx.expectError(GL_INVALID_OPERATION);
1382	ctx.endSection();
1383}
1384
1385void uniformuiv_incompatible_type (NegativeTestContext& ctx)
1386{
1387	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1388
1389	ctx.glUseProgram(program.getProgram());
1390	GLint vec4_v	= ctx.glGetUniformLocation(program.getProgram(), "vec4_v");	// vec4
1391	GLint ivec4_f	= ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");	// ivec4
1392	GLint uvec4_f	= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");	// uvec4
1393	GLint sampler_f	= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1394	ctx.expectError(GL_NO_ERROR);
1395
1396	if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1397	{
1398		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1399		ctx.fail("Failed to retrieve uniform location");
1400	}
1401
1402	std::vector<GLuint> data(4);
1403
1404	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.");
1405	ctx.glUseProgram(program.getProgram());
1406	ctx.glUniform1uiv(uvec4_f, 1, &data[0]);
1407	ctx.expectError(GL_INVALID_OPERATION);
1408	ctx.glUniform2uiv(uvec4_f, 1, &data[0]);
1409	ctx.expectError(GL_INVALID_OPERATION);
1410	ctx.glUniform3uiv(uvec4_f, 1, &data[0]);
1411	ctx.expectError(GL_INVALID_OPERATION);
1412	ctx.glUniform4uiv(uvec4_f, 1, &data[0]);
1413	ctx.expectError(GL_NO_ERROR);
1414	ctx.endSection();
1415
1416	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.");
1417	ctx.glUseProgram(program.getProgram());
1418	ctx.glUniform1uiv(vec4_v, 1, &data[0]);
1419	ctx.expectError(GL_INVALID_OPERATION);
1420	ctx.glUniform2uiv(vec4_v, 1, &data[0]);
1421	ctx.expectError(GL_INVALID_OPERATION);
1422	ctx.glUniform3uiv(vec4_v, 1, &data[0]);
1423	ctx.expectError(GL_INVALID_OPERATION);
1424	ctx.glUniform4uiv(vec4_v, 1, &data[0]);
1425	ctx.expectError(GL_INVALID_OPERATION);
1426	ctx.endSection();
1427
1428	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.");
1429	ctx.glUseProgram(program.getProgram());
1430	ctx.glUniform1uiv(ivec4_f, 1, &data[0]);
1431	ctx.expectError(GL_INVALID_OPERATION);
1432	ctx.glUniform2uiv(ivec4_f, 1, &data[0]);
1433	ctx.expectError(GL_INVALID_OPERATION);
1434	ctx.glUniform3uiv(ivec4_f, 1, &data[0]);
1435	ctx.expectError(GL_INVALID_OPERATION);
1436	ctx.glUniform4uiv(ivec4_f, 1, &data[0]);
1437	ctx.expectError(GL_INVALID_OPERATION);
1438	ctx.endSection();
1439
1440	ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1441	ctx.glUseProgram(program.getProgram());
1442	ctx.glUniform1uiv(sampler_f, 1, &data[0]);
1443	ctx.expectError(GL_INVALID_OPERATION);
1444	ctx.endSection();
1445
1446	ctx.glUseProgram(0);
1447}
1448
1449void uniformuiv_invalid_location (NegativeTestContext& ctx)
1450{
1451	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1452
1453	ctx.glUseProgram(program.getProgram());
1454	ctx.expectError(GL_NO_ERROR);
1455
1456	std::vector<GLuint> data(4);
1457
1458	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.");
1459	ctx.glUseProgram(program.getProgram());
1460	ctx.glUniform1uiv(-2, 1, &data[0]);
1461	ctx.expectError(GL_INVALID_OPERATION);
1462	ctx.glUniform2uiv(-2, 1, &data[0]);
1463	ctx.expectError(GL_INVALID_OPERATION);
1464	ctx.glUniform3uiv(-2, 1, &data[0]);
1465	ctx.expectError(GL_INVALID_OPERATION);
1466	ctx.glUniform4uiv(-2, 1, &data[0]);
1467	ctx.expectError(GL_INVALID_OPERATION);
1468
1469	ctx.glUseProgram(program.getProgram());
1470	ctx.glUniform1uiv(-1, 1, &data[0]);
1471	ctx.expectError(GL_NO_ERROR);
1472	ctx.glUniform2uiv(-1, 1, &data[0]);
1473	ctx.expectError(GL_NO_ERROR);
1474	ctx.glUniform3uiv(-1, 1, &data[0]);
1475	ctx.expectError(GL_NO_ERROR);
1476	ctx.glUniform4uiv(-1, 1, &data[0]);
1477	ctx.expectError(GL_NO_ERROR);
1478	ctx.endSection();
1479
1480	ctx.glUseProgram(0);
1481}
1482
1483void uniformuiv_invalid_count (NegativeTestContext& ctx)
1484{
1485	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1486
1487	ctx.glUseProgram			(program.getProgram());
1488	int uvec4_f				= ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1489	ctx.expectError(GL_NO_ERROR);
1490
1491	if (uvec4_f == -1)
1492	{
1493		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1494		ctx.fail("Failed to retrieve uniform location");
1495	}
1496
1497	std::vector<GLuint> data(8);
1498
1499	ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1500	ctx.glUseProgram(program.getProgram());
1501	ctx.glUniform1uiv(uvec4_f, 2, &data[0]);
1502	ctx.expectError(GL_INVALID_OPERATION);
1503	ctx.glUniform2uiv(uvec4_f, 2, &data[0]);
1504	ctx.expectError(GL_INVALID_OPERATION);
1505	ctx.glUniform3uiv(uvec4_f, 2, &data[0]);
1506	ctx.expectError(GL_INVALID_OPERATION);
1507	ctx.glUniform4uiv(uvec4_f, 2, &data[0]);
1508	ctx.expectError(GL_INVALID_OPERATION);
1509	ctx.endSection();
1510
1511	ctx.glUseProgram(0);
1512}
1513
1514
1515// ctx.glUniformMatrix*fv
1516
1517void uniform_matrixfv_invalid_program (NegativeTestContext& ctx)
1518{
1519	std::vector<GLfloat> data(16);
1520
1521	ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1522	ctx.glUseProgram(0);
1523	ctx.glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1524	ctx.expectError(GL_INVALID_OPERATION);
1525	ctx.glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1526	ctx.expectError(GL_INVALID_OPERATION);
1527	ctx.glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1528	ctx.expectError(GL_INVALID_OPERATION);
1529
1530	ctx.glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1531	ctx.expectError(GL_INVALID_OPERATION);
1532	ctx.glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1533	ctx.expectError(GL_INVALID_OPERATION);
1534	ctx.glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1535	ctx.expectError(GL_INVALID_OPERATION);
1536	ctx.glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1537	ctx.expectError(GL_INVALID_OPERATION);
1538	ctx.glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1539	ctx.expectError(GL_INVALID_OPERATION);
1540	ctx.glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1541	ctx.expectError(GL_INVALID_OPERATION);
1542	ctx.endSection();
1543}
1544
1545void uniform_matrixfv_incompatible_type (NegativeTestContext& ctx)
1546{
1547	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1548
1549	ctx.glUseProgram			(program.getProgram());
1550	GLint mat4_v			= ctx.glGetUniformLocation(program.getProgram(), "mat4_v");	// mat4
1551	GLint sampler_f			= ctx.glGetUniformLocation(program.getProgram(), "sampler_f");	// sampler2D
1552	ctx.expectError(GL_NO_ERROR);
1553
1554	if (mat4_v == -1 || sampler_f == -1)
1555	{
1556		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1557		ctx.fail("Failed to retrieve uniform location");
1558	}
1559
1560	std::vector<GLfloat> data(16);
1561
1562	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.");
1563	ctx.glUseProgram(program.getProgram());
1564	ctx.glUniformMatrix2fv(mat4_v, 1, GL_FALSE, &data[0]);
1565	ctx.expectError(GL_INVALID_OPERATION);
1566	ctx.glUniformMatrix3fv(mat4_v, 1, GL_FALSE, &data[0]);
1567	ctx.expectError(GL_INVALID_OPERATION);
1568	ctx.glUniformMatrix4fv(mat4_v, 1, GL_FALSE, &data[0]);
1569	ctx.expectError(GL_NO_ERROR);
1570
1571	ctx.glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1572	ctx.expectError(GL_INVALID_OPERATION);
1573	ctx.glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1574	ctx.expectError(GL_INVALID_OPERATION);
1575	ctx.glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1576	ctx.expectError(GL_INVALID_OPERATION);
1577	ctx.glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1578	ctx.expectError(GL_INVALID_OPERATION);
1579	ctx.glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1580	ctx.expectError(GL_INVALID_OPERATION);
1581	ctx.glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1582	ctx.expectError(GL_INVALID_OPERATION);
1583	ctx.endSection();
1584
1585	ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1586	ctx.glUseProgram(program.getProgram());
1587	ctx.glUniformMatrix2fv(sampler_f, 1, GL_FALSE, &data[0]);
1588	ctx.expectError(GL_INVALID_OPERATION);
1589	ctx.glUniformMatrix3fv(sampler_f, 1, GL_FALSE, &data[0]);
1590	ctx.expectError(GL_INVALID_OPERATION);
1591	ctx.glUniformMatrix4fv(sampler_f, 1, GL_FALSE, &data[0]);
1592	ctx.expectError(GL_INVALID_OPERATION);
1593
1594	ctx.glUniformMatrix2x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1595	ctx.expectError(GL_INVALID_OPERATION);
1596	ctx.glUniformMatrix3x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1597	ctx.expectError(GL_INVALID_OPERATION);
1598	ctx.glUniformMatrix2x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1599	ctx.expectError(GL_INVALID_OPERATION);
1600	ctx.glUniformMatrix4x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1601	ctx.expectError(GL_INVALID_OPERATION);
1602	ctx.glUniformMatrix3x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1603	ctx.expectError(GL_INVALID_OPERATION);
1604	ctx.glUniformMatrix4x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1605	ctx.expectError(GL_INVALID_OPERATION);
1606	ctx.endSection();
1607
1608	ctx.glUseProgram(0);
1609}
1610
1611void uniform_matrixfv_invalid_location (NegativeTestContext& ctx)
1612{
1613	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1614
1615	ctx.glUseProgram(program.getProgram());
1616	ctx.expectError(GL_NO_ERROR);
1617
1618	std::vector<GLfloat> data(16);
1619
1620	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.");
1621	ctx.glUseProgram(program.getProgram());
1622	ctx.glUniformMatrix2fv(-2, 1, GL_FALSE, &data[0]);
1623	ctx.expectError(GL_INVALID_OPERATION);
1624	ctx.glUniformMatrix3fv(-2, 1, GL_FALSE, &data[0]);
1625	ctx.expectError(GL_INVALID_OPERATION);
1626	ctx.glUniformMatrix4fv(-2, 1, GL_FALSE, &data[0]);
1627	ctx.expectError(GL_INVALID_OPERATION);
1628
1629	ctx.glUniformMatrix2x3fv(-2, 1, GL_FALSE, &data[0]);
1630	ctx.expectError(GL_INVALID_OPERATION);
1631	ctx.glUniformMatrix3x2fv(-2, 1, GL_FALSE, &data[0]);
1632	ctx.expectError(GL_INVALID_OPERATION);
1633	ctx.glUniformMatrix2x4fv(-2, 1, GL_FALSE, &data[0]);
1634	ctx.expectError(GL_INVALID_OPERATION);
1635	ctx.glUniformMatrix4x2fv(-2, 1, GL_FALSE, &data[0]);
1636	ctx.expectError(GL_INVALID_OPERATION);
1637	ctx.glUniformMatrix3x4fv(-2, 1, GL_FALSE, &data[0]);
1638	ctx.expectError(GL_INVALID_OPERATION);
1639	ctx.glUniformMatrix4x3fv(-2, 1, GL_FALSE, &data[0]);
1640	ctx.expectError(GL_INVALID_OPERATION);
1641
1642	ctx.glUseProgram(program.getProgram());
1643	ctx.glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1644	ctx.expectError(GL_NO_ERROR);
1645	ctx.glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1646	ctx.expectError(GL_NO_ERROR);
1647	ctx.glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1648	ctx.expectError(GL_NO_ERROR);
1649
1650	ctx.glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1651	ctx.expectError(GL_NO_ERROR);
1652	ctx.glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1653	ctx.expectError(GL_NO_ERROR);
1654	ctx.glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1655	ctx.expectError(GL_NO_ERROR);
1656	ctx.glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1657	ctx.expectError(GL_NO_ERROR);
1658	ctx.glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1659	ctx.expectError(GL_NO_ERROR);
1660	ctx.glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1661	ctx.expectError(GL_NO_ERROR);
1662	ctx.endSection();
1663
1664	ctx.glUseProgram(0);
1665}
1666
1667void uniform_matrixfv_invalid_count (NegativeTestContext& ctx)
1668{
1669	glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1670
1671	ctx.glUseProgram			(program.getProgram());
1672	GLint mat4_v			= ctx.glGetUniformLocation(program.getProgram(), "mat4_v"); // mat4
1673	ctx.expectError(GL_NO_ERROR);
1674
1675	if (mat4_v == -1)
1676	{
1677		ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1678		ctx.fail("Failed to retrieve uniform location");
1679	}
1680
1681	std::vector<GLfloat> data(32);
1682
1683	ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1684	ctx.glUseProgram(program.getProgram());
1685	ctx.glUniformMatrix2fv(mat4_v, 2, GL_FALSE, &data[0]);
1686	ctx.expectError(GL_INVALID_OPERATION);
1687	ctx.glUniformMatrix3fv(mat4_v, 2, GL_FALSE, &data[0]);
1688	ctx.expectError(GL_INVALID_OPERATION);
1689	ctx.glUniformMatrix4fv(mat4_v, 2, GL_FALSE, &data[0]);
1690	ctx.expectError(GL_INVALID_OPERATION);
1691
1692	ctx.glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1693	ctx.expectError(GL_INVALID_OPERATION);
1694	ctx.glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1695	ctx.expectError(GL_INVALID_OPERATION);
1696	ctx.glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1697	ctx.expectError(GL_INVALID_OPERATION);
1698	ctx.glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1699	ctx.expectError(GL_INVALID_OPERATION);
1700	ctx.glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1701	ctx.expectError(GL_INVALID_OPERATION);
1702	ctx.glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1703	ctx.expectError(GL_INVALID_OPERATION);
1704	ctx.endSection();
1705
1706	ctx.glUseProgram(0);
1707}
1708
1709// Transform feedback
1710void gen_transform_feedbacks (NegativeTestContext& ctx)
1711{
1712	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
1713	GLuint id = 0;
1714	ctx.glGenTransformFeedbacks(-1, &id);
1715	ctx.expectError(GL_INVALID_VALUE);
1716	ctx.endSection();
1717}
1718
1719void bind_transform_feedback (NegativeTestContext& ctx)
1720{
1721	GLuint						tfID[2];
1722	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1723	deUint32					buf = 0x1234;
1724	const char* tfVarying		= "gl_Position";
1725
1726	ctx.glGenBuffers				(1, &buf);
1727	ctx.glGenTransformFeedbacks		(2, tfID);
1728
1729	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_TRANSFORM_FEEDBACK.");
1730	ctx.glBindTransformFeedback(-1, tfID[0]);
1731	ctx.expectError(GL_INVALID_ENUM);
1732	ctx.endSection();
1733
1734	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.");
1735	ctx.glUseProgram				(program.getProgram());
1736	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1737	ctx.glLinkProgram				(program.getProgram());
1738	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID[0]);
1739	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1740	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1741	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1742	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
1743	ctx.expectError				(GL_NO_ERROR);
1744
1745	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID[1]);
1746	ctx.expectError				(GL_INVALID_OPERATION);
1747
1748	ctx.glEndTransformFeedback		();
1749	ctx.expectError				(GL_NO_ERROR);
1750	ctx.endSection();
1751
1752	ctx.glUseProgram				(0);
1753	ctx.glDeleteBuffers				(1, &buf);
1754	ctx.glDeleteTransformFeedbacks	(2, tfID);
1755	ctx.expectError				(GL_NO_ERROR);
1756}
1757
1758void delete_transform_feedbacks (NegativeTestContext& ctx)
1759{
1760	GLuint id = 0;
1761	ctx.glGenTransformFeedbacks(1, &id);
1762
1763	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
1764	ctx.glDeleteTransformFeedbacks(-1, &id);
1765	ctx.expectError(GL_INVALID_VALUE);
1766	ctx.endSection();
1767
1768	ctx.glDeleteTransformFeedbacks(1, &id);
1769}
1770
1771void begin_transform_feedback (NegativeTestContext& ctx)
1772{
1773	GLuint						tfID[2];
1774	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1775	deUint32					buf = 0x1234;
1776	const char* tfVarying		= "gl_Position";
1777
1778	ctx.glGenBuffers				(1, &buf);
1779	ctx.glGenTransformFeedbacks		(2, tfID);
1780
1781	ctx.glUseProgram				(program.getProgram());
1782	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1783	ctx.glLinkProgram				(program.getProgram());
1784	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID[0]);
1785	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1786	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1787	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1788	ctx.expectError					(GL_NO_ERROR);
1789
1790	ctx.beginSection("GL_INVALID_ENUM is generated if primitiveMode is not one of GL_POINTS, GL_LINES, or GL_TRIANGLES.");
1791	ctx.glBeginTransformFeedback	(-1);
1792	ctx.expectError					(GL_INVALID_ENUM);
1793	ctx.endSection();
1794
1795	ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is already active.");
1796	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
1797	ctx.expectError					(GL_NO_ERROR);
1798	ctx.glBeginTransformFeedback	(GL_POINTS);
1799	ctx.expectError					(GL_INVALID_OPERATION);
1800	ctx.endSection();
1801
1802	ctx.beginSection("GL_INVALID_OPERATION is generated if any binding point used in transform feedback mode does not have a buffer object bound.");
1803	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
1804	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
1805	ctx.expectError					(GL_INVALID_OPERATION);
1806	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1807	ctx.endSection();
1808
1809	ctx.beginSection("GL_INVALID_OPERATION is generated if no binding points would be used because no program object is active.");
1810	ctx.glUseProgram				(0);
1811	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
1812	ctx.expectError					(GL_INVALID_OPERATION);
1813	ctx.glUseProgram				(program.getProgram());
1814	ctx.endSection();
1815
1816	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.");
1817	ctx.glTransformFeedbackVaryings	(program.getProgram(), 0, 0, GL_INTERLEAVED_ATTRIBS);
1818	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
1819	ctx.expectError					(GL_INVALID_OPERATION);
1820	ctx.endSection();
1821
1822	ctx.glEndTransformFeedback		();
1823	ctx.glDeleteBuffers				(1, &buf);
1824	ctx.glDeleteTransformFeedbacks	(2, tfID);
1825	ctx.expectError					(GL_NO_ERROR);
1826}
1827
1828void pause_transform_feedback (NegativeTestContext& ctx)
1829{
1830	GLuint						tfID[2];
1831	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1832	deUint32					buf = 0x1234;
1833	const char* tfVarying		= "gl_Position";
1834
1835	ctx.glGenBuffers				(1, &buf);
1836	ctx.glGenTransformFeedbacks		(2, tfID);
1837
1838	ctx.glUseProgram				(program.getProgram());
1839	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1840	ctx.glLinkProgram				(program.getProgram());
1841	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID[0]);
1842	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1843	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1844	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1845	ctx.expectError					(GL_NO_ERROR);
1846
1847	ctx.beginSection("GL_INVALID_OPERATION is generated if the currently bound transform feedback object is not active or is paused.");
1848	ctx.glPauseTransformFeedback	();
1849	ctx.expectError					(GL_INVALID_OPERATION);
1850	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
1851	ctx.glPauseTransformFeedback	();
1852	ctx.expectError					(GL_NO_ERROR);
1853	ctx.glPauseTransformFeedback	();
1854	ctx.expectError					(GL_INVALID_OPERATION);
1855	ctx.endSection();
1856
1857	ctx.glEndTransformFeedback		();
1858	ctx.glDeleteBuffers				(1, &buf);
1859	ctx.glDeleteTransformFeedbacks	(2, tfID);
1860	ctx.expectError					(GL_NO_ERROR);
1861}
1862
1863void resume_transform_feedback (NegativeTestContext& ctx)
1864{
1865	GLuint						tfID[2];
1866	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1867	deUint32					buf = 0x1234;
1868	const char* tfVarying		= "gl_Position";
1869
1870	ctx.glGenBuffers				(1, &buf);
1871	ctx.glGenTransformFeedbacks		(2, tfID);
1872
1873	ctx.glUseProgram				(program.getProgram());
1874	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1875	ctx.glLinkProgram				(program.getProgram());
1876	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID[0]);
1877	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1878	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1879	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1880	ctx.expectError					(GL_NO_ERROR);
1881
1882	ctx.beginSection("GL_INVALID_OPERATION is generated if the currently bound transform feedback object is not active or is not paused.");
1883	ctx.glResumeTransformFeedback	();
1884	ctx.expectError					(GL_INVALID_OPERATION);
1885	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
1886	ctx.glResumeTransformFeedback	();
1887	ctx.expectError					(GL_INVALID_OPERATION);
1888	ctx.glPauseTransformFeedback	();
1889	ctx.glResumeTransformFeedback	();
1890	ctx.expectError					(GL_NO_ERROR);
1891	ctx.endSection();
1892
1893	ctx.glEndTransformFeedback		();
1894	ctx.glDeleteBuffers				(1, &buf);
1895	ctx.glDeleteTransformFeedbacks	(2, tfID);
1896	ctx.expectError					(GL_NO_ERROR);
1897}
1898
1899void end_transform_feedback (NegativeTestContext& ctx)
1900{
1901	GLuint						tfID = 0;
1902	glu::ShaderProgram			program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1903	deUint32					buf = 0x1234;
1904	const char* tfVarying		= "gl_Position";
1905
1906	ctx.glGenBuffers				(1, &buf);
1907	ctx.glGenTransformFeedbacks		(1, &tfID);
1908
1909	ctx.glUseProgram				(program.getProgram());
1910	ctx.glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1911	ctx.glLinkProgram				(program.getProgram());
1912	ctx.glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
1913	ctx.glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1914	ctx.glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1915	ctx.glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1916	ctx.expectError					(GL_NO_ERROR);
1917
1918	ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is not active.");
1919	ctx.glEndTransformFeedback		();
1920	ctx.expectError					(GL_INVALID_OPERATION);
1921	ctx.glBeginTransformFeedback	(GL_TRIANGLES);
1922	ctx.glEndTransformFeedback		();
1923	ctx.expectError					(GL_NO_ERROR);
1924	ctx.endSection();
1925
1926	ctx.glDeleteBuffers				(1, &buf);
1927	ctx.glDeleteTransformFeedbacks	(1, &tfID);
1928	ctx.expectError					(GL_NO_ERROR);
1929}
1930
1931void get_transform_feedback_varying (NegativeTestContext& ctx)
1932{
1933	GLuint					tfID = 0;
1934	glu::ShaderProgram		program			(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1935	glu::ShaderProgram		programInvalid	(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, ""));
1936	const char* tfVarying	= "gl_Position";
1937	int						maxTransformFeedbackVaryings = 0;
1938
1939	GLsizei					length;
1940	GLsizei					size;
1941	GLenum					type;
1942	char					name[32];
1943
1944	ctx.glGenTransformFeedbacks				(1, &tfID);
1945
1946	ctx.glTransformFeedbackVaryings			(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1947	ctx.expectError						(GL_NO_ERROR);
1948	ctx.glLinkProgram						(program.getProgram());
1949	ctx.expectError						(GL_NO_ERROR);
1950
1951	ctx.glBindTransformFeedback				(GL_TRANSFORM_FEEDBACK, tfID);
1952	ctx.expectError						(GL_NO_ERROR);
1953
1954	ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object.");
1955	ctx.glGetTransformFeedbackVarying		(-1, 0, 32, &length, &size, &type, &name[0]);
1956	ctx.expectError						(GL_INVALID_VALUE);
1957	ctx.endSection();
1958
1959	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater or equal to the value of GL_TRANSFORM_FEEDBACK_VARYINGS.");
1960	ctx.glGetProgramiv						(program.getProgram(), GL_TRANSFORM_FEEDBACK_VARYINGS, &maxTransformFeedbackVaryings);
1961	ctx.glGetTransformFeedbackVarying		(program.getProgram(), maxTransformFeedbackVaryings, 32, &length, &size, &type, &name[0]);
1962	ctx.expectError						(GL_INVALID_VALUE);
1963	ctx.endSection();
1964
1965	ctx.beginSection("GL_INVALID_OPERATION or GL_INVALID_VALUE is generated program has not been linked.");
1966	ctx.glGetTransformFeedbackVarying		(programInvalid.getProgram(), 0, 32, &length, &size, &type, &name[0]);
1967	ctx.expectError						(GL_INVALID_OPERATION, GL_INVALID_VALUE);
1968	ctx.endSection();
1969
1970	ctx.glDeleteTransformFeedbacks			(1, &tfID);
1971	ctx.expectError						(GL_NO_ERROR);
1972}
1973
1974void transform_feedback_varyings (NegativeTestContext& ctx)
1975{
1976	GLuint					tfID = 0;
1977	glu::ShaderProgram		program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1978	const char* tfVarying	= "gl_Position";
1979	GLint					maxTransformFeedbackSeparateAttribs = 0;
1980
1981	ctx.glGenTransformFeedbacks				(1, &tfID);
1982	ctx.expectError						(GL_NO_ERROR);
1983
1984	ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object.");
1985	ctx.glTransformFeedbackVaryings			(0, 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1986	ctx.expectError						(GL_INVALID_VALUE);
1987	ctx.endSection();
1988
1989	ctx.beginSection("GL_INVALID_VALUE is generated if bufferMode is GL_SEPARATE_ATTRIBS and count is greater than GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.");
1990	ctx.glGetIntegerv						(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTransformFeedbackSeparateAttribs);
1991	ctx.glTransformFeedbackVaryings			(program.getProgram(), maxTransformFeedbackSeparateAttribs+1, &tfVarying, GL_SEPARATE_ATTRIBS);
1992	ctx.expectError						(GL_INVALID_VALUE);
1993	ctx.endSection();
1994
1995	ctx.glDeleteTransformFeedbacks			(1, &tfID);
1996	ctx.expectError						(GL_NO_ERROR);
1997}
1998
1999std::vector<FunctionContainer> getNegativeShaderApiTestFunctions ()
2000{
2001	FunctionContainer funcs[] =
2002	{
2003		{create_shader,							"create_shader",						"Invalid glCreateShader() usage"			   },
2004		{shader_source,							"shader_source",						"Invalid glShaderSource() usage"			   },
2005		{compile_shader,						"compile_shader",						"Invalid glCompileShader() usage"			   },
2006		{delete_shader,							"delete_shader",						"Invalid glDeleteShader() usage"			   },
2007		{shader_binary,							"shader_binary",						"Invalid glShaderBinary() usage"			   },
2008		{attach_shader,							"attach_shader",						"Invalid glAttachShader() usage"			   },
2009		{detach_shader,							"detach_shader",						"Invalid glDetachShader() usage"			   },
2010		{link_program,							"link_program",							"Invalid glLinkProgram() usage"				   },
2011		{use_program,							"use_program",							"Invalid glUseProgram() usage"				   },
2012		{delete_program,						"delete_program",						"Invalid glDeleteProgram() usage"			   },
2013		{validate_program,						"validate_program",						"Invalid glValidateProgram() usage"			   },
2014		{get_program_binary,					"get_program_binary",					"Invalid glGetProgramBinary() usage"		   },
2015		{program_binary,						"program_binary",						"Invalid glProgramBinary() usage"			   },
2016		{program_parameteri,					"program_parameteri",					"Invalid glProgramParameteri() usage"		   },
2017		{gen_samplers,							"gen_samplers",							"Invalid glGenSamplers() usage"				   },
2018		{bind_sampler,							"bind_sampler",							"Invalid glBindSampler() usage"				   },
2019		{delete_samplers,						"delete_samplers",						"Invalid glDeleteSamplers() usage"			   },
2020		{get_sampler_parameteriv,				"get_sampler_parameteriv",				"Invalid glGetSamplerParameteriv() usage"	   },
2021		{get_sampler_parameterfv,				"get_sampler_parameterfv",				"Invalid glGetSamplerParameterfv() usage"	   },
2022		{sampler_parameteri,					"sampler_parameteri",					"Invalid glSamplerParameteri() usage"		   },
2023		{sampler_parameteriv,					"sampler_parameteriv",					"Invalid glSamplerParameteriv() usage"		   },
2024		{sampler_parameterf,					"sampler_parameterf",					"Invalid glSamplerParameterf() usage"		   },
2025		{sampler_parameterfv,					"sampler_parameterfv",					"Invalid glSamplerParameterfv() usage"		   },
2026		{get_attrib_location,					"get_attrib_location",					"Invalid glGetAttribLocation() usage"		   },
2027		{get_uniform_location,					"get_uniform_location",					"Invalid glGetUniformLocation() usage"		   },
2028		{bind_attrib_location,					"bind_attrib_location",					"Invalid glBindAttribLocation() usage"		   },
2029		{uniform_block_binding,					"uniform_block_binding",				"Invalid glUniformBlockBinding() usage"		   },
2030		{uniformf_invalid_program,				"uniformf_invalid_program",				"Invalid glUniform{1234}f() usage"			   },
2031		{uniformf_incompatible_type,			"uniformf_incompatible_type",			"Invalid glUniform{1234}f() usage"			   },
2032		{uniformf_invalid_location,				"uniformf_invalid_location",			"Invalid glUniform{1234}f() usage"			   },
2033		{uniformfv_invalid_program,				"uniformfv_invalid_program",			"Invalid glUniform{1234}fv() usage"			   },
2034		{uniformfv_incompatible_type,			"uniformfv_incompatible_type",			"Invalid glUniform{1234}fv() usage"			   },
2035		{uniformfv_invalid_location,			"uniformfv_invalid_location",			"Invalid glUniform{1234}fv() usage"			   },
2036		{uniformfv_invalid_count,				"uniformfv_invalid_count",				"Invalid glUniform{1234}fv() usage"			   },
2037		{uniformi_invalid_program,				"uniformi_invalid_program",				"Invalid glUniform{1234}i() usage"			   },
2038		{uniformi_incompatible_type,			"uniformi_incompatible_type",			"Invalid glUniform{1234}i() usage"			   },
2039		{uniformi_invalid_location,				"uniformi_invalid_location",			"Invalid glUniform{1234}i() usage"			   },
2040		{uniformiv_invalid_program,				"uniformiv_invalid_program",			"Invalid glUniform{1234}iv() usage"			   },
2041		{uniformiv_incompatible_type,			"uniformiv_incompatible_type",			"Invalid glUniform{1234}iv() usage"			   },
2042		{uniformiv_invalid_location,			"uniformiv_invalid_location",			"Invalid glUniform{1234}iv() usage"			   },
2043		{uniformiv_invalid_count,				"uniformiv_invalid_count",				"Invalid glUniform{1234}iv() usage"			   },
2044		{uniformui_invalid_program,				"uniformui_invalid_program",			"Invalid glUniform{234}ui() usage"			   },
2045		{uniformui_incompatible_type,			"uniformui_incompatible_type",			"Invalid glUniform{1234}ui() usage"			   },
2046		{uniformui_invalid_location,			"uniformui_invalid_location",			"Invalid glUniform{1234}ui() usage"			   },
2047		{uniformuiv_invalid_program,			"uniformuiv_invalid_program",			"Invalid glUniform{234}uiv() usage"			   },
2048		{uniformuiv_incompatible_type,			"uniformuiv_incompatible_type",			"Invalid glUniform{1234}uiv() usage"		   },
2049		{uniformuiv_invalid_location,			"uniformuiv_invalid_location",			"Invalid glUniform{1234}uiv() usage"		   },
2050		{uniformuiv_invalid_count,				"uniformuiv_invalid_count",				"Invalid glUniform{1234}uiv() usage"		   },
2051		{uniform_matrixfv_invalid_program,		"uniform_matrixfv_invalid_program",		"Invalid glUniformMatrix{234}fv() usage"	   },
2052		{uniform_matrixfv_incompatible_type,	"uniform_matrixfv_incompatible_type",	"Invalid glUniformMatrix{234}fv() usage"	   },
2053		{uniform_matrixfv_invalid_location,		"uniform_matrixfv_invalid_location",	"Invalid glUniformMatrix{234}fv() usage"	   },
2054		{uniform_matrixfv_invalid_count,		"uniform_matrixfv_invalid_count",		"Invalid glUniformMatrix{234}fv() usage"	   },
2055		{gen_transform_feedbacks,				"gen_transform_feedbacks",				"Invalid glGenTransformFeedbacks() usage"	   },
2056		{bind_transform_feedback,				"bind_transform_feedback",				"Invalid glBindTransformFeedback() usage"	   },
2057		{delete_transform_feedbacks,			"delete_transform_feedbacks",			"Invalid glDeleteTransformFeedbacks() usage"   },
2058		{begin_transform_feedback,				"begin_transform_feedback",				"Invalid glBeginTransformFeedback() usage"	   },
2059		{pause_transform_feedback,				"pause_transform_feedback",				"Invalid glPauseTransformFeedback() usage"	   },
2060		{resume_transform_feedback,				"resume_transform_feedback",			"Invalid glResumeTransformFeedback() usage"	   },
2061		{end_transform_feedback,				"end_transform_feedback",				"Invalid glEndTransformFeedback() usage"	   },
2062		{get_transform_feedback_varying,		"get_transform_feedback_varying",		"Invalid glGetTransformFeedbackVarying() usage"},
2063		{transform_feedback_varyings,			"transform_feedback_varyings",			"Invalid glTransformFeedbackVaryings() usage"  },
2064	};
2065
2066	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
2067}
2068
2069} // NegativeTestShared
2070} // Functional
2071} // gles31
2072} // deqp
2073