Commit 7f1c3d07 by Nicolas Capens Committed by Nicolas Capens

Fix validation of uniform block size.

Uniform block members should not be validated against the GL_MAX_VERTEX_UNIFORM_VECTORS and GL_MAX_FRAGMENT_UNIFORM_VECTORS limits. Instead, block sizes should not exceed MAX_UNIFORM_BLOCK_SIZE. Also move uniform block index validation to the entry functions. Bug b/111803744 Change-Id: I0ea530813d1f2c29141dc64a93aa10f50460885b Reviewed-on: https://swiftshader-review.googlesource.com/20028Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent be5fe779
...@@ -51,14 +51,6 @@ namespace es2 ...@@ -51,14 +51,6 @@ namespace es2
matrixStride = uniform.blockInfo.matrixStride; matrixStride = uniform.blockInfo.matrixStride;
isRowMajorMatrix = uniform.blockInfo.isRowMajorMatrix; isRowMajorMatrix = uniform.blockInfo.isRowMajorMatrix;
} }
else
{
index = -1;
offset = -1;
arrayStride = -1;
matrixStride = -1;
isRowMajorMatrix = false;
}
} }
Uniform::Uniform(const glsl::Uniform &uniform, const BlockInfo &blockInfo) Uniform::Uniform(const glsl::Uniform &uniform, const BlockInfo &blockInfo)
...@@ -492,20 +484,15 @@ namespace es2 ...@@ -492,20 +484,15 @@ namespace es2
void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding) void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
{ {
if(uniformBlockIndex >= getActiveUniformBlockCount()) ASSERT(uniformBlockIndex < getActiveUniformBlockCount());
{
return error(GL_INVALID_VALUE);
}
uniformBlockBindings[uniformBlockIndex] = uniformBlockBinding; uniformBlockBindings[uniformBlockIndex] = uniformBlockBinding;
} }
GLuint Program::getUniformBlockBinding(GLuint uniformBlockIndex) const GLuint Program::getUniformBlockBinding(GLuint uniformBlockIndex) const
{ {
if(uniformBlockIndex >= getActiveUniformBlockCount()) ASSERT(uniformBlockIndex < getActiveUniformBlockCount());
{
return error(GL_INVALID_VALUE, GL_INVALID_INDEX);
}
return uniformBlockBindings[uniformBlockIndex]; return uniformBlockBindings[uniformBlockIndex];
} }
...@@ -1713,8 +1700,24 @@ namespace es2 ...@@ -1713,8 +1700,24 @@ namespace es2
{ {
const glsl::ActiveUniformBlocks &activeUniformBlocks = shader->activeUniformBlocks; const glsl::ActiveUniformBlocks &activeUniformBlocks = shader->activeUniformBlocks;
ASSERT(static_cast<size_t>(uniform.blockId) < activeUniformBlocks.size()); ASSERT(static_cast<size_t>(uniform.blockId) < activeUniformBlocks.size());
blockIndex = getUniformBlockIndex(activeUniformBlocks[uniform.blockId].name); const std::string &uniformBlockName = activeUniformBlocks[uniform.blockId].name;
blockIndex = getUniformBlockIndex(uniformBlockName);
ASSERT(blockIndex != GL_INVALID_INDEX); ASSERT(blockIndex != GL_INVALID_INDEX);
if(activeUniformBlocks[uniform.blockId].dataSize > MAX_UNIFORM_BLOCK_SIZE)
{
if(shader->getType() == GL_VERTEX_SHADER)
{
appendToInfoLog("Vertex shader active uniform block (%s) exceeds GL_MAX_UNIFORM_BLOCK_SIZE (%d)", uniformBlockName.c_str(), MAX_UNIFORM_BLOCK_SIZE);
return false;
}
else if(shader->getType() == GL_FRAGMENT_SHADER)
{
appendToInfoLog("Fragment shader active uniform block (%s) exceeds GL_MAX_UNIFORM_BLOCK_SIZE (%d)", uniformBlockName.c_str(), MAX_UNIFORM_BLOCK_SIZE);
return false;
}
else UNREACHABLE(shader->getType());
}
} }
if(!defineUniform(shader->getType(), uniform, Uniform::BlockInfo(uniform, blockIndex))) if(!defineUniform(shader->getType(), uniform, Uniform::BlockInfo(uniform, blockIndex)))
...@@ -1865,6 +1868,8 @@ namespace es2 ...@@ -1865,6 +1868,8 @@ namespace es2
} }
else UNREACHABLE(shader); else UNREACHABLE(shader);
if(uniform->blockInfo.index < 0)
{
if(shader == GL_VERTEX_SHADER) if(shader == GL_VERTEX_SHADER)
{ {
if(glslUniform.registerIndex + uniform->registerCount() > MAX_VERTEX_UNIFORM_VECTORS) if(glslUniform.registerIndex + uniform->registerCount() > MAX_VERTEX_UNIFORM_VECTORS)
...@@ -1882,6 +1887,7 @@ namespace es2 ...@@ -1882,6 +1887,7 @@ namespace es2
} }
} }
else UNREACHABLE(shader); else UNREACHABLE(shader);
}
return true; return true;
} }
...@@ -2859,10 +2865,7 @@ namespace es2 ...@@ -2859,10 +2865,7 @@ 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
{ {
if(index >= getActiveUniformBlockCount()) ASSERT(index < getActiveUniformBlockCount());
{
return error(GL_INVALID_VALUE);
}
const UniformBlock &uniformBlock = *uniformBlocks[index]; const UniformBlock &uniformBlock = *uniformBlocks[index];
......
...@@ -42,11 +42,11 @@ namespace es2 ...@@ -42,11 +42,11 @@ namespace es2
{ {
BlockInfo(const glsl::Uniform& uniform, int blockIndex); BlockInfo(const glsl::Uniform& uniform, int blockIndex);
int index; int index = -1;
int offset; int offset = -1;
int arrayStride; int arrayStride = -1;
int matrixStride; int matrixStride = -1;
bool isRowMajorMatrix; bool isRowMajorMatrix = false;
}; };
Uniform(const glsl::Uniform &uniform, const BlockInfo &blockInfo); Uniform(const glsl::Uniform &uniform, const BlockInfo &blockInfo);
......
...@@ -2629,6 +2629,11 @@ GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv(GLuint program, GLuint uni ...@@ -2629,6 +2629,11 @@ GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv(GLuint program, GLuint uni
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(uniformBlockIndex >= programObject->getActiveUniformBlockCount())
{
return error(GL_INVALID_VALUE);
}
switch(pname) switch(pname)
{ {
case GL_UNIFORM_BLOCK_BINDING: case GL_UNIFORM_BLOCK_BINDING:
...@@ -2669,6 +2674,11 @@ GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName(GLuint program, GLuint u ...@@ -2669,6 +2674,11 @@ GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName(GLuint program, GLuint u
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(uniformBlockIndex >= programObject->getActiveUniformBlockCount())
{
return error(GL_INVALID_VALUE);
}
programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName); programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
} }
} }
...@@ -2694,6 +2704,11 @@ GL_APICALL void GL_APIENTRY glUniformBlockBinding(GLuint program, GLuint uniform ...@@ -2694,6 +2704,11 @@ GL_APICALL void GL_APIENTRY glUniformBlockBinding(GLuint program, GLuint uniform
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(uniformBlockIndex >= programObject->getActiveUniformBlockCount())
{
return error(GL_INVALID_VALUE);
}
programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding); programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
} }
} }
......
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