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