1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 3.1 Module
3 * -------------------------------------------------
5 * Copyright 2014 The Android Open Source Project
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * \brief Negative Shader API tests.
22 *//*--------------------------------------------------------------------*/
24 #include "es31fNegativeShaderApiTests.hpp"
26 #include "deUniquePtr.hpp"
28 #include "glwDefs.hpp"
29 #include "glwEnums.hpp"
31 #include "gluShaderProgram.hpp"
32 #include "gluCallLogWrapper.hpp"
42 namespace NegativeTestShared
45 using glu::CallLogWrapper;
48 static const char* vertexShaderSource = "#version 300 es\n"
51 " gl_Position = vec4(0.0);\n"
54 static const char* fragmentShaderSource = "#version 300 es\n"
55 "layout(location = 0) out mediump vec4 fragColor;"
58 " fragColor = vec4(0.0);\n"
61 static const char* uniformTestVertSource = "#version 300 es\n"
62 "uniform mediump vec4 vec4_v;\n"
63 "uniform mediump mat4 mat4_v;\n"
66 " gl_Position = mat4_v * vec4_v;\n"
69 static 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;"
76 " fragColor.xy = (vec4(uvec4_f) + vec4(ivec4_f)).xy;\n"
77 " fragColor.zw = texture(sampler_f, vec2(0.0, 0.0)).zw;\n"
80 static const char* uniformBlockVertSource = "#version 300 es\n"
81 "layout(shared) uniform Block { lowp float var; };\n"
84 " gl_Position = vec4(var);\n"
88 // Shader control commands
89 void create_shader (NegativeTestContext& ctx)
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);
97 void shader_source (NegativeTestContext& ctx)
99 // make notAShader not a shader id
100 const GLuint notAShader = ctx.glCreateShader(GL_VERTEX_SHADER);
101 ctx.glDeleteShader(notAShader);
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);
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);
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);
120 ctx.glDeleteProgram(program);
121 ctx.glDeleteShader(shader);
124 void compile_shader (NegativeTestContext& ctx)
126 // \note Shader compilation must be supported.
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);
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);
139 ctx.glDeleteProgram(program);
142 void delete_shader (NegativeTestContext& ctx)
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);
150 void shader_binary (NegativeTestContext& ctx)
152 std::vector<deInt32> binaryFormats;
155 deInt32 numFormats = 0x1234;
156 ctx.glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &numFormats);
159 ctx.getLog() << TestLog::Message << "// No supported extensions available." << TestLog::EndMessage;
162 binaryFormats.resize(numFormats);
163 ctx.glGetIntegerv(GL_SHADER_BINARY_FORMATS, &binaryFormats[0]);
167 deBool shaderBinarySupported = !binaryFormats.empty();
168 if (!shaderBinarySupported)
169 ctx.getLog() << TestLog::Message << "// Shader binaries not supported." << TestLog::EndMessage;
171 ctx.getLog() << TestLog::Message << "// Shader binaries supported" << TestLog::EndMessage;
174 shaders[0] = ctx.glCreateShader(GL_VERTEX_SHADER);
175 shaders[1] = ctx.glCreateShader(GL_VERTEX_SHADER);
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);
182 if (shaderBinarySupported)
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);
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);
196 ctx.glDeleteShader(shaders[0]);
197 ctx.glDeleteShader(shaders[1]);
200 void attach_shader (NegativeTestContext& ctx)
202 GLuint shader1 = ctx.glCreateShader(GL_VERTEX_SHADER);
203 GLuint shader2 = ctx.glCreateShader(GL_VERTEX_SHADER);
204 GLuint program = ctx.glCreateProgram();
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);
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);
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);
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);
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);
239 ctx.glDeleteProgram(program);
240 ctx.glDeleteShader(shader1);
241 ctx.glDeleteShader(shader2);
244 void detach_shader (NegativeTestContext& ctx)
246 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
247 GLuint program = ctx.glCreateProgram();
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);
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);
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);
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);
275 ctx.glDeleteProgram(program);
276 ctx.glDeleteShader(shader);
279 void link_program (NegativeTestContext& ctx)
281 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
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);
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);
293 ctx.glDeleteShader(shader);
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";
301 ctx.glGenTransformFeedbacks (1, &tfID);
302 ctx.glGenBuffers (1, &buf);
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);
314 ctx.glLinkProgram (program.getProgram());
315 ctx.expectError (GL_INVALID_OPERATION);
317 ctx.glEndTransformFeedback ();
318 ctx.glDeleteTransformFeedbacks (1, &tfID);
319 ctx.glDeleteBuffers (1, &buf);
320 ctx.expectError (GL_NO_ERROR);
324 void use_program (NegativeTestContext& ctx)
326 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
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);
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);
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";
345 ctx.glGenTransformFeedbacks (1, &tfID);
346 ctx.glGenBuffers (1, &buf);
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);
358 ctx.glUseProgram (program2.getProgram());
359 ctx.expectError (GL_INVALID_OPERATION);
361 ctx.glPauseTransformFeedback ();
362 ctx.glUseProgram (program2.getProgram());
363 ctx.expectError (GL_NO_ERROR);
365 ctx.glEndTransformFeedback ();
366 ctx.glDeleteTransformFeedbacks (1, &tfID);
367 ctx.glDeleteBuffers (1, &buf);
368 ctx.expectError (GL_NO_ERROR);
372 ctx.glDeleteShader(shader);
375 void delete_program (NegativeTestContext& ctx)
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);
383 void validate_program (NegativeTestContext& ctx)
385 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
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);
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);
397 ctx.glDeleteShader(shader);
400 void get_program_binary (NegativeTestContext& ctx)
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;
408 GLint linkStatus = -1;
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);
418 ctx.glGetProgramBinary (program.getProgram(), 0, &binaryLength, &binaryFormat, &binaryPtr);
419 ctx.expectError (GL_INVALID_OPERATION);
422 ctx.glGetProgramBinary (program.getProgram(), bufSize-1, &binaryLength, &binaryFormat, &binaryPtr);
423 ctx.expectError (GL_INVALID_OPERATION);
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);
435 ctx.glGetProgramBinary (programInvalid.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryPtr);
436 ctx.expectError (GL_INVALID_OPERATION);
440 void program_binary (NegativeTestContext& ctx)
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;
449 GLint linkStatus = -1;
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;
456 TCU_CHECK(bufSize >= 0);
459 binaryBuf.resize(bufSize);
460 ctx.glGetProgramBinary (srcProgram.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryBuf[0]);
461 ctx.expectError (GL_NO_ERROR);
463 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not the name of an existing program object.");
464 ctx.glProgramBinary (dummyShader, binaryFormat, &binaryBuf[0], binaryLength);
465 ctx.expectError (GL_INVALID_OPERATION);
468 ctx.beginSection("GL_INVALID_ENUM is generated if binaryFormat is not a value recognized by the implementation.");
469 ctx.glProgramBinary (dstProgram, -1, &binaryBuf[0], binaryLength);
470 ctx.expectError (GL_INVALID_ENUM);
474 ctx.glDeleteShader(dummyShader);
475 ctx.glDeleteProgram(dstProgram);
478 void program_parameteri (NegativeTestContext& ctx)
480 GLuint program = ctx.glCreateProgram();
482 ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of an existing program object.");
483 ctx.glProgramParameteri (0, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
484 ctx.expectError (GL_INVALID_VALUE);
487 ctx.beginSection("GL_INVALID_ENUM is generated if pname is not GL_PROGRAM_BINARY_RETRIEVABLE_HINT.");
488 ctx.glProgramParameteri (program, -1, GL_TRUE);
489 ctx.expectError (GL_INVALID_ENUM);
492 ctx.beginSection("GL_INVALID_VALUE is generated if value is not GL_FALSE or GL_TRUE.");
493 ctx.glProgramParameteri (program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, 2);
494 ctx.expectError (GL_INVALID_VALUE);
497 ctx.glDeleteProgram(program);
500 void gen_samplers (NegativeTestContext& ctx)
502 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
504 ctx.glGenSamplers (-1, &sampler);
505 ctx.expectError (GL_INVALID_VALUE);
509 void bind_sampler (NegativeTestContext& ctx)
511 int maxTexImageUnits = 0x1234;
513 ctx.glGetIntegerv (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTexImageUnits);
514 ctx.glGenSamplers (1, &sampler);
516 ctx.beginSection("GL_INVALID_VALUE is generated if unit is greater than or equal to the value of GL_MAX_COMBIED_TEXTURE_IMAGE_UNITS.");
517 ctx.glBindSampler (maxTexImageUnits, sampler);
518 ctx.expectError (GL_INVALID_VALUE);
521 ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not zero or a name previously returned from a call to ctx.glGenSamplers.");
522 ctx.glBindSampler (1, -1);
523 ctx.expectError (GL_INVALID_OPERATION);
526 ctx.beginSection("GL_INVALID_OPERATION is generated if sampler has been deleted by a call to ctx.glDeleteSamplers.");
527 ctx.glDeleteSamplers(1, &sampler);
528 ctx.glBindSampler (1, sampler);
529 ctx.expectError (GL_INVALID_OPERATION);
533 void delete_samplers (NegativeTestContext& ctx)
535 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
536 ctx.glDeleteSamplers(-1, 0);
537 ctx.expectError (GL_INVALID_VALUE);
541 void get_sampler_parameteriv (NegativeTestContext& ctx)
545 ctx.glGenSamplers (1, &sampler);
547 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.");
548 ctx.glGetSamplerParameteriv (-1, GL_TEXTURE_MAG_FILTER, ¶ms);
549 ctx.expectError (GL_INVALID_OPERATION);
552 ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
553 ctx.glGetSamplerParameteriv (sampler, -1, ¶ms);
554 ctx.expectError (GL_INVALID_ENUM);
557 ctx.glDeleteSamplers(1, &sampler);
560 void get_sampler_parameterfv (NegativeTestContext& ctx)
564 ctx.glGenSamplers (1, &sampler);
566 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.");
567 ctx.glGetSamplerParameterfv (-1, GL_TEXTURE_MAG_FILTER, ¶ms);
568 ctx.expectError (GL_INVALID_OPERATION);
571 ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
572 ctx.glGetSamplerParameterfv (sampler, -1, ¶ms);
573 ctx.expectError (GL_INVALID_ENUM);
576 ctx.glDeleteSamplers(1, &sampler);
579 void sampler_parameteri (NegativeTestContext& ctx)
582 ctx.glGenSamplers (1, &sampler);
584 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.");
585 ctx.glSamplerParameteri (-1, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
586 ctx.expectError (GL_INVALID_OPERATION);
589 ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
590 ctx.glSamplerParameteri (sampler, GL_TEXTURE_WRAP_S, -1);
591 ctx.expectError (GL_INVALID_ENUM);
594 ctx.glDeleteSamplers(1, &sampler);
597 void sampler_parameteriv (NegativeTestContext& ctx)
601 ctx.glGenSamplers (1, &sampler);
603 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.");
604 params = GL_CLAMP_TO_EDGE;
605 ctx.glSamplerParameteriv (-1, GL_TEXTURE_WRAP_S, ¶ms);
606 ctx.expectError (GL_INVALID_OPERATION);
609 ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
611 ctx.glSamplerParameteriv (sampler, GL_TEXTURE_WRAP_S, ¶ms);
612 ctx.expectError (GL_INVALID_ENUM);
615 ctx.glDeleteSamplers(1, &sampler);
618 void sampler_parameterf (NegativeTestContext& ctx)
621 ctx.glGenSamplers (1, &sampler);
623 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.");
624 ctx.glSamplerParameterf (-1, GL_TEXTURE_MIN_LOD, -1000.0f);
625 ctx.expectError (GL_INVALID_OPERATION);
628 ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
629 ctx.glSamplerParameterf (sampler, GL_TEXTURE_WRAP_S, -1.0f);
630 ctx.expectError (GL_INVALID_ENUM);
633 ctx.glDeleteSamplers(1, &sampler);
636 void sampler_parameterfv (NegativeTestContext& ctx)
640 ctx.glGenSamplers (1, &sampler);
642 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.");
644 ctx.glSamplerParameterfv (-1, GL_TEXTURE_WRAP_S, ¶ms);
645 ctx.expectError (GL_INVALID_OPERATION);
648 ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
650 ctx.glSamplerParameterfv (sampler, GL_TEXTURE_WRAP_S, ¶ms);
651 ctx.expectError (GL_INVALID_ENUM);
654 ctx.glDeleteSamplers(1, &sampler);
657 // Shader data commands
659 void get_attrib_location (NegativeTestContext& ctx)
661 GLuint programEmpty = ctx.glCreateProgram();
662 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
664 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
666 ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
667 ctx.glBindAttribLocation (programEmpty, 0, "test");
668 ctx.glGetAttribLocation (programEmpty, "test");
669 ctx.expectError (GL_INVALID_OPERATION);
672 ctx.beginSection("GL_INVALID_VALUE is generated if program is not a program or shader object.");
673 ctx.glUseProgram (program.getProgram());
674 ctx.glBindAttribLocation (program.getProgram(), 0, "test");
675 ctx.expectError (GL_NO_ERROR);
676 ctx.glGetAttribLocation (program.getProgram(), "test");
677 ctx.expectError (GL_NO_ERROR);
678 ctx.glGetAttribLocation (-2, "test");
679 ctx.expectError (GL_INVALID_VALUE);
682 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
683 ctx.glGetAttribLocation (shader, "test");
684 ctx.expectError (GL_INVALID_OPERATION);
687 ctx.glUseProgram (0);
688 ctx.glDeleteShader (shader);
689 ctx.glDeleteProgram (programEmpty);
692 void get_uniform_location (NegativeTestContext& ctx)
694 GLuint programEmpty = ctx.glCreateProgram();
695 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
697 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
699 ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
700 ctx.glGetUniformLocation(programEmpty, "test");
701 ctx.expectError(GL_INVALID_OPERATION);
704 ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
705 ctx.glUseProgram(program.getProgram());
706 ctx.glGetUniformLocation(-2, "test");
707 ctx.expectError(GL_INVALID_VALUE);
710 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
711 ctx.glGetAttribLocation(shader, "test");
712 ctx.expectError(GL_INVALID_OPERATION);
716 ctx.glDeleteProgram(programEmpty);
717 ctx.glDeleteShader(shader);
720 void bind_attrib_location (NegativeTestContext& ctx)
722 GLuint program = ctx.glCreateProgram();
723 GLuint maxIndex = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
724 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
726 ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
727 ctx.glBindAttribLocation(program, maxIndex, "test");
728 ctx.expectError(GL_INVALID_VALUE);
731 ctx.beginSection("GL_INVALID_OPERATION is generated if name starts with the reserved prefix \"gl_\".");
732 ctx.glBindAttribLocation(program, maxIndex-1, "gl_test");
733 ctx.expectError(GL_INVALID_OPERATION);
736 ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
737 ctx.glBindAttribLocation(-1, maxIndex-1, "test");
738 ctx.expectError(GL_INVALID_VALUE);
741 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
742 ctx.glBindAttribLocation(shader, maxIndex-1, "test");
743 ctx.expectError(GL_INVALID_OPERATION);
746 ctx.glDeleteProgram(program);
747 ctx.glDeleteShader(shader);
750 void uniform_block_binding (NegativeTestContext& ctx)
752 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformBlockVertSource, uniformTestFragSource));
754 ctx.glUseProgram (program.getProgram());
756 GLint maxUniformBufferBindings = -1;
757 GLint numActiveUniforms = -1;
758 GLint numActiveBlocks = -1;
759 ctx.glGetIntegerv (GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
760 ctx.glGetProgramiv (program.getProgram(), GL_ACTIVE_UNIFORMS, &numActiveUniforms);
761 ctx.glGetProgramiv (program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks);
762 ctx.getLog() << TestLog::Message << "// GL_MAX_UNIFORM_BUFFER_BINDINGS = " << maxUniformBufferBindings << TestLog::EndMessage;
763 ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORMS = " << numActiveUniforms << TestLog::EndMessage;
764 ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << TestLog::EndMessage;
765 ctx.expectError (GL_NO_ERROR);
767 ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockIndex is not an active uniform block index of program.");
768 ctx.glUniformBlockBinding(program.getProgram(), -1, 0);
769 ctx.expectError(GL_INVALID_VALUE);
770 ctx.glUniformBlockBinding(program.getProgram(), 5, 0);
771 ctx.expectError(GL_INVALID_VALUE);
774 ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockBinding is greater than or equal to the value of GL_MAX_UNIFORM_BUFFER_BINDINGS.");
775 ctx.glUniformBlockBinding(program.getProgram(), maxUniformBufferBindings, 0);
776 ctx.expectError(GL_INVALID_VALUE);
779 ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object generated by the GL.");
780 ctx.glUniformBlockBinding(-1, 0, 0);
781 ctx.expectError(GL_INVALID_VALUE);
787 void uniformf_invalid_program (NegativeTestContext& ctx)
789 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
791 ctx.glUniform1f(-1, 0.0f);
792 ctx.expectError(GL_INVALID_OPERATION);
793 ctx.glUniform2f(-1, 0.0f, 0.0f);
794 ctx.expectError(GL_INVALID_OPERATION);
795 ctx.glUniform3f(-1, 0.0f, 0.0f, 0.0f);
796 ctx.expectError(GL_INVALID_OPERATION);
797 ctx.glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
798 ctx.expectError(GL_INVALID_OPERATION);
802 void uniformf_incompatible_type (NegativeTestContext& ctx)
804 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
806 ctx.glUseProgram(program.getProgram());
807 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
808 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
809 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
810 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
811 ctx.expectError(GL_NO_ERROR);
813 if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
815 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
816 ctx.fail("Failed to retrieve uniform location");
819 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.");
820 ctx.glUseProgram(program.getProgram());
821 ctx.glUniform1f(vec4_v, 0.0f);
822 ctx.expectError(GL_INVALID_OPERATION);
823 ctx.glUniform2f(vec4_v, 0.0f, 0.0f);
824 ctx.expectError(GL_INVALID_OPERATION);
825 ctx.glUniform3f(vec4_v, 0.0f, 0.0f, 0.0f);
826 ctx.expectError(GL_INVALID_OPERATION);
827 ctx.glUniform4f(vec4_v, 0.0f, 0.0f, 0.0f, 0.0f);
828 ctx.expectError(GL_NO_ERROR);
831 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.");
832 ctx.glUseProgram(program.getProgram());
833 ctx.glUniform4f(ivec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
834 ctx.expectError(GL_INVALID_OPERATION);
835 ctx.glUniform4f(uvec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
836 ctx.expectError(GL_INVALID_OPERATION);
839 ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
840 ctx.glUseProgram(program.getProgram());
841 ctx.glUniform1f(sampler_f, 0.0f);
842 ctx.expectError(GL_INVALID_OPERATION);
848 void uniformf_invalid_location (NegativeTestContext& ctx)
850 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
852 ctx.glUseProgram(program.getProgram());
853 ctx.expectError(GL_NO_ERROR);
855 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.");
856 ctx.glUseProgram(program.getProgram());
857 ctx.glUniform1f(-2, 0.0f);
858 ctx.expectError(GL_INVALID_OPERATION);
859 ctx.glUniform2f(-2, 0.0f, 0.0f);
860 ctx.expectError(GL_INVALID_OPERATION);
861 ctx.glUniform3f(-2, 0.0f, 0.0f, 0.0f);
862 ctx.expectError(GL_INVALID_OPERATION);
863 ctx.glUniform4f(-2, 0.0f, 0.0f, 0.0f, 0.0f);
864 ctx.expectError(GL_INVALID_OPERATION);
866 ctx.glUseProgram(program.getProgram());
867 ctx.glUniform1f(-1, 0.0f);
868 ctx.expectError(GL_NO_ERROR);
869 ctx.glUniform2f(-1, 0.0f, 0.0f);
870 ctx.expectError(GL_NO_ERROR);
871 ctx.glUniform3f(-1, 0.0f, 0.0f, 0.0f);
872 ctx.expectError(GL_NO_ERROR);
873 ctx.glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
874 ctx.expectError(GL_NO_ERROR);
882 void uniformfv_invalid_program (NegativeTestContext& ctx)
884 std::vector<GLfloat> data(4);
886 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
888 ctx.glUniform1fv(-1, 1, &data[0]);
889 ctx.expectError(GL_INVALID_OPERATION);
890 ctx.glUniform2fv(-1, 1, &data[0]);
891 ctx.expectError(GL_INVALID_OPERATION);
892 ctx.glUniform3fv(-1, 1, &data[0]);
893 ctx.expectError(GL_INVALID_OPERATION);
894 ctx.glUniform4fv(-1, 1, &data[0]);
895 ctx.expectError(GL_INVALID_OPERATION);
899 void uniformfv_incompatible_type (NegativeTestContext& ctx)
901 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
903 ctx.glUseProgram(program.getProgram());
904 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
905 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
906 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
907 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
908 ctx.expectError(GL_NO_ERROR);
910 if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
912 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
913 ctx.fail("Failed to retrieve uniform location");
916 std::vector<GLfloat> data(4);
918 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.");
919 ctx.glUseProgram(program.getProgram());
920 ctx.glUniform1fv(vec4_v, 1, &data[0]);
921 ctx.expectError(GL_INVALID_OPERATION);
922 ctx.glUniform2fv(vec4_v, 1, &data[0]);
923 ctx.expectError(GL_INVALID_OPERATION);
924 ctx.glUniform3fv(vec4_v, 1, &data[0]);
925 ctx.expectError(GL_INVALID_OPERATION);
926 ctx.glUniform4fv(vec4_v, 1, &data[0]);
927 ctx.expectError(GL_NO_ERROR);
930 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.");
931 ctx.glUseProgram(program.getProgram());
932 ctx.glUniform4fv(ivec4_f, 1, &data[0]);
933 ctx.expectError(GL_INVALID_OPERATION);
934 ctx.glUniform4fv(uvec4_f, 1, &data[0]);
935 ctx.expectError(GL_INVALID_OPERATION);
938 ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
939 ctx.glUseProgram(program.getProgram());
940 ctx.glUniform1fv(sampler_f, 1, &data[0]);
941 ctx.expectError(GL_INVALID_OPERATION);
947 void uniformfv_invalid_location (NegativeTestContext& ctx)
949 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
951 ctx.glUseProgram(program.getProgram());
952 ctx.expectError(GL_NO_ERROR);
954 std::vector<GLfloat> data(4);
956 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.");
957 ctx.glUseProgram(program.getProgram());
958 ctx.glUniform1fv(-2, 1, &data[0]);
959 ctx.expectError(GL_INVALID_OPERATION);
960 ctx.glUniform2fv(-2, 1, &data[0]);
961 ctx.expectError(GL_INVALID_OPERATION);
962 ctx.glUniform3fv(-2, 1, &data[0]);
963 ctx.expectError(GL_INVALID_OPERATION);
964 ctx.glUniform4fv(-2, 1, &data[0]);
965 ctx.expectError(GL_INVALID_OPERATION);
967 ctx.glUseProgram(program.getProgram());
968 ctx.glUniform1fv(-1, 1, &data[0]);
969 ctx.expectError(GL_NO_ERROR);
970 ctx.glUniform2fv(-1, 1, &data[0]);
971 ctx.expectError(GL_NO_ERROR);
972 ctx.glUniform3fv(-1, 1, &data[0]);
973 ctx.expectError(GL_NO_ERROR);
974 ctx.glUniform4fv(-1, 1, &data[0]);
975 ctx.expectError(GL_NO_ERROR);
981 void uniformfv_invalid_count (NegativeTestContext& ctx)
983 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
985 ctx.glUseProgram (program.getProgram());
986 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
987 ctx.expectError(GL_NO_ERROR);
991 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
992 ctx.fail("Failed to retrieve uniform location");
995 std::vector<GLfloat> data(8);
997 ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
998 ctx.glUseProgram(program.getProgram());
999 ctx.glUniform1fv(vec4_v, 2, &data[0]);
1000 ctx.expectError(GL_INVALID_OPERATION);
1001 ctx.glUniform2fv(vec4_v, 2, &data[0]);
1002 ctx.expectError(GL_INVALID_OPERATION);
1003 ctx.glUniform3fv(vec4_v, 2, &data[0]);
1004 ctx.expectError(GL_INVALID_OPERATION);
1005 ctx.glUniform4fv(vec4_v, 2, &data[0]);
1006 ctx.expectError(GL_INVALID_OPERATION);
1009 ctx.glUseProgram(0);
1014 void uniformi_invalid_program (NegativeTestContext& ctx)
1016 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1017 ctx.glUseProgram(0);
1018 ctx.glUniform1i(-1, 0);
1019 ctx.expectError(GL_INVALID_OPERATION);
1020 ctx.glUniform2i(-1, 0, 0);
1021 ctx.expectError(GL_INVALID_OPERATION);
1022 ctx.glUniform3i(-1, 0, 0, 0);
1023 ctx.expectError(GL_INVALID_OPERATION);
1024 ctx.glUniform4i(-1, 0, 0, 0, 0);
1025 ctx.expectError(GL_INVALID_OPERATION);
1029 void uniformi_incompatible_type (NegativeTestContext& ctx)
1031 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1033 ctx.glUseProgram(program.getProgram());
1034 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
1035 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1036 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1037 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1038 ctx.expectError(GL_NO_ERROR);
1040 if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1042 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1043 ctx.fail("Failed to retrieve uniform location");
1046 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.");
1047 ctx.glUseProgram(program.getProgram());
1048 ctx.glUniform1i(ivec4_f, 0);
1049 ctx.expectError(GL_INVALID_OPERATION);
1050 ctx.glUniform2i(ivec4_f, 0, 0);
1051 ctx.expectError(GL_INVALID_OPERATION);
1052 ctx.glUniform3i(ivec4_f, 0, 0, 0);
1053 ctx.expectError(GL_INVALID_OPERATION);
1054 ctx.glUniform4i(ivec4_f, 0, 0, 0, 0);
1055 ctx.expectError(GL_NO_ERROR);
1058 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.");
1059 ctx.glUseProgram(program.getProgram());
1060 ctx.glUniform1i(uvec4_f, 0);
1061 ctx.expectError(GL_INVALID_OPERATION);
1062 ctx.glUniform2i(uvec4_f, 0, 0);
1063 ctx.expectError(GL_INVALID_OPERATION);
1064 ctx.glUniform3i(uvec4_f, 0, 0, 0);
1065 ctx.expectError(GL_INVALID_OPERATION);
1066 ctx.glUniform4i(uvec4_f, 0, 0, 0, 0);
1067 ctx.expectError(GL_INVALID_OPERATION);
1070 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.");
1071 ctx.glUseProgram(program.getProgram());
1072 ctx.glUniform1i(vec4_v, 0);
1073 ctx.expectError(GL_INVALID_OPERATION);
1074 ctx.glUniform2i(vec4_v, 0, 0);
1075 ctx.expectError(GL_INVALID_OPERATION);
1076 ctx.glUniform3i(vec4_v, 0, 0, 0);
1077 ctx.expectError(GL_INVALID_OPERATION);
1078 ctx.glUniform4i(vec4_v, 0, 0, 0, 0);
1079 ctx.expectError(GL_INVALID_OPERATION);
1082 ctx.glUseProgram(0);
1085 void uniformi_invalid_location (NegativeTestContext& ctx)
1087 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1089 ctx.glUseProgram(program.getProgram());
1090 ctx.expectError(GL_NO_ERROR);
1092 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.");
1093 ctx.glUseProgram(program.getProgram());
1094 ctx.glUniform1i(-2, 0);
1095 ctx.expectError(GL_INVALID_OPERATION);
1096 ctx.glUniform2i(-2, 0, 0);
1097 ctx.expectError(GL_INVALID_OPERATION);
1098 ctx.glUniform3i(-2, 0, 0, 0);
1099 ctx.expectError(GL_INVALID_OPERATION);
1100 ctx.glUniform4i(-2, 0, 0, 0, 0);
1101 ctx.expectError(GL_INVALID_OPERATION);
1103 ctx.glUseProgram(program.getProgram());
1104 ctx.glUniform1i(-1, 0);
1105 ctx.expectError(GL_NO_ERROR);
1106 ctx.glUniform2i(-1, 0, 0);
1107 ctx.expectError(GL_NO_ERROR);
1108 ctx.glUniform3i(-1, 0, 0, 0);
1109 ctx.expectError(GL_NO_ERROR);
1110 ctx.glUniform4i(-1, 0, 0, 0, 0);
1111 ctx.expectError(GL_NO_ERROR);
1114 ctx.glUseProgram(0);
1119 void uniformiv_invalid_program (NegativeTestContext& ctx)
1121 std::vector<GLint> data(4);
1123 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1124 ctx.glUseProgram(0);
1125 ctx.glUniform1iv(-1, 1, &data[0]);
1126 ctx.expectError(GL_INVALID_OPERATION);
1127 ctx.glUniform2iv(-1, 1, &data[0]);
1128 ctx.expectError(GL_INVALID_OPERATION);
1129 ctx.glUniform3iv(-1, 1, &data[0]);
1130 ctx.expectError(GL_INVALID_OPERATION);
1131 ctx.glUniform4iv(-1, 1, &data[0]);
1132 ctx.expectError(GL_INVALID_OPERATION);
1136 void uniformiv_incompatible_type (NegativeTestContext& ctx)
1138 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1140 ctx.glUseProgram(program.getProgram());
1141 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
1142 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1143 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1144 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1145 ctx.expectError(GL_NO_ERROR);
1147 if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1149 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1150 ctx.fail("Failed to retrieve uniform location");
1153 std::vector<GLint> data(4);
1155 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.");
1156 ctx.glUseProgram(program.getProgram());
1157 ctx.glUniform1iv(ivec4_f, 1, &data[0]);
1158 ctx.expectError(GL_INVALID_OPERATION);
1159 ctx.glUniform2iv(ivec4_f, 1, &data[0]);
1160 ctx.expectError(GL_INVALID_OPERATION);
1161 ctx.glUniform3iv(ivec4_f, 1, &data[0]);
1162 ctx.expectError(GL_INVALID_OPERATION);
1163 ctx.glUniform4iv(ivec4_f, 1, &data[0]);
1164 ctx.expectError(GL_NO_ERROR);
1167 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.");
1168 ctx.glUseProgram(program.getProgram());
1169 ctx.glUniform1iv(vec4_v, 1, &data[0]);
1170 ctx.expectError(GL_INVALID_OPERATION);
1171 ctx.glUniform2iv(vec4_v, 1, &data[0]);
1172 ctx.expectError(GL_INVALID_OPERATION);
1173 ctx.glUniform3iv(vec4_v, 1, &data[0]);
1174 ctx.expectError(GL_INVALID_OPERATION);
1175 ctx.glUniform4iv(vec4_v, 1, &data[0]);
1176 ctx.expectError(GL_INVALID_OPERATION);
1179 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.");
1180 ctx.glUseProgram(program.getProgram());
1181 ctx.glUniform1iv(uvec4_f, 1, &data[0]);
1182 ctx.expectError(GL_INVALID_OPERATION);
1183 ctx.glUniform2iv(uvec4_f, 1, &data[0]);
1184 ctx.expectError(GL_INVALID_OPERATION);
1185 ctx.glUniform3iv(uvec4_f, 1, &data[0]);
1186 ctx.expectError(GL_INVALID_OPERATION);
1187 ctx.glUniform4iv(uvec4_f, 1, &data[0]);
1188 ctx.expectError(GL_INVALID_OPERATION);
1191 ctx.glUseProgram(0);
1194 void uniformiv_invalid_location (NegativeTestContext& ctx)
1196 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1198 ctx.glUseProgram(program.getProgram());
1199 ctx.expectError(GL_NO_ERROR);
1201 std::vector<GLint> data(4);
1203 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.");
1204 ctx.glUseProgram(program.getProgram());
1205 ctx.glUniform1iv(-2, 1, &data[0]);
1206 ctx.expectError(GL_INVALID_OPERATION);
1207 ctx.glUniform2iv(-2, 1, &data[0]);
1208 ctx.expectError(GL_INVALID_OPERATION);
1209 ctx.glUniform3iv(-2, 1, &data[0]);
1210 ctx.expectError(GL_INVALID_OPERATION);
1211 ctx.glUniform4iv(-2, 1, &data[0]);
1212 ctx.expectError(GL_INVALID_OPERATION);
1214 ctx.glUseProgram(program.getProgram());
1215 ctx.glUniform1iv(-1, 1, &data[0]);
1216 ctx.expectError(GL_NO_ERROR);
1217 ctx.glUniform2iv(-1, 1, &data[0]);
1218 ctx.expectError(GL_NO_ERROR);
1219 ctx.glUniform3iv(-1, 1, &data[0]);
1220 ctx.expectError(GL_NO_ERROR);
1221 ctx.glUniform4iv(-1, 1, &data[0]);
1222 ctx.expectError(GL_NO_ERROR);
1225 ctx.glUseProgram(0);
1228 void uniformiv_invalid_count (NegativeTestContext& ctx)
1230 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1232 ctx.glUseProgram (program.getProgram());
1233 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1234 ctx.expectError(GL_NO_ERROR);
1238 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1239 ctx.fail("Failed to retrieve uniform location");
1242 std::vector<GLint> data(8);
1244 ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1245 ctx.glUseProgram(program.getProgram());
1246 ctx.glUniform1iv(ivec4_f, 2, &data[0]);
1247 ctx.expectError(GL_INVALID_OPERATION);
1248 ctx.glUniform2iv(ivec4_f, 2, &data[0]);
1249 ctx.expectError(GL_INVALID_OPERATION);
1250 ctx.glUniform3iv(ivec4_f, 2, &data[0]);
1251 ctx.expectError(GL_INVALID_OPERATION);
1252 ctx.glUniform4iv(ivec4_f, 2, &data[0]);
1253 ctx.expectError(GL_INVALID_OPERATION);
1256 ctx.glUseProgram(0);
1259 // ctx.glUniform{1234}ui
1261 void uniformui_invalid_program (NegativeTestContext& ctx)
1263 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1264 ctx.glUseProgram(0);
1265 ctx.glUniform1ui(-1, 0);
1266 ctx.expectError(GL_INVALID_OPERATION);
1267 ctx.glUniform2ui(-1, 0, 0);
1268 ctx.expectError(GL_INVALID_OPERATION);
1269 ctx.glUniform3ui(-1, 0, 0, 0);
1270 ctx.expectError(GL_INVALID_OPERATION);
1271 ctx.glUniform4ui(-1, 0, 0, 0, 0);
1272 ctx.expectError(GL_INVALID_OPERATION);
1276 void uniformui_incompatible_type (NegativeTestContext& ctx)
1278 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1280 ctx.glUseProgram(program.getProgram());
1281 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
1282 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1283 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1284 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1285 ctx.expectError(GL_NO_ERROR);
1287 if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1289 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1290 ctx.fail("Failed to retrieve uniform location");
1293 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.");
1294 ctx.glUseProgram(program.getProgram());
1295 ctx.glUniform1ui(uvec4_f, 0);
1296 ctx.expectError(GL_INVALID_OPERATION);
1297 ctx.glUniform2ui(uvec4_f, 0, 0);
1298 ctx.expectError(GL_INVALID_OPERATION);
1299 ctx.glUniform3ui(uvec4_f, 0, 0, 0);
1300 ctx.expectError(GL_INVALID_OPERATION);
1301 ctx.glUniform4ui(uvec4_f, 0, 0, 0, 0);
1302 ctx.expectError(GL_NO_ERROR);
1305 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.");
1306 ctx.glUseProgram(program.getProgram());
1307 ctx.glUniform1ui(ivec4_f, 0);
1308 ctx.expectError(GL_INVALID_OPERATION);
1309 ctx.glUniform2ui(ivec4_f, 0, 0);
1310 ctx.expectError(GL_INVALID_OPERATION);
1311 ctx.glUniform3ui(ivec4_f, 0, 0, 0);
1312 ctx.expectError(GL_INVALID_OPERATION);
1313 ctx.glUniform4ui(ivec4_f, 0, 0, 0, 0);
1314 ctx.expectError(GL_INVALID_OPERATION);
1317 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.");
1318 ctx.glUseProgram(program.getProgram());
1319 ctx.glUniform1ui(vec4_v, 0);
1320 ctx.expectError(GL_INVALID_OPERATION);
1321 ctx.glUniform2ui(vec4_v, 0, 0);
1322 ctx.expectError(GL_INVALID_OPERATION);
1323 ctx.glUniform3ui(vec4_v, 0, 0, 0);
1324 ctx.expectError(GL_INVALID_OPERATION);
1325 ctx.glUniform4ui(vec4_v, 0, 0, 0, 0);
1326 ctx.expectError(GL_INVALID_OPERATION);
1329 ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1330 ctx.glUseProgram(program.getProgram());
1331 ctx.glUniform1ui(sampler_f, 0);
1332 ctx.expectError(GL_INVALID_OPERATION);
1335 ctx.glUseProgram(0);
1338 void uniformui_invalid_location (NegativeTestContext& ctx)
1340 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1342 ctx.glUseProgram(program.getProgram());
1343 ctx.expectError(GL_NO_ERROR);
1345 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.");
1346 ctx.glUseProgram(program.getProgram());
1347 ctx.glUniform1i(-2, 0);
1348 ctx.expectError(GL_INVALID_OPERATION);
1349 ctx.glUniform2i(-2, 0, 0);
1350 ctx.expectError(GL_INVALID_OPERATION);
1351 ctx.glUniform3i(-2, 0, 0, 0);
1352 ctx.expectError(GL_INVALID_OPERATION);
1353 ctx.glUniform4i(-2, 0, 0, 0, 0);
1354 ctx.expectError(GL_INVALID_OPERATION);
1356 ctx.glUseProgram(program.getProgram());
1357 ctx.glUniform1i(-1, 0);
1358 ctx.expectError(GL_NO_ERROR);
1359 ctx.glUniform2i(-1, 0, 0);
1360 ctx.expectError(GL_NO_ERROR);
1361 ctx.glUniform3i(-1, 0, 0, 0);
1362 ctx.expectError(GL_NO_ERROR);
1363 ctx.glUniform4i(-1, 0, 0, 0, 0);
1364 ctx.expectError(GL_NO_ERROR);
1367 ctx.glUseProgram(0);
1370 // ctx.glUniform{1234}uiv
1372 void uniformuiv_invalid_program (NegativeTestContext& ctx)
1374 std::vector<GLuint> data(4);
1376 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1377 ctx.glUseProgram(0);
1378 ctx.glUniform1uiv(-1, 1, &data[0]);
1379 ctx.expectError(GL_INVALID_OPERATION);
1380 ctx.glUniform2uiv(-1, 1, &data[0]);
1381 ctx.expectError(GL_INVALID_OPERATION);
1382 ctx.glUniform3uiv(-1, 1, &data[0]);
1383 ctx.expectError(GL_INVALID_OPERATION);
1384 ctx.glUniform4uiv(-1, 1, &data[0]);
1385 ctx.expectError(GL_INVALID_OPERATION);
1389 void uniformuiv_incompatible_type (NegativeTestContext& ctx)
1391 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1393 ctx.glUseProgram(program.getProgram());
1394 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
1395 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1396 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1397 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1398 ctx.expectError(GL_NO_ERROR);
1400 if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1402 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1403 ctx.fail("Failed to retrieve uniform location");
1406 std::vector<GLuint> data(4);
1408 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.");
1409 ctx.glUseProgram(program.getProgram());
1410 ctx.glUniform1uiv(uvec4_f, 1, &data[0]);
1411 ctx.expectError(GL_INVALID_OPERATION);
1412 ctx.glUniform2uiv(uvec4_f, 1, &data[0]);
1413 ctx.expectError(GL_INVALID_OPERATION);
1414 ctx.glUniform3uiv(uvec4_f, 1, &data[0]);
1415 ctx.expectError(GL_INVALID_OPERATION);
1416 ctx.glUniform4uiv(uvec4_f, 1, &data[0]);
1417 ctx.expectError(GL_NO_ERROR);
1420 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.");
1421 ctx.glUseProgram(program.getProgram());
1422 ctx.glUniform1uiv(vec4_v, 1, &data[0]);
1423 ctx.expectError(GL_INVALID_OPERATION);
1424 ctx.glUniform2uiv(vec4_v, 1, &data[0]);
1425 ctx.expectError(GL_INVALID_OPERATION);
1426 ctx.glUniform3uiv(vec4_v, 1, &data[0]);
1427 ctx.expectError(GL_INVALID_OPERATION);
1428 ctx.glUniform4uiv(vec4_v, 1, &data[0]);
1429 ctx.expectError(GL_INVALID_OPERATION);
1432 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.");
1433 ctx.glUseProgram(program.getProgram());
1434 ctx.glUniform1uiv(ivec4_f, 1, &data[0]);
1435 ctx.expectError(GL_INVALID_OPERATION);
1436 ctx.glUniform2uiv(ivec4_f, 1, &data[0]);
1437 ctx.expectError(GL_INVALID_OPERATION);
1438 ctx.glUniform3uiv(ivec4_f, 1, &data[0]);
1439 ctx.expectError(GL_INVALID_OPERATION);
1440 ctx.glUniform4uiv(ivec4_f, 1, &data[0]);
1441 ctx.expectError(GL_INVALID_OPERATION);
1444 ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1445 ctx.glUseProgram(program.getProgram());
1446 ctx.glUniform1uiv(sampler_f, 1, &data[0]);
1447 ctx.expectError(GL_INVALID_OPERATION);
1450 ctx.glUseProgram(0);
1453 void uniformuiv_invalid_location (NegativeTestContext& ctx)
1455 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1457 ctx.glUseProgram(program.getProgram());
1458 ctx.expectError(GL_NO_ERROR);
1460 std::vector<GLuint> data(4);
1462 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.");
1463 ctx.glUseProgram(program.getProgram());
1464 ctx.glUniform1uiv(-2, 1, &data[0]);
1465 ctx.expectError(GL_INVALID_OPERATION);
1466 ctx.glUniform2uiv(-2, 1, &data[0]);
1467 ctx.expectError(GL_INVALID_OPERATION);
1468 ctx.glUniform3uiv(-2, 1, &data[0]);
1469 ctx.expectError(GL_INVALID_OPERATION);
1470 ctx.glUniform4uiv(-2, 1, &data[0]);
1471 ctx.expectError(GL_INVALID_OPERATION);
1473 ctx.glUseProgram(program.getProgram());
1474 ctx.glUniform1uiv(-1, 1, &data[0]);
1475 ctx.expectError(GL_NO_ERROR);
1476 ctx.glUniform2uiv(-1, 1, &data[0]);
1477 ctx.expectError(GL_NO_ERROR);
1478 ctx.glUniform3uiv(-1, 1, &data[0]);
1479 ctx.expectError(GL_NO_ERROR);
1480 ctx.glUniform4uiv(-1, 1, &data[0]);
1481 ctx.expectError(GL_NO_ERROR);
1484 ctx.glUseProgram(0);
1487 void uniformuiv_invalid_count (NegativeTestContext& ctx)
1489 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1491 ctx.glUseProgram (program.getProgram());
1492 int uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1493 ctx.expectError(GL_NO_ERROR);
1497 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1498 ctx.fail("Failed to retrieve uniform location");
1501 std::vector<GLuint> data(8);
1503 ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1504 ctx.glUseProgram(program.getProgram());
1505 ctx.glUniform1uiv(uvec4_f, 2, &data[0]);
1506 ctx.expectError(GL_INVALID_OPERATION);
1507 ctx.glUniform2uiv(uvec4_f, 2, &data[0]);
1508 ctx.expectError(GL_INVALID_OPERATION);
1509 ctx.glUniform3uiv(uvec4_f, 2, &data[0]);
1510 ctx.expectError(GL_INVALID_OPERATION);
1511 ctx.glUniform4uiv(uvec4_f, 2, &data[0]);
1512 ctx.expectError(GL_INVALID_OPERATION);
1515 ctx.glUseProgram(0);
1519 // ctx.glUniformMatrix*fv
1521 void uniform_matrixfv_invalid_program (NegativeTestContext& ctx)
1523 std::vector<GLfloat> data(16);
1525 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1526 ctx.glUseProgram(0);
1527 ctx.glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1528 ctx.expectError(GL_INVALID_OPERATION);
1529 ctx.glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1530 ctx.expectError(GL_INVALID_OPERATION);
1531 ctx.glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1532 ctx.expectError(GL_INVALID_OPERATION);
1534 ctx.glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1535 ctx.expectError(GL_INVALID_OPERATION);
1536 ctx.glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1537 ctx.expectError(GL_INVALID_OPERATION);
1538 ctx.glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1539 ctx.expectError(GL_INVALID_OPERATION);
1540 ctx.glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1541 ctx.expectError(GL_INVALID_OPERATION);
1542 ctx.glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1543 ctx.expectError(GL_INVALID_OPERATION);
1544 ctx.glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1545 ctx.expectError(GL_INVALID_OPERATION);
1549 void uniform_matrixfv_incompatible_type (NegativeTestContext& ctx)
1551 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1553 ctx.glUseProgram (program.getProgram());
1554 GLint mat4_v = ctx.glGetUniformLocation(program.getProgram(), "mat4_v"); // mat4
1555 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1556 ctx.expectError(GL_NO_ERROR);
1558 if (mat4_v == -1 || sampler_f == -1)
1560 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1561 ctx.fail("Failed to retrieve uniform location");
1564 std::vector<GLfloat> data(16);
1566 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.");
1567 ctx.glUseProgram(program.getProgram());
1568 ctx.glUniformMatrix2fv(mat4_v, 1, GL_FALSE, &data[0]);
1569 ctx.expectError(GL_INVALID_OPERATION);
1570 ctx.glUniformMatrix3fv(mat4_v, 1, GL_FALSE, &data[0]);
1571 ctx.expectError(GL_INVALID_OPERATION);
1572 ctx.glUniformMatrix4fv(mat4_v, 1, GL_FALSE, &data[0]);
1573 ctx.expectError(GL_NO_ERROR);
1575 ctx.glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1576 ctx.expectError(GL_INVALID_OPERATION);
1577 ctx.glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1578 ctx.expectError(GL_INVALID_OPERATION);
1579 ctx.glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1580 ctx.expectError(GL_INVALID_OPERATION);
1581 ctx.glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1582 ctx.expectError(GL_INVALID_OPERATION);
1583 ctx.glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1584 ctx.expectError(GL_INVALID_OPERATION);
1585 ctx.glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1586 ctx.expectError(GL_INVALID_OPERATION);
1589 ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1590 ctx.glUseProgram(program.getProgram());
1591 ctx.glUniformMatrix2fv(sampler_f, 1, GL_FALSE, &data[0]);
1592 ctx.expectError(GL_INVALID_OPERATION);
1593 ctx.glUniformMatrix3fv(sampler_f, 1, GL_FALSE, &data[0]);
1594 ctx.expectError(GL_INVALID_OPERATION);
1595 ctx.glUniformMatrix4fv(sampler_f, 1, GL_FALSE, &data[0]);
1596 ctx.expectError(GL_INVALID_OPERATION);
1598 ctx.glUniformMatrix2x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1599 ctx.expectError(GL_INVALID_OPERATION);
1600 ctx.glUniformMatrix3x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1601 ctx.expectError(GL_INVALID_OPERATION);
1602 ctx.glUniformMatrix2x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1603 ctx.expectError(GL_INVALID_OPERATION);
1604 ctx.glUniformMatrix4x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1605 ctx.expectError(GL_INVALID_OPERATION);
1606 ctx.glUniformMatrix3x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1607 ctx.expectError(GL_INVALID_OPERATION);
1608 ctx.glUniformMatrix4x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1609 ctx.expectError(GL_INVALID_OPERATION);
1612 ctx.glUseProgram(0);
1615 void uniform_matrixfv_invalid_location (NegativeTestContext& ctx)
1617 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1619 ctx.glUseProgram(program.getProgram());
1620 ctx.expectError(GL_NO_ERROR);
1622 std::vector<GLfloat> data(16);
1624 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.");
1625 ctx.glUseProgram(program.getProgram());
1626 ctx.glUniformMatrix2fv(-2, 1, GL_FALSE, &data[0]);
1627 ctx.expectError(GL_INVALID_OPERATION);
1628 ctx.glUniformMatrix3fv(-2, 1, GL_FALSE, &data[0]);
1629 ctx.expectError(GL_INVALID_OPERATION);
1630 ctx.glUniformMatrix4fv(-2, 1, GL_FALSE, &data[0]);
1631 ctx.expectError(GL_INVALID_OPERATION);
1633 ctx.glUniformMatrix2x3fv(-2, 1, GL_FALSE, &data[0]);
1634 ctx.expectError(GL_INVALID_OPERATION);
1635 ctx.glUniformMatrix3x2fv(-2, 1, GL_FALSE, &data[0]);
1636 ctx.expectError(GL_INVALID_OPERATION);
1637 ctx.glUniformMatrix2x4fv(-2, 1, GL_FALSE, &data[0]);
1638 ctx.expectError(GL_INVALID_OPERATION);
1639 ctx.glUniformMatrix4x2fv(-2, 1, GL_FALSE, &data[0]);
1640 ctx.expectError(GL_INVALID_OPERATION);
1641 ctx.glUniformMatrix3x4fv(-2, 1, GL_FALSE, &data[0]);
1642 ctx.expectError(GL_INVALID_OPERATION);
1643 ctx.glUniformMatrix4x3fv(-2, 1, GL_FALSE, &data[0]);
1644 ctx.expectError(GL_INVALID_OPERATION);
1646 ctx.glUseProgram(program.getProgram());
1647 ctx.glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1648 ctx.expectError(GL_NO_ERROR);
1649 ctx.glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1650 ctx.expectError(GL_NO_ERROR);
1651 ctx.glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1652 ctx.expectError(GL_NO_ERROR);
1654 ctx.glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1655 ctx.expectError(GL_NO_ERROR);
1656 ctx.glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1657 ctx.expectError(GL_NO_ERROR);
1658 ctx.glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1659 ctx.expectError(GL_NO_ERROR);
1660 ctx.glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1661 ctx.expectError(GL_NO_ERROR);
1662 ctx.glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1663 ctx.expectError(GL_NO_ERROR);
1664 ctx.glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1665 ctx.expectError(GL_NO_ERROR);
1668 ctx.glUseProgram(0);
1671 void uniform_matrixfv_invalid_count (NegativeTestContext& ctx)
1673 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1675 ctx.glUseProgram (program.getProgram());
1676 GLint mat4_v = ctx.glGetUniformLocation(program.getProgram(), "mat4_v"); // mat4
1677 ctx.expectError(GL_NO_ERROR);
1681 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1682 ctx.fail("Failed to retrieve uniform location");
1685 std::vector<GLfloat> data(32);
1687 ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1688 ctx.glUseProgram(program.getProgram());
1689 ctx.glUniformMatrix2fv(mat4_v, 2, GL_FALSE, &data[0]);
1690 ctx.expectError(GL_INVALID_OPERATION);
1691 ctx.glUniformMatrix3fv(mat4_v, 2, GL_FALSE, &data[0]);
1692 ctx.expectError(GL_INVALID_OPERATION);
1693 ctx.glUniformMatrix4fv(mat4_v, 2, GL_FALSE, &data[0]);
1694 ctx.expectError(GL_INVALID_OPERATION);
1696 ctx.glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1697 ctx.expectError(GL_INVALID_OPERATION);
1698 ctx.glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1699 ctx.expectError(GL_INVALID_OPERATION);
1700 ctx.glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1701 ctx.expectError(GL_INVALID_OPERATION);
1702 ctx.glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1703 ctx.expectError(GL_INVALID_OPERATION);
1704 ctx.glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1705 ctx.expectError(GL_INVALID_OPERATION);
1706 ctx.glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1707 ctx.expectError(GL_INVALID_OPERATION);
1710 ctx.glUseProgram(0);
1713 // Transform feedback
1714 void gen_transform_feedbacks (NegativeTestContext& ctx)
1716 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
1718 ctx.glGenTransformFeedbacks(-1, &id);
1719 ctx.expectError(GL_INVALID_VALUE);
1723 void bind_transform_feedback (NegativeTestContext& ctx)
1726 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1727 deUint32 buf = 0x1234;
1728 const char* tfVarying = "gl_Position";
1730 ctx.glGenBuffers (1, &buf);
1731 ctx.glGenTransformFeedbacks (2, tfID);
1733 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_TRANSFORM_FEEDBACK.");
1734 ctx.glBindTransformFeedback(-1, tfID[0]);
1735 ctx.expectError(GL_INVALID_ENUM);
1738 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.");
1739 ctx.glUseProgram (program.getProgram());
1740 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1741 ctx.glLinkProgram (program.getProgram());
1742 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID[0]);
1743 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1744 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1745 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1746 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1747 ctx.expectError (GL_NO_ERROR);
1749 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID[1]);
1750 ctx.expectError (GL_INVALID_OPERATION);
1752 ctx.glEndTransformFeedback ();
1753 ctx.expectError (GL_NO_ERROR);
1756 ctx.glUseProgram (0);
1757 ctx.glDeleteBuffers (1, &buf);
1758 ctx.glDeleteTransformFeedbacks (2, tfID);
1759 ctx.expectError (GL_NO_ERROR);
1762 void delete_transform_feedbacks (NegativeTestContext& ctx)
1765 ctx.glGenTransformFeedbacks(1, &id);
1767 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
1768 ctx.glDeleteTransformFeedbacks(-1, &id);
1769 ctx.expectError(GL_INVALID_VALUE);
1772 ctx.glDeleteTransformFeedbacks(1, &id);
1775 void begin_transform_feedback (NegativeTestContext& ctx)
1778 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1779 deUint32 buf = 0x1234;
1780 const char* tfVarying = "gl_Position";
1782 ctx.glGenBuffers (1, &buf);
1783 ctx.glGenTransformFeedbacks (2, tfID);
1785 ctx.glUseProgram (program.getProgram());
1786 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1787 ctx.glLinkProgram (program.getProgram());
1788 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID[0]);
1789 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1790 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1791 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1792 ctx.expectError (GL_NO_ERROR);
1794 ctx.beginSection("GL_INVALID_ENUM is generated if primitiveMode is not one of GL_POINTS, GL_LINES, or GL_TRIANGLES.");
1795 ctx.glBeginTransformFeedback (-1);
1796 ctx.expectError (GL_INVALID_ENUM);
1799 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is already active.");
1800 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1801 ctx.expectError (GL_NO_ERROR);
1802 ctx.glBeginTransformFeedback (GL_POINTS);
1803 ctx.expectError (GL_INVALID_OPERATION);
1806 ctx.beginSection("GL_INVALID_OPERATION is generated if any binding point used in transform feedback mode does not have a buffer object bound.");
1807 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
1808 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1809 ctx.expectError (GL_INVALID_OPERATION);
1810 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1813 ctx.beginSection("GL_INVALID_OPERATION is generated if no binding points would be used because no program object is active.");
1814 ctx.glUseProgram (0);
1815 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1816 ctx.expectError (GL_INVALID_OPERATION);
1817 ctx.glUseProgram (program.getProgram());
1820 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.");
1821 ctx.glTransformFeedbackVaryings (program.getProgram(), 0, 0, GL_INTERLEAVED_ATTRIBS);
1822 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1823 ctx.expectError (GL_INVALID_OPERATION);
1826 ctx.glEndTransformFeedback ();
1827 ctx.glDeleteBuffers (1, &buf);
1828 ctx.glDeleteTransformFeedbacks (2, tfID);
1829 ctx.expectError (GL_NO_ERROR);
1832 void pause_transform_feedback (NegativeTestContext& ctx)
1835 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1836 deUint32 buf = 0x1234;
1837 const char* tfVarying = "gl_Position";
1839 ctx.glGenBuffers (1, &buf);
1840 ctx.glGenTransformFeedbacks (2, tfID);
1842 ctx.glUseProgram (program.getProgram());
1843 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1844 ctx.glLinkProgram (program.getProgram());
1845 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID[0]);
1846 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1847 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1848 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1849 ctx.expectError (GL_NO_ERROR);
1851 ctx.beginSection("GL_INVALID_OPERATION is generated if the currently bound transform feedback object is not active or is paused.");
1852 ctx.glPauseTransformFeedback ();
1853 ctx.expectError (GL_INVALID_OPERATION);
1854 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1855 ctx.glPauseTransformFeedback ();
1856 ctx.expectError (GL_NO_ERROR);
1857 ctx.glPauseTransformFeedback ();
1858 ctx.expectError (GL_INVALID_OPERATION);
1861 ctx.glEndTransformFeedback ();
1862 ctx.glDeleteBuffers (1, &buf);
1863 ctx.glDeleteTransformFeedbacks (2, tfID);
1864 ctx.expectError (GL_NO_ERROR);
1867 void resume_transform_feedback (NegativeTestContext& ctx)
1870 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1871 deUint32 buf = 0x1234;
1872 const char* tfVarying = "gl_Position";
1874 ctx.glGenBuffers (1, &buf);
1875 ctx.glGenTransformFeedbacks (2, tfID);
1877 ctx.glUseProgram (program.getProgram());
1878 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1879 ctx.glLinkProgram (program.getProgram());
1880 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID[0]);
1881 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1882 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1883 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1884 ctx.expectError (GL_NO_ERROR);
1886 ctx.beginSection("GL_INVALID_OPERATION is generated if the currently bound transform feedback object is not active or is not paused.");
1887 ctx.glResumeTransformFeedback ();
1888 ctx.expectError (GL_INVALID_OPERATION);
1889 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1890 ctx.glResumeTransformFeedback ();
1891 ctx.expectError (GL_INVALID_OPERATION);
1892 ctx.glPauseTransformFeedback ();
1893 ctx.glResumeTransformFeedback ();
1894 ctx.expectError (GL_NO_ERROR);
1897 ctx.glEndTransformFeedback ();
1898 ctx.glDeleteBuffers (1, &buf);
1899 ctx.glDeleteTransformFeedbacks (2, tfID);
1900 ctx.expectError (GL_NO_ERROR);
1903 void end_transform_feedback (NegativeTestContext& ctx)
1906 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1907 deUint32 buf = 0x1234;
1908 const char* tfVarying = "gl_Position";
1910 ctx.glGenBuffers (1, &buf);
1911 ctx.glGenTransformFeedbacks (1, &tfID);
1913 ctx.glUseProgram (program.getProgram());
1914 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1915 ctx.glLinkProgram (program.getProgram());
1916 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID);
1917 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1918 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1919 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1920 ctx.expectError (GL_NO_ERROR);
1922 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is not active.");
1923 ctx.glEndTransformFeedback ();
1924 ctx.expectError (GL_INVALID_OPERATION);
1925 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1926 ctx.glEndTransformFeedback ();
1927 ctx.expectError (GL_NO_ERROR);
1930 ctx.glDeleteBuffers (1, &buf);
1931 ctx.glDeleteTransformFeedbacks (1, &tfID);
1932 ctx.expectError (GL_NO_ERROR);
1935 void get_transform_feedback_varying (NegativeTestContext& ctx)
1938 glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1939 glu::ShaderProgram programInvalid (ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, ""));
1940 const char* tfVarying = "gl_Position";
1941 int maxTransformFeedbackVaryings = 0;
1948 ctx.glGenTransformFeedbacks (1, &tfID);
1950 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1951 ctx.expectError (GL_NO_ERROR);
1952 ctx.glLinkProgram (program.getProgram());
1953 ctx.expectError (GL_NO_ERROR);
1955 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID);
1956 ctx.expectError (GL_NO_ERROR);
1958 ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object.");
1959 ctx.glGetTransformFeedbackVarying (-1, 0, 32, &length, &size, &type, &name[0]);
1960 ctx.expectError (GL_INVALID_VALUE);
1963 ctx.beginSection("GL_INVALID_VALUE is generated if index is greater or equal to the value of GL_TRANSFORM_FEEDBACK_VARYINGS.");
1964 ctx.glGetProgramiv (program.getProgram(), GL_TRANSFORM_FEEDBACK_VARYINGS, &maxTransformFeedbackVaryings);
1965 ctx.glGetTransformFeedbackVarying (program.getProgram(), maxTransformFeedbackVaryings, 32, &length, &size, &type, &name[0]);
1966 ctx.expectError (GL_INVALID_VALUE);
1969 ctx.beginSection("GL_INVALID_OPERATION or GL_INVALID_VALUE is generated program has not been linked.");
1970 ctx.glGetTransformFeedbackVarying (programInvalid.getProgram(), 0, 32, &length, &size, &type, &name[0]);
1971 ctx.expectError (GL_INVALID_OPERATION, GL_INVALID_VALUE);
1974 ctx.glDeleteTransformFeedbacks (1, &tfID);
1975 ctx.expectError (GL_NO_ERROR);
1978 void transform_feedback_varyings (NegativeTestContext& ctx)
1981 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1982 const char* tfVarying = "gl_Position";
1983 GLint maxTransformFeedbackSeparateAttribs = 0;
1985 ctx.glGenTransformFeedbacks (1, &tfID);
1986 ctx.expectError (GL_NO_ERROR);
1988 ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object.");
1989 ctx.glTransformFeedbackVaryings (0, 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1990 ctx.expectError (GL_INVALID_VALUE);
1993 ctx.beginSection("GL_INVALID_VALUE is generated if bufferMode is GL_SEPARATE_ATTRIBS and count is greater than GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.");
1994 ctx.glGetIntegerv (GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTransformFeedbackSeparateAttribs);
1995 ctx.glTransformFeedbackVaryings (program.getProgram(), maxTransformFeedbackSeparateAttribs+1, &tfVarying, GL_SEPARATE_ATTRIBS);
1996 ctx.expectError (GL_INVALID_VALUE);
1999 ctx.glDeleteTransformFeedbacks (1, &tfID);
2000 ctx.expectError (GL_NO_ERROR);
2003 std::vector<FunctionContainer> getNegativeShaderApiTestFunctions ()
2005 FunctionContainer funcs[] =
2007 {create_shader, "create_shader", "Invalid glCreateShader() usage" },
2008 {shader_source, "shader_source", "Invalid glShaderSource() usage" },
2009 {compile_shader, "compile_shader", "Invalid glCompileShader() usage" },
2010 {delete_shader, "delete_shader", "Invalid glDeleteShader() usage" },
2011 {shader_binary, "shader_binary", "Invalid glShaderBinary() usage" },
2012 {attach_shader, "attach_shader", "Invalid glAttachShader() usage" },
2013 {detach_shader, "detach_shader", "Invalid glDetachShader() usage" },
2014 {link_program, "link_program", "Invalid glLinkProgram() usage" },
2015 {use_program, "use_program", "Invalid glUseProgram() usage" },
2016 {delete_program, "delete_program", "Invalid glDeleteProgram() usage" },
2017 {validate_program, "validate_program", "Invalid glValidateProgram() usage" },
2018 {get_program_binary, "get_program_binary", "Invalid glGetProgramBinary() usage" },
2019 {program_binary, "program_binary", "Invalid glProgramBinary() usage" },
2020 {program_parameteri, "program_parameteri", "Invalid glProgramParameteri() usage" },
2021 {gen_samplers, "gen_samplers", "Invalid glGenSamplers() usage" },
2022 {bind_sampler, "bind_sampler", "Invalid glBindSampler() usage" },
2023 {delete_samplers, "delete_samplers", "Invalid glDeleteSamplers() usage" },
2024 {get_sampler_parameteriv, "get_sampler_parameteriv", "Invalid glGetSamplerParameteriv() usage" },
2025 {get_sampler_parameterfv, "get_sampler_parameterfv", "Invalid glGetSamplerParameterfv() usage" },
2026 {sampler_parameteri, "sampler_parameteri", "Invalid glSamplerParameteri() usage" },
2027 {sampler_parameteriv, "sampler_parameteriv", "Invalid glSamplerParameteriv() usage" },
2028 {sampler_parameterf, "sampler_parameterf", "Invalid glSamplerParameterf() usage" },
2029 {sampler_parameterfv, "sampler_parameterfv", "Invalid glSamplerParameterfv() usage" },
2030 {get_attrib_location, "get_attrib_location", "Invalid glGetAttribLocation() usage" },
2031 {get_uniform_location, "get_uniform_location", "Invalid glGetUniformLocation() usage" },
2032 {bind_attrib_location, "bind_attrib_location", "Invalid glBindAttribLocation() usage" },
2033 {uniform_block_binding, "uniform_block_binding", "Invalid glUniformBlockBinding() usage" },
2034 {uniformf_invalid_program, "uniformf_invalid_program", "Invalid glUniform{1234}f() usage" },
2035 {uniformf_incompatible_type, "uniformf_incompatible_type", "Invalid glUniform{1234}f() usage" },
2036 {uniformf_invalid_location, "uniformf_invalid_location", "Invalid glUniform{1234}f() usage" },
2037 {uniformfv_invalid_program, "uniformfv_invalid_program", "Invalid glUniform{1234}fv() usage" },
2038 {uniformfv_incompatible_type, "uniformfv_incompatible_type", "Invalid glUniform{1234}fv() usage" },
2039 {uniformfv_invalid_location, "uniformfv_invalid_location", "Invalid glUniform{1234}fv() usage" },
2040 {uniformfv_invalid_count, "uniformfv_invalid_count", "Invalid glUniform{1234}fv() usage" },
2041 {uniformi_invalid_program, "uniformi_invalid_program", "Invalid glUniform{1234}i() usage" },
2042 {uniformi_incompatible_type, "uniformi_incompatible_type", "Invalid glUniform{1234}i() usage" },
2043 {uniformi_invalid_location, "uniformi_invalid_location", "Invalid glUniform{1234}i() usage" },
2044 {uniformiv_invalid_program, "uniformiv_invalid_program", "Invalid glUniform{1234}iv() usage" },
2045 {uniformiv_incompatible_type, "uniformiv_incompatible_type", "Invalid glUniform{1234}iv() usage" },
2046 {uniformiv_invalid_location, "uniformiv_invalid_location", "Invalid glUniform{1234}iv() usage" },
2047 {uniformiv_invalid_count, "uniformiv_invalid_count", "Invalid glUniform{1234}iv() usage" },
2048 {uniformui_invalid_program, "uniformui_invalid_program", "Invalid glUniform{234}ui() usage" },
2049 {uniformui_incompatible_type, "uniformui_incompatible_type", "Invalid glUniform{1234}ui() usage" },
2050 {uniformui_invalid_location, "uniformui_invalid_location", "Invalid glUniform{1234}ui() usage" },
2051 {uniformuiv_invalid_program, "uniformuiv_invalid_program", "Invalid glUniform{234}uiv() usage" },
2052 {uniformuiv_incompatible_type, "uniformuiv_incompatible_type", "Invalid glUniform{1234}uiv() usage" },
2053 {uniformuiv_invalid_location, "uniformuiv_invalid_location", "Invalid glUniform{1234}uiv() usage" },
2054 {uniformuiv_invalid_count, "uniformuiv_invalid_count", "Invalid glUniform{1234}uiv() usage" },
2055 {uniform_matrixfv_invalid_program, "uniform_matrixfv_invalid_program", "Invalid glUniformMatrix{234}fv() usage" },
2056 {uniform_matrixfv_incompatible_type, "uniform_matrixfv_incompatible_type", "Invalid glUniformMatrix{234}fv() usage" },
2057 {uniform_matrixfv_invalid_location, "uniform_matrixfv_invalid_location", "Invalid glUniformMatrix{234}fv() usage" },
2058 {uniform_matrixfv_invalid_count, "uniform_matrixfv_invalid_count", "Invalid glUniformMatrix{234}fv() usage" },
2059 {gen_transform_feedbacks, "gen_transform_feedbacks", "Invalid glGenTransformFeedbacks() usage" },
2060 {bind_transform_feedback, "bind_transform_feedback", "Invalid glBindTransformFeedback() usage" },
2061 {delete_transform_feedbacks, "delete_transform_feedbacks", "Invalid glDeleteTransformFeedbacks() usage" },
2062 {begin_transform_feedback, "begin_transform_feedback", "Invalid glBeginTransformFeedback() usage" },
2063 {pause_transform_feedback, "pause_transform_feedback", "Invalid glPauseTransformFeedback() usage" },
2064 {resume_transform_feedback, "resume_transform_feedback", "Invalid glResumeTransformFeedback() usage" },
2065 {end_transform_feedback, "end_transform_feedback", "Invalid glEndTransformFeedback() usage" },
2066 {get_transform_feedback_varying, "get_transform_feedback_varying", "Invalid glGetTransformFeedbackVarying() usage"},
2067 {transform_feedback_varyings, "transform_feedback_varyings", "Invalid glTransformFeedbackVaryings() usage" },
2070 return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
2073 } // NegativeTestShared