Commit 0f2542e1 by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Validate SPIR-V transformer at link time

Using an ASSERT, the SPIR-V transformer is run at link time to catch bugs in tests that link but don't draw. Bug: angleproject:4249 Change-Id: Icbeeb6e968f9901ba003918b1dd1d2eef0792469 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2488227Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
parent 883276cc
...@@ -44,6 +44,25 @@ VkDeviceSize GetShaderBufferBindingSize(const gl::OffsetBindingPointer<gl::Buffe ...@@ -44,6 +44,25 @@ VkDeviceSize GetShaderBufferBindingSize(const gl::OffsetBindingPointer<gl::Buffe
ASSERT(bufferGL->getSize() >= bufferBinding.getOffset()); ASSERT(bufferGL->getSize() >= bufferBinding.getOffset());
return bufferGL->getSize() - bufferBinding.getOffset(); return bufferGL->getSize() - bufferBinding.getOffset();
} }
bool ValidateTransformedSpirV(ContextVk *contextVk,
const gl::ShaderBitSet &linkedShaderStages,
ProgramExecutableVk *executableVk,
const gl::ShaderMap<SpirvBlob> &spirvBlobs)
{
for (gl::ShaderType shaderType : linkedShaderStages)
{
SpirvBlob transformed;
if (GlslangWrapperVk::TransformSpirV(
contextVk, shaderType, false,
executableVk->getShaderInterfaceVariableInfoMap()[shaderType],
spirvBlobs[shaderType], &transformed) != angle::Result::Continue)
{
return false;
}
}
return true;
}
} // namespace } // namespace
DefaultUniformBlock::DefaultUniformBlock() = default; DefaultUniformBlock::DefaultUniformBlock() = default;
...@@ -57,13 +76,17 @@ ShaderInfo::~ShaderInfo() = default; ...@@ -57,13 +76,17 @@ ShaderInfo::~ShaderInfo() = default;
angle::Result ShaderInfo::initShaders(ContextVk *contextVk, angle::Result ShaderInfo::initShaders(ContextVk *contextVk,
const gl::ShaderBitSet &linkedShaderStages, const gl::ShaderBitSet &linkedShaderStages,
const gl::ShaderMap<std::string> &shaderSources) const gl::ShaderMap<std::string> &shaderSources,
ProgramExecutableVk *executableVk)
{ {
ASSERT(!valid()); ASSERT(!valid());
ANGLE_TRY(GlslangWrapperVk::GetShaderCode(contextVk, linkedShaderStages, contextVk->getCaps(), ANGLE_TRY(GlslangWrapperVk::GetShaderCode(contextVk, linkedShaderStages, contextVk->getCaps(),
shaderSources, &mSpirvBlobs)); shaderSources, &mSpirvBlobs));
// Assert that SPIR-V transformation is correct, even if the test never issues a draw call.
ASSERT(ValidateTransformedSpirV(contextVk, linkedShaderStages, executableVk, mSpirvBlobs));
mIsInitialized = true; mIsInitialized = true;
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -30,7 +30,8 @@ class ShaderInfo final : angle::NonCopyable ...@@ -30,7 +30,8 @@ class ShaderInfo final : angle::NonCopyable
angle::Result initShaders(ContextVk *contextVk, angle::Result initShaders(ContextVk *contextVk,
const gl::ShaderBitSet &linkedShaderStages, const gl::ShaderBitSet &linkedShaderStages,
const gl::ShaderMap<std::string> &shaderSources); const gl::ShaderMap<std::string> &shaderSources,
ProgramExecutableVk *executableVk);
void release(ContextVk *contextVk); void release(ContextVk *contextVk);
ANGLE_INLINE bool valid() const { return mIsInitialized; } ANGLE_INLINE bool valid() const { return mIsInitialized; }
......
...@@ -275,7 +275,7 @@ std::unique_ptr<LinkEvent> ProgramVk::link(const gl::Context *context, ...@@ -275,7 +275,7 @@ std::unique_ptr<LinkEvent> ProgramVk::link(const gl::Context *context,
// Compile the shaders. // Compile the shaders.
angle::Result status = mOriginalShaderInfo.initShaders( angle::Result status = mOriginalShaderInfo.initShaders(
contextVk, mState.getExecutable().getLinkedShaderStages(), shaderSources); contextVk, mState.getExecutable().getLinkedShaderStages(), shaderSources, &mExecutable);
if (status != angle::Result::Continue) if (status != angle::Result::Continue)
{ {
return std::make_unique<LinkEventDone>(status); return std::make_unique<LinkEventDone>(status);
......
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