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