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