From f7fdfe52bc39fbee754f36073209f879cd9edc2c Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 14 Jan 2021 23:07:39 +0300 Subject: [PATCH] vk: Fix custom event signals --- rpcs3/Emu/RSX/VK/VKTextureCache.cpp | 2 +- rpcs3/Emu/RSX/VK/vkutils/barriers.cpp | 8 ++++++-- rpcs3/Emu/RSX/VK/vkutils/barriers.h | 6 ++++-- rpcs3/Emu/RSX/VK/vkutils/sync.cpp | 4 ++-- rpcs3/Emu/RSX/VK/vkutils/sync.h | 2 +- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp index 33c81de9a3..3add9ef1db 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp @@ -138,7 +138,7 @@ namespace vk // Create event object for this transfer and queue signal op dma_fence = std::make_unique(*m_device); - dma_fence->signal(cmd, VK_PIPELINE_STAGE_TRANSFER_BIT); + dma_fence->signal(cmd, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT); // Set cb flag for queued dma operations cmd.set_flag(vk::command_buffer::cb_has_dma_transfer); diff --git a/rpcs3/Emu/RSX/VK/vkutils/barriers.cpp b/rpcs3/Emu/RSX/VK/vkutils/barriers.cpp index dc0e29d8a6..d5c66b7d89 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/barriers.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/barriers.cpp @@ -53,14 +53,18 @@ namespace vk vkCmdPipelineBarrier(cmd, src_stage, dst_stage, 0, 0, nullptr, 1, &barrier, 0, nullptr); } - void insert_execution_barrier(VkCommandBuffer cmd, VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage) + void insert_global_memory_barrier(VkCommandBuffer cmd, VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage, VkAccessFlags src_access, VkAccessFlags dst_access) { if (vk::is_renderpass_open(cmd)) { vk::end_renderpass(cmd); } - vkCmdPipelineBarrier(cmd, src_stage, dst_stage, 0, 0, nullptr, 0, nullptr, 0, nullptr); + VkMemoryBarrier barrier = {}; + barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; + barrier.srcAccessMask = src_access; + barrier.dstAccessMask = dst_access; + vkCmdPipelineBarrier(cmd, src_stage, dst_stage, 0, 1, &barrier, 0, nullptr, 0, nullptr); } void insert_texture_barrier(VkCommandBuffer cmd, VkImage image, VkImageLayout current_layout, VkImageLayout new_layout, VkImageSubresourceRange range) diff --git a/rpcs3/Emu/RSX/VK/vkutils/barriers.h b/rpcs3/Emu/RSX/VK/vkutils/barriers.h index a4c15c5b9f..9ba1a4fd28 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/barriers.h +++ b/rpcs3/Emu/RSX/VK/vkutils/barriers.h @@ -17,7 +17,9 @@ namespace vk VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage, VkAccessFlags src_mask, VkAccessFlags dst_mask, const VkImageSubresourceRange& range); - void insert_execution_barrier(VkCommandBuffer cmd, + void insert_global_memory_barrier(VkCommandBuffer cmd, VkPipelineStageFlags src_stage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - VkPipelineStageFlags dst_stage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); + VkPipelineStageFlags dst_stage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VkAccessFlags src_access = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, + VkAccessFlags dst_access = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT); } diff --git a/rpcs3/Emu/RSX/VK/vkutils/sync.cpp b/rpcs3/Emu/RSX/VK/vkutils/sync.cpp index 22e5fa4f10..27e9bfacb4 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/sync.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/sync.cpp @@ -103,7 +103,7 @@ namespace vk } } - void event::signal(const command_buffer& cmd, VkPipelineStageFlags stages) + void event::signal(const command_buffer& cmd, VkPipelineStageFlags stages, VkAccessFlags access) { if (m_vk_event) [[likely]] { @@ -111,7 +111,7 @@ namespace vk } else { - insert_execution_barrier(cmd, stages, VK_PIPELINE_STAGE_TRANSFER_BIT); + insert_global_memory_barrier(cmd, stages, VK_PIPELINE_STAGE_TRANSFER_BIT, access, VK_ACCESS_TRANSFER_WRITE_BIT); vkCmdFillBuffer(cmd, m_buffer->value, 0, 4, 0xDEADBEEF); } } diff --git a/rpcs3/Emu/RSX/VK/vkutils/sync.h b/rpcs3/Emu/RSX/VK/vkutils/sync.h index d73e64d2da..6f030a92c4 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/sync.h +++ b/rpcs3/Emu/RSX/VK/vkutils/sync.h @@ -37,7 +37,7 @@ namespace vk public: event(const render_device& dev); ~event(); - void signal(const command_buffer& cmd, VkPipelineStageFlags stages); + void signal(const command_buffer& cmd, VkPipelineStageFlags stages, VkAccessFlags access); VkResult status() const; };