You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
770 lines
29 KiB
770 lines
29 KiB
/*-------------------------------------------------------------------------
|
|
* drawElements Quality Program OpenGL ES 2.0 Module
|
|
* -------------------------------------------------
|
|
*
|
|
* Copyright 2014 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*//*!
|
|
* \file
|
|
* \brief Negative GL State API tests.
|
|
*//*--------------------------------------------------------------------*/
|
|
|
|
#include "es2fNegativeStateApiTests.hpp"
|
|
#include "es2fApiCase.hpp"
|
|
#include "gluShaderProgram.hpp"
|
|
#include "deMemory.h"
|
|
|
|
#include "glwEnums.hpp"
|
|
#include "glwDefs.hpp"
|
|
|
|
using namespace glw; // GL types
|
|
|
|
namespace deqp
|
|
{
|
|
namespace gles2
|
|
{
|
|
namespace Functional
|
|
{
|
|
|
|
using tcu::TestLog;
|
|
|
|
static const char* uniformTestVertSource = "uniform mediump vec4 vTest;\n"
|
|
"void main (void)\n"
|
|
"{\n"
|
|
" gl_Position = vTest;\n"
|
|
"}\n\0";
|
|
static const char* uniformTestFragSource = "uniform mediump ivec4 fTest;\n"
|
|
"void main (void)\n"
|
|
"{\n"
|
|
" gl_FragColor = vec4(fTest);\n"
|
|
"}\n\0";
|
|
|
|
NegativeStateApiTests::NegativeStateApiTests (Context& context)
|
|
: TestCaseGroup(context, "state", "Negative GL State API Cases")
|
|
{
|
|
}
|
|
|
|
NegativeStateApiTests::~NegativeStateApiTests (void)
|
|
{
|
|
}
|
|
|
|
void NegativeStateApiTests::init (void)
|
|
{
|
|
// Enabling & disabling states
|
|
|
|
ES2F_ADD_API_CASE(enable, "Invalid glEnable() usage",
|
|
{
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
|
|
glEnable(-1);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
ES2F_ADD_API_CASE(disable, "Invalid glDisable() usage",
|
|
{
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
|
|
glDisable(-1);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
|
|
// Simple state queries
|
|
|
|
ES2F_ADD_API_CASE(get_booleanv, "Invalid glGetBooleanv() usage",
|
|
{
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
|
|
GLboolean params[1] = { GL_FALSE };
|
|
glGetBooleanv(-1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
ES2F_ADD_API_CASE(get_floatv, "Invalid glGetFloatv() usage",
|
|
{
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
|
|
GLfloat params[1] = { 0.0f };
|
|
glGetFloatv(-1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
ES2F_ADD_API_CASE(get_integerv, "Invalid glGetIntegerv() usage",
|
|
{
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
|
|
GLint params[1] = { 0 };
|
|
glGetIntegerv(-1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
ES2F_ADD_API_CASE(get_string, "Invalid glGetString() usage",
|
|
{
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if name is not an accepted value.");
|
|
glGetString(0);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
|
|
// Enumerated state queries: Shaders
|
|
|
|
ES2F_ADD_API_CASE(get_attached_shaders, "Invalid glGetAttachedShaders() usage",
|
|
{
|
|
GLuint shaders[1] = { 0 };
|
|
GLuint shaderObject = glCreateShader(GL_VERTEX_SHADER);
|
|
GLuint program = glCreateProgram();
|
|
GLsizei count[1] = { -1 };
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
|
|
glGetAttachedShaders(-1, 1, &count[0], &shaders[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
|
|
glGetAttachedShaders(shaderObject, 1, &count[0], &shaders[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if maxCount is less than 0.");
|
|
glGetAttachedShaders(program, -1, &count[0], &shaders[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteShader(shaderObject);
|
|
glDeleteProgram(program);
|
|
});
|
|
ES2F_ADD_API_CASE(get_shaderiv, "Invalid glGetShaderiv() usage",
|
|
{
|
|
GLboolean shaderCompilerSupported;
|
|
glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
|
|
if (!shaderCompilerSupported)
|
|
m_log << TestLog::Message << "// Shader compiler not supported, always expect GL_INVALID_OPERATION" << TestLog::EndMessage;
|
|
else
|
|
m_log << TestLog::Message << "// Shader compiler supported" << TestLog::EndMessage;
|
|
|
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER);
|
|
GLuint program = glCreateProgram();
|
|
GLint param[1] = { -1 };
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
|
|
glGetShaderiv(shader, -1, ¶m[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
|
|
glGetShaderiv(-1, GL_SHADER_TYPE, ¶m[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
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.");
|
|
glGetShaderiv(shader, GL_COMPILE_STATUS, ¶m[0]);
|
|
expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
|
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, ¶m[0]);
|
|
expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
|
|
glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, ¶m[0]);
|
|
expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader does not refer to a shader object.");
|
|
glGetShaderiv(program, GL_SHADER_TYPE, ¶m[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteShader(shader);
|
|
glDeleteProgram(program);
|
|
});
|
|
ES2F_ADD_API_CASE(get_shader_info_log, "Invalid glGetShaderInfoLog() usage",
|
|
{
|
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER);
|
|
GLuint program = glCreateProgram();
|
|
GLsizei length[1] = { -1 };
|
|
char infoLog[128];
|
|
|
|
deMemset(&infoLog[0], 0, sizeof(infoLog));
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
|
|
glGetShaderInfoLog(-1, 128, &length[0], &infoLog[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
|
|
glGetShaderInfoLog(program, 128, &length[0], &infoLog[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if maxLength is less than 0.");
|
|
glGetShaderInfoLog(shader, -1, &length[0], &infoLog[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteShader(shader);
|
|
glDeleteProgram(program);
|
|
});
|
|
ES2F_ADD_API_CASE(get_shader_precision_format, "Invalid glGetShaderPrecisionFormat() usage",
|
|
{
|
|
GLboolean shaderCompilerSupported;
|
|
glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
|
|
if (!shaderCompilerSupported)
|
|
m_log << TestLog::Message << "// Shader compiler not supported, always expect GL_INVALID_OPERATION" << TestLog::EndMessage;
|
|
else
|
|
m_log << TestLog::Message << "// Shader compiler supported" << TestLog::EndMessage;
|
|
|
|
GLint range[2];
|
|
range[0] = -1;
|
|
range[1] = -1;
|
|
GLint precision[1] = { -1 };
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if shaderType or precisionType is not an accepted value.");
|
|
glGetShaderPrecisionFormat (-1, GL_MEDIUM_FLOAT, &range[0], &precision[0]);
|
|
expectError(shaderCompilerSupported ? GL_INVALID_ENUM : GL_INVALID_OPERATION);
|
|
glGetShaderPrecisionFormat (GL_VERTEX_SHADER, -1, &range[0], &precision[0]);
|
|
expectError(shaderCompilerSupported ? GL_INVALID_ENUM : GL_INVALID_OPERATION);
|
|
glGetShaderPrecisionFormat (-1, -1, &range[0], &precision[0]);
|
|
expectError(shaderCompilerSupported ? GL_INVALID_ENUM : GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a shader compiler is not supported.");
|
|
glGetShaderPrecisionFormat (GL_VERTEX_SHADER, GL_MEDIUM_FLOAT, &range[0], &precision[0]);
|
|
expectError(shaderCompilerSupported ? GL_NO_ERROR : GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
ES2F_ADD_API_CASE(get_shader_source, "Invalid glGetShaderSource() usage",
|
|
{
|
|
GLsizei length[1] = { -1 };
|
|
char source[1] = { 0 };
|
|
GLuint program = glCreateProgram();
|
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER);
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
|
|
glGetShaderSource(-1, 1, &length[0], &source[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
|
|
glGetShaderSource(program, 1, &length[0], &source[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if bufSize is less than 0.");
|
|
glGetShaderSource(shader, -1, &length[0], &source[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteProgram(program);
|
|
glDeleteShader(shader);
|
|
});
|
|
|
|
// Enumerated state queries: Programs
|
|
|
|
ES2F_ADD_API_CASE(get_programiv, "Invalid glGetProgramiv() usage",
|
|
{
|
|
GLuint program = glCreateProgram();
|
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER);
|
|
GLint params[1] = { -1 };
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
|
|
glGetProgramiv(program, -1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
|
|
glGetProgramiv(-1, GL_LINK_STATUS, ¶ms[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program does not refer to a program object.");
|
|
glGetProgramiv(shader, GL_LINK_STATUS, ¶ms[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteProgram(program);
|
|
glDeleteShader(shader);
|
|
});
|
|
ES2F_ADD_API_CASE(get_program_info_log, "Invalid glGetProgramInfoLog() usage",
|
|
{
|
|
GLuint program = glCreateProgram();
|
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER);
|
|
GLsizei length[1] = { -1 };
|
|
char infoLog[1] = { 0 };
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
|
|
glGetProgramInfoLog (-1, 1, &length[0], &infoLog[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
|
|
glGetProgramInfoLog (shader, 1, &length[0], &infoLog[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if maxLength is less than 0.");
|
|
glGetProgramInfoLog (program, -1, &length[0], &infoLog[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteProgram(program);
|
|
glDeleteShader(shader);
|
|
});
|
|
|
|
// Enumerated state queries: Shader variables
|
|
|
|
ES2F_ADD_API_CASE(get_tex_parameterfv, "Invalid glGetTexParameterfv() usage",
|
|
{
|
|
GLfloat params[1] = { 0.0f };
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
|
|
glGetTexParameterfv (-1, GL_TEXTURE_MAG_FILTER, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
glGetTexParameterfv (GL_TEXTURE_2D, -1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
glGetTexParameterfv (-1, -1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
ES2F_ADD_API_CASE(get_tex_parameteriv, "Invalid glGetTexParameteriv() usage",
|
|
{
|
|
GLint params[1] = { -1 };
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
|
|
glGetTexParameteriv (-1, GL_TEXTURE_MAG_FILTER, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
glGetTexParameteriv (GL_TEXTURE_2D, -1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
glGetTexParameteriv (-1, -1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
ES2F_ADD_API_CASE(get_uniformfv, "Invalid glGetUniformfv() usage",
|
|
{
|
|
glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
|
|
glUseProgram(program.getProgram());
|
|
|
|
GLint vUnif = glGetUniformLocation(program.getProgram(), "vTest"); // vec4
|
|
GLint fUnif = glGetUniformLocation(program.getProgram(), "fTest"); // ivec4
|
|
if (vUnif == -1 || fUnif == -1)
|
|
m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
|
|
|
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER);
|
|
GLuint programEmpty = glCreateProgram();
|
|
GLfloat params[4];
|
|
|
|
deMemset(¶ms[0], 0, sizeof(params));
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
|
|
glGetUniformfv (-1, vUnif, ¶ms[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
|
|
glGetUniformfv (shader, vUnif, ¶ms[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been successfully linked.");
|
|
glGetUniformfv (programEmpty, vUnif, ¶ms[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
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.");
|
|
glGetUniformfv (program.getProgram(), de::max(vUnif, fUnif)+1, ¶ms[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteShader(shader);
|
|
glDeleteProgram(programEmpty);
|
|
});
|
|
ES2F_ADD_API_CASE(get_uniformiv, "Invalid glGetUniformiv() usage",
|
|
{
|
|
glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
|
|
glUseProgram(program.getProgram());
|
|
|
|
GLint vUnif = glGetUniformLocation(program.getProgram(), "vTest"); // vec4
|
|
GLint fUnif = glGetUniformLocation(program.getProgram(), "fTest"); // ivec4
|
|
if (vUnif == -1 || fUnif == -1)
|
|
m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
|
|
|
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER);
|
|
GLuint programEmpty = glCreateProgram();
|
|
GLint params[4];
|
|
|
|
deMemset(¶ms[0], 0, sizeof(params));
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
|
|
glGetUniformiv (-1, vUnif, ¶ms[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
|
|
glGetUniformiv (shader, vUnif, ¶ms[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been successfully linked.");
|
|
glGetUniformiv (programEmpty, vUnif, ¶ms[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
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.");
|
|
glGetUniformiv (program.getProgram(), de::max(vUnif, fUnif)+1, ¶ms[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteShader(shader);
|
|
glDeleteProgram(programEmpty);
|
|
});
|
|
ES2F_ADD_API_CASE(get_vertex_attribfv, "Invalid glGetVertexAttribfv() usage",
|
|
{
|
|
GLfloat params[1];
|
|
|
|
deMemset(¶ms[0], 0, sizeof(params));
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
|
|
glGetVertexAttribfv(0, -1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
|
|
GLint maxVertexAttribs;
|
|
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
|
|
glGetVertexAttribfv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, ¶ms[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
ES2F_ADD_API_CASE(get_vertex_attribiv, "Invalid glGetVertexAttribiv() usage",
|
|
{
|
|
GLint params[1];
|
|
|
|
deMemset(¶ms[0], 0, sizeof(params));
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
|
|
glGetVertexAttribiv(0, -1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
|
|
GLint maxVertexAttribs;
|
|
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
|
|
glGetVertexAttribiv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, ¶ms[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
ES2F_ADD_API_CASE(get_vertex_attrib_pointerv, "Invalid glGetVertexAttribPointerv() usage",
|
|
{
|
|
GLvoid* ptr[1] = { DE_NULL };
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
|
|
glGetVertexAttribPointerv(0, -1, &ptr[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
|
|
GLint maxVertexAttribs;
|
|
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
|
|
glGetVertexAttribPointerv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_POINTER, &ptr[0]);
|
|
expectError(GL_INVALID_VALUE);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
|
|
// Enumerated state queries: Buffers
|
|
|
|
ES2F_ADD_API_CASE(get_buffer_parameteriv, "Invalid glGetBufferParameteriv() usage",
|
|
{
|
|
GLint params[1];
|
|
GLuint buf;
|
|
glGenBuffers(1, &buf);
|
|
glBindBuffer(GL_ARRAY_BUFFER, buf);
|
|
|
|
deMemset(¶ms[0], 0, sizeof(params));
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or value is not an accepted value.");
|
|
glGetBufferParameteriv(-1, GL_BUFFER_SIZE, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
glGetBufferParameteriv(GL_ARRAY_BUFFER , -1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
glGetBufferParameteriv(-1, -1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
|
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, ¶ms[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteBuffers(1, &buf);
|
|
});
|
|
ES2F_ADD_API_CASE(get_framebuffer_attachment_parameteriv, "Invalid glGetFramebufferAttachmentParameteriv() usage",
|
|
{
|
|
// GL_MAJOR_VERSION query does not exist on GLES2
|
|
// so succeeding query implies GLES3+ hardware.
|
|
bool isES3Compatible = false;
|
|
glw::GLint majorVersion = 0;
|
|
glGetIntegerv(GL_MAJOR_VERSION, &majorVersion);
|
|
if (glGetError() == GL_NO_ERROR)
|
|
isES3Compatible = true;
|
|
|
|
GLint params[1] = { -1 };
|
|
GLuint fbo;
|
|
glGenFramebuffers(1, &fbo);
|
|
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER.");
|
|
glGetFramebufferAttachmentParameteriv(-1, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
|
|
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.");
|
|
if (isES3Compatible)
|
|
{
|
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms[0]); // TYPE is GL_NONE
|
|
expectError(GL_NO_ERROR);
|
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, ¶ms[0]); // TYPE is GL_NONE
|
|
expectError(GL_INVALID_OPERATION);
|
|
}
|
|
else
|
|
{
|
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
}
|
|
m_log << TestLog::EndSection;
|
|
|
|
if (!isES3Compatible)
|
|
{
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if the attached object at the named attachment point is incompatible with pname.");
|
|
GLint attachmentObjectType = -1;
|
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &attachmentObjectType);
|
|
expectError(GL_NO_ERROR);
|
|
|
|
if (attachmentObjectType == GL_RENDERBUFFER)
|
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, ¶ms[0]);
|
|
else if (attachmentObjectType == GL_TEXTURE)
|
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, ¶ms[0]);
|
|
else if (attachmentObjectType == GL_NONE)
|
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms[0]);
|
|
else
|
|
m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid return value from glGetFramebufferAttachmentParameteriv()");
|
|
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
}
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the default framebuffer object name 0 is bound.");
|
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, ¶ms[0]);
|
|
if (isES3Compatible)
|
|
expectError(GL_INVALID_OPERATION, GL_INVALID_ENUM);
|
|
else
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteFramebuffers(1, &fbo);
|
|
});
|
|
ES2F_ADD_API_CASE(get_renderbuffer_parameteriv, "Invalid glGetRenderbufferParameteriv() usage",
|
|
{
|
|
GLint params[1];
|
|
GLuint rbo;
|
|
glGenRenderbuffers(1, &rbo);
|
|
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
|
|
|
|
deMemset(¶ms[0], 0, sizeof(params));
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
|
|
glGetRenderbufferParameteriv(-1, GL_RENDERBUFFER_WIDTH, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
|
|
glGetRenderbufferParameteriv(GL_RENDERBUFFER, -1, ¶ms[0]);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the reserved renderbuffer object name 0 is bound.");
|
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
|
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, ¶ms[0]);
|
|
expectError(GL_INVALID_OPERATION);
|
|
m_log << TestLog::EndSection;
|
|
|
|
glDeleteRenderbuffers(1, &rbo);
|
|
});
|
|
|
|
// Enumerated boolean state queries
|
|
|
|
ES2F_ADD_API_CASE(get_is_enabled, "Invalid glIsEnabled() usage",
|
|
{
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if cap is not an accepted value.");
|
|
glIsEnabled(-1);
|
|
expectError(GL_INVALID_ENUM);
|
|
glIsEnabled(GL_TRIANGLES);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
|
|
// Hints
|
|
|
|
ES2F_ADD_API_CASE(hint, "Invalid glHint() usage",
|
|
{
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if either target or mode is not an accepted value.");
|
|
glHint(GL_GENERATE_MIPMAP_HINT, -1);
|
|
expectError(GL_INVALID_ENUM);
|
|
glHint(-1, GL_FASTEST);
|
|
expectError(GL_INVALID_ENUM);
|
|
glHint(-1, -1);
|
|
expectError(GL_INVALID_ENUM);
|
|
m_log << TestLog::EndSection;
|
|
});
|
|
|
|
// Named object usage
|
|
|
|
ES2F_ADD_API_CASE(is_buffer, "Invalid glIsBuffer() usage",
|
|
{
|
|
GLuint buffer = 0;
|
|
GLboolean isBuffer;
|
|
|
|
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.");
|
|
isBuffer = glIsBuffer(buffer);
|
|
checkBooleans (isBuffer, GL_FALSE);
|
|
|
|
glGenBuffers (1, &buffer);
|
|
isBuffer = glIsBuffer(buffer);
|
|
checkBooleans (isBuffer, GL_FALSE);
|
|
|
|
glBindBuffer (GL_ARRAY_BUFFER, buffer);
|
|
isBuffer = glIsBuffer(buffer);
|
|
checkBooleans (isBuffer, GL_TRUE);
|
|
|
|
glBindBuffer (GL_ARRAY_BUFFER, 0);
|
|
glDeleteBuffers (1, &buffer);
|
|
isBuffer = glIsBuffer(buffer);
|
|
checkBooleans (isBuffer, GL_FALSE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
expectError (GL_NO_ERROR);
|
|
});
|
|
ES2F_ADD_API_CASE(is_framebuffer, "Invalid glIsFramebuffer() usage",
|
|
{
|
|
GLuint fbo = 0;
|
|
GLboolean isFbo;
|
|
|
|
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.");
|
|
isFbo = glIsFramebuffer(fbo);
|
|
checkBooleans (isFbo, GL_FALSE);
|
|
|
|
glGenFramebuffers (1, &fbo);
|
|
isFbo = glIsFramebuffer(fbo);
|
|
checkBooleans (isFbo, GL_FALSE);
|
|
|
|
glBindFramebuffer (GL_FRAMEBUFFER, fbo);
|
|
isFbo = glIsFramebuffer(fbo);
|
|
checkBooleans (isFbo, GL_TRUE);
|
|
|
|
glBindFramebuffer (GL_FRAMEBUFFER, 0);
|
|
glDeleteFramebuffers(1, &fbo);
|
|
isFbo = glIsFramebuffer(fbo);
|
|
checkBooleans (isFbo, GL_FALSE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
expectError (GL_NO_ERROR);
|
|
});
|
|
ES2F_ADD_API_CASE(is_program, "Invalid glIsProgram() usage",
|
|
{
|
|
GLuint program = 0;
|
|
GLboolean isProgram;
|
|
|
|
m_log << TestLog::Section("", "A name created with glCreateProgram, and not yet deleted with glDeleteProgram is a name of a program object.");
|
|
isProgram = glIsProgram(program);
|
|
checkBooleans (isProgram, GL_FALSE);
|
|
|
|
program = glCreateProgram();
|
|
isProgram = glIsProgram(program);
|
|
checkBooleans (isProgram, GL_TRUE);
|
|
|
|
glDeleteProgram (program);
|
|
isProgram = glIsProgram(program);
|
|
checkBooleans (isProgram, GL_FALSE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
expectError (GL_NO_ERROR);
|
|
});
|
|
ES2F_ADD_API_CASE(is_renderbuffer, "Invalid glIsRenderbuffer() usage",
|
|
{
|
|
GLuint rbo = 0;
|
|
GLboolean isRbo;
|
|
|
|
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.");
|
|
isRbo = glIsRenderbuffer(rbo);
|
|
checkBooleans (isRbo, GL_FALSE);
|
|
|
|
glGenRenderbuffers (1, &rbo);
|
|
isRbo = glIsRenderbuffer(rbo);
|
|
checkBooleans (isRbo, GL_FALSE);
|
|
|
|
glBindRenderbuffer (GL_RENDERBUFFER, rbo);
|
|
isRbo = glIsRenderbuffer(rbo);
|
|
checkBooleans (isRbo, GL_TRUE);
|
|
|
|
glBindRenderbuffer (GL_RENDERBUFFER, 0);
|
|
glDeleteRenderbuffers (1, &rbo);
|
|
isRbo = glIsRenderbuffer(rbo);
|
|
checkBooleans (isRbo, GL_FALSE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
expectError (GL_NO_ERROR);
|
|
});
|
|
ES2F_ADD_API_CASE(is_shader, "Invalid glIsShader() usage",
|
|
{
|
|
GLuint shader = 0;
|
|
GLboolean isShader;
|
|
|
|
m_log << TestLog::Section("", "A name created with glCreateShader, and not yet deleted with glDeleteShader is a name of a shader object.");
|
|
isShader = glIsProgram(shader);
|
|
checkBooleans (isShader, GL_FALSE);
|
|
|
|
shader = glCreateShader(GL_VERTEX_SHADER);
|
|
isShader = glIsShader(shader);
|
|
checkBooleans (isShader, GL_TRUE);
|
|
|
|
glDeleteShader (shader);
|
|
isShader = glIsShader(shader);
|
|
checkBooleans (isShader, GL_FALSE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
expectError (GL_NO_ERROR);
|
|
});
|
|
ES2F_ADD_API_CASE(is_texture, "Invalid glIsTexture() usage",
|
|
{
|
|
GLuint texture = 0;
|
|
GLboolean isTexture;
|
|
|
|
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.");
|
|
isTexture = glIsTexture(texture);
|
|
checkBooleans (isTexture, GL_FALSE);
|
|
|
|
glGenTextures (1, &texture);
|
|
isTexture = glIsTexture(texture);
|
|
checkBooleans (isTexture, GL_FALSE);
|
|
|
|
glBindTexture (GL_TEXTURE_2D, texture);
|
|
isTexture = glIsTexture(texture);
|
|
checkBooleans (isTexture, GL_TRUE);
|
|
|
|
glBindTexture (GL_TEXTURE_2D, 0);
|
|
glDeleteTextures (1, &texture);
|
|
isTexture = glIsTexture(texture);
|
|
checkBooleans (isTexture, GL_FALSE);
|
|
m_log << TestLog::EndSection;
|
|
|
|
expectError (GL_NO_ERROR);
|
|
});
|
|
}
|
|
|
|
} // Functional
|
|
} // gles2
|
|
} // deqp
|