Pass InterfaceBlockLinker to ProgramImpl::link.
This change is in preparation for moving the linking logic to the
Implementation.
Introduces a ProgramLinkedResources class that is passed into the Impl
and holds linking-related info such as the UBOs, Varyings, etc.
BUG=angleproject:2208
Change-Id: I2ef0824b54bfb462c79d003bffe34e9cfad60d8a
Reviewed-on: https://chromium-review.googlesource.com/746204
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index de9724c..e150711 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -258,6 +258,53 @@
return true;
}
+void InitUniformBlockLinker(const gl::Context *context,
+ const ProgramState &state,
+ UniformBlockLinker *blockLinker)
+{
+ if (state.getAttachedVertexShader())
+ {
+ blockLinker->addShaderBlocks(GL_VERTEX_SHADER,
+ &state.getAttachedVertexShader()->getUniformBlocks(context));
+ }
+
+ if (state.getAttachedFragmentShader())
+ {
+ blockLinker->addShaderBlocks(GL_FRAGMENT_SHADER,
+ &state.getAttachedFragmentShader()->getUniformBlocks(context));
+ }
+
+ if (state.getAttachedComputeShader())
+ {
+ blockLinker->addShaderBlocks(GL_COMPUTE_SHADER,
+ &state.getAttachedComputeShader()->getUniformBlocks(context));
+ }
+}
+
+void InitShaderStorageBlockLinker(const gl::Context *context,
+ const ProgramState &state,
+ ShaderStorageBlockLinker *blockLinker)
+{
+ if (state.getAttachedVertexShader())
+ {
+ blockLinker->addShaderBlocks(
+ GL_VERTEX_SHADER, &state.getAttachedVertexShader()->getShaderStorageBlocks(context));
+ }
+
+ if (state.getAttachedFragmentShader())
+ {
+ blockLinker->addShaderBlocks(
+ GL_FRAGMENT_SHADER,
+ &state.getAttachedFragmentShader()->getShaderStorageBlocks(context));
+ }
+
+ if (state.getAttachedComputeShader())
+ {
+ blockLinker->addShaderBlocks(
+ GL_COMPUTE_SHADER, &state.getAttachedComputeShader()->getShaderStorageBlocks(context));
+ }
+}
+
} // anonymous namespace
const char *const g_fakepath = "C:\\fakepath";
@@ -736,8 +783,14 @@
return NoError();
}
- gl::VaryingPacking noPacking(0, PackMode::ANGLE_RELAXED);
- ANGLE_TRY_RESULT(mProgram->link(context, noPacking, mInfoLog), mLinked);
+ ProgramLinkedResources resources = {{0, PackMode::ANGLE_RELAXED},
+ {&mState.mUniformBlocks, &mState.mUniforms},
+ {&mState.mShaderStorageBlocks}};
+
+ InitUniformBlockLinker(context, mState, &resources.uniformBlockLinker);
+ InitShaderStorageBlockLinker(context, mState, &resources.shaderStorageBlockLinker);
+
+ ANGLE_TRY_RESULT(mProgram->link(context, resources, mInfoLog), mLinked);
if (!mLinked)
{
return NoError();
@@ -801,9 +854,16 @@
// In WebGL, we use a slightly different handling for packing variables.
auto packMode = data.getExtensions().webglCompatibility ? PackMode::WEBGL_STRICT
: PackMode::ANGLE_RELAXED;
- VaryingPacking varyingPacking(data.getCaps().maxVaryingVectors, packMode);
- if (!varyingPacking.packUserVaryings(mInfoLog, packedVaryings,
- mState.getTransformFeedbackVaryingNames()))
+
+ ProgramLinkedResources resources = {{data.getCaps().maxVaryingVectors, packMode},
+ {&mState.mUniformBlocks, &mState.mUniforms},
+ {&mState.mShaderStorageBlocks}};
+
+ InitUniformBlockLinker(context, mState, &resources.uniformBlockLinker);
+ InitShaderStorageBlockLinker(context, mState, &resources.shaderStorageBlockLinker);
+
+ if (!resources.varyingPacking.packUserVaryings(mInfoLog, packedVaryings,
+ mState.getTransformFeedbackVaryingNames()))
{
return NoError();
}
@@ -813,7 +873,7 @@
return NoError();
}
- ANGLE_TRY_RESULT(mProgram->link(context, varyingPacking, mInfoLog), mLinked);
+ ANGLE_TRY_RESULT(mProgram->link(context, resources, mInfoLog), mLinked);
if (!mLinked)
{
return NoError();
@@ -2829,24 +2889,7 @@
void Program::gatherUniformBlockInfo(const gl::Context *context)
{
UniformBlockLinker blockLinker(&mState.mUniformBlocks, &mState.mUniforms);
-
- if (mState.mAttachedVertexShader)
- {
- blockLinker.addShaderBlocks(GL_VERTEX_SHADER,
- &mState.mAttachedVertexShader->getUniformBlocks(context));
- }
-
- if (mState.mAttachedFragmentShader)
- {
- blockLinker.addShaderBlocks(GL_FRAGMENT_SHADER,
- &mState.mAttachedFragmentShader->getUniformBlocks(context));
- }
-
- if (mState.mAttachedComputeShader)
- {
- blockLinker.addShaderBlocks(GL_COMPUTE_SHADER,
- &mState.mAttachedComputeShader->getUniformBlocks(context));
- }
+ InitUniformBlockLinker(context, mState, &blockLinker);
auto getImplBlockSize = [this](const std::string &name, const std::string &mappedName,
size_t *sizeOut) {
@@ -2864,24 +2907,7 @@
void Program::gatherShaderStorageBlockInfo(const gl::Context *context)
{
ShaderStorageBlockLinker blockLinker(&mState.mShaderStorageBlocks);
-
- if (mState.mAttachedVertexShader)
- {
- blockLinker.addShaderBlocks(GL_VERTEX_SHADER,
- &mState.mAttachedVertexShader->getShaderStorageBlocks(context));
- }
-
- if (mState.mAttachedFragmentShader)
- {
- blockLinker.addShaderBlocks(
- GL_FRAGMENT_SHADER, &mState.mAttachedFragmentShader->getShaderStorageBlocks(context));
- }
-
- if (mState.mAttachedComputeShader)
- {
- blockLinker.addShaderBlocks(
- GL_COMPUTE_SHADER, &mState.mAttachedComputeShader->getShaderStorageBlocks(context));
- }
+ InitShaderStorageBlockLinker(context, mState, &blockLinker);
// We don't have a way of determining block info for shader storage blocks yet.
// TODO(jiajia.qin@intel.com): Determine correct block size and layout.