1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*-------------------------------------------------------------------------
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * drawElements Quality Program OpenGL ES 2.0 Module
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * -------------------------------------------------
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2014 The Android Open Source Project
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Licensed under the Apache License, Version 2.0 (the "License");
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * you may not use this file except in compliance with the License.
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * You may obtain a copy of the License at
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *      http://www.apache.org/licenses/LICENSE-2.0
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unless required by applicable law or agreed to in writing, software
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distributed under the License is distributed on an "AS IS" BASIS,
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See the License for the specific language governing permissions and
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * limitations under the License.
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *//*!
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \brief Negative GL State API tests.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *//*--------------------------------------------------------------------*/
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "es2fNegativeStateApiTests.hpp"
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "es2fApiCase.hpp"
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "gluShaderProgram.hpp"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "deMemory.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glwEnums.hpp"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glwDefs.hpp"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing namespace glw; // GL types
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace deqp
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace gles2
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace Functional
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing tcu::TestLog;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char* uniformTestVertSource	=	"uniform mediump vec4 vTest;\n"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org												"void main (void)\n"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org												"{\n"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org												"	gl_Position = vTest;\n"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org												"}\n\0";
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char* uniformTestFragSource	=	"uniform mediump ivec4 fTest;\n"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org												"void main (void)\n"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org												"{\n"
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org												"	gl_FragColor = vec4(fTest);\n"
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org												"}\n\0";
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgNegativeStateApiTests::NegativeStateApiTests (Context& context)
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	: TestCaseGroup(context, "state", "Negative GL State API Cases")
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgNegativeStateApiTests::~NegativeStateApiTests (void)
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid NegativeStateApiTests::init (void)
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	// Enabling & disabling states
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ES2F_ADD_API_CASE(enable, "Invalid glEnable() usage",
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glEnable(-1);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_ENUM);
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		});
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ES2F_ADD_API_CASE(disable, "Invalid glDisable() usage",
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glDisable(-1);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_ENUM);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		});
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	// Simple state queries
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ES2F_ADD_API_CASE(get_booleanv, "Invalid glGetBooleanv() usage",
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLboolean params[1] = { GL_FALSE };
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetBooleanv(-1, &params[0]);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_ENUM);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		});
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ES2F_ADD_API_CASE(get_floatv, "Invalid glGetFloatv() usage",
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLfloat params[1] = { 0.0f };
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetFloatv(-1, &params[0]);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_ENUM);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		});
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ES2F_ADD_API_CASE(get_integerv, "Invalid glGetIntegerv() usage",
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLint params[1] = { 0 };
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetIntegerv(-1, &params[0]);
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_ENUM);
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		});
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ES2F_ADD_API_CASE(get_string, "Invalid glGetString() usage",
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if name is not an accepted value.");
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetString(0);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_ENUM);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		});
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	// Enumerated state queries: Shaders
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ES2F_ADD_API_CASE(get_attached_shaders, "Invalid glGetAttachedShaders() usage",
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLuint shaders[1]	= { 0 };
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLuint shaderObject = glCreateShader(GL_VERTEX_SHADER);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLuint program		= glCreateProgram();
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLsizei count[1]	= { -1 };
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetAttachedShaders(-1, 1, &count[0], &shaders[0]);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_VALUE);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetAttachedShaders(shaderObject, 1, &count[0], &shaders[0]);
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_OPERATION);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if maxCount is less than 0.");
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetAttachedShaders(program, -1, &count[0], &shaders[0]);
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_VALUE);
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glDeleteShader(shaderObject);
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glDeleteProgram(program);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		});
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ES2F_ADD_API_CASE(get_shaderiv, "Invalid glGetShaderiv() usage",
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLboolean shaderCompilerSupported;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (!shaderCompilerSupported)
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				m_log << TestLog::Message << "// Shader compiler not supported, always expect GL_INVALID_OPERATION" << TestLog::EndMessage;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				m_log << TestLog::Message << "// Shader compiler supported" << TestLog::EndMessage;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLuint shader	= glCreateShader(GL_VERTEX_SHADER);
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLuint program	= glCreateProgram();
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLint param[1]	= { -1 };
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderiv(shader, -1, &param[0]);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_ENUM);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderiv(-1, GL_SHADER_TYPE, &param[0]);
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_VALUE);
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			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.");
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderiv(shader, GL_COMPILE_STATUS, &param[0]);
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &param[0]);
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &param[0]);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader does not refer to a shader object.");
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderiv(program, GL_SHADER_TYPE, &param[0]);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_OPERATION);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glDeleteShader(shader);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glDeleteProgram(program);
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		});
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ES2F_ADD_API_CASE(get_shader_info_log, "Invalid glGetShaderInfoLog() usage",
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLuint shader	= glCreateShader(GL_VERTEX_SHADER);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLuint program	= glCreateProgram();
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLsizei length[1] = { -1 };
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			char infoLog[128];
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			deMemset(&infoLog[0], 0, sizeof(infoLog));
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderInfoLog(-1, 128, &length[0], &infoLog[0]);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_VALUE);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderInfoLog(program, 128, &length[0], &infoLog[0]);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_OPERATION);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if maxLength is less than 0.");
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderInfoLog(shader, -1, &length[0], &infoLog[0]);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(GL_INVALID_VALUE);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glDeleteShader(shader);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glDeleteProgram(program);
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		});
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ES2F_ADD_API_CASE(get_shader_precision_format, "Invalid glGetShaderPrecisionFormat() usage",
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLboolean shaderCompilerSupported;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (!shaderCompilerSupported)
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				m_log << TestLog::Message << "// Shader compiler not supported, always expect GL_INVALID_OPERATION" << TestLog::EndMessage;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				m_log << TestLog::Message << "// Shader compiler supported" << TestLog::EndMessage;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLint range[2];
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			range[0] = -1;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			range[1] = -1;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLint precision[1] = { -1 };
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if shaderType or precisionType is not an accepted value.");
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderPrecisionFormat (-1, GL_MEDIUM_FLOAT, &range[0], &precision[0]);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(shaderCompilerSupported ? GL_INVALID_ENUM : GL_INVALID_OPERATION);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderPrecisionFormat (GL_VERTEX_SHADER, -1, &range[0], &precision[0]);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(shaderCompilerSupported ? GL_INVALID_ENUM : GL_INVALID_OPERATION);
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			glGetShaderPrecisionFormat (-1, -1, &range[0], &precision[0]);
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			expectError(shaderCompilerSupported ? GL_INVALID_ENUM : GL_INVALID_OPERATION);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			m_log << TestLog::EndSection;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			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)
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			GLint params[1] = { -1 };
506			GLuint fbo;
507			glGenFramebuffers(1, &fbo);
508			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
509
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, &params[0]);
512			expectError(GL_INVALID_ENUM);
513			m_log << TestLog::EndSection;
514
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, &params[0]);
517			expectError(GL_INVALID_ENUM);
518			m_log << TestLog::EndSection;
519
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);
524
525			if (attachmentObjectType == GL_RENDERBUFFER)
526				glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &params[0]);
527			else if (attachmentObjectType == GL_TEXTURE)
528				glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, &params[0]);
529			else if (attachmentObjectType == GL_NONE)
530				glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);
531			else
532				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid return value from glGetFramebufferAttachmentParameteriv()");
533
534			expectError(GL_INVALID_ENUM);
535			m_log << TestLog::EndSection;
536
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, &params[0]);
540			expectError(GL_INVALID_OPERATION);
541			m_log << TestLog::EndSection;
542
543			glDeleteFramebuffers(1, &fbo);
544		});
545	ES2F_ADD_API_CASE(get_renderbuffer_parameteriv, "Invalid glGetRenderbufferParameteriv() usage",
546		{
547			GLint params[1];
548			GLuint rbo;
549			glGenRenderbuffers(1, &rbo);
550			glBindRenderbuffer(GL_RENDERBUFFER, rbo);
551
552			deMemset(&params[0], 0, sizeof(params));
553
554			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
555			glGetRenderbufferParameteriv(-1, GL_RENDERBUFFER_WIDTH, &params[0]);
556			expectError(GL_INVALID_ENUM);
557			m_log << TestLog::EndSection;
558
559			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
560			glGetRenderbufferParameteriv(GL_RENDERBUFFER, -1, &params[0]);
561			expectError(GL_INVALID_ENUM);
562			m_log << TestLog::EndSection;
563
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, &params[0]);
567			expectError(GL_INVALID_OPERATION);
568			m_log << TestLog::EndSection;
569
570			glDeleteRenderbuffers(1, &rbo);
571		});
572
573	// Enumerated boolean state queries
574
575	ES2F_ADD_API_CASE(get_is_enabled, "Invalid glIsEnabled() usage",
576		{
577			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not an accepted value.");
578			glIsEnabled(-1);
579			expectError(GL_INVALID_ENUM);
580			glIsEnabled(GL_TRIANGLES);
581			expectError(GL_INVALID_ENUM);
582			m_log << TestLog::EndSection;
583		});
584
585	// Hints
586
587	ES2F_ADD_API_CASE(hint, "Invalid glHint() usage",
588		{
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);
594			glHint(-1, -1);
595			expectError(GL_INVALID_ENUM);
596			m_log << TestLog::EndSection;
597		});
598
599	// Named object usage
600
601	ES2F_ADD_API_CASE(is_buffer, "Invalid glIsBuffer() usage",
602		{
603			GLuint		buffer = 0;
604			GLboolean	isBuffer;
605
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);
609
610			glGenBuffers	(1, &buffer);
611			isBuffer		= glIsBuffer(buffer);
612			checkBooleans	(isBuffer, GL_FALSE);
613
614			glBindBuffer	(GL_ARRAY_BUFFER, buffer);
615			isBuffer		= glIsBuffer(buffer);
616			checkBooleans	(isBuffer, GL_TRUE);
617
618			glBindBuffer	(GL_ARRAY_BUFFER, 0);
619			glDeleteBuffers	(1, &buffer);
620			isBuffer		= glIsBuffer(buffer);
621			checkBooleans	(isBuffer, GL_FALSE);
622			m_log << TestLog::EndSection;
623
624			expectError			(GL_NO_ERROR);
625		});
626	ES2F_ADD_API_CASE(is_framebuffer, "Invalid glIsFramebuffer() usage",
627		{
628			GLuint		fbo = 0;
629			GLboolean	isFbo;
630
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);
634
635			glGenFramebuffers	(1, &fbo);
636			isFbo				= glIsFramebuffer(fbo);
637			checkBooleans		(isFbo, GL_FALSE);
638
639			glBindFramebuffer	(GL_FRAMEBUFFER, fbo);
640			isFbo				= glIsFramebuffer(fbo);
641			checkBooleans		(isFbo, GL_TRUE);
642
643			glBindFramebuffer	(GL_FRAMEBUFFER, 0);
644			glDeleteFramebuffers(1, &fbo);
645			isFbo				= glIsFramebuffer(fbo);
646			checkBooleans		(isFbo, GL_FALSE);
647			m_log << TestLog::EndSection;
648
649			expectError			(GL_NO_ERROR);
650		});
651	ES2F_ADD_API_CASE(is_program, "Invalid glIsProgram() usage",
652		{
653			GLuint		program = 0;
654			GLboolean	isProgram;
655
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);
659
660			program				= glCreateProgram();
661			isProgram			= glIsProgram(program);
662			checkBooleans		(isProgram, GL_TRUE);
663
664			glDeleteProgram		(program);
665			isProgram			= glIsProgram(program);
666			checkBooleans		(isProgram, GL_FALSE);
667			m_log << TestLog::EndSection;
668
669			expectError			(GL_NO_ERROR);
670		});
671	ES2F_ADD_API_CASE(is_renderbuffer, "Invalid glIsRenderbuffer() usage",
672		{
673			GLuint		rbo = 0;
674			GLboolean	isRbo;
675
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);
679
680			glGenRenderbuffers		(1, &rbo);
681			isRbo					= glIsRenderbuffer(rbo);
682			checkBooleans			(isRbo, GL_FALSE);
683
684			glBindRenderbuffer		(GL_RENDERBUFFER, rbo);
685			isRbo					= glIsRenderbuffer(rbo);
686			checkBooleans			(isRbo, GL_TRUE);
687
688			glBindRenderbuffer		(GL_RENDERBUFFER, 0);
689			glDeleteRenderbuffers	(1, &rbo);
690			isRbo					= glIsRenderbuffer(rbo);
691			checkBooleans			(isRbo, GL_FALSE);
692			m_log << TestLog::EndSection;
693
694			expectError			(GL_NO_ERROR);
695		});
696	ES2F_ADD_API_CASE(is_shader, "Invalid glIsShader() usage",
697		{
698			GLuint		shader = 0;
699			GLboolean	isShader;
700
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);
704
705			shader				= glCreateShader(GL_VERTEX_SHADER);
706			isShader			= glIsShader(shader);
707			checkBooleans		(isShader, GL_TRUE);
708
709			glDeleteShader		(shader);
710			isShader			= glIsShader(shader);
711			checkBooleans		(isShader, GL_FALSE);
712			m_log << TestLog::EndSection;
713
714			expectError			(GL_NO_ERROR);
715		});
716	ES2F_ADD_API_CASE(is_texture, "Invalid glIsTexture() usage",
717		{
718			GLuint		texture = 0;
719			GLboolean	isTexture;
720
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);
724
725			glGenTextures		(1, &texture);
726			isTexture			= glIsTexture(texture);
727			checkBooleans		(isTexture, GL_FALSE);
728
729			glBindTexture		(GL_TEXTURE_2D, texture);
730			isTexture			= glIsTexture(texture);
731			checkBooleans		(isTexture, GL_TRUE);
732
733			glBindTexture		(GL_TEXTURE_2D, 0);
734			glDeleteTextures	(1, &texture);
735			isTexture			= glIsTexture(texture);
736			checkBooleans		(isTexture, GL_FALSE);
737			m_log << TestLog::EndSection;
738
739			expectError			(GL_NO_ERROR);
740		});
741}
742
743} // Functional
744} // gles2
745} // deqp
746