summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2023-03-12 21:43:31 +0100
committerGravatar Fernando Sahmkow2023-04-29 00:18:21 +0200
commit3fbee093b2bf3b4c15dbc5bb48a3bc768ecedbc9 (patch)
tree3910e8dad8f813ec61643f4d6c30097b548e60a1 /src/video_core/renderer_vulkan
parentMerge pull request #10051 from liamwhite/surface-capabilities (diff)
downloadyuzu-3fbee093b2bf3b4c15dbc5bb48a3bc768ecedbc9.tar.gz
yuzu-3fbee093b2bf3b4c15dbc5bb48a3bc768ecedbc9.tar.xz
yuzu-3fbee093b2bf3b4c15dbc5bb48a3bc768ecedbc9.zip
TextureCache: refactor DMA downloads to allow multiple buffers.
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp43
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.h7
3 files changed, 33 insertions, 19 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 673ab478e..8fc783cc0 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -793,7 +793,7 @@ bool AccelerateDMA::DmaBufferImageCopy(const Tegra::DMA::ImageCopy& copy_info,
793 if constexpr (IS_IMAGE_UPLOAD) { 793 if constexpr (IS_IMAGE_UPLOAD) {
794 image->UploadMemory(buffer->Handle(), offset, copy_span); 794 image->UploadMemory(buffer->Handle(), offset, copy_span);
795 } else { 795 } else {
796 image->DownloadMemory(buffer->Handle(), offset, copy_span); 796 texture_cache.DownloadImageIntoBuffer(image, buffer->Handle(), offset, copy_span);
797 } 797 }
798 return true; 798 return true;
799} 799}
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index ae15f6976..e4d077e63 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -1,10 +1,11 @@
1// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-3.0-or-later
3 3
4#include <algorithm> 4#include <algorithm>
5#include <array> 5#include <array>
6#include <span> 6#include <span>
7#include <vector> 7#include <vector>
8#include <boost/container/small_vector.hpp>
8 9
9#include "common/bit_cast.h" 10#include "common/bit_cast.h"
10#include "common/bit_util.h" 11#include "common/bit_util.h"
@@ -1341,16 +1342,20 @@ void Image::UploadMemory(const StagingBufferRef& map, std::span<const BufferImag
1341 UploadMemory(map.buffer, map.offset, copies); 1342 UploadMemory(map.buffer, map.offset, copies);
1342} 1343}
1343 1344
1344void Image::DownloadMemory(VkBuffer buffer, VkDeviceSize offset, 1345void Image::DownloadMemory(std::span<VkBuffer> buffers_span, VkDeviceSize offset,
1345 std::span<const VideoCommon::BufferImageCopy> copies) { 1346 std::span<const VideoCommon::BufferImageCopy> copies) {
1346 const bool is_rescaled = True(flags & ImageFlagBits::Rescaled); 1347 const bool is_rescaled = True(flags & ImageFlagBits::Rescaled);
1347 if (is_rescaled) { 1348 if (is_rescaled) {
1348 ScaleDown(); 1349 ScaleDown();
1349 } 1350 }
1351 boost::container::small_vector<VkBuffer, 1> buffers_vector{};
1352 for (auto& buffer : buffers_span) {
1353 buffers_vector.push_back(buffer);
1354 }
1350 std::vector vk_copies = TransformBufferImageCopies(copies, offset, aspect_mask); 1355 std::vector vk_copies = TransformBufferImageCopies(copies, offset, aspect_mask);
1351 scheduler->RequestOutsideRenderPassOperationContext(); 1356 scheduler->RequestOutsideRenderPassOperationContext();
1352 scheduler->Record([buffer, image = *original_image, aspect_mask = aspect_mask, 1357 scheduler->Record([buffers = std::move(buffers_vector), image = *original_image,
1353 vk_copies](vk::CommandBuffer cmdbuf) { 1358 aspect_mask = aspect_mask, vk_copies](vk::CommandBuffer cmdbuf) {
1354 const VkImageMemoryBarrier read_barrier{ 1359 const VkImageMemoryBarrier read_barrier{
1355 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 1360 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
1356 .pNext = nullptr, 1361 .pNext = nullptr,
@@ -1369,6 +1374,20 @@ void Image::DownloadMemory(VkBuffer buffer, VkDeviceSize offset,
1369 .layerCount = VK_REMAINING_ARRAY_LAYERS, 1374 .layerCount = VK_REMAINING_ARRAY_LAYERS,
1370 }, 1375 },
1371 }; 1376 };
1377 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
1378 0, read_barrier);
1379
1380 for (auto buffer : buffers) {
1381 cmdbuf.CopyImageToBuffer(image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, buffer,
1382 vk_copies);
1383 }
1384
1385 const VkMemoryBarrier memory_write_barrier{
1386 .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER,
1387 .pNext = nullptr,
1388 .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT,
1389 .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT,
1390 };
1372 const VkImageMemoryBarrier image_write_barrier{ 1391 const VkImageMemoryBarrier image_write_barrier{
1373 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 1392 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
1374 .pNext = nullptr, 1393 .pNext = nullptr,
@@ -1387,15 +1406,6 @@ void Image::DownloadMemory(VkBuffer buffer, VkDeviceSize offset,
1387 .layerCount = VK_REMAINING_ARRAY_LAYERS, 1406 .layerCount = VK_REMAINING_ARRAY_LAYERS,
1388 }, 1407 },
1389 }; 1408 };
1390 const VkMemoryBarrier memory_write_barrier{
1391 .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER,
1392 .pNext = nullptr,
1393 .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT,
1394 .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT,
1395 };
1396 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
1397 0, read_barrier);
1398 cmdbuf.CopyImageToBuffer(image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, buffer, vk_copies);
1399 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 1409 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1400 0, memory_write_barrier, nullptr, image_write_barrier); 1410 0, memory_write_barrier, nullptr, image_write_barrier);
1401 }); 1411 });
@@ -1405,7 +1415,10 @@ void Image::DownloadMemory(VkBuffer buffer, VkDeviceSize offset,
1405} 1415}
1406 1416
1407void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) { 1417void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) {
1408 DownloadMemory(map.buffer, map.offset, copies); 1418 std::array buffers{
1419 map.buffer,
1420 };
1421 DownloadMemory(buffers, map.offset, copies);
1409} 1422}
1410 1423
1411bool Image::IsRescaled() const noexcept { 1424bool Image::IsRescaled() const noexcept {
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h
index d5ee23f8d..422476188 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.h
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.h
@@ -1,5 +1,5 @@
1// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-3.0-or-later
3 3
4#pragma once 4#pragma once
5 5
@@ -138,7 +138,7 @@ public:
138 void UploadMemory(const StagingBufferRef& map, 138 void UploadMemory(const StagingBufferRef& map,
139 std::span<const VideoCommon::BufferImageCopy> copies); 139 std::span<const VideoCommon::BufferImageCopy> copies);
140 140
141 void DownloadMemory(VkBuffer buffer, VkDeviceSize offset, 141 void DownloadMemory(std::span<VkBuffer> buffers, VkDeviceSize offset,
142 std::span<const VideoCommon::BufferImageCopy> copies); 142 std::span<const VideoCommon::BufferImageCopy> copies);
143 143
144 void DownloadMemory(const StagingBufferRef& map, 144 void DownloadMemory(const StagingBufferRef& map,
@@ -371,6 +371,7 @@ struct TextureCacheParams {
371 using Sampler = Vulkan::Sampler; 371 using Sampler = Vulkan::Sampler;
372 using Framebuffer = Vulkan::Framebuffer; 372 using Framebuffer = Vulkan::Framebuffer;
373 using AsyncBuffer = Vulkan::StagingBufferRef; 373 using AsyncBuffer = Vulkan::StagingBufferRef;
374 using BufferType = VkBuffer;
374}; 375};
375 376
376using TextureCache = VideoCommon::TextureCache<TextureCacheParams>; 377using TextureCache = VideoCommon::TextureCache<TextureCacheParams>;