Program related validation Added some validation for uniforms and uniform blocks. Fixes some failures in (only 1 failure left): dEQP-GLES3.functional.negative_api.state* Change-Id: I507c7e8784230f85b0d312d162e5ff82bdbd15ed Reviewed-on: https://swiftshader-review.googlesource.com/14428 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp index 2a80871..b32e792 100644 --- a/src/OpenGL/libGLESv2/Context.cpp +++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -2423,6 +2423,20 @@ template<typename T> bool Context::getUniformBufferiv(GLuint index, GLenum pname, T *param) const { + switch(pname) + { + case GL_UNIFORM_BUFFER_BINDING: + case GL_UNIFORM_BUFFER_SIZE: + case GL_UNIFORM_BUFFER_START: + if(index >= MAX_UNIFORM_BUFFER_BINDINGS) + { + return error(GL_INVALID_VALUE, true); + } + break; + default: + break; + } + const BufferBinding& uniformBuffer = mState.uniformBuffers[index]; switch(pname)
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp index 37c294f..58a3ac9 100644 --- a/src/OpenGL/libGLESv2/Program.cpp +++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -499,6 +499,10 @@ GLuint Program::getUniformBlockBinding(GLuint uniformBlockIndex) const { + if(uniformBlockIndex >= getActiveUniformBlockCount()) + { + return error(GL_INVALID_VALUE, GL_INVALID_INDEX); + } return uniformBlockBindings[uniformBlockIndex]; } @@ -2776,7 +2780,10 @@ void Program::getActiveUniformBlockName(GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name) const { - ASSERT(index < getActiveUniformBlockCount()); + if(index >= getActiveUniformBlockCount()) + { + return error(GL_INVALID_VALUE); + } const UniformBlock &uniformBlock = *uniformBlocks[index];
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp index 76381e1..2d646ec 100644 --- a/src/OpenGL/libGLESv2/libGLESv3.cpp +++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -2382,19 +2382,21 @@ if(context) { - if(program == 0) - { - return error(GL_INVALID_VALUE); - } - es2::Program *programObject = context->getProgram(program); - if(!programObject || !programObject->isLinked()) + if(!programObject) { - return error(GL_INVALID_OPERATION); + if(context->getShader(program)) + { + return error(GL_INVALID_OPERATION); + } + else + { + return error(GL_INVALID_VALUE); + } } - if(!programObject) + if(!programObject->isLinked()) { return error(GL_INVALID_OPERATION); } @@ -2814,7 +2816,14 @@ if(!programObject) { - return error(GL_INVALID_OPERATION); + if(context->getShader(program)) + { + return error(GL_INVALID_OPERATION); + } + else + { + return error(GL_INVALID_VALUE); + } } if(!programObject->isLinked()) @@ -2867,7 +2876,14 @@ if(!programObject) { - return error(GL_INVALID_OPERATION); + if(context->getShader(program)) + { + return error(GL_INVALID_OPERATION); + } + else + { + return error(GL_INVALID_VALUE); + } } for(int uniformId = 0; uniformId < uniformCount; uniformId++) @@ -2901,7 +2917,14 @@ if(!programObject) { - return error(GL_INVALID_OPERATION, GL_INVALID_INDEX); + if(context->getShader(program)) + { + return error(GL_INVALID_OPERATION, GL_INVALID_INDEX); + } + else + { + return error(GL_INVALID_VALUE, GL_INVALID_INDEX); + } } return programObject->getUniformBlockIndex(uniformBlockName);