Home | History | Annotate | Download | only in functional
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program OpenGL ES 3.0 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 GL State API tests.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "es31fNegativeStateApiTests.hpp"
     25 
     26 #include "gluCallLogWrapper.hpp"
     27 #include "gluContextInfo.hpp"
     28 #include "gluShaderProgram.hpp"
     29 
     30 #include "glwDefs.hpp"
     31 #include "glwEnums.hpp"
     32 
     33 #include "tcuStringTemplate.hpp"
     34 
     35 #include "deMemory.h"
     36 
     37 #include <string>
     38 #include <map>
     39 
     40 namespace deqp
     41 {
     42 namespace gles31
     43 {
     44 namespace Functional
     45 {
     46 namespace NegativeTestShared
     47 {
     48 
     49 using tcu::TestLog;
     50 using glu::CallLogWrapper;
     51 using namespace glw;
     52 
     53 static const char* uniformTestVertSource	=	"${GLSL_VERSION_DECL}\n"
     54 												"uniform mediump vec4 vUnif_vec4;\n"
     55 												"in mediump vec4 attr;"
     56 												"layout(shared) uniform Block { mediump vec4 blockVar; };\n"
     57 												"void main (void)\n"
     58 												"{\n"
     59 												"	gl_Position = vUnif_vec4 + blockVar + attr;\n"
     60 												"}\n\0";
     61 
     62 static const char* uniformTestFragSource	=	"${GLSL_VERSION_DECL}\n"
     63 												"uniform mediump ivec4 fUnif_ivec4;\n"
     64 												"uniform mediump uvec4 fUnif_uvec4;\n"
     65 												"layout(location = 0) out mediump vec4 fragColor;"
     66 												"void main (void)\n"
     67 												"{\n"
     68 												"	fragColor = vec4(vec4(fUnif_ivec4) + vec4(fUnif_uvec4));\n"
     69 												"}\n\0";
     70 
     71 static std::string getVtxFragVersionSources (const std::string source, NegativeTestContext& ctx)
     72 {
     73 	const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
     74 
     75 	std::map<std::string, std::string> args;
     76 
     77 	args["GLSL_VERSION_DECL"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_300_ES);
     78 
     79 	return tcu::StringTemplate(source).specialize(args);
     80 }
     81 
     82 // Enabling & disabling states
     83 void enable (NegativeTestContext& ctx)
     84 {
     85 	ctx.beginSection("GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
     86 	ctx.glEnable(-1);
     87 	ctx.expectError(GL_INVALID_ENUM);
     88 	ctx.endSection();
     89 }
     90 
     91 // Enabling & disabling states
     92 void enablei (NegativeTestContext& ctx)
     93 {
     94 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
     95 
     96 	ctx.beginSection("GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
     97 	ctx.glEnablei(-1, -1);
     98 	ctx.expectError(GL_INVALID_ENUM);
     99 	ctx.endSection();
    100 
    101 	ctx.beginSection("GL_INVALID_VALUE is generated  if index is greater than or equal to the number of indexed capabilities for cap.");
    102 	ctx.glEnablei(GL_BLEND, -1);
    103 	ctx.expectError(GL_INVALID_VALUE);
    104 	ctx.endSection();
    105 }
    106 
    107 void disable (NegativeTestContext& ctx)
    108 {
    109 	ctx.beginSection("GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
    110 	ctx.glDisable(-1);
    111 	ctx.expectError(GL_INVALID_ENUM);
    112 	ctx.endSection();
    113 }
    114 
    115 void disablei (NegativeTestContext& ctx)
    116 {
    117 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
    118 
    119 	ctx.beginSection("GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
    120 	ctx.glDisablei(-1,-1);
    121 	ctx.expectError(GL_INVALID_ENUM);
    122 	ctx.endSection();
    123 
    124 	ctx.beginSection("GL_INVALID_VALUE is generated  if index is greater than or equal to the number of indexed capabilities for cap.");
    125 	ctx.glDisablei(GL_BLEND, -1);
    126 	ctx.expectError(GL_INVALID_VALUE);
    127 	ctx.endSection();
    128 }
    129 
    130 // Simple state queries
    131 void get_booleanv (NegativeTestContext& ctx)
    132 {
    133 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
    134 	GLboolean params = GL_FALSE;
    135 	ctx.glGetBooleanv(-1, &params);
    136 	ctx.expectError(GL_INVALID_ENUM);
    137 	ctx.endSection();
    138 }
    139 
    140 void get_booleani_v (NegativeTestContext& ctx)
    141 {
    142 	GLboolean	data						= -1;
    143 	GLint		maxUniformBufferBindings	= 0;
    144 
    145 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not indexed state queriable with these commands.");
    146 	ctx.glGetBooleani_v(-1, 0, &data);
    147 	ctx.expectError(GL_INVALID_ENUM);
    148 	ctx.endSection();
    149 
    150 	ctx.beginSection("GL_INVALID_VALUE is generated if index is outside of the valid range for the indexed state target.");
    151 	ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
    152 	ctx.expectError(GL_NO_ERROR);
    153 	ctx.glGetBooleani_v(GL_UNIFORM_BUFFER_BINDING, maxUniformBufferBindings, &data);
    154 	ctx.expectError(GL_INVALID_VALUE);
    155 	ctx.endSection();
    156 }
    157 
    158 void get_floatv (NegativeTestContext& ctx)
    159 {
    160 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
    161 	GLfloat params = 0.0f;
    162 	ctx.glGetFloatv(-1, &params);
    163 	ctx.expectError(GL_INVALID_ENUM);
    164 	ctx.endSection();
    165 }
    166 
    167 void get_integerv (NegativeTestContext& ctx)
    168 {
    169 	GLint params = -1;
    170 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
    171 	ctx.glGetIntegerv(-1, &params);
    172 	ctx.expectError(GL_INVALID_ENUM);
    173 	ctx.endSection();
    174 }
    175 
    176 void get_integer64v (NegativeTestContext& ctx)
    177 {
    178 	GLint64 params = -1;
    179 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
    180 	ctx.glGetInteger64v(-1, &params);
    181 	ctx.expectError(GL_INVALID_ENUM);
    182 	ctx.endSection();
    183 }
    184 
    185 void get_integeri_v (NegativeTestContext& ctx)
    186 {
    187 	GLint data						= -1;
    188 	GLint maxUniformBufferBindings	= 0;
    189 
    190 	ctx.beginSection("GL_INVALID_ENUM is generated if name is not an accepted value.");
    191 	ctx.glGetIntegeri_v(-1, 0, &data);
    192 	ctx.expectError(GL_INVALID_ENUM);
    193 	ctx.endSection();
    194 
    195 	ctx.beginSection("GL_INVALID_VALUE is generated if index is outside of the valid range for the indexed state target.");
    196 	ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
    197 	ctx.expectError(GL_NO_ERROR);
    198 	ctx.glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, maxUniformBufferBindings, &data);
    199 	ctx.expectError(GL_INVALID_VALUE);
    200 	ctx.endSection();
    201 }
    202 
    203 void get_integer64i_v (NegativeTestContext& ctx)
    204 {
    205 	GLint64	data						= (GLint64)-1;
    206 	GLint	maxUniformBufferBindings	= 0;
    207 
    208 	ctx.beginSection("GL_INVALID_ENUM is generated if name is not an accepted value.");
    209 	ctx.glGetInteger64i_v(-1, 0, &data);
    210 	ctx.expectError(GL_INVALID_ENUM);
    211 	ctx.endSection();
    212 
    213 	ctx.beginSection("GL_INVALID_VALUE is generated if index is outside of the valid range for the indexed state target.");
    214 	ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
    215 	ctx.expectError(GL_NO_ERROR);
    216 	ctx.glGetInteger64i_v(GL_UNIFORM_BUFFER_START, maxUniformBufferBindings, &data);
    217 	ctx.expectError(GL_INVALID_VALUE);
    218 	ctx.endSection();
    219 }
    220 
    221 void get_string (NegativeTestContext& ctx)
    222 {
    223 	ctx.beginSection("GL_INVALID_ENUM is generated if name is not an accepted value.");
    224 	ctx.glGetString(-1);
    225 	ctx.expectError(GL_INVALID_ENUM);
    226 	ctx.endSection();
    227 }
    228 
    229 void get_stringi (NegativeTestContext& ctx)
    230 {
    231 	GLint numExtensions	= 0;
    232 
    233 	ctx.beginSection("GL_INVALID_ENUM is generated if name is not an accepted value.");
    234 	ctx.glGetStringi(-1, 0);
    235 	ctx.expectError(GL_INVALID_ENUM);
    236 	ctx.endSection();
    237 
    238 	ctx.beginSection("GL_INVALID_VALUE is generated if index is outside the valid range for indexed state name.");
    239 	ctx.glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
    240 	ctx.glGetStringi(GL_EXTENSIONS, numExtensions);
    241 	ctx.expectError(GL_INVALID_VALUE);
    242 	ctx.endSection();
    243 }
    244 
    245 // Enumerated state queries: Shaders
    246 
    247 void get_attached_shaders (NegativeTestContext& ctx)
    248 {
    249 	GLuint	shaders[1]		= { 0 };
    250 	GLuint	shaderObject	= ctx.glCreateShader(GL_VERTEX_SHADER);
    251 	GLuint	program			= ctx.glCreateProgram();
    252 	GLsizei	count[1]		= { 0 };
    253 
    254 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    255 	ctx.glGetAttachedShaders(-1, 1, &count[0], &shaders[0]);
    256 	ctx.expectError(GL_INVALID_VALUE);
    257 	ctx.endSection();
    258 
    259 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    260 	ctx.glGetAttachedShaders(shaderObject, 1, &count[0], &shaders[0]);
    261 	ctx.expectError(GL_INVALID_OPERATION);
    262 	ctx.endSection();
    263 
    264 	ctx.beginSection("GL_INVALID_VALUE is generated if maxCount is less than 0.");
    265 	ctx.glGetAttachedShaders(program, -1, &count[0], &shaders[0]);
    266 	ctx.expectError(GL_INVALID_VALUE);
    267 	ctx.endSection();
    268 
    269 	ctx.glDeleteShader(shaderObject);
    270 	ctx.glDeleteProgram(program);
    271 }
    272 
    273 void get_shaderiv (NegativeTestContext& ctx)
    274 {
    275 	GLboolean	shaderCompilerSupported;
    276 	GLuint		shader		= ctx.glCreateShader(GL_VERTEX_SHADER);
    277 	GLuint		program		= ctx.glCreateProgram();
    278 	GLint		param[1]	= { -1 };
    279 
    280 	ctx.glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
    281 	ctx.getLog() << TestLog::Message << "// GL_SHADER_COMPILER = " << (shaderCompilerSupported ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
    282 
    283 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
    284 	ctx.glGetShaderiv(shader, -1, &param[0]);
    285 	ctx.expectError(GL_INVALID_ENUM);
    286 	ctx.endSection();
    287 
    288 	ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
    289 	ctx.glGetShaderiv(-1, GL_SHADER_TYPE, &param[0]);
    290 	ctx.expectError(GL_INVALID_VALUE);
    291 	ctx.endSection();
    292 
    293 	ctx.beginSection("GL_INVALID_OPERATION is generated if shader does not refer to a shader object.");
    294 	ctx.glGetShaderiv(program, GL_SHADER_TYPE, &param[0]);
    295 	ctx.expectError(GL_INVALID_OPERATION);
    296 	ctx.endSection();
    297 
    298 	ctx.glDeleteShader(shader);
    299 	ctx.glDeleteProgram(program);
    300 }
    301 
    302 void get_shader_info_log (NegativeTestContext& ctx)
    303 {
    304 	GLuint shader		= ctx.glCreateShader(GL_VERTEX_SHADER);
    305 	GLuint program		= ctx.glCreateProgram();
    306 	GLsizei length[1]	= { -1 };
    307 	char infoLog[128]	= { 0 };
    308 
    309 	ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
    310 	ctx.glGetShaderInfoLog(-1, 128, &length[0], &infoLog[0]);
    311 	ctx.expectError(GL_INVALID_VALUE);
    312 	ctx.endSection();
    313 
    314 	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
    315 	ctx.glGetShaderInfoLog(program, 128, &length[0], &infoLog[0]);
    316 	ctx.expectError(GL_INVALID_OPERATION);
    317 	ctx.endSection();
    318 
    319 	ctx.beginSection("GL_INVALID_VALUE is generated if maxLength is less than 0.");
    320 	ctx.glGetShaderInfoLog(shader, -1, &length[0], &infoLog[0]);
    321 	ctx.expectError(GL_INVALID_VALUE);
    322 	ctx.endSection();
    323 
    324 	ctx.glDeleteShader(shader);
    325 	ctx.glDeleteProgram(program);
    326 }
    327 
    328 void get_shader_precision_format (NegativeTestContext& ctx)
    329 {
    330 	GLboolean	shaderCompilerSupported;
    331 	GLint		range[2];
    332 	GLint		precision[1];
    333 
    334 	ctx.glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
    335 	ctx.getLog() << TestLog::Message << "// GL_SHADER_COMPILER = " << (shaderCompilerSupported ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
    336 
    337 	deMemset(&range[0], 0xcd, sizeof(range));
    338 	deMemset(&precision[0], 0xcd, sizeof(precision));
    339 
    340 	ctx.beginSection("GL_INVALID_ENUM is generated if shaderType or precisionType is not an accepted value.");
    341 	ctx.glGetShaderPrecisionFormat (-1, GL_MEDIUM_FLOAT, &range[0], &precision[0]);
    342 	ctx.expectError(GL_INVALID_ENUM);
    343 	ctx.glGetShaderPrecisionFormat (GL_VERTEX_SHADER, -1, &range[0], &precision[0]);
    344 	ctx.expectError(GL_INVALID_ENUM);
    345 	ctx.glGetShaderPrecisionFormat (-1, -1, &range[0], &precision[0]);
    346 	ctx.expectError(GL_INVALID_ENUM);
    347 	ctx.endSection();
    348 }
    349 
    350 void get_shader_source (NegativeTestContext& ctx)
    351 {
    352 	GLsizei	length[1]	= { 0 };
    353 	char	source[1]	= { 0 };
    354 	GLuint	program		= ctx.glCreateProgram();
    355 	GLuint	shader		= ctx.glCreateShader(GL_VERTEX_SHADER);
    356 
    357 	ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
    358 	ctx.glGetShaderSource(-1, 1, &length[0], &source[0]);
    359 	ctx.expectError(GL_INVALID_VALUE);
    360 	ctx.endSection();
    361 
    362 	ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
    363 	ctx.glGetShaderSource(program, 1, &length[0], &source[0]);
    364 	ctx.expectError(GL_INVALID_OPERATION);
    365 	ctx.endSection();
    366 
    367 	ctx.beginSection("GL_INVALID_VALUE is generated if bufSize is less than 0.");
    368 	ctx.glGetShaderSource(shader, -1, &length[0], &source[0]);
    369 	ctx.expectError(GL_INVALID_VALUE);
    370 	ctx.endSection();
    371 
    372 	ctx.glDeleteProgram(program);
    373 	ctx.glDeleteShader(shader);
    374 }
    375 
    376 // Enumerated state queries: Programs
    377 
    378 void get_programiv (NegativeTestContext& ctx)
    379 {
    380 	GLuint	program		= ctx.glCreateProgram();
    381 	GLuint	shader		= ctx.glCreateShader(GL_VERTEX_SHADER);
    382 	GLint	params[1]	= { 0 };
    383 
    384 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
    385 	ctx.glGetProgramiv(program, -1, &params[0]);
    386 	ctx.expectError(GL_INVALID_ENUM);
    387 	ctx.endSection();
    388 
    389 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    390 	ctx.glGetProgramiv(-1, GL_LINK_STATUS, &params[0]);
    391 	ctx.expectError(GL_INVALID_VALUE);
    392 	ctx.endSection();
    393 
    394 	ctx.beginSection("GL_INVALID_OPERATION is generated if program does not refer to a program object.");
    395 	ctx.glGetProgramiv(shader, GL_LINK_STATUS, &params[0]);
    396 	ctx.expectError(GL_INVALID_OPERATION);
    397 	ctx.endSection();
    398 
    399 	ctx.glDeleteProgram(program);
    400 	ctx.glDeleteShader(shader);
    401 }
    402 
    403 void get_program_info_log (NegativeTestContext& ctx)
    404 {
    405 	GLuint	program		= ctx.glCreateProgram();
    406 	GLuint	shader		= ctx.glCreateShader(GL_VERTEX_SHADER);
    407 	GLsizei	length[1]	= { 0 };
    408 	char	infoLog[1]	= { 'x' };
    409 
    410 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    411 	ctx.glGetProgramInfoLog (-1, 1, &length[0], &infoLog[0]);
    412 	ctx.expectError(GL_INVALID_VALUE);
    413 	ctx.endSection();
    414 
    415 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    416 	ctx.glGetProgramInfoLog (shader, 1, &length[0], &infoLog[0]);
    417 	ctx.expectError(GL_INVALID_OPERATION);
    418 	ctx.endSection();
    419 
    420 	ctx.beginSection("GL_INVALID_VALUE is generated if maxLength is less than 0.");
    421 	ctx.glGetProgramInfoLog (program, -1, &length[0], &infoLog[0]);
    422 	ctx.expectError(GL_INVALID_VALUE);
    423 	ctx.endSection();
    424 
    425 	ctx.glDeleteProgram(program);
    426 	ctx.glDeleteShader(shader);
    427 }
    428 
    429 // Enumerated state queries: Shader variables
    430 
    431 void get_tex_parameterfv (NegativeTestContext& ctx)
    432 {
    433 	GLfloat params[1] = { 0 };
    434 
    435 	ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
    436 	ctx.glGetTexParameterfv (-1, GL_TEXTURE_MAG_FILTER, &params[0]);
    437 	ctx.expectError(GL_INVALID_ENUM);
    438 	ctx.glGetTexParameterfv (GL_TEXTURE_2D, -1, &params[0]);
    439 	ctx.expectError(GL_INVALID_ENUM);
    440 	ctx.glGetTexParameterfv (-1, -1, &params[0]);
    441 	ctx.expectError(GL_INVALID_ENUM);
    442 	ctx.endSection();
    443 }
    444 
    445 void get_tex_parameteriv (NegativeTestContext& ctx)
    446 {
    447 	GLint params[1] = { 0 };
    448 
    449 	ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
    450 	ctx.glGetTexParameteriv (-1, GL_TEXTURE_MAG_FILTER, &params[0]);
    451 	ctx.expectError(GL_INVALID_ENUM);
    452 	ctx.glGetTexParameteriv (GL_TEXTURE_2D, -1, &params[0]);
    453 	ctx.expectError(GL_INVALID_ENUM);
    454 	ctx.glGetTexParameteriv (-1, -1, &params[0]);
    455 	ctx.expectError(GL_INVALID_ENUM);
    456 	ctx.endSection();
    457 }
    458 
    459 void get_tex_parameteriiv (NegativeTestContext& ctx)
    460 {
    461 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
    462 
    463 	GLint params[1] = { 0 };
    464 
    465 	ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
    466 	ctx.glGetTexParameterIiv(-1, GL_TEXTURE_MAG_FILTER, &params[0]);
    467 	ctx.expectError(GL_INVALID_ENUM);
    468 	ctx.glGetTexParameterIiv(GL_TEXTURE_2D, -1, &params[0]);
    469 	ctx.expectError(GL_INVALID_ENUM);
    470 	ctx.glGetTexParameterIiv(-1, -1, &params[0]);
    471 	ctx.expectError(GL_INVALID_ENUM);
    472 	ctx.endSection();
    473 }
    474 
    475 void get_tex_parameteriuiv (NegativeTestContext& ctx)
    476 {
    477 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
    478 
    479 	GLuint params[1] = { 0 };
    480 
    481 	ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
    482 	ctx.glGetTexParameterIuiv(-1, GL_TEXTURE_MAG_FILTER, &params[0]);
    483 	ctx.expectError(GL_INVALID_ENUM);
    484 	ctx.glGetTexParameterIuiv(GL_TEXTURE_2D, -1, &params[0]);
    485 	ctx.expectError(GL_INVALID_ENUM);
    486 	ctx.glGetTexParameterIuiv(-1, -1, &params[0]);
    487 	ctx.expectError(GL_INVALID_ENUM);
    488 	ctx.endSection();
    489 }
    490 
    491 void get_uniformfv (NegativeTestContext& ctx)
    492 {
    493 	glu::ShaderProgram	program		(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    494 	GLfloat				params[4]	= { 0.f };
    495 	GLuint				shader;
    496 	GLuint				programEmpty;
    497 	GLint				unif;
    498 
    499 	ctx.glUseProgram(program.getProgram());
    500 
    501 	unif = ctx.glGetUniformLocation(program.getProgram(), "vUnif_vec4");	// vec4
    502 	if (unif == -1)
    503 		ctx.fail("Failed to retrieve uniform location");
    504 
    505 	shader = ctx.glCreateShader(GL_VERTEX_SHADER);
    506 	programEmpty = ctx.glCreateProgram();
    507 
    508 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    509 	ctx.glGetUniformfv (-1, unif, &params[0]);
    510 	ctx.expectError(GL_INVALID_VALUE);
    511 	ctx.endSection();
    512 
    513 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    514 	ctx.glGetUniformfv (shader, unif, &params[0]);
    515 	ctx.expectError(GL_INVALID_OPERATION);
    516 	ctx.endSection();
    517 
    518 	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
    519 	ctx.glGetUniformfv (programEmpty, unif, &params[0]);
    520 	ctx.expectError(GL_INVALID_OPERATION);
    521 	ctx.endSection();
    522 
    523 	ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
    524 	ctx.glGetUniformfv (program.getProgram(), -1, &params[0]);
    525 	ctx.expectError(GL_INVALID_OPERATION);
    526 	ctx.endSection();
    527 
    528 	ctx.glDeleteShader(shader);
    529 	ctx.glDeleteProgram(programEmpty);
    530 }
    531 
    532 void get_nuniformfv (NegativeTestContext& ctx)
    533 {
    534 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
    535 
    536 	glu::ShaderProgram	program			(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    537 	GLint				unif			= ctx.glGetUniformLocation(program.getProgram(), "vUnif_vec4");
    538 	GLfloat				params[4]		= { 0.0f, 0.0f, 0.0f, 0.0f };
    539 	GLuint				shader;
    540 	GLuint				programEmpty;
    541 	GLsizei 			bufferSize;
    542 
    543 	ctx.glUseProgram(program.getProgram());
    544 
    545 	if (unif == -1)
    546 		ctx.fail("Failed to retrieve uniform location");
    547 
    548 	shader			= ctx.glCreateShader(GL_VERTEX_SHADER);
    549 	programEmpty	= ctx.glCreateProgram();
    550 
    551 	ctx.glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &bufferSize);
    552 
    553 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    554 	ctx.glGetnUniformfv(-1, unif, bufferSize, &params[0]);
    555 	ctx.expectError(GL_INVALID_VALUE);
    556 	ctx.endSection();
    557 
    558 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    559 	ctx.glGetnUniformfv(shader, unif, bufferSize, &params[0]);
    560 	ctx.expectError(GL_INVALID_OPERATION);
    561 	ctx.endSection();
    562 
    563 	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
    564 	ctx.glGetnUniformfv(programEmpty, unif, bufferSize, &params[0]);
    565 	ctx.expectError(GL_INVALID_OPERATION);
    566 	ctx.endSection();
    567 
    568 	ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
    569 	ctx.glGetnUniformfv(program.getProgram(), -1, bufferSize, &params[0]);
    570 	ctx.expectError(GL_INVALID_OPERATION);
    571 	ctx.endSection();
    572 
    573 	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer size required to store the requested data is greater than bufSize.");
    574 	ctx.glGetnUniformfv(program.getProgram(), unif, 0, &params[0]);
    575 	ctx.expectError(GL_INVALID_OPERATION);
    576 	ctx.endSection();
    577 
    578 	ctx.glDeleteShader(shader);
    579 	ctx.glDeleteProgram(programEmpty);
    580 }
    581 
    582 void get_uniformiv (NegativeTestContext& ctx)
    583 {
    584 	glu::ShaderProgram	program			(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    585 	GLint				unif			= ctx.glGetUniformLocation(program.getProgram(), "fUnif_ivec4");
    586 	GLint				params[4]		= { 0, 0, 0, 0 };
    587 	GLuint				shader;
    588 	GLuint				programEmpty;
    589 
    590 	ctx.glUseProgram(program.getProgram());
    591 
    592 	if (unif == -1)
    593 		ctx.fail("Failed to retrieve uniform location");
    594 
    595 	shader = ctx.glCreateShader(GL_VERTEX_SHADER);
    596 	programEmpty = ctx.glCreateProgram();
    597 
    598 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    599 	ctx.glGetUniformiv (-1, unif, &params[0]);
    600 	ctx.expectError(GL_INVALID_VALUE);
    601 	ctx.endSection();
    602 
    603 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    604 	ctx.glGetUniformiv (shader, unif, &params[0]);
    605 	ctx.expectError(GL_INVALID_OPERATION);
    606 	ctx.endSection();
    607 
    608 	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
    609 	ctx.glGetUniformiv (programEmpty, unif, &params[0]);
    610 	ctx.expectError(GL_INVALID_OPERATION);
    611 	ctx.endSection();
    612 
    613 	ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
    614 	ctx.glGetUniformiv (program.getProgram(), -1, &params[0]);
    615 	ctx.expectError(GL_INVALID_OPERATION);
    616 	ctx.endSection();
    617 
    618 	ctx.glDeleteShader(shader);
    619 	ctx.glDeleteProgram(programEmpty);
    620 }
    621 
    622 void get_nuniformiv (NegativeTestContext& ctx)
    623 {
    624 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
    625 
    626 	glu::ShaderProgram	program			(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    627 	GLint				unif			= ctx.glGetUniformLocation(program.getProgram(), "fUnif_ivec4");
    628 	GLint				params[4]		= { 0, 0, 0, 0 };
    629 	GLuint				shader;
    630 	GLuint				programEmpty;
    631 	GLsizei				bufferSize;
    632 
    633 	ctx.glUseProgram(program.getProgram());
    634 
    635 	if (unif == -1)
    636 		ctx.fail("Failed to retrieve uniform location");
    637 
    638 	shader = ctx.glCreateShader(GL_VERTEX_SHADER);
    639 	programEmpty = ctx.glCreateProgram();
    640 
    641 	ctx.glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &bufferSize);
    642 
    643 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    644 	ctx.glGetnUniformiv(-1, unif, bufferSize, &params[0]);
    645 	ctx.expectError(GL_INVALID_VALUE);
    646 	ctx.endSection();
    647 
    648 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    649 	ctx.glGetnUniformiv(shader, unif, bufferSize, &params[0]);
    650 	ctx.expectError(GL_INVALID_OPERATION);
    651 	ctx.endSection();
    652 
    653 	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
    654 	ctx.glGetnUniformiv(programEmpty, unif, bufferSize, &params[0]);
    655 	ctx.expectError(GL_INVALID_OPERATION);
    656 	ctx.endSection();
    657 
    658 	ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
    659 	ctx.glGetnUniformiv(program.getProgram(), -1, bufferSize, &params[0]);
    660 	ctx.expectError(GL_INVALID_OPERATION);
    661 	ctx.endSection();
    662 
    663 	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer size required to store the requested data is greater than bufSize.");
    664 	ctx.glGetnUniformiv(program.getProgram(), unif, - 1, &params[0]);
    665 	ctx.expectError(GL_INVALID_OPERATION);
    666 	ctx.endSection();
    667 
    668 	ctx.glDeleteShader(shader);
    669 	ctx.glDeleteProgram(programEmpty);
    670 }
    671 
    672 void get_uniformuiv (NegativeTestContext& ctx)
    673 {
    674 	glu::ShaderProgram	program			(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    675 	GLint				unif			= ctx.glGetUniformLocation(program.getProgram(), "fUnif_uvec4");
    676 	GLuint				params[4]		= { 0, 0, 0, 0 };
    677 	GLuint				shader;
    678 	GLuint				programEmpty;
    679 
    680 	ctx.glUseProgram(program.getProgram());
    681 
    682 	if (unif == -1)
    683 		ctx.fail("Failed to retrieve uniform location");
    684 
    685 	shader = ctx.glCreateShader(GL_VERTEX_SHADER);
    686 	programEmpty = ctx.glCreateProgram();
    687 
    688 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    689 	ctx.glGetUniformuiv (-1, unif, &params[0]);
    690 	ctx.expectError(GL_INVALID_VALUE);
    691 	ctx.endSection();
    692 
    693 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    694 	ctx.glGetUniformuiv (shader, unif, &params[0]);
    695 	ctx.expectError(GL_INVALID_OPERATION);
    696 	ctx.endSection();
    697 
    698 	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
    699 	ctx.glGetUniformuiv (programEmpty, unif, &params[0]);
    700 	ctx.expectError(GL_INVALID_OPERATION);
    701 	ctx.endSection();
    702 
    703 	ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
    704 	ctx.glGetUniformuiv (program.getProgram(), -1, &params[0]);
    705 	ctx.expectError(GL_INVALID_OPERATION);
    706 	ctx.endSection();
    707 
    708 	ctx.glDeleteShader(shader);
    709 	ctx.glDeleteProgram(programEmpty);
    710 }
    711 
    712 void get_nuniformuiv (NegativeTestContext& ctx)
    713 {
    714 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
    715 
    716 	glu::ShaderProgram	program			(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    717 	GLint				unif			= ctx.glGetUniformLocation(program.getProgram(), "fUnif_ivec4");
    718 	GLuint				params[4]		= { 0, 0, 0, 0 };
    719 	GLuint				shader;
    720 	GLuint				programEmpty;
    721 	GLsizei				bufferSize;
    722 
    723 	ctx.glUseProgram(program.getProgram());
    724 
    725 	if (unif == -1)
    726 		ctx.fail("Failed to retrieve uniform location");
    727 
    728 	shader = ctx.glCreateShader(GL_VERTEX_SHADER);
    729 	programEmpty = ctx.glCreateProgram();
    730 
    731 	ctx.glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &bufferSize);
    732 
    733 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    734 	ctx.glGetnUniformuiv(-1, unif, bufferSize, &params[0]);
    735 	ctx.expectError(GL_INVALID_VALUE);
    736 	ctx.endSection();
    737 
    738 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    739 	ctx.glGetnUniformuiv(shader, unif, bufferSize, &params[0]);
    740 	ctx.expectError(GL_INVALID_OPERATION);
    741 	ctx.endSection();
    742 
    743 	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
    744 	ctx.glGetnUniformuiv(programEmpty, unif, bufferSize, &params[0]);
    745 	ctx.expectError(GL_INVALID_OPERATION);
    746 	ctx.endSection();
    747 
    748 	ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
    749 	ctx.glGetnUniformuiv(program.getProgram(), -1, bufferSize, &params[0]);
    750 	ctx.expectError(GL_INVALID_OPERATION);
    751 	ctx.endSection();
    752 
    753 	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer size required to store the requested data is greater than bufSize.");
    754 	ctx.glGetnUniformuiv(program.getProgram(), unif, -1, &params[0]);
    755 	ctx.expectError(GL_INVALID_OPERATION);
    756 	ctx.endSection();
    757 
    758 	ctx.glDeleteShader(shader);
    759 	ctx.glDeleteProgram(programEmpty);
    760 }
    761 
    762 void get_active_uniform (NegativeTestContext& ctx)
    763 {
    764 	GLuint				shader				= ctx.glCreateShader(GL_VERTEX_SHADER);
    765 	glu::ShaderProgram	program				(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    766 	GLint				numActiveUniforms	= -1;
    767 
    768 	ctx.glGetProgramiv	(program.getProgram(), GL_ACTIVE_UNIFORMS,	&numActiveUniforms);
    769 	ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORMS = " << numActiveUniforms << " (expected 4)." << TestLog::EndMessage;
    770 
    771 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    772 	ctx.glGetActiveUniform(-1, 0, 0, 0, 0, 0, 0);
    773 	ctx.expectError(GL_INVALID_VALUE);
    774 	ctx.endSection();
    775 
    776 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    777 	ctx.glGetActiveUniform(shader, 0, 0, 0, 0, 0, 0);
    778 	ctx.expectError(GL_INVALID_OPERATION);
    779 	ctx.endSection();
    780 
    781 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to the number of active uniform variables in program.");
    782 	ctx.glUseProgram(program.getProgram());
    783 	ctx.glGetActiveUniform(program.getProgram(), numActiveUniforms, 0, 0, 0, 0, 0);
    784 	ctx.expectError(GL_INVALID_VALUE);
    785 	ctx.endSection();
    786 
    787 	ctx.beginSection("GL_INVALID_VALUE is generated if bufSize is less than 0.");
    788 	ctx.glGetActiveUniform(program.getProgram(), 0, -1, 0, 0, 0, 0);
    789 	ctx.expectError(GL_INVALID_VALUE);
    790 	ctx.endSection();
    791 
    792 	ctx.glUseProgram(0);
    793 	ctx.glDeleteShader(shader);
    794 }
    795 
    796 void get_active_uniformsiv (NegativeTestContext& ctx)
    797 {
    798 	GLuint					shader				= ctx.glCreateShader(GL_VERTEX_SHADER);
    799 	glu::ShaderProgram		program				(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    800 	GLuint					dummyUniformIndex	= 1;
    801 	GLint					dummyParamDst		= -1;
    802 	GLint					numActiveUniforms	= -1;
    803 
    804 	ctx.glUseProgram(program.getProgram());
    805 
    806 	ctx.glGetProgramiv	(program.getProgram(), GL_ACTIVE_UNIFORMS, &numActiveUniforms);
    807 	ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORMS = " << numActiveUniforms << " (expected 4)." << TestLog::EndMessage;
    808 
    809 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    810 	ctx.glGetActiveUniformsiv(-1, 1, &dummyUniformIndex, GL_UNIFORM_TYPE, &dummyParamDst);
    811 	ctx.expectError(GL_INVALID_VALUE);
    812 	ctx.endSection();
    813 
    814 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    815 	ctx.glGetActiveUniformsiv(shader, 1, &dummyUniformIndex, GL_UNIFORM_TYPE, &dummyParamDst);
    816 	ctx.expectError(GL_INVALID_OPERATION);
    817 	ctx.endSection();
    818 
    819 	ctx.beginSection("GL_INVALID_VALUE is generated if any value in uniformIndices is greater than or equal to the value of GL_ACTIVE_UNIFORMS for program.");
    820 	for (int excess = 0; excess <= 2; excess++)
    821 	{
    822 		std::vector<GLuint> invalidUniformIndices;
    823 		invalidUniformIndices.push_back(1);
    824 		invalidUniformIndices.push_back(numActiveUniforms-1+excess);
    825 		invalidUniformIndices.push_back(1);
    826 
    827 		std::vector<GLint> dummyParamsDst(invalidUniformIndices.size());
    828 		ctx.glGetActiveUniformsiv(program.getProgram(), (GLsizei)invalidUniformIndices.size(), &invalidUniformIndices[0], GL_UNIFORM_TYPE, &dummyParamsDst[0]);
    829 		ctx.expectError(excess == 0 ? GL_NO_ERROR : GL_INVALID_VALUE);
    830 	}
    831 	ctx.endSection();
    832 
    833 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted token.");
    834 	ctx.glGetActiveUniformsiv(program.getProgram(), 1, &dummyUniformIndex, -1, &dummyParamDst);
    835 	ctx.expectError(GL_INVALID_ENUM);
    836 	ctx.endSection();
    837 
    838 	ctx.glUseProgram(0);
    839 	ctx.glDeleteShader(shader);
    840 }
    841 
    842 void get_active_uniform_blockiv (NegativeTestContext& ctx)
    843 {
    844 	glu::ShaderProgram	program			(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    845 	GLuint				shader			= ctx.glCreateShader(GL_VERTEX_SHADER);
    846 	GLint				params			= -1;
    847 	GLint				numActiveBlocks	= -1;
    848 
    849 	ctx.glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks);
    850 	ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << " (expected 1)." << TestLog::EndMessage;
    851 	ctx.expectError(GL_NO_ERROR);
    852 
    853 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of either a program or shader object.");
    854 	ctx.glGetActiveUniformBlockiv(-1, 0, GL_UNIFORM_BLOCK_BINDING, &params);
    855 	ctx.expectError(GL_INVALID_VALUE);
    856 	ctx.endSection();
    857 
    858 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object");
    859 	ctx.glGetActiveUniformBlockiv(shader, 0, GL_UNIFORM_BLOCK_BINDING, &params);
    860 	ctx.expectError(GL_INVALID_OPERATION);
    861 	ctx.endSection();
    862 
    863 	ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockIndex is greater than or equal to the value of GL_ACTIVE_UNIFORM_BLOCKS or is not the index of an active uniform block in program.");
    864 	ctx.glUseProgram(program.getProgram());
    865 	ctx.expectError(GL_NO_ERROR);
    866 	ctx.glGetActiveUniformBlockiv(program.getProgram(), numActiveBlocks, GL_UNIFORM_BLOCK_BINDING, &params);
    867 	ctx.expectError(GL_INVALID_VALUE);
    868 	ctx.endSection();
    869 
    870 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the accepted tokens.");
    871 	ctx.glGetActiveUniformBlockiv(program.getProgram(), 0, -1, &params);
    872 	ctx.expectError(GL_INVALID_ENUM);
    873 	ctx.endSection();
    874 
    875 	ctx.glUseProgram(0);
    876 }
    877 
    878 void get_active_uniform_block_name (NegativeTestContext& ctx)
    879 {
    880 	glu::ShaderProgram	program			(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    881 	GLuint				shader			= ctx.glCreateShader(GL_VERTEX_SHADER);
    882 	GLsizei				length			= -1;
    883 	GLint				numActiveBlocks	= -1;
    884 	GLchar				uniformBlockName[128];
    885 
    886 	deMemset(&uniformBlockName[0], 0, sizeof(uniformBlockName));
    887 
    888 	ctx.glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks);
    889 	ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << " (expected 1)." << TestLog::EndMessage;
    890 	ctx.expectError(GL_NO_ERROR);
    891 
    892 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object.");
    893 	ctx.glGetActiveUniformBlockName(shader, numActiveBlocks, GL_UNIFORM_BLOCK_BINDING, &length, &uniformBlockName[0]);
    894 	ctx.expectError(GL_INVALID_OPERATION);
    895 	ctx.endSection();
    896 
    897 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of either a program or shader object.");
    898 	ctx.glGetActiveUniformBlockName(-1, numActiveBlocks, GL_UNIFORM_BLOCK_BINDING, &length, &uniformBlockName[0]);
    899 	ctx.expectError(GL_INVALID_VALUE);
    900 	ctx.endSection();
    901 
    902 	ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockIndex is greater than or equal to the value of GL_ACTIVE_UNIFORM_BLOCKS or is not the index of an active uniform block in program.");
    903 	ctx.glUseProgram(program.getProgram());
    904 	ctx.expectError(GL_NO_ERROR);
    905 	ctx.glGetActiveUniformBlockName(program.getProgram(), numActiveBlocks, (int)sizeof(uniformBlockName), &length, &uniformBlockName[0]);
    906 	ctx.expectError(GL_INVALID_VALUE);
    907 	ctx.endSection();
    908 
    909 	ctx.glUseProgram(0);
    910 }
    911 
    912 void get_active_attrib (NegativeTestContext& ctx)
    913 {
    914 	GLuint				shader				= ctx.glCreateShader(GL_VERTEX_SHADER);
    915 	glu::ShaderProgram	program				(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    916 	GLint				numActiveAttributes	= -1;
    917 	GLsizei				length				= -1;
    918 	GLint				size				= -1;
    919 	GLenum				type				= -1;
    920 	GLchar				name[32];
    921 
    922 	deMemset(&name[0], 0, sizeof(name));
    923 
    924 	ctx.glGetProgramiv	(program.getProgram(), GL_ACTIVE_ATTRIBUTES,	&numActiveAttributes);
    925 	ctx.getLog() << TestLog::Message << "// GL_ACTIVE_ATTRIBUTES = " << numActiveAttributes << " (expected 1)." << TestLog::EndMessage;
    926 
    927 	ctx.glUseProgram(program.getProgram());
    928 
    929 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
    930 	ctx.glGetActiveAttrib(-1, 0, 32, &length, &size, &type, &name[0]);
    931 	ctx.expectError(GL_INVALID_VALUE);
    932 	ctx.endSection();
    933 
    934 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
    935 	ctx.glGetActiveAttrib(shader, 0, 32, &length, &size, &type, &name[0]);
    936 	ctx.expectError(GL_INVALID_OPERATION);
    937 	ctx.endSection();
    938 
    939 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_ACTIVE_ATTRIBUTES.");
    940 	ctx.glGetActiveAttrib(program.getProgram(), numActiveAttributes, (int)sizeof(name), &length, &size, &type, &name[0]);
    941 	ctx.expectError(GL_INVALID_VALUE);
    942 	ctx.endSection();
    943 
    944 	ctx.beginSection("GL_INVALID_VALUE is generated if bufSize is less than 0.");
    945 	ctx.glGetActiveAttrib(program.getProgram(), 0, -1, &length, &size, &type, &name[0]);
    946 	ctx.expectError(GL_INVALID_VALUE);
    947 	ctx.endSection();
    948 
    949 	ctx.glUseProgram(0);
    950 	ctx.glDeleteShader(shader);
    951 }
    952 
    953 void get_uniform_indices (NegativeTestContext& ctx)
    954 {
    955 	GLuint				shader			= ctx.glCreateShader(GL_VERTEX_SHADER);
    956 	glu::ShaderProgram	program			(ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
    957 	GLint 				numActiveBlocks	= -1;
    958 	const GLchar*		uniformName		= "Block.blockVar";
    959 	GLuint				uniformIndices	= -1;
    960 	GLuint				invalid			= -1;
    961 
    962 	ctx.glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS,	&numActiveBlocks);
    963 	ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = "		<< numActiveBlocks			<< TestLog::EndMessage;
    964 	ctx.expectError(GL_NO_ERROR);
    965 
    966 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is a name of shader object.");
    967 	ctx.glGetUniformIndices(shader, 1, &uniformName, &uniformIndices);
    968 	ctx.expectError(GL_INVALID_OPERATION);
    969 	ctx.endSection();
    970 
    971 	ctx.beginSection("GL_INVALID_VALUE is generated if program is not name of program or shader object.");
    972 	ctx.glGetUniformIndices(invalid, 1, &uniformName, &uniformIndices);
    973 	ctx.expectError(GL_INVALID_VALUE);
    974 	ctx.endSection();
    975 
    976 	ctx.glUseProgram(0);
    977 	ctx.glDeleteShader(shader);
    978 }
    979 
    980 void get_vertex_attribfv (NegativeTestContext& ctx)
    981 {
    982 	GLfloat	params				= 0.0f;
    983 	GLint	maxVertexAttribs;
    984 
    985 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
    986 	ctx.glGetVertexAttribfv(0, -1, &params);
    987 	ctx.expectError(GL_INVALID_ENUM);
    988 	ctx.endSection();
    989 
    990 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
    991 	ctx.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
    992 	ctx.glGetVertexAttribfv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &params);
    993 	ctx.expectError(GL_INVALID_VALUE);
    994 	ctx.endSection();
    995 }
    996 
    997 void get_vertex_attribiv (NegativeTestContext& ctx)
    998 {
    999 	GLint	params				= -1;
   1000 	GLint	maxVertexAttribs;
   1001 
   1002 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
   1003 	ctx.glGetVertexAttribiv(0, -1, &params);
   1004 	ctx.expectError(GL_INVALID_ENUM);
   1005 	ctx.endSection();
   1006 
   1007 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
   1008 	ctx.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
   1009 	ctx.glGetVertexAttribiv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &params);
   1010 	ctx.expectError(GL_INVALID_VALUE);
   1011 	ctx.endSection();
   1012 }
   1013 
   1014 void get_vertex_attribi_iv (NegativeTestContext& ctx)
   1015 {
   1016 	GLint	params				= -1;
   1017 	GLint	maxVertexAttribs;
   1018 
   1019 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
   1020 	ctx.glGetVertexAttribIiv(0, -1, &params);
   1021 	ctx.expectError(GL_INVALID_ENUM);
   1022 	ctx.endSection();
   1023 
   1024 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
   1025 	ctx.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
   1026 	ctx.glGetVertexAttribIiv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &params);
   1027 	ctx.expectError(GL_INVALID_VALUE);
   1028 	ctx.endSection();
   1029 }
   1030 
   1031 void get_vertex_attribi_uiv (NegativeTestContext& ctx)
   1032 {
   1033 	GLuint	params				= (GLuint)-1;
   1034 	GLint	maxVertexAttribs;
   1035 
   1036 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
   1037 	ctx.glGetVertexAttribIuiv(0, -1, &params);
   1038 	ctx.expectError(GL_INVALID_ENUM);
   1039 	ctx.endSection();
   1040 
   1041 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
   1042 	ctx.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
   1043 	ctx.glGetVertexAttribIuiv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &params);
   1044 	ctx.expectError(GL_INVALID_VALUE);
   1045 	ctx.endSection();
   1046 }
   1047 
   1048 void get_vertex_attrib_pointerv (NegativeTestContext& ctx)
   1049 {
   1050 	GLvoid*	ptr[1]				= { DE_NULL };
   1051 	GLint	maxVertexAttribs;
   1052 
   1053 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
   1054 	ctx.glGetVertexAttribPointerv(0, -1, &ptr[0]);
   1055 	ctx.expectError(GL_INVALID_ENUM);
   1056 	ctx.endSection();
   1057 
   1058 	ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
   1059 	ctx.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
   1060 	ctx.glGetVertexAttribPointerv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_POINTER, &ptr[0]);
   1061 	ctx.expectError(GL_INVALID_VALUE);
   1062 	ctx.endSection();
   1063 }
   1064 
   1065 void get_frag_data_location (NegativeTestContext& ctx)
   1066 {
   1067 	GLuint shader	= ctx.glCreateShader(GL_VERTEX_SHADER);
   1068 	GLuint program	= ctx.glCreateProgram();
   1069 
   1070 	ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object.");
   1071 	ctx.glGetFragDataLocation(shader, "gl_FragColor");
   1072 	ctx.expectError(GL_INVALID_OPERATION);
   1073 	ctx.endSection();
   1074 
   1075 	ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been linked.");
   1076 	ctx.glGetFragDataLocation(program, "gl_FragColor");
   1077 	ctx.expectError(GL_INVALID_OPERATION);
   1078 	ctx.endSection();
   1079 
   1080 	ctx.glDeleteProgram(program);
   1081 	ctx.glDeleteShader(shader);
   1082 }
   1083 
   1084 // Enumerated state queries: Buffers
   1085 
   1086 void get_buffer_parameteriv (NegativeTestContext& ctx)
   1087 {
   1088 	GLint	params	= -1;
   1089 	GLuint	buf;
   1090 	ctx.glGenBuffers(1, &buf);
   1091 	ctx.glBindBuffer(GL_ARRAY_BUFFER, buf);
   1092 
   1093 	ctx.beginSection("GL_INVALID_ENUM is generated if target or value is not an accepted value.");
   1094 	ctx.glGetBufferParameteriv(-1, GL_BUFFER_SIZE, &params);
   1095 	ctx.expectError(GL_INVALID_ENUM);
   1096 	ctx.glGetBufferParameteriv(GL_ARRAY_BUFFER, -1, &params);
   1097 	ctx.expectError(GL_INVALID_ENUM);
   1098 	ctx.glGetBufferParameteriv(-1, -1, &params);
   1099 	ctx.expectError(GL_INVALID_ENUM);
   1100 	ctx.endSection();
   1101 
   1102 	ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
   1103 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
   1104 	ctx.glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &params);
   1105 	ctx.expectError(GL_INVALID_OPERATION);
   1106 	ctx.endSection();
   1107 
   1108 	ctx.glDeleteBuffers(1, &buf);
   1109 }
   1110 
   1111 void get_buffer_parameteri64v (NegativeTestContext& ctx)
   1112 {
   1113 	GLint64	params	= -1;
   1114 	GLuint	buf;
   1115 	ctx.glGenBuffers(1, &buf);
   1116 	ctx.glBindBuffer(GL_ARRAY_BUFFER, buf);
   1117 
   1118 	ctx.beginSection("GL_INVALID_ENUM is generated if target or value is not an accepted value.");
   1119 	ctx.glGetBufferParameteri64v(-1, GL_BUFFER_SIZE, &params);
   1120 	ctx.expectError(GL_INVALID_ENUM);
   1121 	ctx.glGetBufferParameteri64v(GL_ARRAY_BUFFER , -1, &params);
   1122 	ctx.expectError(GL_INVALID_ENUM);
   1123 	ctx.glGetBufferParameteri64v(-1, -1, &params);
   1124 	ctx.expectError(GL_INVALID_ENUM);
   1125 	ctx.endSection();
   1126 
   1127 	ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
   1128 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
   1129 	ctx.glGetBufferParameteri64v(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &params);
   1130 	ctx.expectError(GL_INVALID_OPERATION);
   1131 	ctx.endSection();
   1132 
   1133 	ctx.glDeleteBuffers(1, &buf);
   1134 }
   1135 
   1136 void get_buffer_pointerv (NegativeTestContext& ctx)
   1137 {
   1138 	GLvoid*	params	= DE_NULL;
   1139 	GLuint	buf;
   1140 	ctx.glGenBuffers(1, &buf);
   1141 	ctx.glBindBuffer(GL_ARRAY_BUFFER, buf);
   1142 
   1143 	ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
   1144 	ctx.glGetBufferPointerv(GL_ARRAY_BUFFER, -1, &params);
   1145 	ctx.expectError(GL_INVALID_ENUM);
   1146 	ctx.glGetBufferPointerv(-1, GL_BUFFER_MAP_POINTER, &params);
   1147 	ctx.expectError(GL_INVALID_ENUM);
   1148 	ctx.endSection();
   1149 
   1150 	ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
   1151 	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
   1152 	ctx.glGetBufferPointerv(GL_ARRAY_BUFFER, GL_BUFFER_MAP_POINTER, &params);
   1153 	ctx.expectError(GL_INVALID_OPERATION);
   1154 	ctx.endSection();
   1155 
   1156 	ctx.glDeleteBuffers(1, &buf);
   1157 }
   1158 
   1159 void get_framebuffer_attachment_parameteriv (NegativeTestContext& ctx)
   1160 {
   1161 	GLint	params[1]	= { -1 };
   1162 	GLuint	fbo;
   1163 	GLuint	rbo[2];
   1164 
   1165 	ctx.glGenFramebuffers			(1, &fbo);
   1166 	ctx.glGenRenderbuffers			(2, rbo);
   1167 
   1168 	ctx.glBindFramebuffer			(GL_FRAMEBUFFER,	fbo);
   1169 	ctx.glBindRenderbuffer			(GL_RENDERBUFFER,	rbo[0]);
   1170 	ctx.glRenderbufferStorage		(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 16, 16);
   1171 	ctx.glFramebufferRenderbuffer	(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo[0]);
   1172 	ctx.glBindRenderbuffer			(GL_RENDERBUFFER,	rbo[1]);
   1173 	ctx.glRenderbufferStorage		(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 16, 16);
   1174 	ctx.glFramebufferRenderbuffer	(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[1]);
   1175 	ctx.glCheckFramebufferStatus	(GL_FRAMEBUFFER);
   1176 	ctx.expectError					(GL_NO_ERROR);
   1177 
   1178 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
   1179 	ctx.glGetFramebufferAttachmentParameteriv(-1, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &params[0]);					// TYPE is GL_RENDERBUFFER
   1180 	ctx.expectError(GL_INVALID_ENUM);
   1181 	ctx.endSection();
   1182 
   1183 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not valid for the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE.");
   1184 	ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &params[0]);	// TYPE is GL_RENDERBUFFER
   1185 	ctx.expectError(GL_INVALID_ENUM);
   1186 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   1187 	ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_BACK, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);					// TYPE is GL_FRAMEBUFFER_DEFAULT
   1188 	ctx.expectError(GL_INVALID_ENUM);
   1189 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   1190 	ctx.endSection();
   1191 
   1192 	ctx.beginSection("GL_INVALID_OPERATION is generated if attachment is GL_DEPTH_STENCIL_ATTACHMENT and different objects are bound to the depth and stencil attachment points of target.");
   1193 	ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);
   1194 	ctx.expectError(GL_INVALID_OPERATION);
   1195 	ctx.endSection();
   1196 
   1197 	ctx.beginSection("GL_INVALID_OPERATION is generated if the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE and pname is not GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME.");
   1198 	ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);		// TYPE is GL_NONE
   1199 	ctx.expectError(GL_NO_ERROR);
   1200 	ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, &params[0]);	// TYPE is GL_NONE
   1201 	ctx.expectError(GL_INVALID_OPERATION);
   1202 	ctx.endSection();
   1203 
   1204 	ctx.beginSection("GL_INVALID_OPERATION or GL_INVALID_ENUM is generated if attachment is not one of the accepted values for the current binding of target.");
   1205 	ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_BACK, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);					// A FBO is bound so GL_BACK is invalid
   1206 	ctx.expectError(GL_INVALID_OPERATION, GL_INVALID_ENUM);
   1207 	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   1208 	ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);		// Default framebuffer is bound so GL_COLOR_ATTACHMENT0 is invalid
   1209 	ctx.expectError(GL_INVALID_OPERATION, GL_INVALID_ENUM);
   1210 	ctx.endSection();
   1211 
   1212 	ctx.glDeleteFramebuffers(1, &fbo);
   1213 }
   1214 
   1215 void get_renderbuffer_parameteriv (NegativeTestContext& ctx)
   1216 {
   1217 	GLint	params[1] = { -1 };
   1218 	GLuint	rbo;
   1219 	ctx.glGenRenderbuffers(1, &rbo);
   1220 	ctx.glBindRenderbuffer(GL_RENDERBUFFER, rbo);
   1221 
   1222 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
   1223 	ctx.glGetRenderbufferParameteriv(-1, GL_RENDERBUFFER_WIDTH, &params[0]);
   1224 	ctx.expectError(GL_INVALID_ENUM);
   1225 	ctx.endSection();
   1226 
   1227 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the accepted tokens.");
   1228 	ctx.glGetRenderbufferParameteriv(GL_RENDERBUFFER, -1, &params[0]);
   1229 	ctx.expectError(GL_INVALID_ENUM);
   1230 	ctx.endSection();
   1231 
   1232 	ctx.beginSection("GL_INVALID_OPERATION  is generated if the renderbuffer currently bound to target is zero.");
   1233 	ctx.glBindRenderbuffer(GL_RENDERBUFFER, 0);
   1234 	ctx.expectError(GL_NO_ERROR);
   1235 	ctx.glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &params[0]);
   1236 	ctx.expectError(GL_INVALID_OPERATION);
   1237 	ctx.endSection();
   1238 
   1239 	ctx.glDeleteRenderbuffers(1, &rbo);
   1240 	ctx.glBindRenderbuffer(GL_RENDERBUFFER, 0);
   1241 }
   1242 
   1243 void get_internalformativ (NegativeTestContext& ctx)
   1244 {
   1245 	GLint params[16];
   1246 
   1247 	deMemset(&params[0], 0xcd, sizeof(params));
   1248 
   1249 	ctx.beginSection("GL_INVALID_VALUE is generated if bufSize is negative.");
   1250 	ctx.glGetInternalformativ	(GL_RENDERBUFFER, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, -1, &params[0]);
   1251 	ctx.expectError				(GL_INVALID_VALUE);
   1252 	ctx.endSection();
   1253 
   1254 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not GL_SAMPLES or GL_NUM_SAMPLE_COUNTS.");
   1255 	ctx.glGetInternalformativ	(GL_RENDERBUFFER, GL_RGBA8, -1, 16, &params[0]);
   1256 	ctx.expectError				(GL_INVALID_ENUM);
   1257 	ctx.endSection();
   1258 
   1259 	ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not color-, depth-, or stencil-renderable.");
   1260 
   1261 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_render_snorm"))
   1262 	{
   1263 		ctx.glGetInternalformativ	(GL_RENDERBUFFER, GL_RG8_SNORM, GL_NUM_SAMPLE_COUNTS, 16, &params[0]);
   1264 		ctx.expectError				(GL_INVALID_ENUM);
   1265 	}
   1266 
   1267 	ctx.glGetInternalformativ	(GL_RENDERBUFFER, GL_COMPRESSED_RGB8_ETC2, GL_NUM_SAMPLE_COUNTS, 16, &params[0]);
   1268 	ctx.expectError				(GL_INVALID_ENUM);
   1269 	ctx.endSection();
   1270 
   1271 	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
   1272 	ctx.glGetInternalformativ	(-1, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, &params[0]);
   1273 	ctx.expectError				(GL_INVALID_ENUM);
   1274 	ctx.glGetInternalformativ	(GL_FRAMEBUFFER, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, &params[0]);
   1275 	ctx.expectError				(GL_INVALID_ENUM);
   1276 
   1277 	if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_sparse_texture"))
   1278 	{
   1279 		ctx.glGetInternalformativ	(GL_TEXTURE_2D, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, &params[0]);
   1280 		ctx.expectError				(GL_INVALID_ENUM);
   1281 	}
   1282 
   1283 	ctx.endSection();
   1284 }
   1285 
   1286 // Query object queries
   1287 
   1288 void get_queryiv (NegativeTestContext& ctx)
   1289 {
   1290 	GLint params = -1;
   1291 
   1292 	ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
   1293 	ctx.glGetQueryiv	(GL_ANY_SAMPLES_PASSED, -1, &params);
   1294 	ctx.expectError		(GL_INVALID_ENUM);
   1295 	ctx.glGetQueryiv	(-1, GL_CURRENT_QUERY, &params);
   1296 	ctx.expectError		(GL_INVALID_ENUM);
   1297 	ctx.glGetQueryiv	(-1, -1, &params);
   1298 	ctx.expectError		(GL_INVALID_ENUM);
   1299 	ctx.endSection();
   1300 }
   1301 
   1302 void get_query_objectuiv (NegativeTestContext& ctx)
   1303 {
   1304 	GLuint params	= -1;
   1305 	GLuint id;
   1306 	ctx.glGenQueries		(1, &id);
   1307 
   1308 	ctx.beginSection("GL_INVALID_OPERATION is generated if id is not the name of a query object.");
   1309 	ctx.glGetQueryObjectuiv	(-1, GL_QUERY_RESULT_AVAILABLE, &params);
   1310 	ctx.expectError			(GL_INVALID_OPERATION);
   1311 	ctx.getLog() << TestLog::Message << "// Note: " << id << " is not a query object yet, since it hasn't been used by glBeginQuery" << TestLog::EndMessage;
   1312 	ctx.glGetQueryObjectuiv	(id, GL_QUERY_RESULT_AVAILABLE, &params);
   1313 	ctx.expectError			(GL_INVALID_OPERATION);
   1314 	ctx.endSection();
   1315 
   1316 	ctx.glBeginQuery		(GL_ANY_SAMPLES_PASSED, id);
   1317 	ctx.glEndQuery			(GL_ANY_SAMPLES_PASSED);
   1318 
   1319 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
   1320 	ctx.glGetQueryObjectuiv	(id, -1, &params);
   1321 	ctx.expectError			(GL_INVALID_ENUM);
   1322 	ctx.endSection();
   1323 
   1324 	ctx.beginSection("GL_INVALID_OPERATION is generated if id is the name of a currently active query object.");
   1325 	ctx.glBeginQuery		(GL_ANY_SAMPLES_PASSED, id);
   1326 	ctx.expectError			(GL_NO_ERROR);
   1327 	ctx.glGetQueryObjectuiv	(id, GL_QUERY_RESULT_AVAILABLE, &params);
   1328 	ctx.expectError			(GL_INVALID_OPERATION);
   1329 	ctx.glEndQuery			(GL_ANY_SAMPLES_PASSED);
   1330 	ctx.expectError			(GL_NO_ERROR);
   1331 	ctx.endSection();
   1332 
   1333 	ctx.glDeleteQueries		(1, &id);
   1334 }
   1335 
   1336 // Sync object queries
   1337 
   1338 void get_synciv (NegativeTestContext& ctx)
   1339 {
   1340 	GLsizei	length		= -1;
   1341 	GLint	values[32];
   1342 	GLsync	sync;
   1343 
   1344 	deMemset(&values[0], 0xcd, sizeof(values));
   1345 
   1346 	ctx.beginSection("GL_INVALID_VALUE is generated if sync is not the name of a sync object.");
   1347 	ctx.glGetSynciv(0, GL_OBJECT_TYPE, 32, &length, &values[0]);
   1348 	ctx.expectError(GL_INVALID_VALUE);
   1349 	ctx.endSection();
   1350 
   1351 	ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the accepted tokens.");
   1352 	sync = ctx.glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
   1353 	ctx.expectError(GL_NO_ERROR);
   1354 	ctx.glGetSynciv(sync, -1, 32, &length, &values[0]);
   1355 	ctx.expectError(GL_INVALID_ENUM);
   1356 	ctx.endSection();
   1357 
   1358 	ctx.glDeleteSync(sync);
   1359 
   1360 	ctx.beginSection("GL_INVALID_VALUE is generated if bufSize is negative.");
   1361 	sync = ctx.glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
   1362 	ctx.expectError(GL_NO_ERROR);
   1363 	ctx.glGetSynciv(sync, GL_OBJECT_TYPE, -1, &length, &values[0]);
   1364 	ctx.expectError(GL_INVALID_VALUE);
   1365 	ctx.endSection();
   1366 
   1367 	ctx.glDeleteSync(sync);
   1368 }
   1369 
   1370 // Enumerated boolean state queries
   1371 
   1372 void is_enabled (NegativeTestContext& ctx)
   1373 {
   1374 	ctx.beginSection("GL_INVALID_ENUM is generated if cap is not an accepted value.");
   1375 	ctx.glIsEnabled(-1);
   1376 	ctx.expectError(GL_INVALID_ENUM);
   1377 	ctx.glIsEnabled(GL_TRIANGLES);
   1378 	ctx.expectError(GL_INVALID_ENUM);
   1379 	ctx.endSection();
   1380 }
   1381 
   1382 void is_enabledi (NegativeTestContext& ctx)
   1383 {
   1384 	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
   1385 
   1386 	ctx.beginSection("GL_INVALID_ENUM is generated if cap is not an accepted value.");
   1387 	ctx.glIsEnabledi(-1, 1);
   1388 	ctx.expectError(GL_INVALID_ENUM);
   1389 	ctx.glIsEnabledi(GL_TRIANGLES, 1);
   1390 	ctx.expectError(GL_INVALID_ENUM);
   1391 	ctx.endSection();
   1392 
   1393 	ctx.beginSection("GL_INVALID_VALUE is generated if index is outside the valid range for the indexed state cap.");
   1394 	ctx.glIsEnabledi(GL_BLEND, -1);
   1395 	ctx.expectError(GL_INVALID_VALUE);
   1396 	ctx.endSection();
   1397 }
   1398 
   1399 // Hints
   1400 
   1401 void hint (NegativeTestContext& ctx)
   1402 {
   1403 	ctx.beginSection("GL_INVALID_ENUM is generated if either target or mode is not an accepted value.");
   1404 	ctx.glHint(GL_GENERATE_MIPMAP_HINT, -1);
   1405 	ctx.expectError(GL_INVALID_ENUM);
   1406 	ctx.glHint(-1, GL_FASTEST);
   1407 	ctx.expectError(GL_INVALID_ENUM);
   1408 	ctx.glHint(-1, -1);
   1409 	ctx.expectError(GL_INVALID_ENUM);
   1410 	ctx.endSection();
   1411 }
   1412 
   1413 std::vector<FunctionContainer> getNegativeStateApiTestFunctions ()
   1414 {
   1415 	const FunctionContainer funcs[] =
   1416 	{
   1417 		{enable,									"enable",									"Invalid glEnable() usage"								},
   1418 		{disable,									"disable",									"Invalid glDisable() usage"								},
   1419 		{get_booleanv,								"get_booleanv",								"Invalid glGetBooleanv() usage"							},
   1420 		{get_floatv,								"get_floatv",								"Invalid glGetFloatv() usage"							},
   1421 		{get_integerv,								"get_integerv",								"Invalid glGetIntegerv() usage"							},
   1422 		{get_integer64v,							"get_integer64v",							"Invalid glGetInteger64v() usage"						},
   1423 		{get_integeri_v,							"get_integeri_v",							"Invalid glGetIntegeri_v() usage"						},
   1424 		{get_booleani_v,							"get_booleani_v",							"Invalid glGetBooleani_v() usage"						},
   1425 		{get_integer64i_v,							"get_integer64i_v",							"Invalid glGetInteger64i_v() usage"						},
   1426 		{get_string,								"get_string",								"Invalid glGetString() usage"							},
   1427 		{get_stringi,								"get_stringi",								"Invalid glGetStringi() usage"							},
   1428 		{get_attached_shaders,						"get_attached_shaders",						"Invalid glGetAttachedShaders() usage"					},
   1429 		{get_shaderiv,								"get_shaderiv",								"Invalid glGetShaderiv() usage"							},
   1430 		{get_shader_info_log,						"get_shader_info_log",						"Invalid glGetShaderInfoLog() usage"					},
   1431 		{get_shader_precision_format,				"get_shader_precision_format",				"Invalid glGetShaderPrecisionFormat() usage"			},
   1432 		{get_shader_source,							"get_shader_source",						"Invalid glGetShaderSource() usage"						},
   1433 		{get_programiv,								"get_programiv",							"Invalid glGetProgramiv() usage"						},
   1434 		{get_program_info_log,						"get_program_info_log",						"Invalid glGetProgramInfoLog() usage"					},
   1435 		{get_tex_parameterfv,						"get_tex_parameterfv",						"Invalid glGetTexParameterfv() usage"					},
   1436 		{get_tex_parameteriv,						"get_tex_parameteriv",						"Invalid glGetTexParameteriv() usage"					},
   1437 		{get_uniformfv,								"get_uniformfv",							"Invalid glGetUniformfv() usage"						},
   1438 		{get_uniformiv,								"get_uniformiv",							"Invalid glGetUniformiv() usage"						},
   1439 		{get_uniformuiv,							"get_uniformuiv",							"Invalid glGetUniformuiv() usage"						},
   1440 		{get_active_uniform,						"get_active_uniform",						"Invalid glGetActiveUniform() usage"					},
   1441 		{get_active_uniformsiv,						"get_active_uniformsiv",					"Invalid glGetActiveUniformsiv() usage"					},
   1442 		{get_active_uniform_blockiv,				"get_active_uniform_blockiv",				"Invalid glGetActiveUniformBlockiv() usage"				},
   1443 		{get_active_uniform_block_name,				"get_active_uniform_block_name",			"Invalid glGetActiveUniformBlockName() usage"			},
   1444 		{get_active_attrib,							"get_active_attrib",						"Invalid glGetActiveAttrib() usage"						},
   1445 		{get_uniform_indices,						"get_uniform_indices",						"Invalid glGetUniformIndices() usage"					},
   1446 		{get_vertex_attribfv,						"get_vertex_attribfv",						"Invalid glGetVertexAttribfv() usage"					},
   1447 		{get_vertex_attribiv,						"get_vertex_attribiv",						"Invalid glGetVertexAttribiv() usage"					},
   1448 		{get_vertex_attribi_iv,						"get_vertex_attribi_iv",					"Invalid glGetVertexAttribIiv() usage"					},
   1449 		{get_vertex_attribi_uiv,					"get_vertex_attribi_uiv",					"Invalid glGetVertexAttribIuiv() usage"					},
   1450 		{get_vertex_attrib_pointerv,				"get_vertex_attrib_pointerv",				"Invalid glGetVertexAttribPointerv() usage"				},
   1451 		{get_frag_data_location,					"get_frag_data_location",					"Invalid glGetFragDataLocation() usage"					},
   1452 		{get_buffer_parameteriv,					"get_buffer_parameteriv",					"Invalid glGetBufferParameteriv() usage"				},
   1453 		{get_buffer_parameteri64v,					"get_buffer_parameteri64v",					"Invalid glGetBufferParameteri64v() usage"				},
   1454 		{get_buffer_pointerv,						"get_buffer_pointerv",						"Invalid glGetBufferPointerv() usage"					},
   1455 		{get_framebuffer_attachment_parameteriv,	"get_framebuffer_attachment_parameteriv",	"Invalid glGetFramebufferAttachmentParameteriv() usage"	},
   1456 		{get_renderbuffer_parameteriv,				"get_renderbuffer_parameteriv",				"Invalid glGetRenderbufferParameteriv() usage"			},
   1457 		{get_internalformativ,						"get_internalformativ",						"Invalid glGetInternalformativ() usage"					},
   1458 		{get_queryiv,								"get_queryiv",								"Invalid glGetQueryiv() usage"							},
   1459 		{get_query_objectuiv,						"get_query_objectuiv",						"Invalid glGetQueryObjectuiv() usage"					},
   1460 		{get_synciv,								"get_synciv",								"Invalid glGetSynciv() usage"							},
   1461 		{is_enabled,								"is_enabled",								"Invalid glIsEnabled() usage"							},
   1462 		{hint,										"hint",										"Invalid glHint() usage"								},
   1463 		{enablei,									"enablei",									"Invalid glEnablei() usage"								},
   1464 		{disablei,									"disablei",									"Invalid glDisablei() usage"							},
   1465 		{get_tex_parameteriiv,						"get_tex_parameteriiv",						"Invalid glGetTexParameterIiv() usage"					},
   1466 		{get_tex_parameteriuiv,						"get_tex_parameteriuiv",					"Invalid glGetTexParameterIuiv() usage"					},
   1467 		{get_nuniformfv,							"get_nuniformfv",							"Invalid glGetnUniformfv() usage"						},
   1468 		{get_nuniformiv,							"get_nuniformiv",							"Invalid glGetnUniformiv() usage"						},
   1469 		{get_nuniformuiv,							"get_nuniformuiv",							"Invalid glGetnUniformuiv() usage"						},
   1470 		{is_enabledi,								"is_enabledi",								"Invalid glIsEnabledi() usage"							},
   1471 	};
   1472 
   1473 	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
   1474 }
   1475 
   1476 } // NegativeTestShared
   1477 } // Functional
   1478 } // gles3
   1479 } // deqp
   1480