Commit 04668675 by Jamie Madill

Mark shared and std140 UBOs as always active.

This aligns ANGLE with the GL spec. With this fix, we pass all of the dEQP conformance tests in Functional / Uniform Buffer Object that don't rely on single buffers. BUG=angle:507 Change-Id: I6063a416e3f7ee6d5327d96850e3d0cc8521c817 Reviewed-on: https://chromium-review.googlesource.com/213506Reviewed-by: 's avatarNicolas Capens <capn@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent a2fbb840
...@@ -1036,7 +1036,11 @@ bool ProgramBinary::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuff ...@@ -1036,7 +1036,11 @@ bool ProgramBinary::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuff
return false; return false;
} }
ASSERT(uniformBlock->isReferencedByVertexShader() || uniformBlock->isReferencedByFragmentShader()); // Unnecessary to apply an unreferenced standard or shared UBO
if (!uniformBlock->isReferencedByVertexShader() && !uniformBlock->isReferencedByFragmentShader())
{
continue;
}
if (uniformBlock->isReferencedByVertexShader()) if (uniformBlock->isReferencedByVertexShader())
{ {
...@@ -2220,7 +2224,8 @@ bool ProgramBinary::linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShad ...@@ -2220,7 +2224,8 @@ bool ProgramBinary::linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShad
{ {
const sh::InterfaceBlock &interfaceBlock = vertexInterfaceBlocks[blockIndex]; const sh::InterfaceBlock &interfaceBlock = vertexInterfaceBlocks[blockIndex];
if (interfaceBlock.staticUse) // Note: shared and std140 layouts are always considered active
if (interfaceBlock.staticUse || interfaceBlock.layout != sh::BLOCKLAYOUT_PACKED)
{ {
if (!defineUniformBlock(infoLog, vertexShader, interfaceBlock, caps)) if (!defineUniformBlock(infoLog, vertexShader, interfaceBlock, caps))
{ {
...@@ -2233,7 +2238,8 @@ bool ProgramBinary::linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShad ...@@ -2233,7 +2238,8 @@ bool ProgramBinary::linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShad
{ {
const sh::InterfaceBlock &interfaceBlock = fragmentInterfaceBlocks[blockIndex]; const sh::InterfaceBlock &interfaceBlock = fragmentInterfaceBlocks[blockIndex];
if (interfaceBlock.staticUse) // Note: shared and std140 layouts are always considered active
if (interfaceBlock.staticUse || interfaceBlock.layout != sh::BLOCKLAYOUT_PACKED)
{ {
if (!defineUniformBlock(infoLog, fragmentShader, interfaceBlock, caps)) if (!defineUniformBlock(infoLog, fragmentShader, interfaceBlock, caps))
{ {
...@@ -2387,23 +2393,26 @@ bool ProgramBinary::defineUniformBlock(InfoLog &infoLog, const Shader &shader, c ...@@ -2387,23 +2393,26 @@ bool ProgramBinary::defineUniformBlock(InfoLog &infoLog, const Shader &shader, c
} }
} }
// Assign registers to the uniform blocks if (interfaceBlock.staticUse)
const GLuint blockIndex = getUniformBlockIndex(interfaceBlock.name);
const unsigned int elementCount = std::max(1u, interfaceBlock.arraySize);
ASSERT(blockIndex != GL_INVALID_INDEX);
ASSERT(blockIndex + elementCount <= mUniformBlocks.size());
unsigned int interfaceBlockRegister = shaderD3D->getInterfaceBlockRegister(interfaceBlock.name);
for (unsigned int uniformBlockElement = 0; uniformBlockElement < elementCount; uniformBlockElement++)
{ {
UniformBlock *uniformBlock = mUniformBlocks[blockIndex + uniformBlockElement]; // Assign registers to the uniform blocks
ASSERT(uniformBlock->name == interfaceBlock.name); const GLuint blockIndex = getUniformBlockIndex(interfaceBlock.name);
const unsigned int elementCount = std::max(1u, interfaceBlock.arraySize);
ASSERT(blockIndex != GL_INVALID_INDEX);
ASSERT(blockIndex + elementCount <= mUniformBlocks.size());
unsigned int interfaceBlockRegister = shaderD3D->getInterfaceBlockRegister(interfaceBlock.name);
if (!assignUniformBlockRegister(infoLog, uniformBlock, shader.getType(), for (unsigned int uniformBlockElement = 0; uniformBlockElement < elementCount; uniformBlockElement++)
interfaceBlockRegister + uniformBlockElement, caps))
{ {
return false; UniformBlock *uniformBlock = mUniformBlocks[blockIndex + uniformBlockElement];
ASSERT(uniformBlock->name == interfaceBlock.name);
if (!assignUniformBlockRegister(infoLog, uniformBlock, shader.getType(),
interfaceBlockRegister + uniformBlockElement, caps))
{
return false;
}
} }
} }
......
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