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.
1336 lines
52 KiB
1336 lines
52 KiB
/*------------------------------------------------------------------------- |
|
* drawElements Quality Program OpenGL ES 3.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 "es3fNegativeStateApiTests.hpp" |
|
#include "es3fApiCase.hpp" |
|
#include "gluShaderProgram.hpp" |
|
#include "gluContextInfo.hpp" |
|
#include "deMemory.h" |
|
|
|
#include "glwDefs.hpp" |
|
#include "glwEnums.hpp" |
|
|
|
using namespace glw; // GL types |
|
|
|
namespace deqp |
|
{ |
|
namespace gles3 |
|
{ |
|
namespace Functional |
|
{ |
|
|
|
using tcu::TestLog; |
|
|
|
static const char* uniformTestVertSource = "#version 300 es\n" |
|
"uniform mediump vec4 vUnif_vec4;\n" |
|
"in mediump vec4 attr;" |
|
"layout(shared) uniform Block { mediump vec4 blockVar; };\n" |
|
"void main (void)\n" |
|
"{\n" |
|
" gl_Position = vUnif_vec4 + blockVar + attr;\n" |
|
"}\n\0"; |
|
static const char* uniformTestFragSource = "#version 300 es\n" |
|
"uniform mediump ivec4 fUnif_ivec4;\n" |
|
"uniform mediump uvec4 fUnif_uvec4;\n" |
|
"layout(location = 0) out mediump vec4 fragColor;" |
|
"void main (void)\n" |
|
"{\n" |
|
" fragColor = vec4(vec4(fUnif_ivec4) + vec4(fUnif_uvec4));\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 |
|
|
|
ES3F_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; |
|
}); |
|
ES3F_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 |
|
|
|
ES3F_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 = GL_FALSE; |
|
glGetBooleanv(-1, ¶ms); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_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 = 0.0f; |
|
glGetFloatv(-1, ¶ms); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_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; |
|
glGetIntegerv(-1, ¶ms); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_ADD_API_CASE(get_integer64v, "Invalid glGetInteger64v() usage", |
|
{ |
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the allowed values."); |
|
GLint64 params = -1; |
|
glGetInteger64v(-1, ¶ms); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_ADD_API_CASE(get_integeri_v, "Invalid glGetIntegeri_v() usage", |
|
{ |
|
GLint data = -1; |
|
GLint maxUniformBufferBindings; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if name is not an accepted value."); |
|
glGetIntegeri_v(-1, 0, &data); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is outside of the valid range for the indexed state target."); |
|
glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings); |
|
expectError(GL_NO_ERROR); |
|
glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, maxUniformBufferBindings, &data); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_ADD_API_CASE(get_integer64i_v, "Invalid glGetInteger64i_v() usage", |
|
{ |
|
GLint64 data = (GLint64)-1;; |
|
GLint maxUniformBufferBindings; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if name is not an accepted value."); |
|
glGetInteger64i_v(-1, 0, &data); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is outside of the valid range for the indexed state target."); |
|
glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings); |
|
expectError(GL_NO_ERROR); |
|
glGetInteger64i_v(GL_UNIFORM_BUFFER_START, maxUniformBufferBindings, &data); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_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(-1); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_ADD_API_CASE(get_stringi, "Invalid glGetStringi() usage", |
|
{ |
|
GLint numExtensions; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if name is not an accepted value."); |
|
glGetStringi(-1, 0); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is outside the valid range for indexed state name."); |
|
glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); |
|
glGetStringi(GL_EXTENSIONS, numExtensions); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
}); |
|
|
|
// Enumerated state queries: Shaders |
|
|
|
ES3F_ADD_API_CASE(get_attached_shaders, "Invalid glGetAttachedShaders() usage", |
|
{ |
|
GLuint shaders[1]; |
|
GLuint shaderObject = glCreateShader(GL_VERTEX_SHADER); |
|
GLuint program = glCreateProgram(); |
|
GLsizei count[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); |
|
}); |
|
ES3F_ADD_API_CASE(get_shaderiv, "Invalid glGetShaderiv() usage", |
|
{ |
|
GLboolean shaderCompilerSupported; |
|
glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported); |
|
m_log << TestLog::Message << "// GL_SHADER_COMPILER = " << (shaderCompilerSupported ? "GL_TRUE" : "GL_FALSE") << 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 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); |
|
}); |
|
ES3F_ADD_API_CASE(get_shader_info_log, "Invalid glGetShaderInfoLog() usage", |
|
{ |
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER); |
|
GLuint program = glCreateProgram(); |
|
GLsizei length[1] = { 0 }; |
|
char infoLog[128] = { 0 }; |
|
|
|
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); |
|
}); |
|
ES3F_ADD_API_CASE(get_shader_precision_format, "Invalid glGetShaderPrecisionFormat() usage", |
|
{ |
|
GLboolean shaderCompilerSupported; |
|
glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported); |
|
m_log << TestLog::Message << "// GL_SHADER_COMPILER = " << (shaderCompilerSupported ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage; |
|
|
|
GLint range[2]; |
|
GLint precision[1]; |
|
|
|
deMemset(&range[0], 0xcd, sizeof(range)); |
|
deMemset(&precision[0], 0xcd, sizeof(precision)); |
|
|
|
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(GL_INVALID_ENUM); |
|
glGetShaderPrecisionFormat (GL_VERTEX_SHADER, -1, &range[0], &precision[0]); |
|
expectError(GL_INVALID_ENUM); |
|
glGetShaderPrecisionFormat (-1, -1, &range[0], &precision[0]); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_ADD_API_CASE(get_shader_source, "Invalid glGetShaderSource() usage", |
|
{ |
|
GLsizei length[1] = { 0 }; |
|
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 |
|
|
|
ES3F_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); |
|
}); |
|
ES3F_ADD_API_CASE(get_program_info_log, "Invalid glGetProgramInfoLog() usage", |
|
{ |
|
GLuint program = glCreateProgram(); |
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER); |
|
GLsizei length[1] = { 0 }; |
|
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 |
|
|
|
ES3F_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; |
|
}); |
|
ES3F_ADD_API_CASE(get_tex_parameteriv, "Invalid glGetTexParameteriv() usage", |
|
{ |
|
GLint params[1] = { 0 }; |
|
|
|
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; |
|
}); |
|
ES3F_ADD_API_CASE(get_uniformfv, "Invalid glGetUniformfv() usage", |
|
{ |
|
glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource)); |
|
glUseProgram(program.getProgram()); |
|
|
|
GLint unif = glGetUniformLocation(program.getProgram(), "vUnif_vec4"); // vec4 |
|
if (unif == -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] = { 0.0f }; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL."); |
|
glGetUniformfv (-1, unif, ¶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, unif, ¶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, unif, ¶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(), -1, ¶ms[0]); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
glDeleteShader(shader); |
|
glDeleteProgram(programEmpty); |
|
}); |
|
ES3F_ADD_API_CASE(get_uniformiv, "Invalid glGetUniformiv() usage", |
|
{ |
|
glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource)); |
|
glUseProgram(program.getProgram()); |
|
|
|
GLint unif = glGetUniformLocation(program.getProgram(), "fUnif_ivec4"); // ivec4 |
|
if (unif == -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] = { 0 }; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL."); |
|
glGetUniformiv (-1, unif, ¶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, unif, ¶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, unif, ¶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(), -1, ¶ms[0]); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
glDeleteShader(shader); |
|
glDeleteProgram(programEmpty); |
|
}); |
|
ES3F_ADD_API_CASE(get_uniformuiv, "Invalid glGetUniformuiv() usage", |
|
{ |
|
glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource)); |
|
glUseProgram(program.getProgram()); |
|
|
|
GLint unif = glGetUniformLocation(program.getProgram(), "fUnif_uvec4"); // uvec4 |
|
if (unif == -1) |
|
m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location"); |
|
|
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER); |
|
GLuint programEmpty = glCreateProgram(); |
|
GLuint params[4] = { 0 }; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL."); |
|
glGetUniformuiv (-1, unif, ¶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."); |
|
glGetUniformuiv (shader, unif, ¶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."); |
|
glGetUniformuiv (programEmpty, unif, ¶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."); |
|
glGetUniformuiv (program.getProgram(), -1, ¶ms[0]); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
glDeleteShader(shader); |
|
glDeleteProgram(programEmpty); |
|
}); |
|
ES3F_ADD_API_CASE(get_active_uniform, "Invalid glGetActiveUniform() usage", |
|
{ |
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER); |
|
glu::ShaderProgram program (m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource)); |
|
GLint numActiveUniforms = -1; |
|
|
|
glGetProgramiv (program.getProgram(), GL_ACTIVE_UNIFORMS, &numActiveUniforms); |
|
m_log << TestLog::Message << "// GL_ACTIVE_UNIFORMS = " << numActiveUniforms << " (expected 4)." << TestLog::EndMessage; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL."); |
|
glGetActiveUniform(-1, 0, 0, 0, 0, 0, 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."); |
|
glGetActiveUniform(shader, 0, 0, 0, 0, 0, 0); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to the number of active uniform variables in program."); |
|
glUseProgram(program.getProgram()); |
|
glGetActiveUniform(program.getProgram(), numActiveUniforms, 0, 0, 0, 0, 0); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if bufSize is less than 0."); |
|
glGetActiveUniform(program.getProgram(), 0, -1, 0, 0, 0, 0); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
|
|
glUseProgram(0); |
|
glDeleteShader(shader); |
|
}); |
|
ES3F_ADD_API_CASE(get_active_uniformsiv, "Invalid glGetActiveUniformsiv() usage", |
|
{ |
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER); |
|
glu::ShaderProgram program (m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource)); |
|
GLuint dummyUniformIndex = 1; |
|
GLint dummyParamDst = -1; |
|
GLint numActiveUniforms = -1; |
|
|
|
glUseProgram(program.getProgram()); |
|
|
|
glGetProgramiv (program.getProgram(), GL_ACTIVE_UNIFORMS, &numActiveUniforms); |
|
m_log << TestLog::Message << "// GL_ACTIVE_UNIFORMS = " << numActiveUniforms << " (expected 4)." << TestLog::EndMessage; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL."); |
|
glGetActiveUniformsiv(-1, 1, &dummyUniformIndex, GL_UNIFORM_TYPE, &dummyParamDst); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object."); |
|
glGetActiveUniformsiv(shader, 1, &dummyUniformIndex, GL_UNIFORM_TYPE, &dummyParamDst); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if any value in uniformIndices is greater than or equal to the value of GL_ACTIVE_UNIFORMS for program."); |
|
for (int excess = 0; excess <= 2; excess++) |
|
{ |
|
std::vector<GLuint> invalidUniformIndices; |
|
invalidUniformIndices.push_back(1); |
|
invalidUniformIndices.push_back(numActiveUniforms-1+excess); |
|
invalidUniformIndices.push_back(1); |
|
|
|
std::vector<GLint> dummyParamsDst(invalidUniformIndices.size()); |
|
glGetActiveUniformsiv(program.getProgram(), (GLsizei)invalidUniformIndices.size(), &invalidUniformIndices[0], GL_UNIFORM_TYPE, &dummyParamsDst[0]); |
|
expectError(excess == 0 ? GL_NO_ERROR : GL_INVALID_VALUE); |
|
} |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted token."); |
|
glGetActiveUniformsiv(program.getProgram(), 1, &dummyUniformIndex, -1, &dummyParamDst); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
glUseProgram(0); |
|
glDeleteShader(shader); |
|
}); |
|
ES3F_ADD_API_CASE(get_active_uniform_blockiv, "Invalid glGetActiveUniformBlockiv() usage", |
|
{ |
|
glu::ShaderProgram program (m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource)); |
|
GLint params = -1; |
|
GLint numActiveBlocks = -1; |
|
|
|
glGetProgramiv (program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks); |
|
m_log << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << " (expected 1)." << TestLog::EndMessage; |
|
expectError (GL_NO_ERROR); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if uniformBlockIndex is greater than or equal to the value of GL_ACTIVE_UNIFORM_BLOCKS or is not the index of an active uniform block in program."); |
|
glUseProgram(program.getProgram()); |
|
expectError(GL_NO_ERROR); |
|
glGetActiveUniformBlockiv(program.getProgram(), numActiveBlocks, GL_UNIFORM_BLOCK_BINDING, ¶ms); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the accepted tokens."); |
|
glGetActiveUniformBlockiv(program.getProgram(), 0, -1, ¶ms); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
glUseProgram(0); |
|
}); |
|
ES3F_ADD_API_CASE(get_active_uniform_block_name, "Invalid glGetActiveUniformBlockName() usage", |
|
{ |
|
glu::ShaderProgram program (m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource)); |
|
GLsizei length = -1; |
|
GLint numActiveBlocks = -1; |
|
GLchar uniformBlockName[128]; |
|
|
|
deMemset(&uniformBlockName[0], 0, sizeof(uniformBlockName)); |
|
|
|
glGetProgramiv (program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks); |
|
m_log << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << " (expected 1)." << TestLog::EndMessage; |
|
expectError (GL_NO_ERROR); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if uniformBlockIndex is greater than or equal to the value of GL_ACTIVE_UNIFORM_BLOCKS or is not the index of an active uniform block in program."); |
|
glUseProgram(program.getProgram()); |
|
expectError(GL_NO_ERROR); |
|
glGetActiveUniformBlockName(program.getProgram(), numActiveBlocks, (int)sizeof(uniformBlockName), &length, &uniformBlockName[0]); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
|
|
glUseProgram(0); |
|
}); |
|
ES3F_ADD_API_CASE(get_active_attrib, "Invalid glGetActiveAttrib() usage", |
|
{ |
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER); |
|
glu::ShaderProgram program (m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource)); |
|
GLint numActiveAttributes = -1; |
|
|
|
GLsizei length = -1; |
|
GLint size = -1; |
|
GLenum type = -1; |
|
GLchar name[32]; |
|
|
|
deMemset(&name[0], 0, sizeof(name)); |
|
|
|
glGetProgramiv (program.getProgram(), GL_ACTIVE_ATTRIBUTES, &numActiveAttributes); |
|
m_log << TestLog::Message << "// GL_ACTIVE_ATTRIBUTES = " << numActiveAttributes << " (expected 1)." << TestLog::EndMessage; |
|
|
|
glUseProgram(program.getProgram()); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL."); |
|
glGetActiveAttrib(-1, 0, 32, &length, &size, &type, &name[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."); |
|
glGetActiveAttrib(shader, 0, 32, &length, &size, &type, &name[0]); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_ACTIVE_ATTRIBUTES."); |
|
glGetActiveAttrib(program.getProgram(), numActiveAttributes, (int)sizeof(name), &length, &size, &type, &name[0]); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if bufSize is less than 0."); |
|
glGetActiveAttrib(program.getProgram(), 0, -1, &length, &size, &type, &name[0]); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
|
|
glUseProgram(0); |
|
glDeleteShader(shader); |
|
}); |
|
ES3F_ADD_API_CASE(get_uniform_indices, "Invalid glGetUniformIndices() usage", |
|
{ |
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER); |
|
glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource)); |
|
GLint numActiveBlocks = -1; |
|
const GLchar* uniformName = "Block.blockVar"; |
|
GLuint uniformIndices = -1; |
|
|
|
glGetProgramiv (program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks); |
|
m_log << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << TestLog::EndMessage; |
|
expectError (GL_NO_ERROR); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is a name of shader object."); |
|
glGetUniformIndices(shader, 1, &uniformName, &uniformIndices); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not name of program or shader object."); |
|
GLuint invalid = -1; |
|
glGetUniformIndices(invalid, 1, &uniformName, &uniformIndices); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
|
|
glUseProgram(0); |
|
glDeleteShader(shader); |
|
}); |
|
ES3F_ADD_API_CASE(get_vertex_attribfv, "Invalid glGetVertexAttribfv() usage", |
|
{ |
|
GLfloat params = 0.0f; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value."); |
|
glGetVertexAttribfv(0, -1, ¶ms); |
|
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); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_ADD_API_CASE(get_vertex_attribiv, "Invalid glGetVertexAttribiv() usage", |
|
{ |
|
GLint params = -1; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value."); |
|
glGetVertexAttribiv(0, -1, ¶ms); |
|
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); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_ADD_API_CASE(get_vertex_attribi_iv, "Invalid glGetVertexAttribIiv() usage", |
|
{ |
|
GLint params = -1; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value."); |
|
glGetVertexAttribIiv(0, -1, ¶ms); |
|
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); |
|
glGetVertexAttribIiv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, ¶ms); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_ADD_API_CASE(get_vertex_attribi_uiv, "Invalid glGetVertexAttribIuiv() usage", |
|
{ |
|
GLuint params = (GLuint)-1; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value."); |
|
glGetVertexAttribIuiv(0, -1, ¶ms); |
|
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); |
|
glGetVertexAttribIuiv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, ¶ms); |
|
expectError(GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_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; |
|
}); |
|
ES3F_ADD_API_CASE(get_frag_data_location, "Invalid glGetFragDataLocation() usage", |
|
{ |
|
GLuint shader = glCreateShader(GL_VERTEX_SHADER); |
|
GLuint program = glCreateProgram(); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is the name of a shader object."); |
|
glGetFragDataLocation(shader, "gl_FragColor"); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been linked."); |
|
glGetFragDataLocation(program, "gl_FragColor"); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
glDeleteProgram(program); |
|
glDeleteShader(shader); |
|
}); |
|
|
|
// Enumerated state queries: Buffers |
|
|
|
ES3F_ADD_API_CASE(get_buffer_parameteriv, "Invalid glGetBufferParameteriv() usage", |
|
{ |
|
GLint params = -1; |
|
GLuint buf; |
|
glGenBuffers(1, &buf); |
|
glBindBuffer(GL_ARRAY_BUFFER, buf); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or value is not an accepted value."); |
|
glGetBufferParameteriv(-1, GL_BUFFER_SIZE, ¶ms); |
|
expectError(GL_INVALID_ENUM); |
|
glGetBufferParameteriv(GL_ARRAY_BUFFER, -1, ¶ms); |
|
expectError(GL_INVALID_ENUM); |
|
glGetBufferParameteriv(-1, -1, ¶ms); |
|
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); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
glDeleteBuffers(1, &buf); |
|
}); |
|
ES3F_ADD_API_CASE(get_buffer_parameteri64v, "Invalid glGetBufferParameteri64v() usage", |
|
{ |
|
GLint64 params = -1; |
|
GLuint buf; |
|
glGenBuffers(1, &buf); |
|
glBindBuffer(GL_ARRAY_BUFFER, buf); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or value is not an accepted value."); |
|
glGetBufferParameteri64v(-1, GL_BUFFER_SIZE, ¶ms); |
|
expectError(GL_INVALID_ENUM); |
|
glGetBufferParameteri64v(GL_ARRAY_BUFFER , -1, ¶ms); |
|
expectError(GL_INVALID_ENUM); |
|
glGetBufferParameteri64v(-1, -1, ¶ms); |
|
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); |
|
glGetBufferParameteri64v(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, ¶ms); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
glDeleteBuffers(1, &buf); |
|
}); |
|
ES3F_ADD_API_CASE(get_buffer_pointerv, "Invalid glGetBufferPointerv() usage", |
|
{ |
|
GLvoid* params = DE_NULL; |
|
GLuint buf; |
|
glGenBuffers(1, &buf); |
|
glBindBuffer(GL_ARRAY_BUFFER, buf); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not an accepted value."); |
|
glGetBufferPointerv(GL_ARRAY_BUFFER, -1, ¶ms); |
|
expectError(GL_INVALID_ENUM); |
|
glGetBufferPointerv(-1, GL_BUFFER_MAP_POINTER, ¶ms); |
|
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); |
|
glGetBufferPointerv(GL_ARRAY_BUFFER, GL_BUFFER_MAP_POINTER, ¶ms); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
glDeleteBuffers(1, &buf); |
|
}); |
|
ES3F_ADD_API_CASE(get_framebuffer_attachment_parameteriv, "Invalid glGetFramebufferAttachmentParameteriv() usage", |
|
{ |
|
GLint params[1] = { -1 }; |
|
GLuint fbo; |
|
GLuint rbo[2]; |
|
|
|
glGenFramebuffers (1, &fbo); |
|
glGenRenderbuffers (2, rbo); |
|
|
|
glBindFramebuffer (GL_FRAMEBUFFER, fbo); |
|
glBindRenderbuffer (GL_RENDERBUFFER, rbo[0]); |
|
glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 16, 16); |
|
glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo[0]); |
|
glBindRenderbuffer (GL_RENDERBUFFER, rbo[1]); |
|
glRenderbufferStorage (GL_RENDERBUFFER, GL_STENCIL_INDEX8, 16, 16); |
|
glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[1]); |
|
glCheckFramebufferStatus (GL_FRAMEBUFFER); |
|
expectError (GL_NO_ERROR); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the accepted tokens."); |
|
glGetFramebufferAttachmentParameteriv(-1, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, ¶ms[0]); // TYPE is GL_RENDERBUFFER |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not valid for the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE."); |
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, ¶ms[0]); // TYPE is GL_RENDERBUFFER |
|
expectError(GL_INVALID_ENUM); |
|
glBindFramebuffer(GL_FRAMEBUFFER, 0); |
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_BACK, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms[0]); // TYPE is GL_FRAMEBUFFER_DEFAULT |
|
expectError(GL_INVALID_ENUM); |
|
glBindFramebuffer(GL_FRAMEBUFFER, fbo); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if attachment is GL_DEPTH_STENCIL_ATTACHMENT and different objects are bound to the depth and stencil attachment points of target."); |
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms[0]); |
|
expectError(GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE and pname is not GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME."); |
|
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); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION or GL_INVALID_ENUM is generated if attachment is not one of the accepted values for the current binding of target."); |
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_BACK, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms[0]); // A FBO is bound so GL_BACK is invalid |
|
expectError(GL_INVALID_OPERATION, GL_INVALID_ENUM); |
|
glBindFramebuffer(GL_FRAMEBUFFER, 0); |
|
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms[0]); // Default framebuffer is bound so GL_COLOR_ATTACHMENT0 is invalid |
|
expectError(GL_INVALID_OPERATION, GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
glDeleteFramebuffers(1, &fbo); |
|
}); |
|
ES3F_ADD_API_CASE(get_renderbuffer_parameteriv, "Invalid glGetRenderbufferParameteriv() usage", |
|
{ |
|
GLint params[1] = { -1 }; |
|
GLuint rbo; |
|
glGenRenderbuffers(1, &rbo); |
|
glBindRenderbuffer(GL_RENDERBUFFER, rbo); |
|
|
|
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 accepted tokens."); |
|
glGetRenderbufferParameteriv(GL_RENDERBUFFER, -1, ¶ms[0]); |
|
expectError(GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
glDeleteRenderbuffers(1, &rbo); |
|
glBindRenderbuffer(GL_RENDERBUFFER, 0); |
|
}); |
|
ES3F_ADD_API_CASE(get_internalformativ, "Invalid glGetInternalformativ() usage", |
|
{ |
|
GLint params[16]; |
|
|
|
deMemset(¶ms[0], 0xcd, sizeof(params)); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if bufSize is negative."); |
|
glGetInternalformativ (GL_RENDERBUFFER, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, -1, ¶ms[0]); |
|
expectError (GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not GL_SAMPLES or GL_NUM_SAMPLE_COUNTS."); |
|
glGetInternalformativ (GL_RENDERBUFFER, GL_RGBA8, -1, 16, ¶ms[0]); |
|
expectError (GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if internalformat is not color-, depth-, or stencil-renderable."); |
|
if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_render_snorm")) |
|
{ |
|
glGetInternalformativ (GL_RENDERBUFFER, GL_RG8_SNORM, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]); |
|
expectError (GL_INVALID_ENUM); |
|
} |
|
|
|
glGetInternalformativ (GL_RENDERBUFFER, GL_COMPRESSED_RGB8_ETC2, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]); |
|
expectError (GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER."); |
|
glGetInternalformativ (-1, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]); |
|
expectError (GL_INVALID_ENUM); |
|
glGetInternalformativ (GL_FRAMEBUFFER, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]); |
|
expectError (GL_INVALID_ENUM); |
|
|
|
if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_sparse_texture")) |
|
{ |
|
glGetInternalformativ (GL_TEXTURE_2D, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]); |
|
expectError (GL_INVALID_ENUM); |
|
} |
|
m_log << TestLog::EndSection; |
|
}); |
|
|
|
// Query object queries |
|
|
|
ES3F_ADD_API_CASE(get_queryiv, "Invalid glGetQueryiv() usage", |
|
{ |
|
GLint params = -1; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not an accepted value."); |
|
glGetQueryiv (GL_ANY_SAMPLES_PASSED, -1, ¶ms); |
|
expectError (GL_INVALID_ENUM); |
|
glGetQueryiv (-1, GL_CURRENT_QUERY, ¶ms); |
|
expectError (GL_INVALID_ENUM); |
|
glGetQueryiv (-1, -1, ¶ms); |
|
expectError (GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
}); |
|
ES3F_ADD_API_CASE(get_query_objectuiv, "Invalid glGetQueryObjectuiv() usage", |
|
{ |
|
GLuint params = -1; |
|
GLuint id; |
|
glGenQueries (1, &id); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id is not the name of a query object."); |
|
glGetQueryObjectuiv (-1, GL_QUERY_RESULT_AVAILABLE, ¶ms); |
|
expectError (GL_INVALID_OPERATION); |
|
m_log << TestLog::Message << "// Note: " << id << " is not a query object yet, since it hasn't been used by glBeginQuery" << TestLog::EndMessage; |
|
glGetQueryObjectuiv (id, GL_QUERY_RESULT_AVAILABLE, ¶ms); |
|
expectError (GL_INVALID_OPERATION); |
|
m_log << TestLog::EndSection; |
|
|
|
glBeginQuery (GL_ANY_SAMPLES_PASSED, id); |
|
glEndQuery (GL_ANY_SAMPLES_PASSED); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value."); |
|
glGetQueryObjectuiv (id, -1, ¶ms); |
|
expectError (GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id is the name of a currently active query object."); |
|
glBeginQuery (GL_ANY_SAMPLES_PASSED, id); |
|
expectError (GL_NO_ERROR); |
|
glGetQueryObjectuiv (id, GL_QUERY_RESULT_AVAILABLE, ¶ms); |
|
expectError (GL_INVALID_OPERATION); |
|
glEndQuery (GL_ANY_SAMPLES_PASSED); |
|
expectError (GL_NO_ERROR); |
|
m_log << TestLog::EndSection; |
|
|
|
glDeleteQueries (1, &id); |
|
}); |
|
|
|
// Sync object queries |
|
|
|
ES3F_ADD_API_CASE(get_synciv, "Invalid glGetSynciv() usage", |
|
{ |
|
GLsizei length = -1; |
|
GLint values[32]; |
|
GLsync sync; |
|
|
|
deMemset(&values[0], 0xcd, sizeof(values)); |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if sync is not the name of a sync object."); |
|
glGetSynciv (0, GL_OBJECT_TYPE, 32, &length, &values[0]); |
|
expectError (GL_INVALID_VALUE); |
|
m_log << TestLog::EndSection; |
|
|
|
m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not one of the accepted tokens."); |
|
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); |
|
expectError (GL_NO_ERROR); |
|
glGetSynciv (sync, -1, 32, &length, &values[0]); |
|
expectError (GL_INVALID_ENUM); |
|
m_log << TestLog::EndSection; |
|
}); |
|
|
|
// Enumerated boolean state queries |
|
|
|
ES3F_ADD_API_CASE(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 |
|
|
|
ES3F_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 |
|
|
|
ES3F_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); |
|
}); |
|
ES3F_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); |
|
}); |
|
ES3F_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); |
|
}); |
|
ES3F_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); |
|
}); |
|
ES3F_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); |
|
}); |
|
ES3F_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); |
|
}); |
|
ES3F_ADD_API_CASE(is_query, "Invalid glIsQuery() usage", |
|
{ |
|
GLuint query = 0; |
|
GLboolean isQuery; |
|
|
|
m_log << TestLog::Section("", "A name returned by glGenQueries, but not yet associated with a query object by calling glBeginQuery, is not the name of a query object."); |
|
isQuery = glIsQuery(query); |
|
checkBooleans (isQuery, GL_FALSE); |
|
|
|
glGenQueries (1, &query); |
|
isQuery = glIsQuery(query); |
|
checkBooleans (isQuery, GL_FALSE); |
|
|
|
glBeginQuery (GL_ANY_SAMPLES_PASSED, query); |
|
isQuery = glIsQuery(query); |
|
checkBooleans (isQuery, GL_TRUE); |
|
|
|
glEndQuery (GL_ANY_SAMPLES_PASSED); |
|
glDeleteQueries (1, &query); |
|
isQuery = glIsQuery(query); |
|
checkBooleans (isQuery, GL_FALSE); |
|
m_log << TestLog::EndSection; |
|
|
|
expectError (GL_NO_ERROR); |
|
}); |
|
ES3F_ADD_API_CASE(is_sampler, "Invalid glIsSampler() usage", |
|
{ |
|
GLuint sampler = 0; |
|
GLboolean isSampler; |
|
|
|
m_log << TestLog::Section("", "A name returned by glGenSamplers is the name of a sampler object."); |
|
isSampler = glIsSampler(sampler); |
|
checkBooleans (isSampler, GL_FALSE); |
|
|
|
glGenSamplers (1, &sampler); |
|
isSampler = glIsSampler(sampler); |
|
checkBooleans (isSampler, GL_TRUE); |
|
|
|
glBindSampler (0, sampler); |
|
isSampler = glIsSampler(sampler); |
|
checkBooleans (isSampler, GL_TRUE); |
|
|
|
glDeleteSamplers (1, &sampler); |
|
isSampler = glIsSampler(sampler); |
|
checkBooleans (isSampler, GL_FALSE); |
|
m_log << TestLog::EndSection; |
|
|
|
expectError (GL_NO_ERROR); |
|
}); |
|
ES3F_ADD_API_CASE(is_sync, "Invalid glIsSync() usage", |
|
{ |
|
GLsync sync = 0; |
|
GLboolean isSync; |
|
|
|
m_log << TestLog::Section("", "A name returned by glFenceSync is the name of a sync object."); |
|
isSync = glIsSync(sync); |
|
checkBooleans (isSync, GL_FALSE); |
|
|
|
sync = glFenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0); |
|
isSync = glIsSync(sync); |
|
checkBooleans (isSync, GL_TRUE); |
|
|
|
glDeleteSync (sync); |
|
isSync = glIsSync(sync); |
|
checkBooleans (isSync, GL_FALSE); |
|
m_log << TestLog::EndSection; |
|
|
|
expectError (GL_NO_ERROR); |
|
}); |
|
ES3F_ADD_API_CASE(is_transform_feedback, "Invalid glIsTransformFeedback() usage", |
|
{ |
|
GLuint tf = 0; |
|
GLboolean isTF; |
|
|
|
m_log << TestLog::Section("", "A name returned by glGenTransformFeedbacks, but not yet bound using glBindTransformFeedback, is not the name of a transform feedback object."); |
|
isTF = glIsTransformFeedback(tf); |
|
checkBooleans (isTF, GL_FALSE); |
|
|
|
glGenTransformFeedbacks (1, &tf); |
|
isTF = glIsTransformFeedback(tf); |
|
checkBooleans (isTF, GL_FALSE); |
|
|
|
glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, tf); |
|
isTF = glIsTransformFeedback(tf); |
|
checkBooleans (isTF, GL_TRUE); |
|
|
|
glBindTransformFeedback (GL_TRANSFORM_FEEDBACK, 0); |
|
glDeleteTransformFeedbacks (1, &tf); |
|
isTF = glIsTransformFeedback(tf); |
|
checkBooleans (isTF, GL_FALSE); |
|
m_log << TestLog::EndSection; |
|
|
|
expectError (GL_NO_ERROR); |
|
}); |
|
ES3F_ADD_API_CASE(is_vertex_array, "Invalid glIsVertexArray() usage", |
|
{ |
|
GLuint vao = 0; |
|
GLboolean isVao; |
|
|
|
m_log << TestLog::Section("", "A name returned by glGenVertexArrays, but not yet bound using glBindVertexArray, is not the name of a vertex array object."); |
|
isVao = glIsVertexArray(vao); |
|
checkBooleans (isVao, GL_FALSE); |
|
|
|
glGenVertexArrays (1, &vao); |
|
isVao = glIsVertexArray(vao); |
|
checkBooleans (isVao, GL_FALSE); |
|
|
|
glBindVertexArray (vao); |
|
isVao = glIsVertexArray(vao); |
|
checkBooleans (isVao, GL_TRUE); |
|
|
|
glBindVertexArray (0); |
|
glDeleteVertexArrays (1, &vao); |
|
isVao = glIsVertexArray(vao); |
|
checkBooleans (isVao, GL_FALSE); |
|
m_log << TestLog::EndSection; |
|
|
|
expectError (GL_NO_ERROR); |
|
}); |
|
} |
|
|
|
} // Functional |
|
} // gles3 |
|
} // deqp
|
|
|