diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/TextureReadbackVk.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/TextureReadbackVk.cpp index bce23b59..1fe90abe 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/TextureReadbackVk.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/TextureReadbackVk.cpp @@ -124,12 +124,8 @@ void LatteTextureReadbackInfoVk::StartTransfer() renderer->barrier_image(baseTexture, region.imageSubresource, VK_IMAGE_LAYOUT_GENERAL); - renderer->barrier_sequentializeTransfer(); - vkCmdCopyImageToBuffer(renderer->getCurrentCommandBuffer(), baseTexture->GetImageObj()->m_image, VK_IMAGE_LAYOUT_GENERAL, m_buffer, 1, ®ion); - renderer->barrier_sequentializeTransfer(); - renderer->barrier_image(baseTexture, region.imageSubresource, VK_IMAGE_LAYOUT_GENERAL); // make sure transfer is finished before image is modified renderer->barrier_bufferRange(m_buffer, m_buffer_offset, m_image_size); // make sure transfer is finished before result is read diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp index 4dfc763f..42571aa5 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp @@ -3709,9 +3709,9 @@ void VulkanRenderer::bufferCache_upload(uint8* buffer, sint32 size, uint32 buffe vkMemAllocator.FlushReservation(uploadResv); - barrier_bufferRange( - uploadResv.vkBuffer, uploadResv.bufferOffset, uploadResv.size, // make sure any in-flight transfers are completed + barrier_bufferRange( + uploadResv.vkBuffer, uploadResv.bufferOffset, uploadResv.size, // make sure source data is visible m_bufferCache, bufferOffset, size); // make sure all reads are completed before we overwrite the data VkBufferCopy region; @@ -3720,7 +3720,7 @@ void VulkanRenderer::bufferCache_upload(uint8* buffer, sint32 size, uint32 buffe region.size = size; vkCmdCopyBuffer(m_state.currentCommandBuffer, uploadResv.vkBuffer, m_bufferCache, 1, ®ion); - barrier_sequentializeTransfer(); + barrier_bufferRange(m_bufferCache, bufferOffset, size); } void VulkanRenderer::bufferCache_copy(uint32 srcOffset, uint32 dstOffset, uint32 size) @@ -3728,7 +3728,10 @@ void VulkanRenderer::bufferCache_copy(uint32 srcOffset, uint32 dstOffset, uint32 cemu_assert_debug(!m_useHostMemoryForCache); draw_endRenderPass(); - barrier_sequentializeTransfer(); + barrier_bufferRange( + m_bufferCache, srcOffset, size, // make sure source data is visible + m_bufferCache, dstOffset, size); // make sure all reads are completed before we overwrite the data bool isOverlapping = (srcOffset + size) > dstOffset && (srcOffset) < (dstOffset + size); cemu_assert_debug(!isOverlapping); @@ -3739,7 +3742,7 @@ void VulkanRenderer::bufferCache_copy(uint32 srcOffset, uint32 dstOffset, uint32 bufferCopy.size = size; vkCmdCopyBuffer(m_state.currentCommandBuffer, m_bufferCache, m_bufferCache, 1, &bufferCopy); - barrier_sequentializeTransfer(); + barrier_bufferRange(m_bufferCache, dstOffset, size); } void VulkanRenderer::bufferCache_copyStreamoutToMainBuffer(uint32 srcOffset, uint32 dstOffset, uint32 size) @@ -3756,12 +3759,10 @@ void VulkanRenderer::bufferCache_copyStreamoutToMainBuffer(uint32 srcOffset, uin else dstBuffer = m_bufferCache; - barrier_bufferRange( - m_xfbRingBuffer, srcOffset, size, // wait for all writes to finish - dstBuffer, dstOffset, size); // wait for all reads to finish - - barrier_sequentializeTransfer(); + barrier_bufferRange( + m_xfbRingBuffer, srcOffset, size, // make sure source data is visible + dstBuffer, dstOffset, size); // make sure all reads are completed before we overwrite the data VkBufferCopy bufferCopy{}; bufferCopy.srcOffset = srcOffset; @@ -3769,7 +3770,7 @@ void VulkanRenderer::bufferCache_copyStreamoutToMainBuffer(uint32 srcOffset, uin bufferCopy.size = size; vkCmdCopyBuffer(m_state.currentCommandBuffer, m_xfbRingBuffer, dstBuffer, 1, &bufferCopy); - barrier_sequentializeTransfer(); + barrier_bufferRange(dstBuffer, dstOffset, size); // make sure writes are visible to host } void VulkanRenderer::AppendOverlayDebugInfo() diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h index 0a329c28..c819134f 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h @@ -871,34 +871,6 @@ private: performanceMonitor.vk.numDrawBarriersPerFrame.increment(); } - void barrier_sequentializeTransfer() - { - VkMemoryBarrier memBarrier{}; - memBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; - memBarrier.pNext = nullptr; - - VkPipelineStageFlags srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT; - VkPipelineStageFlags dstStages = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; - - memBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT; - memBarrier.dstAccessMask = 0; - - memBarrier.srcAccessMask |= (VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT); - memBarrier.dstAccessMask |= (VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT); - - vkCmdPipelineBarrier(m_state.currentCommandBuffer, srcStages, dstStages, 0, 1, &memBarrier, 0, nullptr, 0, nullptr); - performanceMonitor.vk.numDrawBarriersPerFrame.increment(); - } - - void barrier_sequentializeCommand() - { - VkPipelineStageFlags srcStages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - VkPipelineStageFlags dstStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - - vkCmdPipelineBarrier(m_state.currentCommandBuffer, srcStages, dstStages, 0, 0, nullptr, 0, nullptr, 0, nullptr); - performanceMonitor.vk.numDrawBarriersPerFrame.increment(); - } - template void barrier_image(VkImage imageVk, VkImageSubresourceRange& subresourceRange, VkImageLayout oldLayout, VkImageLayout newLayout) {