vk: Handle WAW and RAW hazards when performing "flush" operations
This commit is contained in:
@@ -100,7 +100,7 @@ namespace vk
|
|||||||
auto dma_sync_region = valid_range;
|
auto dma_sync_region = valid_range;
|
||||||
dma_mapping_handle dma_mapping = { 0, nullptr };
|
dma_mapping_handle dma_mapping = { 0, nullptr };
|
||||||
|
|
||||||
auto dma_sync = [&dma_sync_region, &dma_mapping](bool load, bool force = false)
|
auto dma_sync = [&](bool load, bool force = false)
|
||||||
{
|
{
|
||||||
if (dma_mapping.second && !force)
|
if (dma_mapping.second && !force)
|
||||||
{
|
{
|
||||||
@@ -335,6 +335,14 @@ namespace vk
|
|||||||
vkCmdCopyImageToBuffer(cmd, src->value, src->current_layout, dma_mapping.second->value, 1, ®ion);
|
vkCmdCopyImageToBuffer(cmd, src->value, src->current_layout, dma_mapping.second->value, 1, ®ion);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Post-transfer barrier on dma layer
|
||||||
|
vk::insert_buffer_memory_barrier(
|
||||||
|
cmd, dma_mapping.second->value,
|
||||||
|
dma_mapping.first, dma_sync_region.length(),
|
||||||
|
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
|
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT
|
||||||
|
);
|
||||||
|
|
||||||
src->pop_layout(cmd);
|
src->pop_layout(cmd);
|
||||||
|
|
||||||
VkBufferMemoryBarrier2KHR mem_barrier =
|
VkBufferMemoryBarrier2KHR mem_barrier =
|
||||||
|
|||||||
Reference in New Issue
Block a user