Commit 48280a4e by Alexis Hetu Committed by Alexis Hétu

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/14428Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent a0aa5fde
...@@ -2423,6 +2423,20 @@ template bool Context::getUniformBufferiv<GLint64>(GLuint index, GLenum pname, G ...@@ -2423,6 +2423,20 @@ template bool Context::getUniformBufferiv<GLint64>(GLuint index, GLenum pname, G
template<typename T> bool Context::getUniformBufferiv(GLuint index, GLenum pname, T *param) const 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]; const BufferBinding& uniformBuffer = mState.uniformBuffers[index];
switch(pname) switch(pname)
......
...@@ -499,6 +499,10 @@ namespace es2 ...@@ -499,6 +499,10 @@ namespace es2
GLuint Program::getUniformBlockBinding(GLuint uniformBlockIndex) const GLuint Program::getUniformBlockBinding(GLuint uniformBlockIndex) const
{ {
if(uniformBlockIndex >= getActiveUniformBlockCount())
{
return error(GL_INVALID_VALUE, GL_INVALID_INDEX);
}
return uniformBlockBindings[uniformBlockIndex]; return uniformBlockBindings[uniformBlockIndex];
} }
...@@ -2776,7 +2780,10 @@ namespace es2 ...@@ -2776,7 +2780,10 @@ namespace es2
void Program::getActiveUniformBlockName(GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name) const 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]; const UniformBlock &uniformBlock = *uniformBlocks[index];
......
...@@ -2382,19 +2382,21 @@ GL_APICALL void GL_APIENTRY glGetUniformuiv(GLuint program, GLint location, GLui ...@@ -2382,19 +2382,21 @@ GL_APICALL void GL_APIENTRY glGetUniformuiv(GLuint program, GLint location, GLui
if(context) if(context)
{ {
if(program == 0)
{
return error(GL_INVALID_VALUE);
}
es2::Program *programObject = context->getProgram(program); es2::Program *programObject = context->getProgram(program);
if(!programObject || !programObject->isLinked()) if(!programObject)
{
if(context->getShader(program))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
else
{
return error(GL_INVALID_VALUE);
}
}
if(!programObject) if(!programObject->isLinked())
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
...@@ -2814,8 +2816,15 @@ GL_APICALL void GL_APIENTRY glGetUniformIndices(GLuint program, GLsizei uniformC ...@@ -2814,8 +2816,15 @@ GL_APICALL void GL_APIENTRY glGetUniformIndices(GLuint program, GLsizei uniformC
if(!programObject) if(!programObject)
{ {
if(context->getShader(program))
{
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
else
{
return error(GL_INVALID_VALUE);
}
}
if(!programObject->isLinked()) if(!programObject->isLinked())
{ {
...@@ -2867,8 +2876,15 @@ GL_APICALL void GL_APIENTRY glGetActiveUniformsiv(GLuint program, GLsizei unifor ...@@ -2867,8 +2876,15 @@ GL_APICALL void GL_APIENTRY glGetActiveUniformsiv(GLuint program, GLsizei unifor
if(!programObject) if(!programObject)
{ {
if(context->getShader(program))
{
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
else
{
return error(GL_INVALID_VALUE);
}
}
for(int uniformId = 0; uniformId < uniformCount; uniformId++) for(int uniformId = 0; uniformId < uniformCount; uniformId++)
{ {
...@@ -2901,8 +2917,15 @@ GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex(GLuint program, const GLcha ...@@ -2901,8 +2917,15 @@ GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex(GLuint program, const GLcha
if(!programObject) if(!programObject)
{ {
if(context->getShader(program))
{
return error(GL_INVALID_OPERATION, GL_INVALID_INDEX); return error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
} }
else
{
return error(GL_INVALID_VALUE, GL_INVALID_INDEX);
}
}
return programObject->getUniformBlockIndex(uniformBlockName); return programObject->getUniformBlockIndex(uniformBlockName);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment