diff options
| author | 2021-10-23 00:25:19 +0200 | |
|---|---|---|
| committer | 2021-11-16 22:11:32 +0100 | |
| commit | c5dbd93adb0566f0b2b09657b4340cc3da59d703 (patch) | |
| tree | c3298f72485dc8ddc77c1c8e322f21a1c8247471 /src | |
| parent | HostShader: Fix gaussian and add attribution. (diff) | |
| download | yuzu-c5dbd93adb0566f0b2b09657b4340cc3da59d703.tar.gz yuzu-c5dbd93adb0566f0b2b09657b4340cc3da59d703.tar.xz yuzu-c5dbd93adb0566f0b2b09657b4340cc3da59d703.zip | |
VulkanBufferCache: Avoid adding barriers between multiple copies.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 38 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.h | 6 |
3 files changed, 43 insertions, 5 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index d350c9b36..43bed63ac 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -853,12 +853,14 @@ void BufferCache<P>::CommitAsyncFlushesHigh() { | |||
| 853 | } | 853 | } |
| 854 | if constexpr (USE_MEMORY_MAPS) { | 854 | if constexpr (USE_MEMORY_MAPS) { |
| 855 | auto download_staging = runtime.DownloadStagingBuffer(total_size_bytes); | 855 | auto download_staging = runtime.DownloadStagingBuffer(total_size_bytes); |
| 856 | runtime.PreCopyBarrier(); | ||
| 856 | for (auto& [copy, buffer_id] : downloads) { | 857 | for (auto& [copy, buffer_id] : downloads) { |
| 857 | // Have in mind the staging buffer offset for the copy | 858 | // Have in mind the staging buffer offset for the copy |
| 858 | copy.dst_offset += download_staging.offset; | 859 | copy.dst_offset += download_staging.offset; |
| 859 | const std::array copies{copy}; | 860 | const std::array copies{copy}; |
| 860 | runtime.CopyBuffer(download_staging.buffer, slot_buffers[buffer_id], copies); | 861 | runtime.CopyBuffer(download_staging.buffer, slot_buffers[buffer_id], copies, false); |
| 861 | } | 862 | } |
| 863 | runtime.PostCopyBarrier(); | ||
| 862 | runtime.Finish(); | 864 | runtime.Finish(); |
| 863 | for (const auto& [copy, buffer_id] : downloads) { | 865 | for (const auto& [copy, buffer_id] : downloads) { |
| 864 | const Buffer& buffer = slot_buffers[buffer_id]; | 866 | const Buffer& buffer = slot_buffers[buffer_id]; |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 8ac58bc2f..5ffd93499 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -146,7 +146,7 @@ void BufferCacheRuntime::Finish() { | |||
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, | 148 | void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, |
| 149 | std::span<const VideoCommon::BufferCopy> copies) { | 149 | std::span<const VideoCommon::BufferCopy> copies, bool barrier) { |
| 150 | static constexpr VkMemoryBarrier READ_BARRIER{ | 150 | static constexpr VkMemoryBarrier READ_BARRIER{ |
| 151 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, | 151 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, |
| 152 | .pNext = nullptr, | 152 | .pNext = nullptr, |
| @@ -163,10 +163,42 @@ void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, | |||
| 163 | boost::container::small_vector<VkBufferCopy, 3> vk_copies(copies.size()); | 163 | boost::container::small_vector<VkBufferCopy, 3> vk_copies(copies.size()); |
| 164 | std::ranges::transform(copies, vk_copies.begin(), MakeBufferCopy); | 164 | std::ranges::transform(copies, vk_copies.begin(), MakeBufferCopy); |
| 165 | scheduler.RequestOutsideRenderPassOperationContext(); | 165 | scheduler.RequestOutsideRenderPassOperationContext(); |
| 166 | scheduler.Record([src_buffer, dst_buffer, vk_copies](vk::CommandBuffer cmdbuf) { | 166 | scheduler.Record([src_buffer, dst_buffer, vk_copies, barrier](vk::CommandBuffer cmdbuf) { |
| 167 | if (barrier) { | ||
| 168 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, | ||
| 169 | VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER); | ||
| 170 | } | ||
| 171 | cmdbuf.CopyBuffer(src_buffer, dst_buffer, vk_copies); | ||
| 172 | if (barrier) { | ||
| 173 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, | ||
| 174 | VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, WRITE_BARRIER); | ||
| 175 | } | ||
| 176 | }); | ||
| 177 | } | ||
| 178 | |||
| 179 | void BufferCacheRuntime::PreCopyBarrier() { | ||
| 180 | static constexpr VkMemoryBarrier READ_BARRIER{ | ||
| 181 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, | ||
| 182 | .pNext = nullptr, | ||
| 183 | .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, | ||
| 184 | .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, | ||
| 185 | }; | ||
| 186 | scheduler.RequestOutsideRenderPassOperationContext(); | ||
| 187 | scheduler.Record([](vk::CommandBuffer cmdbuf) { | ||
| 167 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, | 188 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, |
| 168 | 0, READ_BARRIER); | 189 | 0, READ_BARRIER); |
| 169 | cmdbuf.CopyBuffer(src_buffer, dst_buffer, vk_copies); | 190 | }); |
| 191 | } | ||
| 192 | |||
| 193 | void BufferCacheRuntime::PostCopyBarrier() { | ||
| 194 | static constexpr VkMemoryBarrier WRITE_BARRIER{ | ||
| 195 | .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, | ||
| 196 | .pNext = nullptr, | ||
| 197 | .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, | ||
| 198 | .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, | ||
| 199 | }; | ||
| 200 | scheduler.RequestOutsideRenderPassOperationContext(); | ||
| 201 | scheduler.Record([](vk::CommandBuffer cmdbuf) { | ||
| 170 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, | 202 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, |
| 171 | 0, WRITE_BARRIER); | 203 | 0, WRITE_BARRIER); |
| 172 | }); | 204 | }); |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index c27402ff0..1ee0d8420 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -69,8 +69,12 @@ public: | |||
| 69 | 69 | ||
| 70 | [[nodiscard]] StagingBufferRef DownloadStagingBuffer(size_t size); | 70 | [[nodiscard]] StagingBufferRef DownloadStagingBuffer(size_t size); |
| 71 | 71 | ||
| 72 | void PreCopyBarrier(); | ||
| 73 | |||
| 72 | void CopyBuffer(VkBuffer src_buffer, VkBuffer dst_buffer, | 74 | void CopyBuffer(VkBuffer src_buffer, VkBuffer dst_buffer, |
| 73 | std::span<const VideoCommon::BufferCopy> copies); | 75 | std::span<const VideoCommon::BufferCopy> copies, bool barrier = true); |
| 76 | |||
| 77 | void PostCopyBarrier(); | ||
| 74 | 78 | ||
| 75 | void ClearBuffer(VkBuffer dest_buffer, u32 offset, size_t size, u32 value); | 79 | void ClearBuffer(VkBuffer dest_buffer, u32 offset, size_t size, u32 value); |
| 76 | 80 | ||