Clean up uniform block Program Impl APIs.
The D3D-specific code we can split into D3D-only methods, and the
GL-level shared code we can place in Program instead of making Impl
methods. This cleans up the Impl inteface significantly.
BUG=angleproject:1123
Change-Id: Ibcb7d07733eb939adf5bb4f5395a661875a60238
Reviewed-on: https://chromium-review.googlesource.com/293763
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index 3afe236..b4b88a3 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -1152,6 +1152,8 @@
return LinkResult(false, gl::Error(GL_NO_ERROR));
}
+ defineUniformBlocks(*data.caps);
+
return LinkResult(true, gl::Error(GL_NO_ERROR));
}
@@ -1256,30 +1258,23 @@
return mRenderer->setUniformBuffers(data, mVertexUBOCache, mFragmentUBOCache);
}
-bool ProgramD3D::assignUniformBlockRegister(gl::InfoLog &infoLog, gl::UniformBlock *uniformBlock, GLenum shader,
- unsigned int registerIndex, const gl::Caps &caps)
+void ProgramD3D::assignUniformBlockRegister(gl::UniformBlock *uniformBlock,
+ GLenum shader,
+ unsigned int registerIndex,
+ const gl::Caps &caps)
{
+ // Validation done in the GL-level Program.
if (shader == GL_VERTEX_SHADER)
{
uniformBlock->vsRegisterIndex = registerIndex;
- if (registerIndex - mRenderer->getReservedVertexUniformBuffers() >= caps.maxVertexUniformBlocks)
- {
- infoLog << "Vertex shader uniform block count exceed GL_MAX_VERTEX_UNIFORM_BLOCKS (" << caps.maxVertexUniformBlocks << ")";
- return false;
- }
+ ASSERT(registerIndex < caps.maxVertexUniformBlocks);
}
else if (shader == GL_FRAGMENT_SHADER)
{
uniformBlock->psRegisterIndex = registerIndex;
- if (registerIndex - mRenderer->getReservedFragmentUniformBuffers() >= caps.maxFragmentUniformBlocks)
- {
- infoLog << "Fragment shader uniform block count exceed GL_MAX_FRAGMENT_UNIFORM_BLOCKS (" << caps.maxFragmentUniformBlocks << ")";
- return false;
- }
+ ASSERT(registerIndex < caps.maxFragmentUniformBlocks);
}
else UNREACHABLE();
-
- return true;
}
void ProgramD3D::dirtyAllUniforms()
@@ -1541,6 +1536,29 @@
}
}
+void ProgramD3D::defineUniformBlocks(const gl::Caps &caps)
+{
+ const gl::Shader *vertexShader = mData.getAttachedVertexShader();
+
+ for (const sh::InterfaceBlock &vertexBlock : vertexShader->getInterfaceBlocks())
+ {
+ if (vertexBlock.staticUse || vertexBlock.layout != sh::BLOCKLAYOUT_PACKED)
+ {
+ defineUniformBlock(*vertexShader, vertexBlock, caps);
+ }
+ }
+
+ const gl::Shader *fragmentShader = mData.getAttachedFragmentShader();
+
+ for (const sh::InterfaceBlock &fragmentBlock : fragmentShader->getInterfaceBlocks())
+ {
+ if (fragmentBlock.staticUse || fragmentBlock.layout != sh::BLOCKLAYOUT_PACKED)
+ {
+ defineUniformBlock(*fragmentShader, fragmentBlock, caps);
+ }
+ }
+}
+
template <typename T>
static inline void SetIfDirty(T *dest, const T& source, bool *dirtyFlag)
{
@@ -1834,8 +1852,7 @@
}
}
-bool ProgramD3D::defineUniformBlock(gl::InfoLog &infoLog,
- const gl::Shader &shader,
+void ProgramD3D::defineUniformBlock(const gl::Shader &shader,
const sh::InterfaceBlock &interfaceBlock,
const gl::Caps &caps)
{
@@ -1897,15 +1914,10 @@
gl::UniformBlock *uniformBlock = mUniformBlocks[blockIndex + uniformBlockElement];
ASSERT(uniformBlock->name == interfaceBlock.name);
- if (!assignUniformBlockRegister(infoLog, uniformBlock, shader.getType(),
- interfaceBlockRegister + uniformBlockElement, caps))
- {
- return false;
- }
+ assignUniformBlockRegister(uniformBlock, shader.getType(),
+ interfaceBlockRegister + uniformBlockElement, caps);
}
}
-
- return true;
}
bool ProgramD3D::assignSamplers(unsigned int startSamplerIndex,