Commit c5b5cf6c by Courtney Goeltzenleuchter Committed by Commit Bot

Refactor to pass ProgramMergedVaryings to link impl

Follow-on CL needs the ProgramMergedVaryings in the Vulkan backend to generate valid SPIRV. Bug: angleproject:3078 Change-Id: Ic442a3e0bd713fec36bd6b9420f67f3b1118e5ad Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2404336Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Courtney Goeltzenleuchter <courtneygo@google.com>
parent a4ef812c
......@@ -1460,6 +1460,8 @@ angle::Result Program::linkImpl(const Context *context)
bool result = linkValidateShaders(infoLog);
ASSERT(result);
ProgramMergedVaryings mergedVaryings;
if (mState.mAttachedShaders[ShaderType::Compute])
{
mState.mExecutable->mResources.reset(new ProgramLinkedResources(
......@@ -1584,15 +1586,13 @@ angle::Result Program::linkImpl(const Context *context)
ProgramPipeline *programPipeline = context->getState().getProgramPipeline();
if (programPipeline && programPipeline->usesShaderProgram(id()))
{
const ProgramMergedVaryings &mergedVaryings =
context->getState().getProgramPipeline()->getMergedVaryings();
ANGLE_TRY(linkMergedVaryings(context, *mState.mExecutable, mergedVaryings));
mergedVaryings = context->getState().getProgramPipeline()->getMergedVaryings();
}
else
{
const ProgramMergedVaryings &mergedVaryings = getMergedVaryings();
ANGLE_TRY(linkMergedVaryings(context, *mState.mExecutable, mergedVaryings));
mergedVaryings = getMergedVaryings();
}
ANGLE_TRY(linkMergedVaryings(context, *mState.mExecutable, mergedVaryings));
}
updateLinkedShaderStages();
......@@ -1600,7 +1600,8 @@ angle::Result Program::linkImpl(const Context *context)
mLinkingState.reset(new LinkingState());
mLinkingState->linkingFromBinary = false;
mLinkingState->programHash = programHash;
mLinkingState->linkEvent = mProgram->link(context, mState.mExecutable->getResources(), infoLog);
mLinkingState->linkEvent =
mProgram->link(context, mState.mExecutable->getResources(), infoLog, mergedVaryings);
// Must be after mProgram->link() to avoid misleading the linker about output variables.
mState.updateProgramInterfaceInputs();
......
......@@ -540,6 +540,8 @@ ProgramMergedVaryings ProgramPipeline::getMergedVaryings() const
// The code gets compiled into binaries.
angle::Result ProgramPipeline::link(const Context *context)
{
ProgramMergedVaryings mergedVaryings;
if (!getExecutable().isCompute())
{
InfoLog &infoLog = mState.mExecutable->getInfoLog();
......@@ -575,7 +577,7 @@ angle::Result ProgramPipeline::link(const Context *context)
static_cast<GLuint>(context->getState().getCaps().maxVaryingVectors);
VaryingPacking varyingPacking(maxVaryingVectors, packMode);
const ProgramMergedVaryings &mergedVaryings = getMergedVaryings();
mergedVaryings = getMergedVaryings();
for (ShaderType shaderType : getExecutable().getLinkedShaderStages())
{
Program *program = mState.mPrograms[shaderType];
......@@ -586,7 +588,7 @@ angle::Result ProgramPipeline::link(const Context *context)
}
}
ANGLE_TRY(getImplementation()->link(context));
ANGLE_TRY(getImplementation()->link(context, mergedVaryings));
return angle::Result::Continue;
}
......
......@@ -84,8 +84,9 @@ class ProgramImpl : angle::NonCopyable
virtual std::unique_ptr<LinkEvent> link(const gl::Context *context,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog) = 0;
virtual GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) = 0;
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings &mergedVaryings) = 0;
virtual GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) = 0;
virtual void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) = 0;
virtual void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) = 0;
......
......@@ -32,7 +32,11 @@ class MockProgramImpl : public rx::ProgramImpl
MOCK_METHOD3(link,
std::unique_ptr<LinkEvent>(const gl::Context *,
const gl::ProgramLinkedResources &,
gl::InfoLog &));
gl::InfoLog &))
std::unique_ptr<LinkEvent> link(const gl::Context *gmock_a0,
const gl::ProgramLinkedResources &gmock_a1,
gl::InfoLog &gmock_a2,
const gl::ProgramMergedVaryings &mergedVaryings);
MOCK_METHOD2(validate, GLboolean(const gl::Caps &, gl::InfoLog *));
MOCK_METHOD3(setUniform1fv, void(GLint, GLsizei, const GLfloat *));
......
......@@ -11,7 +11,8 @@
namespace rx
{
angle::Result ProgramPipelineImpl::link(const gl::Context *context)
angle::Result ProgramPipelineImpl::link(const gl::Context *context,
const gl::ProgramMergedVaryings &mergedVaryings)
{
return angle::Result::Continue;
}
......
......@@ -23,7 +23,8 @@ class ProgramPipelineImpl : public angle::NonCopyable
virtual ~ProgramPipelineImpl() {}
virtual void destroy(const gl::Context *context) {}
virtual angle::Result link(const gl::Context *context);
virtual angle::Result link(const gl::Context *context,
const gl::ProgramMergedVaryings &mergedVaryings);
const gl::ProgramPipelineState &getState() const { return mState; }
......
......@@ -2032,7 +2032,8 @@ angle::Result ProgramD3D::getComputeExecutableForImage2DBindLayout(
std::unique_ptr<LinkEvent> ProgramD3D::link(const gl::Context *context,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog)
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings & /*mergedVaryings*/)
{
ANGLE_TRACE_EVENT0("gpu.angle", "ProgramD3D::link");
const auto &data = context->getState();
......
......@@ -233,7 +233,8 @@ class ProgramD3D : public ProgramImpl
gl::InfoLog *infoLog);
std::unique_ptr<LinkEvent> link(const gl::Context *context,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog) override;
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings &mergedVaryings) override;
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
void updateUniformBufferCache(const gl::Caps &caps);
......
......@@ -221,7 +221,8 @@ class ProgramGL::LinkEventGL final : public LinkEvent
std::unique_ptr<LinkEvent> ProgramGL::link(const gl::Context *context,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog)
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings & /*mergedVaryings*/)
{
ANGLE_TRACE_EVENT0("gpu.angle", "ProgramGL::link");
......
......@@ -45,7 +45,8 @@ class ProgramGL : public ProgramImpl
std::unique_ptr<LinkEvent> link(const gl::Context *contextImpl,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog) override;
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings &mergedVaryings) override;
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
......
......@@ -55,7 +55,8 @@ class ProgramMtl : public ProgramImpl, public mtl::RenderPipelineCacheSpecialize
std::unique_ptr<LinkEvent> link(const gl::Context *context,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog) override;
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings &mergedVaryings) override;
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
......
......@@ -245,7 +245,8 @@ void ProgramMtl::setSeparable(bool separable)
std::unique_ptr<LinkEvent> ProgramMtl::link(const gl::Context *context,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog)
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings & /* mergedVaryings */)
{
// Link resources before calling GetShaderSource to make sure they are ready for the set/binding
// assignment done in that function.
......
......@@ -33,7 +33,8 @@ void ProgramNULL::setSeparable(bool separable) {}
std::unique_ptr<LinkEvent> ProgramNULL::link(const gl::Context *contextImpl,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog)
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings & /*mergedVaryings*/)
{
return std::make_unique<LinkEventDone>(angle::Result::Continue);
}
......
......@@ -30,7 +30,8 @@ class ProgramNULL : public ProgramImpl
std::unique_ptr<LinkEvent> link(const gl::Context *context,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog) override;
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings &mergedVaryings) override;
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
......
......@@ -52,7 +52,8 @@ void ProgramPipelineVk::fillProgramStateMap(
}
}
angle::Result ProgramPipelineVk::link(const gl::Context *glContext)
angle::Result ProgramPipelineVk::link(const gl::Context *glContext,
const gl::ProgramMergedVaryings & /*mergedVaryings*/)
{
ContextVk *contextVk = vk::GetImpl(glContext);
const gl::State &glState = glContext->getState();
......
......@@ -45,7 +45,8 @@ class ProgramPipelineVk : public ProgramPipelineImpl
void fillProgramStateMap(const ContextVk *contextVk,
gl::ShaderMap<const gl::ProgramState *> *programStatesOut);
angle::Result link(const gl::Context *context) override;
angle::Result link(const gl::Context *glContext,
const gl::ProgramMergedVaryings &mergedVaryings) override;
angle::Result updateUniforms(ContextVk *contextVk);
......
......@@ -254,7 +254,8 @@ void ProgramVk::fillProgramStateMap(gl::ShaderMap<const gl::ProgramState *> *pro
std::unique_ptr<LinkEvent> ProgramVk::link(const gl::Context *context,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog)
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings & /*mergedVaryings*/)
{
ANGLE_TRACE_EVENT0("gpu.angle", "ProgramVk::link");
......
......@@ -46,7 +46,8 @@ class ProgramVk : public ProgramImpl
std::unique_ptr<LinkEvent> link(const gl::Context *context,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog) override;
gl::InfoLog &infoLog,
const gl::ProgramMergedVaryings &mergedVaryings) override;
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
......
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