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