summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
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/video_core/renderer_vulkan
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/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp38
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.h6
2 files changed, 40 insertions, 4 deletions
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