1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 2.0 Module
3 * -------------------------------------------------
5 * Copyright 2014 The Android Open Source Project
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * \brief Negative GL State API tests.
22 *//*--------------------------------------------------------------------*/
24 #include "es2fNegativeStateApiTests.hpp"
25 #include "es2fApiCase.hpp"
26 #include "gluShaderProgram.hpp"
29 #include "glwEnums.hpp"
30 #include "glwDefs.hpp"
32 using namespace glw; // GL types
43 static const char* uniformTestVertSource = "uniform mediump vec4 vTest;\n"
46 " gl_Position = vTest;\n"
48 static const char* uniformTestFragSource = "uniform mediump ivec4 fTest;\n"
51 " gl_FragColor = vec4(fTest);\n"
54 NegativeStateApiTests::NegativeStateApiTests (Context& context)
55 : TestCaseGroup(context, "state", "Negative GL State API Cases")
59 NegativeStateApiTests::~NegativeStateApiTests (void)
63 void NegativeStateApiTests::init (void)
65 // Enabling & disabling states
67 ES2F_ADD_API_CASE(enable, "Invalid glEnable() usage",
69 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
71 expectError(GL_INVALID_ENUM);
72 m_log << TestLog::EndSection;
74 ES2F_ADD_API_CASE(disable, "Invalid glDisable() usage",
76 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
78 expectError(GL_INVALID_ENUM);
79 m_log << TestLog::EndSection;
82 // Simple state queries
84 ES2F_ADD_API_CASE(get_booleanv, "Invalid glGetBooleanv() usage",
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, ¶ms[0]);
89 expectError(GL_INVALID_ENUM);
90 m_log << TestLog::EndSection;
92 ES2F_ADD_API_CASE(get_floatv, "Invalid glGetFloatv() usage",
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, ¶ms[0]);
97 expectError(GL_INVALID_ENUM);
98 m_log << TestLog::EndSection;
100 ES2F_ADD_API_CASE(get_integerv, "Invalid glGetIntegerv() usage",
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, ¶ms[0]);
105 expectError(GL_INVALID_ENUM);
106 m_log << TestLog::EndSection;
108 ES2F_ADD_API_CASE(get_string, "Invalid glGetString() usage",
110 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if name is not an accepted value.");
112 expectError(GL_INVALID_ENUM);
113 m_log << TestLog::EndSection;
116 // Enumerated state queries: Shaders
118 ES2F_ADD_API_CASE(get_attached_shaders, "Invalid glGetAttachedShaders() usage",
120 GLuint shaders[1] = { 0 };
121 GLuint shaderObject = glCreateShader(GL_VERTEX_SHADER);
122 GLuint program = glCreateProgram();
123 GLsizei count[1] = { -1 };
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;
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;
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;
140 glDeleteShader(shaderObject);
141 glDeleteProgram(program);
143 ES2F_ADD_API_CASE(get_shaderiv, "Invalid glGetShaderiv() usage",
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;
150 m_log << TestLog::Message << "// Shader compiler supported" << TestLog::EndMessage;
152 GLuint shader = glCreateShader(GL_VERTEX_SHADER);
153 GLuint program = glCreateProgram();
154 GLint param[1] = { -1 };
156 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
157 glGetShaderiv(shader, -1, ¶m[0]);
158 expectError(GL_INVALID_ENUM);
159 m_log << TestLog::EndSection;
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, ¶m[0]);
163 expectError(GL_INVALID_VALUE);
164 m_log << TestLog::EndSection;
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, ¶m[0]);
168 expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
169 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, ¶m[0]);
170 expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
171 glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, ¶m[0]);
172 expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
173 m_log << TestLog::EndSection;
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, ¶m[0]);
177 expectError(GL_INVALID_OPERATION);
178 m_log << TestLog::EndSection;
180 glDeleteShader(shader);
181 glDeleteProgram(program);
183 ES2F_ADD_API_CASE(get_shader_info_log, "Invalid glGetShaderInfoLog() usage",
185 GLuint shader = glCreateShader(GL_VERTEX_SHADER);
186 GLuint program = glCreateProgram();
187 GLsizei length[1] = { -1 };
190 deMemset(&infoLog[0], 0, sizeof(infoLog));
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;
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;
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;
207 glDeleteShader(shader);
208 glDeleteProgram(program);
210 ES2F_ADD_API_CASE(get_shader_precision_format, "Invalid glGetShaderPrecisionFormat() usage",
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;
217 m_log << TestLog::Message << "// Shader compiler supported" << TestLog::EndMessage;
222 GLint precision[1] = { -1 };
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;
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;
238 ES2F_ADD_API_CASE(get_shader_source, "Invalid glGetShaderSource() usage",
240 GLsizei length[1] = { -1 };
241 char source[1] = { 0 };
242 GLuint program = glCreateProgram();
243 GLuint shader = glCreateShader(GL_VERTEX_SHADER);
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;
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;
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;
260 glDeleteProgram(program);
261 glDeleteShader(shader);
264 // Enumerated state queries: Programs
266 ES2F_ADD_API_CASE(get_programiv, "Invalid glGetProgramiv() usage",
268 GLuint program = glCreateProgram();
269 GLuint shader = glCreateShader(GL_VERTEX_SHADER);
270 GLint params[1] = { -1 };
272 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
273 glGetProgramiv(program, -1, ¶ms[0]);
274 expectError(GL_INVALID_ENUM);
275 m_log << TestLog::EndSection;
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, ¶ms[0]);
279 expectError(GL_INVALID_VALUE);
280 m_log << TestLog::EndSection;
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, ¶ms[0]);
284 expectError(GL_INVALID_OPERATION);
285 m_log << TestLog::EndSection;
287 glDeleteProgram(program);
288 glDeleteShader(shader);
290 ES2F_ADD_API_CASE(get_program_info_log, "Invalid glGetProgramInfoLog() usage",
292 GLuint program = glCreateProgram();
293 GLuint shader = glCreateShader(GL_VERTEX_SHADER);
294 GLsizei length[1] = { -1 };
295 char infoLog[1] = { 0 };
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;
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;
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;
312 glDeleteProgram(program);
313 glDeleteShader(shader);
316 // Enumerated state queries: Shader variables
318 ES2F_ADD_API_CASE(get_tex_parameterfv, "Invalid glGetTexParameterfv() usage",
320 GLfloat params[1] = { 0.0f };
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, ¶ms[0]);
324 expectError(GL_INVALID_ENUM);
325 glGetTexParameterfv (GL_TEXTURE_2D, -1, ¶ms[0]);
326 expectError(GL_INVALID_ENUM);
327 glGetTexParameterfv (-1, -1, ¶ms[0]);
328 expectError(GL_INVALID_ENUM);
329 m_log << TestLog::EndSection;
331 ES2F_ADD_API_CASE(get_tex_parameteriv, "Invalid glGetTexParameteriv() usage",
333 GLint params[1] = { -1 };
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, ¶ms[0]);
337 expectError(GL_INVALID_ENUM);
338 glGetTexParameteriv (GL_TEXTURE_2D, -1, ¶ms[0]);
339 expectError(GL_INVALID_ENUM);
340 glGetTexParameteriv (-1, -1, ¶ms[0]);
341 expectError(GL_INVALID_ENUM);
342 m_log << TestLog::EndSection;
344 ES2F_ADD_API_CASE(get_uniformfv, "Invalid glGetUniformfv() usage",
346 glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
347 glUseProgram(program.getProgram());
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");
354 GLuint shader = glCreateShader(GL_VERTEX_SHADER);
355 GLuint programEmpty = glCreateProgram();
358 deMemset(¶ms[0], 0, sizeof(params));
360 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
361 glGetUniformfv (-1, vUnif, ¶ms[0]);
362 expectError(GL_INVALID_VALUE);
363 m_log << TestLog::EndSection;
365 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
366 glGetUniformfv (shader, vUnif, ¶ms[0]);
367 expectError(GL_INVALID_OPERATION);
368 m_log << TestLog::EndSection;
370 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been successfully linked.");
371 glGetUniformfv (programEmpty, vUnif, ¶ms[0]);
372 expectError(GL_INVALID_OPERATION);
373 m_log << TestLog::EndSection;
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, ¶ms[0]);
377 expectError(GL_INVALID_OPERATION);
378 m_log << TestLog::EndSection;
380 glDeleteShader(shader);
381 glDeleteProgram(programEmpty);
383 ES2F_ADD_API_CASE(get_uniformiv, "Invalid glGetUniformiv() usage",
385 glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
386 glUseProgram(program.getProgram());
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");
393 GLuint shader = glCreateShader(GL_VERTEX_SHADER);
394 GLuint programEmpty = glCreateProgram();
397 deMemset(¶ms[0], 0, sizeof(params));
399 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
400 glGetUniformiv (-1, vUnif, ¶ms[0]);
401 expectError(GL_INVALID_VALUE);
402 m_log << TestLog::EndSection;
404 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
405 glGetUniformiv (shader, vUnif, ¶ms[0]);
406 expectError(GL_INVALID_OPERATION);
407 m_log << TestLog::EndSection;
409 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been successfully linked.");
410 glGetUniformiv (programEmpty, vUnif, ¶ms[0]);
411 expectError(GL_INVALID_OPERATION);
412 m_log << TestLog::EndSection;
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, ¶ms[0]);
416 expectError(GL_INVALID_OPERATION);
417 m_log << TestLog::EndSection;
419 glDeleteShader(shader);
420 glDeleteProgram(programEmpty);
422 ES2F_ADD_API_CASE(get_vertex_attribfv, "Invalid glGetVertexAttribfv() usage",
426 deMemset(¶ms[0], 0, sizeof(params));
428 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
429 glGetVertexAttribfv(0, -1, ¶ms[0]);
430 expectError(GL_INVALID_ENUM);
431 m_log << TestLog::EndSection;
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, ¶ms[0]);
437 expectError(GL_INVALID_VALUE);
438 m_log << TestLog::EndSection;
440 ES2F_ADD_API_CASE(get_vertex_attribiv, "Invalid glGetVertexAttribiv() usage",
444 deMemset(¶ms[0], 0, sizeof(params));
446 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
447 glGetVertexAttribiv(0, -1, ¶ms[0]);
448 expectError(GL_INVALID_ENUM);
449 m_log << TestLog::EndSection;
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, ¶ms[0]);
455 expectError(GL_INVALID_VALUE);
456 m_log << TestLog::EndSection;
458 ES2F_ADD_API_CASE(get_vertex_attrib_pointerv, "Invalid glGetVertexAttribPointerv() usage",
460 GLvoid* ptr[1] = { DE_NULL };
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;
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;
475 // Enumerated state queries: Buffers
477 ES2F_ADD_API_CASE(get_buffer_parameteriv, "Invalid glGetBufferParameteriv() usage",
481 glGenBuffers(1, &buf);
482 glBindBuffer(GL_ARRAY_BUFFER, buf);
484 deMemset(¶ms[0], 0, sizeof(params));
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, ¶ms[0]);
488 expectError(GL_INVALID_ENUM);
489 glGetBufferParameteriv(GL_ARRAY_BUFFER , -1, ¶ms[0]);
490 expectError(GL_INVALID_ENUM);
491 glGetBufferParameteriv(-1, -1, ¶ms[0]);
492 expectError(GL_INVALID_ENUM);
493 m_log << TestLog::EndSection;
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, ¶ms[0]);
498 expectError(GL_INVALID_OPERATION);
499 m_log << TestLog::EndSection;
501 glDeleteBuffers(1, &buf);
503 ES2F_ADD_API_CASE(get_framebuffer_attachment_parameteriv, "Invalid glGetFramebufferAttachmentParameteriv() usage",
505 GLint params[1] = { -1 };
507 glGenFramebuffers(1, &fbo);
508 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
510 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER.");
511 glGetFramebufferAttachmentParameteriv(-1, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, ¶ms[0]);
512 expectError(GL_INVALID_ENUM);
513 m_log << TestLog::EndSection;
515 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.");
516 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms[0]);
517 expectError(GL_INVALID_ENUM);
518 m_log << TestLog::EndSection;
520 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if the attached object at the named attachment point is incompatible with pname.");
521 GLint attachmentObjectType = -1;
522 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &attachmentObjectType);
523 expectError(GL_NO_ERROR);
525 if (attachmentObjectType == GL_RENDERBUFFER)
526 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, ¶ms[0]);
527 else if (attachmentObjectType == GL_TEXTURE)
528 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, ¶ms[0]);
529 else if (attachmentObjectType == GL_NONE)
530 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms[0]);
532 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid return value from glGetFramebufferAttachmentParameteriv()");
534 expectError(GL_INVALID_ENUM);
535 m_log << TestLog::EndSection;
537 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the default framebuffer object name 0 is bound.");
538 glBindFramebuffer(GL_FRAMEBUFFER, 0);
539 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, ¶ms[0]);
540 expectError(GL_INVALID_OPERATION);
541 m_log << TestLog::EndSection;
543 glDeleteFramebuffers(1, &fbo);
545 ES2F_ADD_API_CASE(get_renderbuffer_parameteriv, "Invalid glGetRenderbufferParameteriv() usage",
549 glGenRenderbuffers(1, &rbo);
550 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
552 deMemset(¶ms[0], 0, sizeof(params));
554 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
555 glGetRenderbufferParameteriv(-1, GL_RENDERBUFFER_WIDTH, ¶ms[0]);
556 expectError(GL_INVALID_ENUM);
557 m_log << TestLog::EndSection;
559 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
560 glGetRenderbufferParameteriv(GL_RENDERBUFFER, -1, ¶ms[0]);
561 expectError(GL_INVALID_ENUM);
562 m_log << TestLog::EndSection;
564 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the reserved renderbuffer object name 0 is bound.");
565 glBindRenderbuffer(GL_RENDERBUFFER, 0);
566 glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, ¶ms[0]);
567 expectError(GL_INVALID_OPERATION);
568 m_log << TestLog::EndSection;
570 glDeleteRenderbuffers(1, &rbo);
573 // Enumerated boolean state queries
575 ES2F_ADD_API_CASE(get_is_enabled, "Invalid glIsEnabled() usage",
577 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not an accepted value.");
579 expectError(GL_INVALID_ENUM);
580 glIsEnabled(GL_TRIANGLES);
581 expectError(GL_INVALID_ENUM);
582 m_log << TestLog::EndSection;
587 ES2F_ADD_API_CASE(hint, "Invalid glHint() usage",
589 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if either target or mode is not an accepted value.");
590 glHint(GL_GENERATE_MIPMAP_HINT, -1);
591 expectError(GL_INVALID_ENUM);
592 glHint(-1, GL_FASTEST);
593 expectError(GL_INVALID_ENUM);
595 expectError(GL_INVALID_ENUM);
596 m_log << TestLog::EndSection;
599 // Named object usage
601 ES2F_ADD_API_CASE(is_buffer, "Invalid glIsBuffer() usage",
606 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.");
607 isBuffer = glIsBuffer(buffer);
608 checkBooleans (isBuffer, GL_FALSE);
610 glGenBuffers (1, &buffer);
611 isBuffer = glIsBuffer(buffer);
612 checkBooleans (isBuffer, GL_FALSE);
614 glBindBuffer (GL_ARRAY_BUFFER, buffer);
615 isBuffer = glIsBuffer(buffer);
616 checkBooleans (isBuffer, GL_TRUE);
618 glBindBuffer (GL_ARRAY_BUFFER, 0);
619 glDeleteBuffers (1, &buffer);
620 isBuffer = glIsBuffer(buffer);
621 checkBooleans (isBuffer, GL_FALSE);
622 m_log << TestLog::EndSection;
624 expectError (GL_NO_ERROR);
626 ES2F_ADD_API_CASE(is_framebuffer, "Invalid glIsFramebuffer() usage",
631 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.");
632 isFbo = glIsFramebuffer(fbo);
633 checkBooleans (isFbo, GL_FALSE);
635 glGenFramebuffers (1, &fbo);
636 isFbo = glIsFramebuffer(fbo);
637 checkBooleans (isFbo, GL_FALSE);
639 glBindFramebuffer (GL_FRAMEBUFFER, fbo);
640 isFbo = glIsFramebuffer(fbo);
641 checkBooleans (isFbo, GL_TRUE);
643 glBindFramebuffer (GL_FRAMEBUFFER, 0);
644 glDeleteFramebuffers(1, &fbo);
645 isFbo = glIsFramebuffer(fbo);
646 checkBooleans (isFbo, GL_FALSE);
647 m_log << TestLog::EndSection;
649 expectError (GL_NO_ERROR);
651 ES2F_ADD_API_CASE(is_program, "Invalid glIsProgram() usage",
656 m_log << TestLog::Section("", "A name created with glCreateProgram, and not yet deleted with glDeleteProgram is a name of a program object.");
657 isProgram = glIsProgram(program);
658 checkBooleans (isProgram, GL_FALSE);
660 program = glCreateProgram();
661 isProgram = glIsProgram(program);
662 checkBooleans (isProgram, GL_TRUE);
664 glDeleteProgram (program);
665 isProgram = glIsProgram(program);
666 checkBooleans (isProgram, GL_FALSE);
667 m_log << TestLog::EndSection;
669 expectError (GL_NO_ERROR);
671 ES2F_ADD_API_CASE(is_renderbuffer, "Invalid glIsRenderbuffer() usage",
676 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.");
677 isRbo = glIsRenderbuffer(rbo);
678 checkBooleans (isRbo, GL_FALSE);
680 glGenRenderbuffers (1, &rbo);
681 isRbo = glIsRenderbuffer(rbo);
682 checkBooleans (isRbo, GL_FALSE);
684 glBindRenderbuffer (GL_RENDERBUFFER, rbo);
685 isRbo = glIsRenderbuffer(rbo);
686 checkBooleans (isRbo, GL_TRUE);
688 glBindRenderbuffer (GL_RENDERBUFFER, 0);
689 glDeleteRenderbuffers (1, &rbo);
690 isRbo = glIsRenderbuffer(rbo);
691 checkBooleans (isRbo, GL_FALSE);
692 m_log << TestLog::EndSection;
694 expectError (GL_NO_ERROR);
696 ES2F_ADD_API_CASE(is_shader, "Invalid glIsShader() usage",
701 m_log << TestLog::Section("", "A name created with glCreateShader, and not yet deleted with glDeleteShader is a name of a shader object.");
702 isShader = glIsProgram(shader);
703 checkBooleans (isShader, GL_FALSE);
705 shader = glCreateShader(GL_VERTEX_SHADER);
706 isShader = glIsShader(shader);
707 checkBooleans (isShader, GL_TRUE);
709 glDeleteShader (shader);
710 isShader = glIsShader(shader);
711 checkBooleans (isShader, GL_FALSE);
712 m_log << TestLog::EndSection;
714 expectError (GL_NO_ERROR);
716 ES2F_ADD_API_CASE(is_texture, "Invalid glIsTexture() usage",
721 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.");
722 isTexture = glIsTexture(texture);
723 checkBooleans (isTexture, GL_FALSE);
725 glGenTextures (1, &texture);
726 isTexture = glIsTexture(texture);
727 checkBooleans (isTexture, GL_FALSE);
729 glBindTexture (GL_TEXTURE_2D, texture);
730 isTexture = glIsTexture(texture);
731 checkBooleans (isTexture, GL_TRUE);
733 glBindTexture (GL_TEXTURE_2D, 0);
734 glDeleteTextures (1, &texture);
735 isTexture = glIsTexture(texture);
736 checkBooleans (isTexture, GL_FALSE);
737 m_log << TestLog::EndSection;
739 expectError (GL_NO_ERROR);