summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2021-10-23 00:25:19 +0200
committerGravatar Fernando Sahmkow2021-11-16 22:11:32 +0100
commitc5dbd93adb0566f0b2b09657b4340cc3da59d703 (patch)
treec3298f72485dc8ddc77c1c8e322f21a1c8247471 /src
parentHostShader: Fix gaussian and add attribution. (diff)
downloadyuzu-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.h4
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp38
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.h6
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
148void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, 148void 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
179void 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
193void 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