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, ...@@ -931,7 +931,7 @@ angle::Result ContextVk::setupIndirectDraw(const gl::Context *context,
mCurrentIndirectBuffer = indirectBuffer; mCurrentIndirectBuffer = indirectBuffer;
} }
mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT, mRenderPassCommands->bufferRead(this, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, indirectBuffer); vk::PipelineStage::DrawIndirect, indirectBuffer);
ANGLE_TRY(setupDraw(context, mode, firstVertex, vertexCount, instanceCount, ANGLE_TRY(setupDraw(context, mode, firstVertex, vertexCount, instanceCount,
...@@ -1295,7 +1295,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl( ...@@ -1295,7 +1295,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl(
// Note: if another range of the same buffer is simultaneously used for storage, // 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 // such as for transform feedback output, or SSBO, unnecessary barriers can be
// generated. // generated.
commandBufferHelper->bufferRead(&mResourceUseList, VK_ACCESS_SHADER_READ_BIT, commandBufferHelper->bufferRead(this, VK_ACCESS_SHADER_READ_BIT,
vk::GetPipelineStage(stage), &buffer); vk::GetPipelineStage(stage), &buffer);
} }
...@@ -1396,7 +1396,7 @@ angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(DirtyBits::Iterator *d ...@@ -1396,7 +1396,7 @@ angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(DirtyBits::Iterator *d
vk::BufferHelper *arrayBuffer = arrayBufferResources[attribIndex]; vk::BufferHelper *arrayBuffer = arrayBufferResources[attribIndex];
if (arrayBuffer) if (arrayBuffer)
{ {
mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, mRenderPassCommands->bufferRead(this, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
vk::PipelineStage::VertexInput, arrayBuffer); vk::PipelineStage::VertexInput, arrayBuffer);
} }
} }
...@@ -1413,8 +1413,8 @@ angle::Result ContextVk::handleDirtyGraphicsIndexBuffer(DirtyBits::Iterator *dir ...@@ -1413,8 +1413,8 @@ angle::Result ContextVk::handleDirtyGraphicsIndexBuffer(DirtyBits::Iterator *dir
mVertexArray->getCurrentElementArrayBufferOffset(), mVertexArray->getCurrentElementArrayBufferOffset(),
getVkIndexType(mCurrentDrawElementsType)); getVkIndexType(mCurrentDrawElementsType));
mRenderPassCommands->bufferRead(&mResourceUseList, VK_ACCESS_INDEX_READ_BIT, mRenderPassCommands->bufferRead(this, VK_ACCESS_INDEX_READ_BIT, vk::PipelineStage::VertexInput,
vk::PipelineStage::VertexInput, elementArrayBuffer); elementArrayBuffer);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1433,8 +1433,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyShaderResourcesImpl( ...@@ -1433,8 +1433,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyShaderResourcesImpl(
if (executable->hasUniformBuffers() || executable->hasStorageBuffers() || if (executable->hasUniformBuffers() || executable->hasStorageBuffers() ||
executable->hasAtomicCounterBuffers() || executable->hasImages()) executable->hasAtomicCounterBuffers() || executable->hasImages())
{ {
ANGLE_TRY(mExecutable->updateShaderResourcesDescriptorSet(this, &mResourceUseList, ANGLE_TRY(mExecutable->updateShaderResourcesDescriptorSet(this, commandBufferHelper));
commandBufferHelper));
} }
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1472,7 +1471,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation( ...@@ -1472,7 +1471,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation(
{ {
vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex]; vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex];
ASSERT(bufferHelper); ASSERT(bufferHelper);
mRenderPassCommands->bufferWrite(&mResourceUseList, VK_ACCESS_SHADER_WRITE_BIT, mRenderPassCommands->bufferWrite(this, VK_ACCESS_SHADER_WRITE_BIT,
vk::PipelineStage::VertexShader, vk::PipelineStage::VertexShader,
vk::AliasingMode::Disallowed, bufferHelper); vk::AliasingMode::Disallowed, bufferHelper);
} }
...@@ -1510,9 +1509,9 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension( ...@@ -1510,9 +1509,9 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension(
{ {
vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex]; vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex];
ASSERT(bufferHelper); ASSERT(bufferHelper);
mRenderPassCommands->bufferWrite( mRenderPassCommands->bufferWrite(this, VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
&mResourceUseList, VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, vk::PipelineStage::TransformFeedback,
vk::PipelineStage::TransformFeedback, vk::AliasingMode::Disallowed, bufferHelper); vk::AliasingMode::Disallowed, bufferHelper);
} }
const gl::TransformFeedbackBuffersArray<VkBuffer> &bufferHandles = const gl::TransformFeedbackBuffersArray<VkBuffer> &bufferHandles =
...@@ -2252,7 +2251,7 @@ angle::Result ContextVk::drawArraysIndirect(const gl::Context *context, ...@@ -2252,7 +2251,7 @@ angle::Result ContextVk::drawArraysIndirect(const gl::Context *context,
if (mVertexArray->getStreamingVertexAttribsMask().any()) 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); vk::PipelineStage::DrawIndirect, currentIndirectBuf);
// We have instanced vertex attributes that need to be emulated for Vulkan. // We have instanced vertex attributes that need to be emulated for Vulkan.
...@@ -2306,7 +2305,7 @@ angle::Result ContextVk::drawElementsIndirect(const gl::Context *context, ...@@ -2306,7 +2305,7 @@ angle::Result ContextVk::drawElementsIndirect(const gl::Context *context,
if (mVertexArray->getStreamingVertexAttribsMask().any()) 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); vk::PipelineStage::DrawIndirect, currentIndirectBuf);
// We have instanced vertex attributes that need to be emulated for Vulkan. // 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 ...@@ -3706,7 +3705,7 @@ angle::Result ContextVk::dispatchComputeIndirect(const gl::Context *context, GLi
gl::Buffer *glBuffer = getState().getTargetBuffer(gl::BufferBinding::DispatchIndirect); gl::Buffer *glBuffer = getState().getTargetBuffer(gl::BufferBinding::DispatchIndirect);
vk::BufferHelper &buffer = vk::GetImpl(glBuffer)->getBuffer(); 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); vk::PipelineStage::DrawIndirect, &buffer);
mOutsideRenderPassCommands->getCommandBuffer().dispatchIndirect(buffer.getBuffer(), indirect); mOutsideRenderPassCommands->getCommandBuffer().dispatchIndirect(buffer.getBuffer(), indirect);
...@@ -4328,7 +4327,7 @@ angle::Result ContextVk::updateActiveImages(vk::CommandBufferHelper *commandBuff ...@@ -4328,7 +4327,7 @@ angle::Result ContextVk::updateActiveImages(vk::CommandBufferHelper *commandBuff
for (gl::ShaderType stage : shaderStages) for (gl::ShaderType stage : shaderStages)
{ {
commandBufferHelper->bufferWrite( 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); vk::GetPipelineStage(stage), vk::AliasingMode::Disallowed, &buffer);
} }
...@@ -5171,8 +5170,8 @@ angle::Result ContextVk::onResourceAccess(const vk::CommandBufferAccess &access) ...@@ -5171,8 +5170,8 @@ angle::Result ContextVk::onResourceAccess(const vk::CommandBufferAccess &access)
ASSERT(!mRenderPassCommands->usesBufferForWrite(*bufferAccess.buffer)); ASSERT(!mRenderPassCommands->usesBufferForWrite(*bufferAccess.buffer));
ASSERT(!mOutsideRenderPassCommands->usesBufferForWrite(*bufferAccess.buffer)); ASSERT(!mOutsideRenderPassCommands->usesBufferForWrite(*bufferAccess.buffer));
mOutsideRenderPassCommands->bufferRead(&mResourceUseList, bufferAccess.accessType, mOutsideRenderPassCommands->bufferRead(this, bufferAccess.accessType, bufferAccess.stage,
bufferAccess.stage, bufferAccess.buffer); bufferAccess.buffer);
} }
for (const vk::CommandBufferBufferAccess &bufferAccess : access.getWriteBuffers()) for (const vk::CommandBufferBufferAccess &bufferAccess : access.getWriteBuffers())
...@@ -5180,9 +5179,8 @@ angle::Result ContextVk::onResourceAccess(const vk::CommandBufferAccess &access) ...@@ -5180,9 +5179,8 @@ angle::Result ContextVk::onResourceAccess(const vk::CommandBufferAccess &access)
ASSERT(!mRenderPassCommands->usesBuffer(*bufferAccess.buffer)); ASSERT(!mRenderPassCommands->usesBuffer(*bufferAccess.buffer));
ASSERT(!mOutsideRenderPassCommands->usesBuffer(*bufferAccess.buffer)); ASSERT(!mOutsideRenderPassCommands->usesBuffer(*bufferAccess.buffer));
mOutsideRenderPassCommands->bufferWrite(&mResourceUseList, bufferAccess.accessType, mOutsideRenderPassCommands->bufferWrite(this, bufferAccess.accessType, bufferAccess.stage,
bufferAccess.stage, vk::AliasingMode::Disallowed, vk::AliasingMode::Disallowed, bufferAccess.buffer);
bufferAccess.buffer);
} }
return angle::Result::Continue; return angle::Result::Continue;
......
...@@ -1009,7 +1009,6 @@ void ProgramExecutableVk::updateDefaultUniformsDescriptorSet( ...@@ -1009,7 +1009,6 @@ void ProgramExecutableVk::updateDefaultUniformsDescriptorSet(
angle::Result ProgramExecutableVk::updateBuffersDescriptorSet( angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
ContextVk *contextVk, ContextVk *contextVk,
const gl::ShaderType shaderType, const gl::ShaderType shaderType,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper, vk::CommandBufferHelper *commandBufferHelper,
const std::vector<gl::InterfaceBlock> &blocks, const std::vector<gl::InterfaceBlock> &blocks,
VkDescriptorType descriptorType) VkDescriptorType descriptorType)
...@@ -1087,13 +1086,13 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet( ...@@ -1087,13 +1086,13 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
{ {
// We set the SHADER_READ_BIT to be conservative. // We set the SHADER_READ_BIT to be conservative.
VkAccessFlags accessFlags = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; VkAccessFlags accessFlags = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
commandBufferHelper->bufferWrite(resourceUseList, accessFlags, commandBufferHelper->bufferWrite(contextVk, accessFlags,
vk::GetPipelineStage(shaderType), vk::GetPipelineStage(shaderType),
vk::AliasingMode::Allowed, &bufferHelper); vk::AliasingMode::Allowed, &bufferHelper);
} }
else else
{ {
commandBufferHelper->bufferRead(resourceUseList, VK_ACCESS_UNIFORM_READ_BIT, commandBufferHelper->bufferRead(contextVk, VK_ACCESS_UNIFORM_READ_BIT,
vk::GetPipelineStage(shaderType), &bufferHelper); vk::GetPipelineStage(shaderType), &bufferHelper);
} }
} }
...@@ -1105,7 +1104,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet( ...@@ -1105,7 +1104,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
const gl::ProgramState &programState, const gl::ProgramState &programState,
const gl::ShaderType shaderType, const gl::ShaderType shaderType,
ContextVk *contextVk, ContextVk *contextVk,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper) vk::CommandBufferHelper *commandBufferHelper)
{ {
const gl::State &glState = contextVk->getState(); const gl::State &glState = contextVk->getState();
...@@ -1169,7 +1167,7 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet( ...@@ -1169,7 +1167,7 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
// We set SHADER_READ_BIT to be conservative. // We set SHADER_READ_BIT to be conservative.
commandBufferHelper->bufferWrite( 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); vk::GetPipelineStage(shaderType), vk::AliasingMode::Allowed, &bufferHelper);
writtenBindings.set(binding); writtenBindings.set(binding);
...@@ -1338,7 +1336,6 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet( ...@@ -1338,7 +1336,6 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet(
angle::Result ProgramExecutableVk::updateShaderResourcesDescriptorSet( angle::Result ProgramExecutableVk::updateShaderResourcesDescriptorSet(
ContextVk *contextVk, ContextVk *contextVk,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper) vk::CommandBufferHelper *commandBufferHelper)
{ {
const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable(); const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable();
...@@ -1355,14 +1352,14 @@ angle::Result ProgramExecutableVk::updateShaderResourcesDescriptorSet( ...@@ -1355,14 +1352,14 @@ angle::Result ProgramExecutableVk::updateShaderResourcesDescriptorSet(
const gl::ProgramState *programState = programStates[shaderType]; const gl::ProgramState *programState = programStates[shaderType];
ASSERT(programState); ASSERT(programState);
ANGLE_TRY(updateBuffersDescriptorSet(contextVk, shaderType, resourceUseList, ANGLE_TRY(updateBuffersDescriptorSet(contextVk, shaderType, commandBufferHelper,
commandBufferHelper, programState->getUniformBlocks(), programState->getUniformBlocks(),
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)); VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER));
ANGLE_TRY(updateBuffersDescriptorSet( ANGLE_TRY(updateBuffersDescriptorSet(contextVk, shaderType, commandBufferHelper,
contextVk, shaderType, resourceUseList, commandBufferHelper, programState->getShaderStorageBlocks(),
programState->getShaderStorageBlocks(), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)); VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
ANGLE_TRY(updateAtomicCounterBuffersDescriptorSet(*programState, shaderType, contextVk, ANGLE_TRY(updateAtomicCounterBuffersDescriptorSet(*programState, shaderType, contextVk,
resourceUseList, commandBufferHelper)); commandBufferHelper));
ANGLE_TRY(updateImagesDescriptorSet(contextVk, programState->getExecutable(), shaderType)); ANGLE_TRY(updateImagesDescriptorSet(contextVk, programState->getExecutable(), shaderType));
} }
......
...@@ -146,7 +146,6 @@ class ProgramExecutableVk ...@@ -146,7 +146,6 @@ class ProgramExecutableVk
angle::Result updateTexturesDescriptorSet(ContextVk *contextVk); angle::Result updateTexturesDescriptorSet(ContextVk *contextVk);
angle::Result updateShaderResourcesDescriptorSet(ContextVk *contextVk, angle::Result updateShaderResourcesDescriptorSet(ContextVk *contextVk,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper); vk::CommandBufferHelper *commandBufferHelper);
angle::Result updateTransformFeedbackDescriptorSet( angle::Result updateTransformFeedbackDescriptorSet(
const gl::ProgramState &programState, const gl::ProgramState &programState,
...@@ -215,7 +214,6 @@ class ProgramExecutableVk ...@@ -215,7 +214,6 @@ class ProgramExecutableVk
ContextVk *contextVk); ContextVk *contextVk);
angle::Result updateBuffersDescriptorSet(ContextVk *contextVk, angle::Result updateBuffersDescriptorSet(ContextVk *contextVk,
const gl::ShaderType shaderType, const gl::ShaderType shaderType,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper, vk::CommandBufferHelper *commandBufferHelper,
const std::vector<gl::InterfaceBlock> &blocks, const std::vector<gl::InterfaceBlock> &blocks,
VkDescriptorType descriptorType); VkDescriptorType descriptorType);
...@@ -223,7 +221,6 @@ class ProgramExecutableVk ...@@ -223,7 +221,6 @@ class ProgramExecutableVk
const gl::ProgramState &programState, const gl::ProgramState &programState,
const gl::ShaderType shaderType, const gl::ShaderType shaderType,
ContextVk *contextVk, ContextVk *contextVk,
vk::ResourceUseList *resourceUseList,
vk::CommandBufferHelper *commandBufferHelper); vk::CommandBufferHelper *commandBufferHelper);
angle::Result updateImagesDescriptorSet(ContextVk *contextVk, angle::Result updateImagesDescriptorSet(ContextVk *contextVk,
const gl::ProgramExecutable &executable, const gl::ProgramExecutable &executable,
......
...@@ -839,12 +839,12 @@ bool CommandBufferHelper::usesBufferForWrite(const BufferHelper &buffer) const ...@@ -839,12 +839,12 @@ bool CommandBufferHelper::usesBufferForWrite(const BufferHelper &buffer) const
return access == BufferAccess::Write; return access == BufferAccess::Write;
} }
void CommandBufferHelper::bufferRead(ResourceUseList *resourceUseList, void CommandBufferHelper::bufferRead(ContextVk *contextVk,
VkAccessFlags readAccessType, VkAccessFlags readAccessType,
PipelineStage readStage, PipelineStage readStage,
BufferHelper *buffer) BufferHelper *buffer)
{ {
buffer->retain(resourceUseList); buffer->retain(&contextVk->getResourceUseList());
VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[readStage]; VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[readStage];
if (buffer->recordReadBarrier(readAccessType, stageBits, &mPipelineBarriers[readStage])) if (buffer->recordReadBarrier(readAccessType, stageBits, &mPipelineBarriers[readStage]))
{ {
...@@ -858,13 +858,13 @@ void CommandBufferHelper::bufferRead(ResourceUseList *resourceUseList, ...@@ -858,13 +858,13 @@ void CommandBufferHelper::bufferRead(ResourceUseList *resourceUseList,
} }
} }
void CommandBufferHelper::bufferWrite(ResourceUseList *resourceUseList, void CommandBufferHelper::bufferWrite(ContextVk *contextVk,
VkAccessFlags writeAccessType, VkAccessFlags writeAccessType,
PipelineStage writeStage, PipelineStage writeStage,
AliasingMode aliasingMode, AliasingMode aliasingMode,
BufferHelper *buffer) BufferHelper *buffer)
{ {
buffer->retain(resourceUseList); buffer->retain(&contextVk->getResourceUseList());
VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[writeStage]; VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[writeStage];
if (buffer->recordWriteBarrier(writeAccessType, stageBits, &mPipelineBarriers[writeStage])) if (buffer->recordWriteBarrier(writeAccessType, stageBits, &mPipelineBarriers[writeStage]))
{ {
...@@ -880,6 +880,14 @@ void CommandBufferHelper::bufferWrite(ResourceUseList *resourceUseList, ...@@ -880,6 +880,14 @@ void CommandBufferHelper::bufferWrite(ResourceUseList *resourceUseList,
ASSERT(!usesBuffer(*buffer)); ASSERT(!usesBuffer(*buffer));
mUsedBuffers.insert(buffer->getBufferSerial().getValue(), BufferAccess::Write); 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, void CommandBufferHelper::imageRead(ContextVk *contextVk,
......
...@@ -985,11 +985,11 @@ class CommandBufferHelper : angle::NonCopyable ...@@ -985,11 +985,11 @@ class CommandBufferHelper : angle::NonCopyable
// General Functions (non-renderPass specific) // General Functions (non-renderPass specific)
void initialize(bool isRenderPassCommandBuffer); void initialize(bool isRenderPassCommandBuffer);
void bufferRead(ResourceUseList *resourceUseList, void bufferRead(ContextVk *contextVk,
VkAccessFlags readAccessType, VkAccessFlags readAccessType,
PipelineStage readStage, PipelineStage readStage,
BufferHelper *buffer); BufferHelper *buffer);
void bufferWrite(ResourceUseList *resourceUseList, void bufferWrite(ContextVk *contextVk,
VkAccessFlags writeAccessType, VkAccessFlags writeAccessType,
PipelineStage writeStage, PipelineStage writeStage,
AliasingMode aliasingMode, 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