1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 2.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 "es2fNegativeStateApiTests.hpp"
25 #include "es2fApiCase.hpp"
26 #include "gluShaderProgram.hpp"
27 #include "deMemory.h"
28 
29 #include "glwEnums.hpp"
30 #include "glwDefs.hpp"
31 
32 using namespace glw; // GL types
33 
34 namespace deqp
35 {
36 namespace gles2
37 {
38 namespace Functional
39 {
40 
41 using tcu::TestLog;
42 
43 static const char* uniformTestVertSource	=	"uniform mediump vec4 vTest;\n"
44 												"void main (void)\n"
45 												"{\n"
46 												"	gl_Position = vTest;\n"
47 												"}\n\0";
48 static const char* uniformTestFragSource	=	"uniform mediump ivec4 fTest;\n"
49 												"void main (void)\n"
50 												"{\n"
51 												"	gl_FragColor = vec4(fTest);\n"
52 												"}\n\0";
53 
NegativeStateApiTests(Context & context)54 NegativeStateApiTests::NegativeStateApiTests (Context& context)
55 	: TestCaseGroup(context, "state", "Negative GL State API Cases")
56 {
57 }
58 
~NegativeStateApiTests(void)59 NegativeStateApiTests::~NegativeStateApiTests (void)
60 {
61 }
62 
init(void)63 void NegativeStateApiTests::init (void)
64 {
65 	// Enabling & disabling states
66 
67 	ES2F_ADD_API_CASE(enable, "Invalid glEnable() usage",
68 		{
69 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
70 			glEnable(-1);
71 			expectError(GL_INVALID_ENUM);
72 			m_log << TestLog::EndSection;
73 		});
74 	ES2F_ADD_API_CASE(disable, "Invalid glDisable() usage",
75 		{
76 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
77 			glDisable(-1);
78 			expectError(GL_INVALID_ENUM);
79 			m_log << TestLog::EndSection;
80 		});
81 
82 	// Simple state queries
83 
84 	ES2F_ADD_API_CASE(get_booleanv, "Invalid glGetBooleanv() usage",
85 		{
86 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
87 			GLboolean params[1] = { GL_FALSE };
88 			glGetBooleanv(-1, &params[0]);
89 			expectError(GL_INVALID_ENUM);
90 			m_log << TestLog::EndSection;
91 		});
92 	ES2F_ADD_API_CASE(get_floatv, "Invalid glGetFloatv() usage",
93 		{
94 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
95 			GLfloat params[1] = { 0.0f };
96 			glGetFloatv(-1, &params[0]);
97 			expectError(GL_INVALID_ENUM);
98 			m_log << TestLog::EndSection;
99 		});
100 	ES2F_ADD_API_CASE(get_integerv, "Invalid glGetIntegerv() usage",
101 		{
102 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
103 			GLint params[1] = { 0 };
104 			glGetIntegerv(-1, &params[0]);
105 			expectError(GL_INVALID_ENUM);
106 			m_log << TestLog::EndSection;
107 		});
108 	ES2F_ADD_API_CASE(get_string, "Invalid glGetString() usage",
109 		{
110 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if name is not an accepted value.");
111 			glGetString(0);
112 			expectError(GL_INVALID_ENUM);
113 			m_log << TestLog::EndSection;
114 		});
115 
116 	// Enumerated state queries: Shaders
117 
118 	ES2F_ADD_API_CASE(get_attached_shaders, "Invalid glGetAttachedShaders() usage",
119 		{
120 			GLuint shaders[1]	= { 0 };
121 			GLuint shaderObject = glCreateShader(GL_VERTEX_SHADER);
122 			GLuint program		= glCreateProgram();
123 			GLsizei count[1]	= { -1 };
124 
125 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
126 			glGetAttachedShaders(-1, 1, &count[0], &shaders[0]);
127 			expectError(GL_INVALID_VALUE);
128 			m_log << TestLog::EndSection;
129 
130 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
131 			glGetAttachedShaders(shaderObject, 1, &count[0], &shaders[0]);
132 			expectError(GL_INVALID_OPERATION);
133 			m_log << TestLog::EndSection;
134 
135 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if maxCount is less than 0.");
136 			glGetAttachedShaders(program, -1, &count[0], &shaders[0]);
137 			expectError(GL_INVALID_VALUE);
138 			m_log << TestLog::EndSection;
139 
140 			glDeleteShader(shaderObject);
141 			glDeleteProgram(program);
142 		});
143 	ES2F_ADD_API_CASE(get_shaderiv, "Invalid glGetShaderiv() usage",
144 		{
145 			GLboolean shaderCompilerSupported;
146 			glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
147 			if (!shaderCompilerSupported)
148 				m_log << TestLog::Message << "// Shader compiler not supported, always expect GL_INVALID_OPERATION" << TestLog::EndMessage;
149 			else
150 				m_log << TestLog::Message << "// Shader compiler supported" << TestLog::EndMessage;
151 
152 			GLuint shader	= glCreateShader(GL_VERTEX_SHADER);
153 			GLuint program	= glCreateProgram();
154 			GLint param[1]	= { -1 };
155 
156 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
157 			glGetShaderiv(shader, -1, &param[0]);
158 			expectError(GL_INVALID_ENUM);
159 			m_log << TestLog::EndSection;
160 
161 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
162 			glGetShaderiv(-1, GL_SHADER_TYPE, &param[0]);
163 			expectError(GL_INVALID_VALUE);
164 			m_log << TestLog::EndSection;
165 
166 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if pname is GL_COMPILE_STATUS, GL_INFO_LOG_LENGTH, or GL_SHADER_SOURCE_LENGTH but a shader compiler is not supported.");
167 			glGetShaderiv(shader, GL_COMPILE_STATUS, &param[0]);
168 			expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
169 			glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &param[0]);
170 			expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
171 			glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &param[0]);
172 			expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
173 			m_log << TestLog::EndSection;
174 
175 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader does not refer to a shader object.");
176 			glGetShaderiv(program, GL_SHADER_TYPE, &param[0]);
177 			expectError(GL_INVALID_OPERATION);
178 			m_log << TestLog::EndSection;
179 
180 			glDeleteShader(shader);
181 			glDeleteProgram(program);
182 		});
183 	ES2F_ADD_API_CASE(get_shader_info_log, "Invalid glGetShaderInfoLog() usage",
184 		{
185 			GLuint shader	= glCreateShader(GL_VERTEX_SHADER);
186 			GLuint program	= glCreateProgram();
187 			GLsizei length[1] = { -1 };
188 			char infoLog[128];
189 
190 			deMemset(&infoLog[0], 0, sizeof(infoLog));
191 
192 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
193 			glGetShaderInfoLog(-1, 128, &length[0], &infoLog[0]);
194 			expectError(GL_INVALID_VALUE);
195 			m_log << TestLog::EndSection;
196 
197 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
198 			glGetShaderInfoLog(program, 128, &length[0], &infoLog[0]);
199 			expectError(GL_INVALID_OPERATION);
200 			m_log << TestLog::EndSection;
201 
202 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if maxLength is less than 0.");
203 			glGetShaderInfoLog(shader, -1, &length[0], &infoLog[0]);
204 			expectError(GL_INVALID_VALUE);
205 			m_log << TestLog::EndSection;
206 
207 			glDeleteShader(shader);
208 			glDeleteProgram(program);
209 		});
210 	ES2F_ADD_API_CASE(get_shader_precision_format, "Invalid glGetShaderPrecisionFormat() usage",
211 		{
212 			GLboolean shaderCompilerSupported;
213 			glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
214 			if (!shaderCompilerSupported)
215 				m_log << TestLog::Message << "// Shader compiler not supported, always expect GL_INVALID_OPERATION" << TestLog::EndMessage;
216 			else
217 				m_log << TestLog::Message << "// Shader compiler supported" << TestLog::EndMessage;
218 
219 			GLint range[2];
220 			range[0] = -1;
221 			range[1] = -1;
222 			GLint precision[1] = { -1 };
223 
224 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if shaderType or precisionType is not an accepted value.");
225 			glGetShaderPrecisionFormat (-1, GL_MEDIUM_FLOAT, &range[0], &precision[0]);
226 			expectError(shaderCompilerSupported ? GL_INVALID_ENUM : GL_INVALID_OPERATION);
227 			glGetShaderPrecisionFormat (GL_VERTEX_SHADER, -1, &range[0], &precision[0]);
228 			expectError(shaderCompilerSupported ? GL_INVALID_ENUM : GL_INVALID_OPERATION);
229 			glGetShaderPrecisionFormat (-1, -1, &range[0], &precision[0]);
230 			expectError(shaderCompilerSupported ? GL_INVALID_ENUM : GL_INVALID_OPERATION);
231 			m_log << TestLog::EndSection;
232 
233 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a shader compiler is not supported.");
234 			glGetShaderPrecisionFormat (GL_VERTEX_SHADER, GL_MEDIUM_FLOAT, &range[0], &precision[0]);
235 			expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
236 			m_log << TestLog::EndSection;
237 		});
238 	ES2F_ADD_API_CASE(get_shader_source, "Invalid glGetShaderSource() usage",
239 		{
240 			GLsizei length[1] = { -1 };
241 			char source[1] = { 0 };
242 			GLuint program	= glCreateProgram();
243 			GLuint shader	= glCreateShader(GL_VERTEX_SHADER);
244 
245 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
246 			glGetShaderSource(-1, 1, &length[0], &source[0]);
247 			expectError(GL_INVALID_VALUE);
248 			m_log << TestLog::EndSection;
249 
250 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
251 			glGetShaderSource(program, 1, &length[0], &source[0]);
252 			expectError(GL_INVALID_OPERATION);
253 			m_log << TestLog::EndSection;
254 
255 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if bufSize is less than 0.");
256 			glGetShaderSource(shader, -1, &length[0], &source[0]);
257 			expectError(GL_INVALID_VALUE);
258 			m_log << TestLog::EndSection;
259 
260 			glDeleteProgram(program);
261 			glDeleteShader(shader);
262 		});
263 
264 	// Enumerated state queries: Programs
265 
266 	ES2F_ADD_API_CASE(get_programiv, "Invalid glGetProgramiv() usage",
267 		{
268 			GLuint program	= glCreateProgram();
269 			GLuint shader	= glCreateShader(GL_VERTEX_SHADER);
270 			GLint params[1] = { -1 };
271 
272 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
273 			glGetProgramiv(program, -1, &params[0]);
274 			expectError(GL_INVALID_ENUM);
275 			m_log << TestLog::EndSection;
276 
277 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
278 			glGetProgramiv(-1, GL_LINK_STATUS, &params[0]);
279 			expectError(GL_INVALID_VALUE);
280 			m_log << TestLog::EndSection;
281 
282 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program does not refer to a program object.");
283 			glGetProgramiv(shader, GL_LINK_STATUS, &params[0]);
284 			expectError(GL_INVALID_OPERATION);
285 			m_log << TestLog::EndSection;
286 
287 			glDeleteProgram(program);
288 			glDeleteShader(shader);
289 		});
290 	ES2F_ADD_API_CASE(get_program_info_log, "Invalid glGetProgramInfoLog() usage",
291 		{
292 			GLuint program	= glCreateProgram();
293 			GLuint shader	= glCreateShader(GL_VERTEX_SHADER);
294 			GLsizei length[1] = { -1 };
295 			char infoLog[1] = { 0 };
296 
297 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
298 			glGetProgramInfoLog (-1, 1, &length[0], &infoLog[0]);
299 			expectError(GL_INVALID_VALUE);
300 			m_log << TestLog::EndSection;
301 
302 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
303 			glGetProgramInfoLog (shader, 1, &length[0], &infoLog[0]);
304 			expectError(GL_INVALID_OPERATION);
305 			m_log << TestLog::EndSection;
306 
307 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if maxLength is less than 0.");
308 			glGetProgramInfoLog (program, -1, &length[0], &infoLog[0]);
309 			expectError(GL_INVALID_VALUE);
310 			m_log << TestLog::EndSection;
311 
312 			glDeleteProgram(program);
313 			glDeleteShader(shader);
314 		});
315 
316 	// Enumerated state queries: Shader variables
317 
318 	ES2F_ADD_API_CASE(get_tex_parameterfv, "Invalid glGetTexParameterfv() usage",
319 		{
320 			GLfloat params[1] = { 0.0f };
321 
322 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
323 			glGetTexParameterfv (-1, GL_TEXTURE_MAG_FILTER, &params[0]);
324 			expectError(GL_INVALID_ENUM);
325 			glGetTexParameterfv (GL_TEXTURE_2D, -1, &params[0]);
326 			expectError(GL_INVALID_ENUM);
327 			glGetTexParameterfv (-1, -1, &params[0]);
328 			expectError(GL_INVALID_ENUM);
329 			m_log << TestLog::EndSection;
330 		});
331 	ES2F_ADD_API_CASE(get_tex_parameteriv, "Invalid glGetTexParameteriv() usage",
332 		{
333 			GLint params[1] = { -1 };
334 
335 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
336 			glGetTexParameteriv (-1, GL_TEXTURE_MAG_FILTER, &params[0]);
337 			expectError(GL_INVALID_ENUM);
338 			glGetTexParameteriv (GL_TEXTURE_2D, -1, &params[0]);
339 			expectError(GL_INVALID_ENUM);
340 			glGetTexParameteriv (-1, -1, &params[0]);
341 			expectError(GL_INVALID_ENUM);
342 			m_log << TestLog::EndSection;
343 		});
344 	ES2F_ADD_API_CASE(get_uniformfv, "Invalid glGetUniformfv() usage",
345 		{
346 			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
347 			glUseProgram(program.getProgram());
348 
349 			GLint vUnif = glGetUniformLocation(program.getProgram(), "vTest");	// vec4
350 			GLint fUnif = glGetUniformLocation(program.getProgram(), "fTest");	// ivec4
351 			if (vUnif == -1 || fUnif == -1)
352 				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
353 
354 			GLuint shader		= glCreateShader(GL_VERTEX_SHADER);
355 			GLuint programEmpty = glCreateProgram();
356 			GLfloat params[4];
357 
358 			deMemset(&params[0], 0, sizeof(params));
359 
360 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
361 			glGetUniformfv (-1, vUnif, &params[0]);
362 			expectError(GL_INVALID_VALUE);
363 			m_log << TestLog::EndSection;
364 
365 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
366 			glGetUniformfv (shader, vUnif, &params[0]);
367 			expectError(GL_INVALID_OPERATION);
368 			m_log << TestLog::EndSection;
369 
370 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been successfully linked.");
371 			glGetUniformfv (programEmpty, vUnif, &params[0]);
372 			expectError(GL_INVALID_OPERATION);
373 			m_log << TestLog::EndSection;
374 
375 			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.");
376 			glGetUniformfv (program.getProgram(), de::max(vUnif, fUnif)+1, &params[0]);
377 			expectError(GL_INVALID_OPERATION);
378 			m_log << TestLog::EndSection;
379 
380 			glDeleteShader(shader);
381 			glDeleteProgram(programEmpty);
382 		});
383 	ES2F_ADD_API_CASE(get_uniformiv, "Invalid glGetUniformiv() usage",
384 		{
385 			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
386 			glUseProgram(program.getProgram());
387 
388 			GLint vUnif = glGetUniformLocation(program.getProgram(), "vTest");	// vec4
389 			GLint fUnif = glGetUniformLocation(program.getProgram(), "fTest");	// ivec4
390 			if (vUnif == -1 || fUnif == -1)
391 				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
392 
393 			GLuint shader		= glCreateShader(GL_VERTEX_SHADER);
394 			GLuint programEmpty = glCreateProgram();
395 			GLint params[4];
396 
397 			deMemset(&params[0], 0, sizeof(params));
398 
399 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
400 			glGetUniformiv (-1, vUnif, &params[0]);
401 			expectError(GL_INVALID_VALUE);
402 			m_log << TestLog::EndSection;
403 
404 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
405 			glGetUniformiv (shader, vUnif, &params[0]);
406 			expectError(GL_INVALID_OPERATION);
407 			m_log << TestLog::EndSection;
408 
409 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been successfully linked.");
410 			glGetUniformiv (programEmpty, vUnif, &params[0]);
411 			expectError(GL_INVALID_OPERATION);
412 			m_log << TestLog::EndSection;
413 
414 			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.");
415 			glGetUniformiv (program.getProgram(), de::max(vUnif, fUnif)+1, &params[0]);
416 			expectError(GL_INVALID_OPERATION);
417 			m_log << TestLog::EndSection;
418 
419 			glDeleteShader(shader);
420 			glDeleteProgram(programEmpty);
421 		});
422 	ES2F_ADD_API_CASE(get_vertex_attribfv, "Invalid glGetVertexAttribfv() usage",
423 		{
424 			GLfloat params[1];
425 
426 			deMemset(&params[0], 0, sizeof(params));
427 
428 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
429 			glGetVertexAttribfv(0, -1, &params[0]);
430 			expectError(GL_INVALID_ENUM);
431 			m_log << TestLog::EndSection;
432 
433 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
434 			GLint maxVertexAttribs;
435 			glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
436 			glGetVertexAttribfv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &params[0]);
437 			expectError(GL_INVALID_VALUE);
438 			m_log << TestLog::EndSection;
439 		});
440 	ES2F_ADD_API_CASE(get_vertex_attribiv, "Invalid glGetVertexAttribiv() usage",
441 		{
442 			GLint params[1];
443 
444 			deMemset(&params[0], 0, sizeof(params));
445 
446 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
447 			glGetVertexAttribiv(0, -1, &params[0]);
448 			expectError(GL_INVALID_ENUM);
449 			m_log << TestLog::EndSection;
450 
451 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
452 			GLint maxVertexAttribs;
453 			glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
454 			glGetVertexAttribiv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &params[0]);
455 			expectError(GL_INVALID_VALUE);
456 			m_log << TestLog::EndSection;
457 		});
458 	ES2F_ADD_API_CASE(get_vertex_attrib_pointerv, "Invalid glGetVertexAttribPointerv() usage",
459 		{
460 			GLvoid* ptr[1] = { DE_NULL };
461 
462 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
463 			glGetVertexAttribPointerv(0, -1, &ptr[0]);
464 			expectError(GL_INVALID_ENUM);
465 			m_log << TestLog::EndSection;
466 
467 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
468 			GLint maxVertexAttribs;
469 			glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
470 			glGetVertexAttribPointerv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_POINTER, &ptr[0]);
471 			expectError(GL_INVALID_VALUE);
472 			m_log << TestLog::EndSection;
473 		});
474 
475 	// Enumerated state queries: Buffers
476 
477 	ES2F_ADD_API_CASE(get_buffer_parameteriv, "Invalid glGetBufferParameteriv() usage",
478 		{
479 			GLint params[1];
480 			GLuint buf;
481 			glGenBuffers(1, &buf);
482 			glBindBuffer(GL_ARRAY_BUFFER, buf);
483 
484 			deMemset(&params[0], 0, sizeof(params));
485 
486 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or value is not an accepted value.");
487 			glGetBufferParameteriv(-1, GL_BUFFER_SIZE, &params[0]);
488 			expectError(GL_INVALID_ENUM);
489 			glGetBufferParameteriv(GL_ARRAY_BUFFER , -1, &params[0]);
490 			expectError(GL_INVALID_ENUM);
491 			glGetBufferParameteriv(-1, -1, &params[0]);
492 			expectError(GL_INVALID_ENUM);
493 			m_log << TestLog::EndSection;
494 
495 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
496 			glBindBuffer(GL_ARRAY_BUFFER, 0);
497 			glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &params[0]);
498 			expectError(GL_INVALID_OPERATION);
499 			m_log << TestLog::EndSection;
500 
501 			glDeleteBuffers(1, &buf);
502 		});
503 	ES2F_ADD_API_CASE(get_framebuffer_attachment_parameteriv, "Invalid glGetFramebufferAttachmentParameteriv() usage",
504 		{
505 			// GL_MAJOR_VERSION query does not exist on GLES2
506 			// so succeeding query implies GLES3+ hardware.
507 			bool isES3Compatible = false;
508 			glw::GLint majorVersion = 0;
509 			glGetIntegerv(GL_MAJOR_VERSION, &majorVersion);
510 			if (glGetError() == GL_NO_ERROR)
511 				isES3Compatible = true;
512 
513 			GLint params[1] = { -1 };
514 			GLuint fbo;
515 			glGenFramebuffers(1, &fbo);
516 			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
517 
518 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER.");
519 			glGetFramebufferAttachmentParameteriv(-1, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &params[0]);
520 			expectError(GL_INVALID_ENUM);
521 			m_log << TestLog::EndSection;
522 
523 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if there is no attached object at the named attachment point and pname is not GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE.");
524 			if (isES3Compatible)
525 			{
526 				glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);		// TYPE is GL_NONE
527 				expectError(GL_NO_ERROR);
528 				glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, &params[0]);	// TYPE is GL_NONE
529 				expectError(GL_INVALID_OPERATION);
530 			}
531 			else
532 			{
533 				glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);
534 				expectError(GL_INVALID_ENUM);
535 			}
536 			m_log << TestLog::EndSection;
537 
538 			if (!isES3Compatible)
539 			{
540 				m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if the attached object at the named attachment point is incompatible with pname.");
541 				GLint attachmentObjectType = -1;
542 				glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &attachmentObjectType);
543 				expectError(GL_NO_ERROR);
544 
545 				if (attachmentObjectType == GL_RENDERBUFFER)
546 					glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &params[0]);
547 				else if (attachmentObjectType == GL_TEXTURE)
548 					glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, &params[0]);
549 				else if (attachmentObjectType == GL_NONE)
550 					glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);
551 				else
552 					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid return value from glGetFramebufferAttachmentParameteriv()");
553 
554 				expectError(GL_INVALID_ENUM);
555 				m_log << TestLog::EndSection;
556 			}
557 
558 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the default framebuffer object name 0 is bound.");
559 			glBindFramebuffer(GL_FRAMEBUFFER, 0);
560 			glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &params[0]);
561 			if (isES3Compatible)
562 				expectError(GL_INVALID_OPERATION, GL_INVALID_ENUM);
563 			else
564 				expectError(GL_INVALID_OPERATION);
565 			m_log << TestLog::EndSection;
566 
567 			glDeleteFramebuffers(1, &fbo);
568 		});
569 	ES2F_ADD_API_CASE(get_renderbuffer_parameteriv, "Invalid glGetRenderbufferParameteriv() usage",
570 		{
571 			GLint params[1];
572 			GLuint rbo;
573 			glGenRenderbuffers(1, &rbo);
574 			glBindRenderbuffer(GL_RENDERBUFFER, rbo);
575 
576 			deMemset(&params[0], 0, sizeof(params));
577 
578 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
579 			glGetRenderbufferParameteriv(-1, GL_RENDERBUFFER_WIDTH, &params[0]);
580 			expectError(GL_INVALID_ENUM);
581 			m_log << TestLog::EndSection;
582 
583 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
584 			glGetRenderbufferParameteriv(GL_RENDERBUFFER, -1, &params[0]);
585 			expectError(GL_INVALID_ENUM);
586 			m_log << TestLog::EndSection;
587 
588 			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the reserved renderbuffer object name 0 is bound.");
589 			glBindRenderbuffer(GL_RENDERBUFFER, 0);
590 			glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &params[0]);
591 			expectError(GL_INVALID_OPERATION);
592 			m_log << TestLog::EndSection;
593 
594 			glDeleteRenderbuffers(1, &rbo);
595 		});
596 
597 	// Enumerated boolean state queries
598 
599 	ES2F_ADD_API_CASE(get_is_enabled, "Invalid glIsEnabled() usage",
600 		{
601 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not an accepted value.");
602 			glIsEnabled(-1);
603 			expectError(GL_INVALID_ENUM);
604 			glIsEnabled(GL_TRIANGLES);
605 			expectError(GL_INVALID_ENUM);
606 			m_log << TestLog::EndSection;
607 		});
608 
609 	// Hints
610 
611 	ES2F_ADD_API_CASE(hint, "Invalid glHint() usage",
612 		{
613 			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if either target or mode is not an accepted value.");
614 			glHint(GL_GENERATE_MIPMAP_HINT, -1);
615 			expectError(GL_INVALID_ENUM);
616 			glHint(-1, GL_FASTEST);
617 			expectError(GL_INVALID_ENUM);
618 			glHint(-1, -1);
619 			expectError(GL_INVALID_ENUM);
620 			m_log << TestLog::EndSection;
621 		});
622 
623 	// Named object usage
624 
625 	ES2F_ADD_API_CASE(is_buffer, "Invalid glIsBuffer() usage",
626 		{
627 			GLuint		buffer = 0;
628 			GLboolean	isBuffer;
629 
630 			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.");
631 			isBuffer		= glIsBuffer(buffer);
632 			checkBooleans	(isBuffer, GL_FALSE);
633 
634 			glGenBuffers	(1, &buffer);
635 			isBuffer		= glIsBuffer(buffer);
636 			checkBooleans	(isBuffer, GL_FALSE);
637 
638 			glBindBuffer	(GL_ARRAY_BUFFER, buffer);
639 			isBuffer		= glIsBuffer(buffer);
640 			checkBooleans	(isBuffer, GL_TRUE);
641 
642 			glBindBuffer	(GL_ARRAY_BUFFER, 0);
643 			glDeleteBuffers	(1, &buffer);
644 			isBuffer		= glIsBuffer(buffer);
645 			checkBooleans	(isBuffer, GL_FALSE);
646 			m_log << TestLog::EndSection;
647 
648 			expectError			(GL_NO_ERROR);
649 		});
650 	ES2F_ADD_API_CASE(is_framebuffer, "Invalid glIsFramebuffer() usage",
651 		{
652 			GLuint		fbo = 0;
653 			GLboolean	isFbo;
654 
655 			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.");
656 			isFbo				= glIsFramebuffer(fbo);
657 			checkBooleans		(isFbo, GL_FALSE);
658 
659 			glGenFramebuffers	(1, &fbo);
660 			isFbo				= glIsFramebuffer(fbo);
661 			checkBooleans		(isFbo, GL_FALSE);
662 
663 			glBindFramebuffer	(GL_FRAMEBUFFER, fbo);
664 			isFbo				= glIsFramebuffer(fbo);
665 			checkBooleans		(isFbo, GL_TRUE);
666 
667 			glBindFramebuffer	(GL_FRAMEBUFFER, 0);
668 			glDeleteFramebuffers(1, &fbo);
669 			isFbo				= glIsFramebuffer(fbo);
670 			checkBooleans		(isFbo, GL_FALSE);
671 			m_log << TestLog::EndSection;
672 
673 			expectError			(GL_NO_ERROR);
674 		});
675 	ES2F_ADD_API_CASE(is_program, "Invalid glIsProgram() usage",
676 		{
677 			GLuint		program = 0;
678 			GLboolean	isProgram;
679 
680 			m_log << TestLog::Section("", "A name created with glCreateProgram, and not yet deleted with glDeleteProgram is a name of a program object.");
681 			isProgram			= glIsProgram(program);
682 			checkBooleans		(isProgram, GL_FALSE);
683 
684 			program				= glCreateProgram();
685 			isProgram			= glIsProgram(program);
686 			checkBooleans		(isProgram, GL_TRUE);
687 
688 			glDeleteProgram		(program);
689 			isProgram			= glIsProgram(program);
690 			checkBooleans		(isProgram, GL_FALSE);
691 			m_log << TestLog::EndSection;
692 
693 			expectError			(GL_NO_ERROR);
694 		});
695 	ES2F_ADD_API_CASE(is_renderbuffer, "Invalid glIsRenderbuffer() usage",
696 		{
697 			GLuint		rbo = 0;
698 			GLboolean	isRbo;
699 
700 			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.");
701 			isRbo					= glIsRenderbuffer(rbo);
702 			checkBooleans			(isRbo, GL_FALSE);
703 
704 			glGenRenderbuffers		(1, &rbo);
705 			isRbo					= glIsRenderbuffer(rbo);
706 			checkBooleans			(isRbo, GL_FALSE);
707 
708 			glBindRenderbuffer		(GL_RENDERBUFFER, rbo);
709 			isRbo					= glIsRenderbuffer(rbo);
710 			checkBooleans			(isRbo, GL_TRUE);
711 
712 			glBindRenderbuffer		(GL_RENDERBUFFER, 0);
713 			glDeleteRenderbuffers	(1, &rbo);
714 			isRbo					= glIsRenderbuffer(rbo);
715 			checkBooleans			(isRbo, GL_FALSE);
716 			m_log << TestLog::EndSection;
717 
718 			expectError			(GL_NO_ERROR);
719 		});
720 	ES2F_ADD_API_CASE(is_shader, "Invalid glIsShader() usage",
721 		{
722 			GLuint		shader = 0;
723 			GLboolean	isShader;
724 
725 			m_log << TestLog::Section("", "A name created with glCreateShader, and not yet deleted with glDeleteShader is a name of a shader object.");
726 			isShader			= glIsProgram(shader);
727 			checkBooleans		(isShader, GL_FALSE);
728 
729 			shader				= glCreateShader(GL_VERTEX_SHADER);
730 			isShader			= glIsShader(shader);
731 			checkBooleans		(isShader, GL_TRUE);
732 
733 			glDeleteShader		(shader);
734 			isShader			= glIsShader(shader);
735 			checkBooleans		(isShader, GL_FALSE);
736 			m_log << TestLog::EndSection;
737 
738 			expectError			(GL_NO_ERROR);
739 		});
740 	ES2F_ADD_API_CASE(is_texture, "Invalid glIsTexture() usage",
741 		{
742 			GLuint		texture = 0;
743 			GLboolean	isTexture;
744 
745 			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.");
746 			isTexture			= glIsTexture(texture);
747 			checkBooleans		(isTexture, GL_FALSE);
748 
749 			glGenTextures		(1, &texture);
750 			isTexture			= glIsTexture(texture);
751 			checkBooleans		(isTexture, GL_FALSE);
752 
753 			glBindTexture		(GL_TEXTURE_2D, texture);
754 			isTexture			= glIsTexture(texture);
755 			checkBooleans		(isTexture, GL_TRUE);
756 
757 			glBindTexture		(GL_TEXTURE_2D, 0);
758 			glDeleteTextures	(1, &texture);
759 			isTexture			= glIsTexture(texture);
760 			checkBooleans		(isTexture, GL_FALSE);
761 			m_log << TestLog::EndSection;
762 
763 			expectError			(GL_NO_ERROR);
764 		});
765 }
766 
767 } // Functional
768 } // gles2
769 } // deqp
770