Commit 79ae52dd by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Fix missing visibility barrier for host-visible buffer writes

See https://chromium-review.googlesource.com/c/angle/angle/+/1661252 for context. This was accidentally broken during the command graph rework. This will eventually be validated by syncval. See https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2329. Bug: angleproject:5070 Change-Id: Ic16fa900e554d46e54b42fc3fbe0f96d5327fa0f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2689379Reviewed-by: 's avatarCharlie Lao <cclao@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
parent 30622479
......@@ -931,7 +931,7 @@ angle::Result ContextVk::setupIndirectDraw(const gl::Context *context,
mCurrentIndirectBuffer = indirectBuffer;
}
mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
mRenderPassCommands->bufferRead(this, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, indirectBuffer);
ANGLE_TRY(setupDraw(context, mode, firstVertex, vertexCount, instanceCount,
......@@ -1295,7 +1295,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl(
// Note: if another range of the same buffer is simultaneously used for storage,
// such as for transform feedback output, or SSBO, unnecessary barriers can be
// generated.
commandBufferHelper->bufferRead(&mResourceUseList, VK_ACCESS_SHADER_READ_BIT,
commandBufferHelper->bufferRead(this, VK_ACCESS_SHADER_READ_BIT,
vk::GetPipelineStage(stage), &buffer);
}
......@@ -1396,7 +1396,7 @@ angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(DirtyBits::Iterator *d
vk::BufferHelper *arrayBuffer = arrayBufferResources[attribIndex];
if (arrayBuffer)
{
mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
mRenderPassCommands->bufferRead(this, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
vk::PipelineStage::VertexInput, arrayBuffer);
}
}
......@@ -1413,8 +1413,8 @@ angle::Result ContextVk::handleDirtyGraphicsIndexBuffer(DirtyBits::Iterator *dir
mVertexArray->getCurrentElementArrayBufferOffset(),
getVkIndexType(mCurrentDrawElementsType));
mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDEX_READ_BIT,
vk::PipelineStage::VertexInput, elementArrayBuffer);
mRenderPassCommands->bufferRead(this, VK_ACCESS_INDEX_READ_BIT, vk::PipelineStage::VertexInput,
elementArrayBuffer);
return angle::Result::Continue;
}
......@@ -1433,8 +1433,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyShaderResourcesImpl(
if (executable->hasUniformBuffers() || executable->hasStorageBuffers() ||
executable->hasAtomicCounterBuffers() || executable->hasImages())
{
ANGLE_TRY(mExecutable->updateShaderResourcesDescriptorSet(this, &mResourceUseList,
commandBufferHelper));
ANGLE_TRY(mExecutable->updateShaderResourcesDescriptorSet(this, commandBufferHelper));
}
return angle::Result::Continue;
}
......@@ -1472,7 +1471,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation(
{
vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex];
ASSERT(bufferHelper);
mRenderPassCommands->bufferWrite(&mResourceUseList, VK_ACCESS_SHADER_WRITE_BIT,
mRenderPassCommands->bufferWrite(this, VK_ACCESS_SHADER_WRITE_BIT,
vk::PipelineStage::VertexShader,
vk::AliasingMode::Disallowed, bufferHelper);
}
......@@ -1510,9 +1509,9 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension(
{
vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex];
ASSERT(bufferHelper);
mRenderPassCommands->bufferWrite(
&mResourceUseList, VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
vk::PipelineStage::TransformFeedback, vk::AliasingMode::Disallowed, bufferHelper);
mRenderPassCommands->bufferWrite(this, VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
vk::PipelineStage::TransformFeedback,
vk::AliasingMode::Disallowed, bufferHelper);
}
const gl::TransformFeedbackBuffersArray<VkBuffer> &bufferHandles =
......@@ -2252,7 +2251,7 @@ angle::Result ContextVk::drawArraysIndirect(const gl::Context *context,
if (mVertexArray->getStreamingVertexAttribsMask().any())
{
mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
mRenderPassCommands->bufferRead(this, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, currentIndirectBuf);
// We have instanced vertex attributes that need to be emulated for Vulkan.
......@@ -2306,7 +2305,7 @@ angle::Result ContextVk::drawElementsIndirect(const gl::Context *context,
if (mVertexArray->getStreamingVertexAttribsMask().any())
{
mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
mRenderPassCommands->bufferRead(this, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, currentIndirectBuf);
// We have instanced vertex attributes that need to be emulated for Vulkan.
......@@ -3706,7 +3705,7 @@ angle::Result ContextVk::dispatchComputeIndirect(const gl::Context *context, GLi
gl::Buffer *glBuffer = getState().getTargetBuffer(gl::BufferBinding::DispatchIndirect);
vk::BufferHelper &buffer = vk::GetImpl(glBuffer)->getBuffer();
mOutsideRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
mOutsideRenderPassCommands->bufferRead(this, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, &buffer);
mOutsideRenderPassCommands->getCommandBuffer().dispatchIndirect(buffer.getBuffer(), indirect);
......@@ -4328,7 +4327,7 @@ angle::Result ContextVk::updateActiveImages(vk::CommandBufferHelper *commandBuff
for (gl::ShaderType stage : shaderStages)
{
commandBufferHelper->bufferWrite(
&mResourceUseList, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
this, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
vk::GetPipelineStage(stage), vk::AliasingMode::Disallowed, &buffer);
}
......@@ -5171,8 +5170,8 @@ angle::Result ContextVk::onResourceAccess(const vk::CommandBufferAccess &access)
ASSERT(!mRenderPassCommands->usesBufferForWrite(*bufferAccess.buffer));
ASSERT(!mOutsideRenderPassCommands->usesBufferForWrite(*bufferAccess.buffer));
mOutsideRenderPassCommands->bufferRead(&mResourceUseList, bufferAccess.accessType,
bufferAccess.stage, bufferAccess.buffer);
mOutsideRenderPassCommands->bufferRead(this, bufferAccess.accessType, bufferAccess.stage,
bufferAccess.buffer);
}
for (const vk::CommandBufferBufferAccess &bufferAccess : access.getWriteBuffers())
......@@ -5180,9 +5179,8 @@ angle::Result ContextVk::onResourceAccess(const vk::CommandBufferAccess &access)
ASSERT(!mRenderPassCommands->usesBuffer(*bufferAccess.buffer));
ASSERT(!mOutsideRenderPassCommands->usesBuffer(*bufferAccess.buffer));
mOutsideRenderPassCommands->bufferWrite(&mResourceUseList, bufferAccess.accessType,
bufferAccess.stage, vk::AliasingMode::Disallowed,
bufferAccess.buffer);
mOutsideRenderPassCommands->bufferWrite(this, bufferAccess.accessType, bufferAccess.stage,
vk::AliasingMode::Disallowed, bufferAccess.buffer);
}
return angle::Result::Continue;
......
......@@ -1009,7 +1009,6 @@ void ProgramExecutableVk::updateDefaultUniformsDescriptorSet(
angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
ContextVk *contextVk,
const gl::ShaderType shaderType,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper,
const std::vector<gl::InterfaceBlock> &blocks,
VkDescriptorType descriptorType)
......@@ -1087,13 +1086,13 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
{
// We set the SHADER_READ_BIT to be conservative.
VkAccessFlags accessFlags = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
commandBufferHelper->bufferWrite(resourceUseList, accessFlags,
commandBufferHelper->bufferWrite(contextVk, accessFlags,
vk::GetPipelineStage(shaderType),
vk::AliasingMode::Allowed, &bufferHelper);
}
else
{
commandBufferHelper->bufferRead(resourceUseList, VK_ACCESS_UNIFORM_READ_BIT,
commandBufferHelper->bufferRead(contextVk, VK_ACCESS_UNIFORM_READ_BIT,
vk::GetPipelineStage(shaderType), &bufferHelper);
}
}
......@@ -1105,7 +1104,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
const gl::ProgramState &programState,
const gl::ShaderType shaderType,
ContextVk *contextVk,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper)
{
const gl::State &glState = contextVk->getState();
......@@ -1169,7 +1167,7 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
// We set SHADER_READ_BIT to be conservative.
commandBufferHelper->bufferWrite(
resourceUseList, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
contextVk, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
vk::GetPipelineStage(shaderType), vk::AliasingMode::Allowed, &bufferHelper);
writtenBindings.set(binding);
......@@ -1338,7 +1336,6 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet(
angle::Result ProgramExecutableVk::updateShaderResourcesDescriptorSet(
ContextVk *contextVk,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper)
{
const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable();
......@@ -1355,14 +1352,14 @@ angle::Result ProgramExecutableVk::updateShaderResourcesDescriptorSet(
const gl::ProgramState *programState = programStates[shaderType];
ASSERT(programState);
ANGLE_TRY(updateBuffersDescriptorSet(contextVk, shaderType, resourceUseList,
commandBufferHelper, programState->getUniformBlocks(),
ANGLE_TRY(updateBuffersDescriptorSet(contextVk, shaderType, commandBufferHelper,
programState->getUniformBlocks(),
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER));
ANGLE_TRY(updateBuffersDescriptorSet(
contextVk, shaderType, resourceUseList, commandBufferHelper,
programState->getShaderStorageBlocks(), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
ANGLE_TRY(updateBuffersDescriptorSet(contextVk, shaderType, commandBufferHelper,
programState->getShaderStorageBlocks(),
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
ANGLE_TRY(updateAtomicCounterBuffersDescriptorSet(*programState, shaderType, contextVk,
resourceUseList, commandBufferHelper));
commandBufferHelper));
ANGLE_TRY(updateImagesDescriptorSet(contextVk, programState->getExecutable(), shaderType));
}
......
......@@ -146,7 +146,6 @@ class ProgramExecutableVk
angle::Result updateTexturesDescriptorSet(ContextVk *contextVk);
angle::Result updateShaderResourcesDescriptorSet(ContextVk *contextVk,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper);
angle::Result updateTransformFeedbackDescriptorSet(
const gl::ProgramState &programState,
......@@ -215,7 +214,6 @@ class ProgramExecutableVk
ContextVk *contextVk);
angle::Result updateBuffersDescriptorSet(ContextVk *contextVk,
const gl::ShaderType shaderType,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper,
const std::vector<gl::InterfaceBlock> &blocks,
VkDescriptorType descriptorType);
......@@ -223,7 +221,6 @@ class ProgramExecutableVk
const gl::ProgramState &programState,
const gl::ShaderType shaderType,
ContextVk *contextVk,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper);
angle::Result updateImagesDescriptorSet(ContextVk *contextVk,
const gl::ProgramExecutable &executable,
......
......@@ -839,12 +839,12 @@ bool CommandBufferHelper::usesBufferForWrite(const BufferHelper &buffer) const
return access == BufferAccess::Write;
}
void CommandBufferHelper::bufferRead(ResourceUseList *resourceUseList,
void CommandBufferHelper::bufferRead(ContextVk *contextVk,
VkAccessFlags readAccessType,
PipelineStage readStage,
BufferHelper *buffer)
{
buffer->retain(resourceUseList);
buffer->retain(&contextVk->getResourceUseList());
VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[readStage];
if (buffer->recordReadBarrier(readAccessType, stageBits, &mPipelineBarriers[readStage]))
{
......@@ -858,13 +858,13 @@ void CommandBufferHelper::bufferRead(ResourceUseList *resourceUseList,
}
}
void CommandBufferHelper::bufferWrite(ResourceUseList *resourceUseList,
void CommandBufferHelper::bufferWrite(ContextVk *contextVk,
VkAccessFlags writeAccessType,
PipelineStage writeStage,
AliasingMode aliasingMode,
BufferHelper *buffer)
{
buffer->retain(resourceUseList);
buffer->retain(&contextVk->getResourceUseList());
VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[writeStage];
if (buffer->recordWriteBarrier(writeAccessType, stageBits, &mPipelineBarriers[writeStage]))
{
......@@ -880,6 +880,14 @@ void CommandBufferHelper::bufferWrite(ResourceUseList *resourceUseList,
ASSERT(!usesBuffer(*buffer));
mUsedBuffers.insert(buffer->getBufferSerial().getValue(), BufferAccess::Write);
}
// Make sure host-visible buffer writes result in a barrier inserted at the end of the frame to
// make the results visible to the host. The buffer may be mapped by the application in the
// future.
if (buffer->isHostVisible())
{
contextVk->onHostVisibleBufferWrite();
}
}
void CommandBufferHelper::imageRead(ContextVk *contextVk,
......
......@@ -985,11 +985,11 @@ class CommandBufferHelper : angle::NonCopyable
// General Functions (non-renderPass specific)
void initialize(bool isRenderPassCommandBuffer);
void bufferRead(ResourceUseList *resourceUseList,
void bufferRead(ContextVk *contextVk,
VkAccessFlags readAccessType,
PipelineStage readStage,
BufferHelper *buffer);
void bufferWrite(ResourceUseList *resourceUseList,
void bufferWrite(ContextVk *contextVk,
VkAccessFlags writeAccessType,
PipelineStage writeStage,
AliasingMode aliasingMode,
......
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