Lines Matching refs:ctx

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);
94 ctx.endSection();
97 void shader_source (NegativeTestContext& ctx)
101 ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
102 ctx.glShaderSource(1, 0, 0, 0);
103 ctx.expectError(GL_INVALID_VALUE);
104 ctx.endSection();
106 ctx.beginSection("GL_INVALID_VALUE is generated if count is less than 0.");
107 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
108 ctx.glShaderSource(shader, -1, 0, 0);
109 ctx.expectError(GL_INVALID_VALUE);
110 ctx.endSection();
112 ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
113 GLuint program = ctx.glCreateProgram();
114 ctx.glShaderSource(program, 0, 0, 0);
115 ctx.expectError(GL_INVALID_OPERATION);
116 ctx.endSection();
118 ctx.glDeleteProgram(program);
119 ctx.glDeleteShader(shader);
122 void compile_shader (NegativeTestContext& ctx)
126 ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
127 ctx.glCompileShader(9);
128 ctx.expectError(GL_INVALID_VALUE);
129 ctx.endSection();
131 ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
132 GLuint program = ctx.glCreateProgram();
133 ctx.glCompileShader(program);
134 ctx.expectError(GL_INVALID_OPERATION);
135 ctx.endSection();
137 ctx.glDeleteProgram(program);
140 void delete_shader (NegativeTestContext& ctx)
142 ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
143 ctx.glDeleteShader(9);
144 ctx.expectError(GL_INVALID_VALUE);
145 ctx.endSection();
148 void shader_binary (NegativeTestContext& ctx)
154 ctx.glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &numFormats);
157 ctx.getLog() << TestLog::Message << "// No supported extensions available." << TestLog::EndMessage;
161 ctx.glGetIntegerv(GL_SHADER_BINARY_FORMATS, &binaryFormats[0]);
167 ctx.getLog() << TestLog::Message << "// Shader binaries not supported." << TestLog::EndMessage;
169 ctx.getLog() << TestLog::Message << "// Shader binaries supported" << TestLog::EndMessage;
172 shaders[0] = ctx.glCreateShader(GL_VERTEX_SHADER);
173 shaders[1] = ctx.glCreateShader(GL_VERTEX_SHADER);
175 ctx.beginSection("GL_INVALID_ENUM is generated if binaryFormat is not an accepted value.");
176 ctx.glShaderBinary(1, &shaders[0], -1, 0, 0);
177 ctx.expectError(GL_INVALID_ENUM);
178 ctx.endSection();
182 ctx.beginSection("GL_INVALID_VALUE is generated if the data pointed to by binary does not match the format specified by binaryFormat.");
184 ctx.glShaderBinary(1, &shaders[0], binaryFormats[0], &data, 1);
185 ctx.expectError(GL_INVALID_VALUE);
186 ctx.endSection();
188 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.");
189 ctx.glShaderBinary(2, &shaders[0], binaryFormats[0], 0, 0);
190 ctx.expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
191 ctx.endSection();
194 ctx.glDeleteShader(shaders[0]);
195 ctx.glDeleteShader(shaders[1]);
198 void attach_shader (NegativeTestContext& ctx)
200 GLuint shader1 = ctx.glCreateShader(GL_VERTEX_SHADER);
201 GLuint shader2 = ctx.glCreateShader(GL_VERTEX_SHADER);
202 GLuint program = ctx.glCreateProgram();
204 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
205 ctx.glAttachShader(shader1, shader1);
206 ctx.expectError(GL_INVALID_OPERATION);
207 ctx.endSection();
209 ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
210 ctx.glAttachShader(program, program);
211 ctx.expectError(GL_INVALID_OPERATION);
212 ctx.glAttachShader(shader1, program);
213 ctx.expectError(GL_INVALID_OPERATION);
214 ctx.endSection();
216 ctx.beginSection("GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
217 ctx.glAttachShader(program, -1);
218 ctx.expectError(GL_INVALID_VALUE);
219 ctx.glAttachShader(-1, shader1);
220 ctx.expectError(GL_INVALID_VALUE);
221 ctx.glAttachShader(-1, -1);
222 ctx.expectError(GL_INVALID_VALUE);
223 ctx.endSection();
225 ctx.beginSection("GL_INVALID_OPERATION is generated if shader is already attached to program.");
226 ctx.glAttachShader(program, shader1);
227 ctx.expectError(GL_NO_ERROR);
228 ctx.glAttachShader(program, shader1);
229 ctx.expectError(GL_INVALID_OPERATION);
230 ctx.endSection();
232 ctx.beginSection("GL_INVALID_OPERATION is generated if a shader of the same type as shader is already attached to program.");
233 ctx.glAttachShader(program, shader2);
234 ctx.expectError(GL_INVALID_OPERATION);
235 ctx.endSection();
237 ctx.glDeleteProgram(program);
238 ctx.glDeleteShader(shader1);
239 ctx.glDeleteShader(shader2);
242 void detach_shader (NegativeTestContext& ctx)
244 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
245 GLuint program = ctx.glCreateProgram();
247 ctx.beginSection("GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
248 ctx.glDetachShader(-1, shader);
249 ctx.expectError(GL_INVALID_VALUE);
250 ctx.glDetachShader(program, -1);
251 ctx.expectError(GL_INVALID_VALUE);
252 ctx.glDetachShader(-1, -1);
253 ctx.expectError(GL_INVALID_VALUE);
254 ctx.endSection();
256 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
257 ctx.glDetachShader(shader, shader);
258 ctx.expectError(GL_INVALID_OPERATION);
259 ctx.endSection();
261 ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
262 ctx.glDetachShader(program, program);
263 ctx.expectError(GL_INVALID_OPERATION);
264 ctx.glDetachShader(shader, program);
265 ctx.expectError(GL_INVALID_OPERATION);
266 ctx.endSection();
268 ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not attached to program.");
269 ctx.glDetachShader(program, shader);
270 ctx.expectError(GL_INVALID_OPERATION);
271 ctx.endSection();
273 ctx.glDeleteProgram(program);
274 ctx.glDeleteShader(shader);
277 void link_program (NegativeTestContext& ctx)
279 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
281 ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
282 ctx.glLinkProgram(-1);
283 ctx.expectError(GL_INVALID_VALUE);
284 ctx.endSection();
286 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
287 ctx.glLinkProgram(shader);
288 ctx.expectError(GL_INVALID_OPERATION);
289 ctx.endSection();
291 ctx.glDeleteShader(shader);
293 ctx.beginSection("GL_INVALID_OPERATION is generated if program is the currently active program object and transform feedback mode is active.");
294 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
299 ctx.glGenTransformFeedbacks (1, &tfID);
300 ctx.glGenBuffers (1, &buf);
302 ctx.glUseProgram (program.getProgram());
303 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
304 ctx.glLinkProgram (program.getProgram());
305 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID);
306 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
307 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
308 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
309 ctx.glBeginTransformFeedback (GL_TRIANGLES);
310 ctx.expectError (GL_NO_ERROR);
312 ctx.glLinkProgram (program.getProgram());
313 ctx.expectError (GL_INVALID_OPERATION);
315 ctx.glEndTransformFeedback ();
316 ctx.glDeleteTransformFeedbacks (1, &tfID);
317 ctx.glDeleteBuffers (1, &buf);
318 ctx.expectError (GL_NO_ERROR);
319 ctx.endSection();
322 void use_program (NegativeTestContext& ctx)
324 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
326 ctx.beginSection("GL_INVALID_VALUE is generated if program is neither 0 nor a value generated by OpenGL.");
327 ctx.glUseProgram(-1);
328 ctx.expectError(GL_INVALID_VALUE);
329 ctx.endSection();
331 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
332 ctx.glUseProgram(shader);
333 ctx.expectError(GL_INVALID_OPERATION);
334 ctx.endSection();
336 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback mode is active and not paused.");
337 glu::ShaderProgram program1(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
338 glu::ShaderProgram program2(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
343 ctx.glGenTransformFeedbacks (1, &tfID);
344 ctx.glGenBuffers (1, &buf);
346 ctx.glUseProgram (program1.getProgram());
347 ctx.glTransformFeedbackVaryings (program1.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
348 ctx.glLinkProgram (program1.getProgram());
349 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID);
350 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
351 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
352 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
353 ctx.glBeginTransformFeedback (GL_TRIANGLES);
354 ctx.expectError (GL_NO_ERROR);
356 ctx.glUseProgram (program2.getProgram());
357 ctx.expectError (GL_INVALID_OPERATION);
359 ctx.glPauseTransformFeedback ();
360 ctx.glUseProgram (program2.getProgram());
361 ctx.expectError (GL_NO_ERROR);
363 ctx.glEndTransformFeedback ();
364 ctx.glDeleteTransformFeedbacks (1, &tfID);
365 ctx.glDeleteBuffers (1, &buf);
366 ctx.expectError (GL_NO_ERROR);
367 ctx.endSection();
369 ctx.glUseProgram(0);
370 ctx.glDeleteShader(shader);
373 void delete_program (NegativeTestContext& ctx)
375 ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
376 ctx.glDeleteProgram(-1);
377 ctx.expectError(GL_INVALID_VALUE);
378 ctx.endSection();
381 void validate_program (NegativeTestContext& ctx)
383 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
385 ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
386 ctx.glValidateProgram(-1);
387 ctx.expectError(GL_INVALID_VALUE);
388 ctx.endSection();
390 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
391 ctx.glValidateProgram(shader);
392 ctx.expectError(GL_INVALID_OPERATION);
393 ctx.endSection();
395 ctx.glDeleteShader(shader);
398 void get_program_binary (NegativeTestContext& ctx)
400 glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
401 glu::ShaderProgram programInvalid (ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, ""));
408 ctx.beginSection("GL_INVALID_OPERATION is generated if bufSize is less than the size of GL_PROGRAM_BINARY_LENGTH for program.");
409 ctx.glGetProgramiv (program.getProgram(), GL_PROGRAM_BINARY_LENGTH, &bufSize);
410 ctx.expectError (GL_NO_ERROR);
411 ctx.glGetProgramiv (program.getProgram(), GL_LINK_STATUS, &linkStatus);
412 ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
413 ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
414 ctx.expectError (GL_NO_ERROR);
416 ctx.glGetProgramBinary (program.getProgram(), 0, &binaryLength, &binaryFormat, &binaryPtr);
417 ctx.expectError (GL_INVALID_OPERATION);
420 ctx.glGetProgramBinary (program.getProgram(), bufSize-1, &binaryLength, &binaryFormat, &binaryPtr);
421 ctx.expectError (GL_INVALID_OPERATION);
423 ctx.endSection();
425 ctx.beginSection("GL_INVALID_OPERATION is generated if GL_LINK_STATUS for the program object is false.");
426 ctx.glGetProgramiv (programInvalid.getProgram(), GL_PROGRAM_BINARY_LENGTH, &bufSize);
427 ctx.expectError (GL_NO_ERROR);
428 ctx.glGetProgramiv (programInvalid.getProgram(), GL_LINK_STATUS, &linkStatus);
429 ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
430 ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
431 ctx.expectError (GL_NO_ERROR);
433 ctx.glGetProgramBinary (programInvalid.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryPtr);
434 ctx.expectError (GL_INVALID_OPERATION);
435 ctx.endSection();
438 void program_binary (NegativeTestContext& ctx)
440 glu::ShaderProgram srcProgram (ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
441 GLuint dstProgram = ctx.glCreateProgram();
442 GLuint dummyShader = ctx.glCreateShader(GL_VERTEX_SHADER);
449 ctx.glGetProgramiv (srcProgram.getProgram(), GL_PROGRAM_BINARY_LENGTH, &bufSize);
450 ctx.glGetProgramiv (srcProgram.getProgram(), GL_LINK_STATUS, &linkStatus);
451 ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
452 ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
455 ctx.glGetProgramBinary (srcProgram.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryBuf[0]);
456 ctx.expectError (GL_NO_ERROR);
458 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not the name of an existing program object.");
459 ctx.glProgramBinary (dummyShader, binaryFormat, &binaryBuf[0], binaryLength);
460 ctx.expectError (GL_INVALID_OPERATION);
461 ctx.endSection();
463 ctx.beginSection("GL_INVALID_ENUM is generated if binaryFormat is not a value recognized by the implementation.");
464 ctx.glProgramBinary (dstProgram, -1, &binaryBuf[0], binaryLength);
465 ctx.expectError (GL_INVALID_ENUM);
466 ctx.endSection();
468 ctx.glDeleteShader(dummyShader);
469 ctx.glDeleteProgram(dstProgram);
472 void program_parameteri (NegativeTestContext& ctx)
474 GLuint program = ctx.glCreateProgram();
476 ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of an existing program object.");
477 ctx.glProgramParameteri (0, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
478 ctx.expectError (GL_INVALID_VALUE);
479 ctx.endSection();
481 ctx.beginSection("GL_INVALID_ENUM is generated if pname is not GL_PROGRAM_BINARY_RETRIEVABLE_HINT.");
482 ctx.glProgramParameteri (program, -1, GL_TRUE);
483 ctx.expectError (GL_INVALID_ENUM);
484 ctx.endSection();
486 ctx.beginSection("GL_INVALID_VALUE is generated if value is not GL_FALSE or GL_TRUE.");
487 ctx.glProgramParameteri (program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, 2);
488 ctx.expectError (GL_INVALID_VALUE);
489 ctx.endSection();
491 ctx.glDeleteProgram(program);
494 void gen_samplers (NegativeTestContext& ctx)
496 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
498 ctx.glGenSamplers (-1, &sampler);
499 ctx.expectError (GL_INVALID_VALUE);
500 ctx.endSection();
503 void bind_sampler (NegativeTestContext& ctx)
507 ctx.glGetIntegerv (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTexImageUnits);
508 ctx.glGenSamplers (1, &sampler);
510 ctx.beginSection("GL_INVALID_VALUE is generated if unit is greater than or equal to the value of GL_MAX_COMBIED_TEXTURE_IMAGE_UNITS.");
511 ctx.glBindSampler (maxTexImageUnits, sampler);
512 ctx.expectError (GL_INVALID_VALUE);
513 ctx.endSection();
515 ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not zero or a name previously returned from a call to ctx.glGenSamplers.");
516 ctx.glBindSampler (1, -1);
517 ctx.expectError (GL_INVALID_OPERATION);
518 ctx.endSection();
520 ctx.beginSection("GL_INVALID_OPERATION is generated if sampler has been deleted by a call to ctx.glDeleteSamplers.");
521 ctx.glDeleteSamplers(1, &sampler);
522 ctx.glBindSampler (1, sampler);
523 ctx.expectError (GL_INVALID_OPERATION);
524 ctx.endSection();
527 void delete_samplers (NegativeTestContext& ctx)
529 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
530 ctx.glDeleteSamplers(-1, 0);
531 ctx.expectError (GL_INVALID_VALUE);
532 ctx.endSection();
535 void get_sampler_parameteriv (NegativeTestContext& ctx)
539 ctx.glGenSamplers (1, &sampler);
541 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.");
542 ctx.glGetSamplerParameteriv (-1, GL_TEXTURE_MAG_FILTER, &params);
543 ctx.expectError (GL_INVALID_OPERATION);
544 ctx.endSection();
546 ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
547 ctx.glGetSamplerParameteriv (sampler, -1, &params);
548 ctx.expectError (GL_INVALID_ENUM);
549 ctx.endSection();
551 ctx.glDeleteSamplers(1, &sampler);
554 void get_sampler_parameterfv (NegativeTestContext& ctx)
558 ctx.glGenSamplers (1, &sampler);
560 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.");
561 ctx.glGetSamplerParameterfv (-1, GL_TEXTURE_MAG_FILTER, &params);
562 ctx.expectError (GL_INVALID_OPERATION);
563 ctx.endSection();
565 ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
566 ctx.glGetSamplerParameterfv (sampler, -1, &params);
567 ctx.expectError (GL_INVALID_ENUM);
568 ctx.endSection();
570 ctx.glDeleteSamplers(1, &sampler);
573 void sampler_parameteri (NegativeTestContext& ctx)
576 ctx.glGenSamplers (1, &sampler);
578 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.");
579 ctx.glSamplerParameteri (-1, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
580 ctx.expectError (GL_INVALID_OPERATION);
581 ctx.endSection();
583 ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
584 ctx.glSamplerParameteri (sampler, GL_TEXTURE_WRAP_S, -1);
585 ctx.expectError (GL_INVALID_ENUM);
586 ctx.endSection();
588 ctx.glDeleteSamplers(1, &sampler);
591 void sampler_parameteriv (NegativeTestContext& ctx)
595 ctx.glGenSamplers (1, &sampler);
597 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.");
599 ctx.glSamplerParameteriv (-1, GL_TEXTURE_WRAP_S, &params);
600 ctx.expectError (GL_INVALID_OPERATION);
601 ctx.endSection();
603 ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
605 ctx.glSamplerParameteriv (sampler, GL_TEXTURE_WRAP_S, &params);
606 ctx.expectError (GL_INVALID_ENUM);
607 ctx.endSection();
609 ctx.glDeleteSamplers(1, &sampler);
612 void sampler_parameterf (NegativeTestContext& ctx)
615 ctx.glGenSamplers (1, &sampler);
617 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.");
618 ctx.glSamplerParameterf (-1, GL_TEXTURE_MIN_LOD, -1000.0f);
619 ctx.expectError (GL_INVALID_OPERATION);
620 ctx.endSection();
622 ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
623 ctx.glSamplerParameterf (sampler, GL_TEXTURE_WRAP_S, -1.0f);
624 ctx.expectError (GL_INVALID_ENUM);
625 ctx.endSection();
627 ctx.glDeleteSamplers(1, &sampler);
630 void sampler_parameterfv (NegativeTestContext& ctx)
634 ctx.glGenSamplers (1, &sampler);
636 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.");
638 ctx.glSamplerParameterfv (-1, GL_TEXTURE_WRAP_S, &params);
639 ctx.expectError (GL_INVALID_OPERATION);
640 ctx.endSection();
642 ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value of pname) and does not.");
644 ctx.glSamplerParameterfv (sampler, GL_TEXTURE_WRAP_S, &params);
645 ctx.expectError (GL_INVALID_ENUM);
646 ctx.endSection();
648 ctx.glDeleteSamplers(1, &sampler);
653 void get_attrib_location (NegativeTestContext& ctx)
655 GLuint programEmpty = ctx.glCreateProgram();
656 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
658 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
660 ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
661 ctx.glBindAttribLocation (programEmpty, 0, "test");
662 ctx.glGetAttribLocation (programEmpty, "test");
663 ctx.expectError (GL_INVALID_OPERATION);
664 ctx.endSection();
666 ctx.beginSection("GL_INVALID_VALUE is generated if program is not a program or shader object.");
667 ctx.glUseProgram (program.getProgram());
668 ctx.glBindAttribLocation (program.getProgram(), 0, "test");
669 ctx.expectError (GL_NO_ERROR);
670 ctx.glGetAttribLocation (program.getProgram(), "test");
671 ctx.expectError (GL_NO_ERROR);
672 ctx.glGetAttribLocation (-2, "test");
673 ctx.expectError (GL_INVALID_VALUE);
674 ctx.endSection();
676 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
677 ctx.glGetAttribLocation (shader, "test");
678 ctx.expectError (GL_INVALID_OPERATION);
679 ctx.endSection();
681 ctx.glUseProgram (0);
682 ctx.glDeleteShader (shader);
683 ctx.glDeleteProgram (programEmpty);
686 void get_uniform_location (NegativeTestContext& ctx)
688 GLuint programEmpty = ctx.glCreateProgram();
689 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
691 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
693 ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
694 ctx.glGetUniformLocation(programEmpty, "test");
695 ctx.expectError(GL_INVALID_OPERATION);
696 ctx.endSection();
698 ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
699 ctx.glUseProgram(program.getProgram());
700 ctx.glGetUniformLocation(-2, "test");
701 ctx.expectError(GL_INVALID_VALUE);
702 ctx.endSection();
704 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
705 ctx.glGetAttribLocation(shader, "test");
706 ctx.expectError(GL_INVALID_OPERATION);
707 ctx.endSection();
709 ctx.glUseProgram(0);
710 ctx.glDeleteProgram(programEmpty);
711 ctx.glDeleteShader(shader);
714 void bind_attrib_location (NegativeTestContext& ctx)
716 GLuint program = ctx.glCreateProgram();
717 GLuint maxIndex = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
718 GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
720 ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
721 ctx.glBindAttribLocation(program, maxIndex, "test");
722 ctx.expectError(GL_INVALID_VALUE);
723 ctx.endSection();
725 ctx.beginSection("GL_INVALID_OPERATION is generated if name starts with the reserved prefix \"gl_\".");
726 ctx.glBindAttribLocation(program, maxIndex-1, "gl_test");
727 ctx.expectError(GL_INVALID_OPERATION);
728 ctx.endSection();
730 ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
731 ctx.glBindAttribLocation(-1, maxIndex-1, "test");
732 ctx.expectError(GL_INVALID_VALUE);
733 ctx.endSection();
735 ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
736 ctx.glBindAttribLocation(shader, maxIndex-1, "test");
737 ctx.expectError(GL_INVALID_OPERATION);
738 ctx.endSection();
740 ctx.glDeleteProgram(program);
741 ctx.glDeleteShader(shader);
744 void uniform_block_binding (NegativeTestContext& ctx)
746 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformBlockVertSource, uniformTestFragSource));
748 ctx.glUseProgram (program.getProgram());
753 ctx.glGetIntegerv (GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
754 ctx.glGetProgramiv (program.getProgram(), GL_ACTIVE_UNIFORMS, &numActiveUniforms);
755 ctx.glGetProgramiv (program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks);
756 ctx.getLog() << TestLog::Message << "// GL_MAX_UNIFORM_BUFFER_BINDINGS = " << maxUniformBufferBindings << TestLog::EndMessage;
757 ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORMS = " << numActiveUniforms << TestLog::EndMessage;
758 ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << TestLog::EndMessage;
759 ctx.expectError (GL_NO_ERROR);
761 ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockIndex is not an active uniform block index of program.");
762 ctx.glUniformBlockBinding(program.getProgram(), -1, 0);
763 ctx.expectError(GL_INVALID_VALUE);
764 ctx.glUniformBlockBinding(program.getProgram(), 5, 0);
765 ctx.expectError(GL_INVALID_VALUE);
766 ctx.endSection();
768 ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockBinding is greater than or equal to the value of GL_MAX_UNIFORM_BUFFER_BINDINGS.");
769 ctx.glUniformBlockBinding(program.getProgram(), maxUniformBufferBindings, 0);
770 ctx.expectError(GL_INVALID_VALUE);
771 ctx.endSection();
773 ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object generated by the GL.");
774 ctx.glUniformBlockBinding(-1, 0, 0);
775 ctx.expectError(GL_INVALID_VALUE);
776 ctx.endSection();
779 // ctx.glUniform*f
781 void uniformf_invalid_program (NegativeTestContext& ctx)
783 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
784 ctx.glUseProgram(0);
785 ctx.glUniform1f(-1, 0.0f);
786 ctx.expectError(GL_INVALID_OPERATION);
787 ctx.glUniform2f(-1, 0.0f, 0.0f);
788 ctx.expectError(GL_INVALID_OPERATION);
789 ctx.glUniform3f(-1, 0.0f, 0.0f, 0.0f);
790 ctx.expectError(GL_INVALID_OPERATION);
791 ctx.glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
792 ctx.expectError(GL_INVALID_OPERATION);
793 ctx.endSection();
796 void uniformf_incompatible_type (NegativeTestContext& ctx)
798 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
800 ctx.glUseProgram(program.getProgram());
801 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
802 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
803 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
804 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
805 ctx.expectError(GL_NO_ERROR);
809 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
810 ctx.fail("Failed to retrieve uniform location");
813 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.");
814 ctx.glUseProgram(program.getProgram());
815 ctx.glUniform1f(vec4_v, 0.0f);
816 ctx.expectError(GL_INVALID_OPERATION);
817 ctx.glUniform2f(vec4_v, 0.0f, 0.0f);
818 ctx.expectError(GL_INVALID_OPERATION);
819 ctx.glUniform3f(vec4_v, 0.0f, 0.0f, 0.0f);
820 ctx.expectError(GL_INVALID_OPERATION);
821 ctx.glUniform4f(vec4_v, 0.0f, 0.0f, 0.0f, 0.0f);
822 ctx.expectError(GL_NO_ERROR);
823 ctx.endSection();
825 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.");
826 ctx.glUseProgram(program.getProgram());
827 ctx.glUniform4f(ivec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
828 ctx.expectError(GL_INVALID_OPERATION);
829 ctx.glUniform4f(uvec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
830 ctx.expectError(GL_INVALID_OPERATION);
831 ctx.endSection();
833 ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
834 ctx.glUseProgram(program.getProgram());
835 ctx.glUniform1f(sampler_f, 0.0f);
836 ctx.expectError(GL_INVALID_OPERATION);
837 ctx.endSection();
839 ctx.glUseProgram(0);
842 void uniformf_invalid_location (NegativeTestContext& ctx)
844 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
846 ctx.glUseProgram(program.getProgram());
847 ctx.expectError(GL_NO_ERROR);
849 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.");
850 ctx.glUseProgram(program.getProgram());
851 ctx.glUniform1f(-2, 0.0f);
852 ctx.expectError(GL_INVALID_OPERATION);
853 ctx.glUniform2f(-2, 0.0f, 0.0f);
854 ctx.expectError(GL_INVALID_OPERATION);
855 ctx.glUniform3f(-2, 0.0f, 0.0f, 0.0f);
856 ctx.expectError(GL_INVALID_OPERATION);
857 ctx.glUniform4f(-2, 0.0f, 0.0f, 0.0f, 0.0f);
858 ctx.expectError(GL_INVALID_OPERATION);
860 ctx.glUseProgram(program.getProgram());
861 ctx.glUniform1f(-1, 0.0f);
862 ctx.expectError(GL_NO_ERROR);
863 ctx.glUniform2f(-1, 0.0f, 0.0f);
864 ctx.expectError(GL_NO_ERROR);
865 ctx.glUniform3f(-1, 0.0f, 0.0f, 0.0f);
866 ctx.expectError(GL_NO_ERROR);
867 ctx.glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
868 ctx.expectError(GL_NO_ERROR);
869 ctx.endSection();
871 ctx.glUseProgram(0);
874 // ctx.glUniform*fv
876 void uniformfv_invalid_program (NegativeTestContext& ctx)
880 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
881 ctx.glUseProgram(0);
882 ctx.glUniform1fv(-1, 1, &data[0]);
883 ctx.expectError(GL_INVALID_OPERATION);
884 ctx.glUniform2fv(-1, 1, &data[0]);
885 ctx.expectError(GL_INVALID_OPERATION);
886 ctx.glUniform3fv(-1, 1, &data[0]);
887 ctx.expectError(GL_INVALID_OPERATION);
888 ctx.glUniform4fv(-1, 1, &data[0]);
889 ctx.expectError(GL_INVALID_OPERATION);
890 ctx.endSection();
893 void uniformfv_incompatible_type (NegativeTestContext& ctx)
895 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
897 ctx.glUseProgram(program.getProgram());
898 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
899 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
900 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
901 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
902 ctx.expectError(GL_NO_ERROR);
906 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
907 ctx.fail("Failed to retrieve uniform location");
912 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.");
913 ctx.glUseProgram(program.getProgram());
914 ctx.glUniform1fv(vec4_v, 1, &data[0]);
915 ctx.expectError(GL_INVALID_OPERATION);
916 ctx.glUniform2fv(vec4_v, 1, &data[0]);
917 ctx.expectError(GL_INVALID_OPERATION);
918 ctx.glUniform3fv(vec4_v, 1, &data[0]);
919 ctx.expectError(GL_INVALID_OPERATION);
920 ctx.glUniform4fv(vec4_v, 1, &data[0]);
921 ctx.expectError(GL_NO_ERROR);
922 ctx.endSection();
924 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.");
925 ctx.glUseProgram(program.getProgram());
926 ctx.glUniform4fv(ivec4_f, 1, &data[0]);
927 ctx.expectError(GL_INVALID_OPERATION);
928 ctx.glUniform4fv(uvec4_f, 1, &data[0]);
929 ctx.expectError(GL_INVALID_OPERATION);
930 ctx.endSection();
932 ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
933 ctx.glUseProgram(program.getProgram());
934 ctx.glUniform1fv(sampler_f, 1, &data[0]);
935 ctx.expectError(GL_INVALID_OPERATION);
936 ctx.endSection();
938 ctx.glUseProgram(0);
941 void uniformfv_invalid_location (NegativeTestContext& ctx)
943 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
945 ctx.glUseProgram(program.getProgram());
946 ctx.expectError(GL_NO_ERROR);
950 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.");
951 ctx.glUseProgram(program.getProgram());
952 ctx.glUniform1fv(-2, 1, &data[0]);
953 ctx.expectError(GL_INVALID_OPERATION);
954 ctx.glUniform2fv(-2, 1, &data[0]);
955 ctx.expectError(GL_INVALID_OPERATION);
956 ctx.glUniform3fv(-2, 1, &data[0]);
957 ctx.expectError(GL_INVALID_OPERATION);
958 ctx.glUniform4fv(-2, 1, &data[0]);
959 ctx.expectError(GL_INVALID_OPERATION);
961 ctx.glUseProgram(program.getProgram());
962 ctx.glUniform1fv(-1, 1, &data[0]);
963 ctx.expectError(GL_NO_ERROR);
964 ctx.glUniform2fv(-1, 1, &data[0]);
965 ctx.expectError(GL_NO_ERROR);
966 ctx.glUniform3fv(-1, 1, &data[0]);
967 ctx.expectError(GL_NO_ERROR);
968 ctx.glUniform4fv(-1, 1, &data[0]);
969 ctx.expectError(GL_NO_ERROR);
970 ctx.endSection();
972 ctx.glUseProgram(0);
975 void uniformfv_invalid_count (NegativeTestContext& ctx)
977 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
979 ctx.glUseProgram (program.getProgram());
980 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
981 ctx.expectError(GL_NO_ERROR);
985 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
986 ctx.fail("Failed to retrieve uniform location");
991 ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
992 ctx.glUseProgram(program.getProgram());
993 ctx.glUniform1fv(vec4_v, 2, &data[0]);
994 ctx.expectError(GL_INVALID_OPERATION);
995 ctx.glUniform2fv(vec4_v, 2, &data[0]);
996 ctx.expectError(GL_INVALID_OPERATION);
997 ctx.glUniform3fv(vec4_v, 2, &data[0]);
998 ctx.expectError(GL_INVALID_OPERATION);
999 ctx.glUniform4fv(vec4_v, 2, &data[0]);
1000 ctx.expectError(GL_INVALID_OPERATION);
1001 ctx.endSection();
1003 ctx.glUseProgram(0);
1006 // ctx.glUniform*i
1008 void uniformi_invalid_program (NegativeTestContext& ctx)
1010 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1011 ctx.glUseProgram(0);
1012 ctx.glUniform1i(-1, 0);
1013 ctx.expectError(GL_INVALID_OPERATION);
1014 ctx.glUniform2i(-1, 0, 0);
1015 ctx.expectError(GL_INVALID_OPERATION);
1016 ctx.glUniform3i(-1, 0, 0, 0);
1017 ctx.expectError(GL_INVALID_OPERATION);
1018 ctx.glUniform4i(-1, 0, 0, 0, 0);
1019 ctx.expectError(GL_INVALID_OPERATION);
1020 ctx.endSection();
1023 void uniformi_incompatible_type (NegativeTestContext& ctx)
1025 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1027 ctx.glUseProgram(program.getProgram());
1028 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
1029 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1030 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1031 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1032 ctx.expectError(GL_NO_ERROR);
1036 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1037 ctx.fail("Failed to retrieve uniform location");
1040 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.");
1041 ctx.glUseProgram(program.getProgram());
1042 ctx.glUniform1i(ivec4_f, 0);
1043 ctx.expectError(GL_INVALID_OPERATION);
1044 ctx.glUniform2i(ivec4_f, 0, 0);
1045 ctx.expectError(GL_INVALID_OPERATION);
1046 ctx.glUniform3i(ivec4_f, 0, 0, 0);
1047 ctx.expectError(GL_INVALID_OPERATION);
1048 ctx.glUniform4i(ivec4_f, 0, 0, 0, 0);
1049 ctx.expectError(GL_NO_ERROR);
1050 ctx.endSection();
1052 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.");
1053 ctx.glUseProgram(program.getProgram());
1054 ctx.glUniform1i(uvec4_f, 0);
1055 ctx.expectError(GL_INVALID_OPERATION);
1056 ctx.glUniform2i(uvec4_f, 0, 0);
1057 ctx.expectError(GL_INVALID_OPERATION);
1058 ctx.glUniform3i(uvec4_f, 0, 0, 0);
1059 ctx.expectError(GL_INVALID_OPERATION);
1060 ctx.glUniform4i(uvec4_f, 0, 0, 0, 0);
1061 ctx.expectError(GL_INVALID_OPERATION);
1062 ctx.endSection();
1064 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.");
1065 ctx.glUseProgram(program.getProgram());
1066 ctx.glUniform1i(vec4_v, 0);
1067 ctx.expectError(GL_INVALID_OPERATION);
1068 ctx.glUniform2i(vec4_v, 0, 0);
1069 ctx.expectError(GL_INVALID_OPERATION);
1070 ctx.glUniform3i(vec4_v, 0, 0, 0);
1071 ctx.expectError(GL_INVALID_OPERATION);
1072 ctx.glUniform4i(vec4_v, 0, 0, 0, 0);
1073 ctx.expectError(GL_INVALID_OPERATION);
1074 ctx.endSection();
1076 ctx.glUseProgram(0);
1079 void uniformi_invalid_location (NegativeTestContext& ctx)
1081 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1083 ctx.glUseProgram(program.getProgram());
1084 ctx.expectError(GL_NO_ERROR);
1086 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.");
1087 ctx.glUseProgram(program.getProgram());
1088 ctx.glUniform1i(-2, 0);
1089 ctx.expectError(GL_INVALID_OPERATION);
1090 ctx.glUniform2i(-2, 0, 0);
1091 ctx.expectError(GL_INVALID_OPERATION);
1092 ctx.glUniform3i(-2, 0, 0, 0);
1093 ctx.expectError(GL_INVALID_OPERATION);
1094 ctx.glUniform4i(-2, 0, 0, 0, 0);
1095 ctx.expectError(GL_INVALID_OPERATION);
1097 ctx.glUseProgram(program.getProgram());
1098 ctx.glUniform1i(-1, 0);
1099 ctx.expectError(GL_NO_ERROR);
1100 ctx.glUniform2i(-1, 0, 0);
1101 ctx.expectError(GL_NO_ERROR);
1102 ctx.glUniform3i(-1, 0, 0, 0);
1103 ctx.expectError(GL_NO_ERROR);
1104 ctx.glUniform4i(-1, 0, 0, 0, 0);
1105 ctx.expectError(GL_NO_ERROR);
1106 ctx.endSection();
1108 ctx.glUseProgram(0);
1111 // ctx.glUniform*iv
1113 void uniformiv_invalid_program (NegativeTestContext& ctx)
1117 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1118 ctx.glUseProgram(0);
1119 ctx.glUniform1iv(-1, 1, &data[0]);
1120 ctx.expectError(GL_INVALID_OPERATION);
1121 ctx.glUniform2iv(-1, 1, &data[0]);
1122 ctx.expectError(GL_INVALID_OPERATION);
1123 ctx.glUniform3iv(-1, 1, &data[0]);
1124 ctx.expectError(GL_INVALID_OPERATION);
1125 ctx.glUniform4iv(-1, 1, &data[0]);
1126 ctx.expectError(GL_INVALID_OPERATION);
1127 ctx.endSection();
1130 void uniformiv_incompatible_type (NegativeTestContext& ctx)
1132 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1134 ctx.glUseProgram(program.getProgram());
1135 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
1136 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1137 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1138 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1139 ctx.expectError(GL_NO_ERROR);
1143 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1144 ctx.fail("Failed to retrieve uniform location");
1149 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.");
1150 ctx.glUseProgram(program.getProgram());
1151 ctx.glUniform1iv(ivec4_f, 1, &data[0]);
1152 ctx.expectError(GL_INVALID_OPERATION);
1153 ctx.glUniform2iv(ivec4_f, 1, &data[0]);
1154 ctx.expectError(GL_INVALID_OPERATION);
1155 ctx.glUniform3iv(ivec4_f, 1, &data[0]);
1156 ctx.expectError(GL_INVALID_OPERATION);
1157 ctx.glUniform4iv(ivec4_f, 1, &data[0]);
1158 ctx.expectError(GL_NO_ERROR);
1159 ctx.endSection();
1161 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.");
1162 ctx.glUseProgram(program.getProgram());
1163 ctx.glUniform1iv(vec4_v, 1, &data[0]);
1164 ctx.expectError(GL_INVALID_OPERATION);
1165 ctx.glUniform2iv(vec4_v, 1, &data[0]);
1166 ctx.expectError(GL_INVALID_OPERATION);
1167 ctx.glUniform3iv(vec4_v, 1, &data[0]);
1168 ctx.expectError(GL_INVALID_OPERATION);
1169 ctx.glUniform4iv(vec4_v, 1, &data[0]);
1170 ctx.expectError(GL_INVALID_OPERATION);
1171 ctx.endSection();
1173 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.");
1174 ctx.glUseProgram(program.getProgram());
1175 ctx.glUniform1iv(uvec4_f, 1, &data[0]);
1176 ctx.expectError(GL_INVALID_OPERATION);
1177 ctx.glUniform2iv(uvec4_f, 1, &data[0]);
1178 ctx.expectError(GL_INVALID_OPERATION);
1179 ctx.glUniform3iv(uvec4_f, 1, &data[0]);
1180 ctx.expectError(GL_INVALID_OPERATION);
1181 ctx.glUniform4iv(uvec4_f, 1, &data[0]);
1182 ctx.expectError(GL_INVALID_OPERATION);
1183 ctx.endSection();
1185 ctx.glUseProgram(0);
1188 void uniformiv_invalid_location (NegativeTestContext& ctx)
1190 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1192 ctx.glUseProgram(program.getProgram());
1193 ctx.expectError(GL_NO_ERROR);
1197 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.");
1198 ctx.glUseProgram(program.getProgram());
1199 ctx.glUniform1iv(-2, 1, &data[0]);
1200 ctx.expectError(GL_INVALID_OPERATION);
1201 ctx.glUniform2iv(-2, 1, &data[0]);
1202 ctx.expectError(GL_INVALID_OPERATION);
1203 ctx.glUniform3iv(-2, 1, &data[0]);
1204 ctx.expectError(GL_INVALID_OPERATION);
1205 ctx.glUniform4iv(-2, 1, &data[0]);
1206 ctx.expectError(GL_INVALID_OPERATION);
1208 ctx.glUseProgram(program.getProgram());
1209 ctx.glUniform1iv(-1, 1, &data[0]);
1210 ctx.expectError(GL_NO_ERROR);
1211 ctx.glUniform2iv(-1, 1, &data[0]);
1212 ctx.expectError(GL_NO_ERROR);
1213 ctx.glUniform3iv(-1, 1, &data[0]);
1214 ctx.expectError(GL_NO_ERROR);
1215 ctx.glUniform4iv(-1, 1, &data[0]);
1216 ctx.expectError(GL_NO_ERROR);
1217 ctx.endSection();
1219 ctx.glUseProgram(0);
1222 void uniformiv_invalid_count (NegativeTestContext& ctx)
1224 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1226 ctx.glUseProgram (program.getProgram());
1227 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1228 ctx.expectError(GL_NO_ERROR);
1232 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1233 ctx.fail("Failed to retrieve uniform location");
1238 ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1239 ctx.glUseProgram(program.getProgram());
1240 ctx.glUniform1iv(ivec4_f, 2, &data[0]);
1241 ctx.expectError(GL_INVALID_OPERATION);
1242 ctx.glUniform2iv(ivec4_f, 2, &data[0]);
1243 ctx.expectError(GL_INVALID_OPERATION);
1244 ctx.glUniform3iv(ivec4_f, 2, &data[0]);
1245 ctx.expectError(GL_INVALID_OPERATION);
1246 ctx.glUniform4iv(ivec4_f, 2, &data[0]);
1247 ctx.expectError(GL_INVALID_OPERATION);
1248 ctx.endSection();
1250 ctx.glUseProgram(0);
1253 // ctx.glUniform{1234}ui
1255 void uniformui_invalid_program (NegativeTestContext& ctx)
1257 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1258 ctx.glUseProgram(0);
1259 ctx.glUniform1ui(-1, 0);
1260 ctx.expectError(GL_INVALID_OPERATION);
1261 ctx.glUniform2ui(-1, 0, 0);
1262 ctx.expectError(GL_INVALID_OPERATION);
1263 ctx.glUniform3ui(-1, 0, 0, 0);
1264 ctx.expectError(GL_INVALID_OPERATION);
1265 ctx.glUniform4ui(-1, 0, 0, 0, 0);
1266 ctx.expectError(GL_INVALID_OPERATION);
1267 ctx.endSection();
1270 void uniformui_incompatible_type (NegativeTestContext& ctx)
1272 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1274 ctx.glUseProgram(program.getProgram());
1275 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
1276 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1277 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1278 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1279 ctx.expectError(GL_NO_ERROR);
1283 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1284 ctx.fail("Failed to retrieve uniform location");
1287 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.");
1288 ctx.glUseProgram(program.getProgram());
1289 ctx.glUniform1ui(uvec4_f, 0);
1290 ctx.expectError(GL_INVALID_OPERATION);
1291 ctx.glUniform2ui(uvec4_f, 0, 0);
1292 ctx.expectError(GL_INVALID_OPERATION);
1293 ctx.glUniform3ui(uvec4_f, 0, 0, 0);
1294 ctx.expectError(GL_INVALID_OPERATION);
1295 ctx.glUniform4ui(uvec4_f, 0, 0, 0, 0);
1296 ctx.expectError(GL_NO_ERROR);
1297 ctx.endSection();
1299 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.");
1300 ctx.glUseProgram(program.getProgram());
1301 ctx.glUniform1ui(ivec4_f, 0);
1302 ctx.expectError(GL_INVALID_OPERATION);
1303 ctx.glUniform2ui(ivec4_f, 0, 0);
1304 ctx.expectError(GL_INVALID_OPERATION);
1305 ctx.glUniform3ui(ivec4_f, 0, 0, 0);
1306 ctx.expectError(GL_INVALID_OPERATION);
1307 ctx.glUniform4ui(ivec4_f, 0, 0, 0, 0);
1308 ctx.expectError(GL_INVALID_OPERATION);
1309 ctx.endSection();
1311 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.");
1312 ctx.glUseProgram(program.getProgram());
1313 ctx.glUniform1ui(vec4_v, 0);
1314 ctx.expectError(GL_INVALID_OPERATION);
1315 ctx.glUniform2ui(vec4_v, 0, 0);
1316 ctx.expectError(GL_INVALID_OPERATION);
1317 ctx.glUniform3ui(vec4_v, 0, 0, 0);
1318 ctx.expectError(GL_INVALID_OPERATION);
1319 ctx.glUniform4ui(vec4_v, 0, 0, 0, 0);
1320 ctx.expectError(GL_INVALID_OPERATION);
1321 ctx.endSection();
1323 ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1324 ctx.glUseProgram(program.getProgram());
1325 ctx.glUniform1ui(sampler_f, 0);
1326 ctx.expectError(GL_INVALID_OPERATION);
1327 ctx.endSection();
1329 ctx.glUseProgram(0);
1332 void uniformui_invalid_location (NegativeTestContext& ctx)
1334 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1336 ctx.glUseProgram(program.getProgram());
1337 ctx.expectError(GL_NO_ERROR);
1339 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.");
1340 ctx.glUseProgram(program.getProgram());
1341 ctx.glUniform1i(-2, 0);
1342 ctx.expectError(GL_INVALID_OPERATION);
1343 ctx.glUniform2i(-2, 0, 0);
1344 ctx.expectError(GL_INVALID_OPERATION);
1345 ctx.glUniform3i(-2, 0, 0, 0);
1346 ctx.expectError(GL_INVALID_OPERATION);
1347 ctx.glUniform4i(-2, 0, 0, 0, 0);
1348 ctx.expectError(GL_INVALID_OPERATION);
1350 ctx.glUseProgram(program.getProgram());
1351 ctx.glUniform1i(-1, 0);
1352 ctx.expectError(GL_NO_ERROR);
1353 ctx.glUniform2i(-1, 0, 0);
1354 ctx.expectError(GL_NO_ERROR);
1355 ctx.glUniform3i(-1, 0, 0, 0);
1356 ctx.expectError(GL_NO_ERROR);
1357 ctx.glUniform4i(-1, 0, 0, 0, 0);
1358 ctx.expectError(GL_NO_ERROR);
1359 ctx.endSection();
1361 ctx.glUseProgram(0);
1364 // ctx.glUniform{1234}uiv
1366 void uniformuiv_invalid_program (NegativeTestContext& ctx)
1370 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1371 ctx.glUseProgram(0);
1372 ctx.glUniform1uiv(-1, 1, &data[0]);
1373 ctx.expectError(GL_INVALID_OPERATION);
1374 ctx.glUniform2uiv(-1, 1, &data[0]);
1375 ctx.expectError(GL_INVALID_OPERATION);
1376 ctx.glUniform3uiv(-1, 1, &data[0]);
1377 ctx.expectError(GL_INVALID_OPERATION);
1378 ctx.glUniform4uiv(-1, 1, &data[0]);
1379 ctx.expectError(GL_INVALID_OPERATION);
1380 ctx.endSection();
1383 void uniformuiv_incompatible_type (NegativeTestContext& ctx)
1385 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1387 ctx.glUseProgram(program.getProgram());
1388 GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
1389 GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1390 GLint uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1391 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1392 ctx.expectError(GL_NO_ERROR);
1396 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1397 ctx.fail("Failed to retrieve uniform location");
1402 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.");
1403 ctx.glUseProgram(program.getProgram());
1404 ctx.glUniform1uiv(uvec4_f, 1, &data[0]);
1405 ctx.expectError(GL_INVALID_OPERATION);
1406 ctx.glUniform2uiv(uvec4_f, 1, &data[0]);
1407 ctx.expectError(GL_INVALID_OPERATION);
1408 ctx.glUniform3uiv(uvec4_f, 1, &data[0]);
1409 ctx.expectError(GL_INVALID_OPERATION);
1410 ctx.glUniform4uiv(uvec4_f, 1, &data[0]);
1411 ctx.expectError(GL_NO_ERROR);
1412 ctx.endSection();
1414 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.");
1415 ctx.glUseProgram(program.getProgram());
1416 ctx.glUniform1uiv(vec4_v, 1, &data[0]);
1417 ctx.expectError(GL_INVALID_OPERATION);
1418 ctx.glUniform2uiv(vec4_v, 1, &data[0]);
1419 ctx.expectError(GL_INVALID_OPERATION);
1420 ctx.glUniform3uiv(vec4_v, 1, &data[0]);
1421 ctx.expectError(GL_INVALID_OPERATION);
1422 ctx.glUniform4uiv(vec4_v, 1, &data[0]);
1423 ctx.expectError(GL_INVALID_OPERATION);
1424 ctx.endSection();
1426 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.");
1427 ctx.glUseProgram(program.getProgram());
1428 ctx.glUniform1uiv(ivec4_f, 1, &data[0]);
1429 ctx.expectError(GL_INVALID_OPERATION);
1430 ctx.glUniform2uiv(ivec4_f, 1, &data[0]);
1431 ctx.expectError(GL_INVALID_OPERATION);
1432 ctx.glUniform3uiv(ivec4_f, 1, &data[0]);
1433 ctx.expectError(GL_INVALID_OPERATION);
1434 ctx.glUniform4uiv(ivec4_f, 1, &data[0]);
1435 ctx.expectError(GL_INVALID_OPERATION);
1436 ctx.endSection();
1438 ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1439 ctx.glUseProgram(program.getProgram());
1440 ctx.glUniform1uiv(sampler_f, 1, &data[0]);
1441 ctx.expectError(GL_INVALID_OPERATION);
1442 ctx.endSection();
1444 ctx.glUseProgram(0);
1447 void uniformuiv_invalid_location (NegativeTestContext& ctx)
1449 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1451 ctx.glUseProgram(program.getProgram());
1452 ctx.expectError(GL_NO_ERROR);
1456 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.");
1457 ctx.glUseProgram(program.getProgram());
1458 ctx.glUniform1uiv(-2, 1, &data[0]);
1459 ctx.expectError(GL_INVALID_OPERATION);
1460 ctx.glUniform2uiv(-2, 1, &data[0]);
1461 ctx.expectError(GL_INVALID_OPERATION);
1462 ctx.glUniform3uiv(-2, 1, &data[0]);
1463 ctx.expectError(GL_INVALID_OPERATION);
1464 ctx.glUniform4uiv(-2, 1, &data[0]);
1465 ctx.expectError(GL_INVALID_OPERATION);
1467 ctx.glUseProgram(program.getProgram());
1468 ctx.glUniform1uiv(-1, 1, &data[0]);
1469 ctx.expectError(GL_NO_ERROR);
1470 ctx.glUniform2uiv(-1, 1, &data[0]);
1471 ctx.expectError(GL_NO_ERROR);
1472 ctx.glUniform3uiv(-1, 1, &data[0]);
1473 ctx.expectError(GL_NO_ERROR);
1474 ctx.glUniform4uiv(-1, 1, &data[0]);
1475 ctx.expectError(GL_NO_ERROR);
1476 ctx.endSection();
1478 ctx.glUseProgram(0);
1481 void uniformuiv_invalid_count (NegativeTestContext& ctx)
1483 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1485 ctx.glUseProgram (program.getProgram());
1486 int uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1487 ctx.expectError(GL_NO_ERROR);
1491 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1492 ctx.fail("Failed to retrieve uniform location");
1497 ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1498 ctx.glUseProgram(program.getProgram());
1499 ctx.glUniform1uiv(uvec4_f, 2, &data[0]);
1500 ctx.expectError(GL_INVALID_OPERATION);
1501 ctx.glUniform2uiv(uvec4_f, 2, &data[0]);
1502 ctx.expectError(GL_INVALID_OPERATION);
1503 ctx.glUniform3uiv(uvec4_f, 2, &data[0]);
1504 ctx.expectError(GL_INVALID_OPERATION);
1505 ctx.glUniform4uiv(uvec4_f, 2, &data[0]);
1506 ctx.expectError(GL_INVALID_OPERATION);
1507 ctx.endSection();
1509 ctx.glUseProgram(0);
1513 // ctx.glUniformMatrix*fv
1515 void uniform_matrixfv_invalid_program (NegativeTestContext& ctx)
1519 ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1520 ctx.glUseProgram(0);
1521 ctx.glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1522 ctx.expectError(GL_INVALID_OPERATION);
1523 ctx.glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1524 ctx.expectError(GL_INVALID_OPERATION);
1525 ctx.glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1526 ctx.expectError(GL_INVALID_OPERATION);
1528 ctx.glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1529 ctx.expectError(GL_INVALID_OPERATION);
1530 ctx.glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1531 ctx.expectError(GL_INVALID_OPERATION);
1532 ctx.glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1533 ctx.expectError(GL_INVALID_OPERATION);
1534 ctx.glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1535 ctx.expectError(GL_INVALID_OPERATION);
1536 ctx.glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1537 ctx.expectError(GL_INVALID_OPERATION);
1538 ctx.glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1539 ctx.expectError(GL_INVALID_OPERATION);
1540 ctx.endSection();
1543 void uniform_matrixfv_incompatible_type (NegativeTestContext& ctx)
1545 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1547 ctx.glUseProgram (program.getProgram());
1548 GLint mat4_v = ctx.glGetUniformLocation(program.getProgram(), "mat4_v"); // mat4
1549 GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1550 ctx.expectError(GL_NO_ERROR);
1554 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1555 ctx.fail("Failed to retrieve uniform location");
1560 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.");
1561 ctx.glUseProgram(program.getProgram());
1562 ctx.glUniformMatrix2fv(mat4_v, 1, GL_FALSE, &data[0]);
1563 ctx.expectError(GL_INVALID_OPERATION);
1564 ctx.glUniformMatrix3fv(mat4_v, 1, GL_FALSE, &data[0]);
1565 ctx.expectError(GL_INVALID_OPERATION);
1566 ctx.glUniformMatrix4fv(mat4_v, 1, GL_FALSE, &data[0]);
1567 ctx.expectError(GL_NO_ERROR);
1569 ctx.glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1570 ctx.expectError(GL_INVALID_OPERATION);
1571 ctx.glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1572 ctx.expectError(GL_INVALID_OPERATION);
1573 ctx.glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1574 ctx.expectError(GL_INVALID_OPERATION);
1575 ctx.glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1576 ctx.expectError(GL_INVALID_OPERATION);
1577 ctx.glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1578 ctx.expectError(GL_INVALID_OPERATION);
1579 ctx.glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1580 ctx.expectError(GL_INVALID_OPERATION);
1581 ctx.endSection();
1583 ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than ctx.glUniform1i and ctx.glUniform1iv.");
1584 ctx.glUseProgram(program.getProgram());
1585 ctx.glUniformMatrix2fv(sampler_f, 1, GL_FALSE, &data[0]);
1586 ctx.expectError(GL_INVALID_OPERATION);
1587 ctx.glUniformMatrix3fv(sampler_f, 1, GL_FALSE, &data[0]);
1588 ctx.expectError(GL_INVALID_OPERATION);
1589 ctx.glUniformMatrix4fv(sampler_f, 1, GL_FALSE, &data[0]);
1590 ctx.expectError(GL_INVALID_OPERATION);
1592 ctx.glUniformMatrix2x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1593 ctx.expectError(GL_INVALID_OPERATION);
1594 ctx.glUniformMatrix3x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1595 ctx.expectError(GL_INVALID_OPERATION);
1596 ctx.glUniformMatrix2x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1597 ctx.expectError(GL_INVALID_OPERATION);
1598 ctx.glUniformMatrix4x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1599 ctx.expectError(GL_INVALID_OPERATION);
1600 ctx.glUniformMatrix3x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1601 ctx.expectError(GL_INVALID_OPERATION);
1602 ctx.glUniformMatrix4x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1603 ctx.expectError(GL_INVALID_OPERATION);
1604 ctx.endSection();
1606 ctx.glUseProgram(0);
1609 void uniform_matrixfv_invalid_location (NegativeTestContext& ctx)
1611 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1613 ctx.glUseProgram(program.getProgram());
1614 ctx.expectError(GL_NO_ERROR);
1618 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.");
1619 ctx.glUseProgram(program.getProgram());
1620 ctx.glUniformMatrix2fv(-2, 1, GL_FALSE, &data[0]);
1621 ctx.expectError(GL_INVALID_OPERATION);
1622 ctx.glUniformMatrix3fv(-2, 1, GL_FALSE, &data[0]);
1623 ctx.expectError(GL_INVALID_OPERATION);
1624 ctx.glUniformMatrix4fv(-2, 1, GL_FALSE, &data[0]);
1625 ctx.expectError(GL_INVALID_OPERATION);
1627 ctx.glUniformMatrix2x3fv(-2, 1, GL_FALSE, &data[0]);
1628 ctx.expectError(GL_INVALID_OPERATION);
1629 ctx.glUniformMatrix3x2fv(-2, 1, GL_FALSE, &data[0]);
1630 ctx.expectError(GL_INVALID_OPERATION);
1631 ctx.glUniformMatrix2x4fv(-2, 1, GL_FALSE, &data[0]);
1632 ctx.expectError(GL_INVALID_OPERATION);
1633 ctx.glUniformMatrix4x2fv(-2, 1, GL_FALSE, &data[0]);
1634 ctx.expectError(GL_INVALID_OPERATION);
1635 ctx.glUniformMatrix3x4fv(-2, 1, GL_FALSE, &data[0]);
1636 ctx.expectError(GL_INVALID_OPERATION);
1637 ctx.glUniformMatrix4x3fv(-2, 1, GL_FALSE, &data[0]);
1638 ctx.expectError(GL_INVALID_OPERATION);
1640 ctx.glUseProgram(program.getProgram());
1641 ctx.glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1642 ctx.expectError(GL_NO_ERROR);
1643 ctx.glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1644 ctx.expectError(GL_NO_ERROR);
1645 ctx.glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1646 ctx.expectError(GL_NO_ERROR);
1648 ctx.glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1649 ctx.expectError(GL_NO_ERROR);
1650 ctx.glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1651 ctx.expectError(GL_NO_ERROR);
1652 ctx.glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1653 ctx.expectError(GL_NO_ERROR);
1654 ctx.glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1655 ctx.expectError(GL_NO_ERROR);
1656 ctx.glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1657 ctx.expectError(GL_NO_ERROR);
1658 ctx.glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1659 ctx.expectError(GL_NO_ERROR);
1660 ctx.endSection();
1662 ctx.glUseProgram(0);
1665 void uniform_matrixfv_invalid_count (NegativeTestContext& ctx)
1667 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1669 ctx.glUseProgram (program.getProgram());
1670 GLint mat4_v = ctx.glGetUniformLocation(program.getProgram(), "mat4_v"); // mat4
1671 ctx.expectError(GL_NO_ERROR);
1675 ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1676 ctx.fail("Failed to retrieve uniform location");
1681 ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable.");
1682 ctx.glUseProgram(program.getProgram());
1683 ctx.glUniformMatrix2fv(mat4_v, 2, GL_FALSE, &data[0]);
1684 ctx.expectError(GL_INVALID_OPERATION);
1685 ctx.glUniformMatrix3fv(mat4_v, 2, GL_FALSE, &data[0]);
1686 ctx.expectError(GL_INVALID_OPERATION);
1687 ctx.glUniformMatrix4fv(mat4_v, 2, GL_FALSE, &data[0]);
1688 ctx.expectError(GL_INVALID_OPERATION);
1690 ctx.glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1691 ctx.expectError(GL_INVALID_OPERATION);
1692 ctx.glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1693 ctx.expectError(GL_INVALID_OPERATION);
1694 ctx.glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1695 ctx.expectError(GL_INVALID_OPERATION);
1696 ctx.glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1697 ctx.expectError(GL_INVALID_OPERATION);
1698 ctx.glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1699 ctx.expectError(GL_INVALID_OPERATION);
1700 ctx.glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1701 ctx.expectError(GL_INVALID_OPERATION);
1702 ctx.endSection();
1704 ctx.glUseProgram(0);
1708 void gen_transform_feedbacks (NegativeTestContext& ctx)
1710 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
1712 ctx.glGenTransformFeedbacks(-1, &id);
1713 ctx.expectError(GL_INVALID_VALUE);
1714 ctx.endSection();
1717 void bind_transform_feedback (NegativeTestContext& ctx)
1720 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1724 ctx.glGenBuffers (1, &buf);
1725 ctx.glGenTransformFeedbacks (2, tfID);
1727 ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_TRANSFORM_FEEDBACK.");
1728 ctx.glBindTransformFeedback(-1, tfID[0]);
1729 ctx.expectError(GL_INVALID_ENUM);
1730 ctx.endSection();
1732 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.");
1733 ctx.glUseProgram (program.getProgram());
1734 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1735 ctx.glLinkProgram (program.getProgram());
1736 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID[0]);
1737 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1738 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1739 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1740 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1741 ctx.expectError (GL_NO_ERROR);
1743 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID[1]);
1744 ctx.expectError (GL_INVALID_OPERATION);
1746 ctx.glEndTransformFeedback ();
1747 ctx.expectError (GL_NO_ERROR);
1748 ctx.endSection();
1750 ctx.glUseProgram (0);
1751 ctx.glDeleteBuffers (1, &buf);
1752 ctx.glDeleteTransformFeedbacks (2, tfID);
1753 ctx.expectError (GL_NO_ERROR);
1756 void delete_transform_feedbacks (NegativeTestContext& ctx)
1759 ctx.glGenTransformFeedbacks(1, &id);
1761 ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
1762 ctx.glDeleteTransformFeedbacks(-1, &id);
1763 ctx.expectError(GL_INVALID_VALUE);
1764 ctx.endSection();
1766 ctx.glDeleteTransformFeedbacks(1, &id);
1769 void begin_transform_feedback (NegativeTestContext& ctx)
1772 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1776 ctx.glGenBuffers (1, &buf);
1777 ctx.glGenTransformFeedbacks (2, tfID);
1779 ctx.glUseProgram (program.getProgram());
1780 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1781 ctx.glLinkProgram (program.getProgram());
1782 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID[0]);
1783 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1784 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1785 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1786 ctx.expectError (GL_NO_ERROR);
1788 ctx.beginSection("GL_INVALID_ENUM is generated if primitiveMode is not one of GL_POINTS, GL_LINES, or GL_TRIANGLES.");
1789 ctx.glBeginTransformFeedback (-1);
1790 ctx.expectError (GL_INVALID_ENUM);
1791 ctx.endSection();
1793 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is already active.");
1794 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1795 ctx.expectError (GL_NO_ERROR);
1796 ctx.glBeginTransformFeedback (GL_POINTS);
1797 ctx.expectError (GL_INVALID_OPERATION);
1798 ctx.endSection();
1800 ctx.beginSection("GL_INVALID_OPERATION is generated if any binding point used in transform feedback mode does not have a buffer object bound.");
1801 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
1802 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1803 ctx.expectError (GL_INVALID_OPERATION);
1804 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1805 ctx.endSection();
1807 ctx.beginSection("GL_INVALID_OPERATION is generated if no binding points would be used because no program object is active.");
1808 ctx.glUseProgram (0);
1809 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1810 ctx.expectError (GL_INVALID_OPERATION);
1811 ctx.glUseProgram (program.getProgram());
1812 ctx.endSection();
1814 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.");
1815 ctx.glTransformFeedbackVaryings (program.getProgram(), 0, 0, GL_INTERLEAVED_ATTRIBS);
1816 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1817 ctx.expectError (GL_INVALID_OPERATION);
1818 ctx.endSection();
1820 ctx.glEndTransformFeedback ();
1821 ctx.glDeleteBuffers (1, &buf);
1822 ctx.glDeleteTransformFeedbacks (2, tfID);
1823 ctx.expectError (GL_NO_ERROR);
1826 void pause_transform_feedback (NegativeTestContext& ctx)
1829 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1833 ctx.glGenBuffers (1, &buf);
1834 ctx.glGenTransformFeedbacks (2, tfID);
1836 ctx.glUseProgram (program.getProgram());
1837 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1838 ctx.glLinkProgram (program.getProgram());
1839 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID[0]);
1840 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1841 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1842 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1843 ctx.expectError (GL_NO_ERROR);
1845 ctx.beginSection("GL_INVALID_OPERATION is generated if the currently bound transform feedback object is not active or is paused.");
1846 ctx.glPauseTransformFeedback ();
1847 ctx.expectError (GL_INVALID_OPERATION);
1848 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1849 ctx.glPauseTransformFeedback ();
1850 ctx.expectError (GL_NO_ERROR);
1851 ctx.glPauseTransformFeedback ();
1852 ctx.expectError (GL_INVALID_OPERATION);
1853 ctx.endSection();
1855 ctx.glEndTransformFeedback ();
1856 ctx.glDeleteBuffers (1, &buf);
1857 ctx.glDeleteTransformFeedbacks (2, tfID);
1858 ctx.expectError (GL_NO_ERROR);
1861 void resume_transform_feedback (NegativeTestContext& ctx)
1864 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1868 ctx.glGenBuffers (1, &buf);
1869 ctx.glGenTransformFeedbacks (2, tfID);
1871 ctx.glUseProgram (program.getProgram());
1872 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1873 ctx.glLinkProgram (program.getProgram());
1874 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID[0]);
1875 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1876 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1877 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1878 ctx.expectError (GL_NO_ERROR);
1880 ctx.beginSection("GL_INVALID_OPERATION is generated if the currently bound transform feedback object is not active or is not paused.");
1881 ctx.glResumeTransformFeedback ();
1882 ctx.expectError (GL_INVALID_OPERATION);
1883 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1884 ctx.glResumeTransformFeedback ();
1885 ctx.expectError (GL_INVALID_OPERATION);
1886 ctx.glPauseTransformFeedback ();
1887 ctx.glResumeTransformFeedback ();
1888 ctx.expectError (GL_NO_ERROR);
1889 ctx.endSection();
1891 ctx.glEndTransformFeedback ();
1892 ctx.glDeleteBuffers (1, &buf);
1893 ctx.glDeleteTransformFeedbacks (2, tfID);
1894 ctx.expectError (GL_NO_ERROR);
1897 void end_transform_feedback (NegativeTestContext& ctx)
1900 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1904 ctx.glGenBuffers (1, &buf);
1905 ctx.glGenTransformFeedbacks (1, &tfID);
1907 ctx.glUseProgram (program.getProgram());
1908 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1909 ctx.glLinkProgram (program.getProgram());
1910 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID);
1911 ctx.glBindBuffer (GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1912 ctx.glBufferData (GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1913 ctx.glBindBufferBase (GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1914 ctx.expectError (GL_NO_ERROR);
1916 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is not active.");
1917 ctx.glEndTransformFeedback ();
1918 ctx.expectError (GL_INVALID_OPERATION);
1919 ctx.glBeginTransformFeedback (GL_TRIANGLES);
1920 ctx.glEndTransformFeedback ();
1921 ctx.expectError (GL_NO_ERROR);
1922 ctx.endSection();
1924 ctx.glDeleteBuffers (1, &buf);
1925 ctx.glDeleteTransformFeedbacks (1, &tfID);
1926 ctx.expectError (GL_NO_ERROR);
1929 void get_transform_feedback_varying (NegativeTestContext& ctx)
1932 glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1933 glu::ShaderProgram programInvalid (ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, ""));
1942 ctx.glGenTransformFeedbacks (1, &tfID);
1944 ctx.glTransformFeedbackVaryings (program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1945 ctx.expectError (GL_NO_ERROR);
1946 ctx.glLinkProgram (program.getProgram());
1947 ctx.expectError (GL_NO_ERROR);
1949 ctx.glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tfID);
1950 ctx.expectError (GL_NO_ERROR);
1952 ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object.");
1953 ctx.glGetTransformFeedbackVarying (-1, 0, 32, &length, &size, &type, &name[0]);
1954 ctx.expectError (GL_INVALID_VALUE);
1955 ctx.endSection();
1957 ctx.beginSection("GL_INVALID_VALUE is generated if index is greater or equal to the value of GL_TRANSFORM_FEEDBACK_VARYINGS.");
1958 ctx.glGetProgramiv (program.getProgram(), GL_TRANSFORM_FEEDBACK_VARYINGS, &maxTransformFeedbackVaryings);
1959 ctx.glGetTransformFeedbackVarying (program.getProgram(), maxTransformFeedbackVaryings, 32, &length, &size, &type, &name[0]);
1960 ctx.expectError (GL_INVALID_VALUE);
1961 ctx.endSection();
1963 ctx.beginSection("GL_INVALID_OPERATION or GL_INVALID_VALUE is generated program has not been linked.");
1964 ctx.glGetTransformFeedbackVarying (programInvalid.getProgram(), 0, 32, &length, &size, &type, &name[0]);
1965 ctx.expectError (GL_INVALID_OPERATION, GL_INVALID_VALUE);
1966 ctx.endSection();
1968 ctx.glDeleteTransformFeedbacks (1, &tfID);
1969 ctx.expectError (GL_NO_ERROR);
1972 void transform_feedback_varyings (NegativeTestContext& ctx)
1975 glu::ShaderProgram program(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1979 ctx.glGenTransformFeedbacks (1, &tfID);
1980 ctx.expectError (GL_NO_ERROR);
1982 ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object.");
1983 ctx.glTransformFeedbackVaryings (0, 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1984 ctx.expectError (GL_INVALID_VALUE);
1985 ctx.endSection();
1987 ctx.beginSection("GL_INVALID_VALUE is generated if bufferMode is GL_SEPARATE_ATTRIBS and count is greater than GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.");
1988 ctx.glGetIntegerv (GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTransformFeedbackSeparateAttribs);
1989 ctx.glTransformFeedbackVaryings (program.getProgram(), maxTransformFeedbackSeparateAttribs+1, &tfVarying, GL_SEPARATE_ATTRIBS);
1990 ctx.expectError (GL_INVALID_VALUE);
1991 ctx.endSection();
1993 ctx.glDeleteTransformFeedbacks (1, &tfID);
1994 ctx.expectError (GL_NO_ERROR);