summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar bunnei2023-04-29 11:46:01 -0700
committerGravatar GitHub2023-04-29 11:46:01 -0700
commitfe57f3967639616142889bf1b638117ca6c879cf (patch)
tree43879297dd91ac1ab824010610e724c37ec3cb95 /src/video_core/renderer_vulkan
parentMerge pull request #10051 from liamwhite/surface-capabilities (diff)
parentTexture Cache: Release stagging buffers on tick frame (diff)
downloadyuzu-fe57f3967639616142889bf1b638117ca6c879cf.tar.gz
yuzu-fe57f3967639616142889bf1b638117ca6c879cf.tar.xz
yuzu-fe57f3967639616142889bf1b638117ca6c879cf.zip
Merge pull request #10082 from FernandoS27/the-testers-really-love-chocolate
Refactor Accelerate DMA and do downloads through TC.
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp6
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp57
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.h6
3 files changed, 51 insertions, 18 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 673ab478e..2559a3aa7 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -781,8 +781,7 @@ bool AccelerateDMA::DmaBufferImageCopy(const Tegra::DMA::ImageCopy& copy_info,
781 } 781 }
782 const u32 buffer_size = static_cast<u32>(buffer_operand.pitch * buffer_operand.height); 782 const u32 buffer_size = static_cast<u32>(buffer_operand.pitch * buffer_operand.height);
783 static constexpr auto sync_info = VideoCommon::ObtainBufferSynchronize::FullSynchronize; 783 static constexpr auto sync_info = VideoCommon::ObtainBufferSynchronize::FullSynchronize;
784 const auto post_op = IS_IMAGE_UPLOAD ? VideoCommon::ObtainBufferOperation::DoNothing 784 const auto post_op = VideoCommon::ObtainBufferOperation::DoNothing;
785 : VideoCommon::ObtainBufferOperation::MarkAsWritten;
786 const auto [buffer, offset] = 785 const auto [buffer, offset] =
787 buffer_cache.ObtainBuffer(buffer_operand.address, buffer_size, sync_info, post_op); 786 buffer_cache.ObtainBuffer(buffer_operand.address, buffer_size, sync_info, post_op);
788 787
@@ -793,7 +792,8 @@ bool AccelerateDMA::DmaBufferImageCopy(const Tegra::DMA::ImageCopy& copy_info,
793 if constexpr (IS_IMAGE_UPLOAD) { 792 if constexpr (IS_IMAGE_UPLOAD) {
794 image->UploadMemory(buffer->Handle(), offset, copy_span); 793 image->UploadMemory(buffer->Handle(), offset, copy_span);
795 } else { 794 } else {
796 image->DownloadMemory(buffer->Handle(), offset, copy_span); 795 texture_cache.DownloadImageIntoBuffer(image, buffer->Handle(), offset, copy_span,
796 buffer_operand.address, buffer_size);
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..d0a7d8f35 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 2019 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"
@@ -1343,14 +1344,31 @@ void Image::UploadMemory(const StagingBufferRef& map, std::span<const BufferImag
1343 1344
1344void Image::DownloadMemory(VkBuffer buffer, VkDeviceSize offset, 1345void Image::DownloadMemory(VkBuffer buffer, VkDeviceSize offset,
1345 std::span<const VideoCommon::BufferImageCopy> copies) { 1346 std::span<const VideoCommon::BufferImageCopy> copies) {
1347 std::array buffer_handles{
1348 buffer,
1349 };
1350 std::array buffer_offsets{
1351 offset,
1352 };
1353 DownloadMemory(buffer_handles, buffer_offsets, copies);
1354}
1355
1356void Image::DownloadMemory(std::span<VkBuffer> buffers_span, std::span<VkDeviceSize> offsets_span,
1357 std::span<const VideoCommon::BufferImageCopy> copies) {
1346 const bool is_rescaled = True(flags & ImageFlagBits::Rescaled); 1358 const bool is_rescaled = True(flags & ImageFlagBits::Rescaled);
1347 if (is_rescaled) { 1359 if (is_rescaled) {
1348 ScaleDown(); 1360 ScaleDown();
1349 } 1361 }
1350 std::vector vk_copies = TransformBufferImageCopies(copies, offset, aspect_mask); 1362 boost::container::small_vector<VkBuffer, 1> buffers_vector{};
1363 boost::container::small_vector<std::vector<VkBufferImageCopy>, 1> vk_copies;
1364 for (size_t index = 0; index < buffers_span.size(); index++) {
1365 buffers_vector.emplace_back(buffers_span[index]);
1366 vk_copies.emplace_back(
1367 TransformBufferImageCopies(copies, offsets_span[index], aspect_mask));
1368 }
1351 scheduler->RequestOutsideRenderPassOperationContext(); 1369 scheduler->RequestOutsideRenderPassOperationContext();
1352 scheduler->Record([buffer, image = *original_image, aspect_mask = aspect_mask, 1370 scheduler->Record([buffers = std::move(buffers_vector), image = *original_image,
1353 vk_copies](vk::CommandBuffer cmdbuf) { 1371 aspect_mask = aspect_mask, vk_copies](vk::CommandBuffer cmdbuf) {
1354 const VkImageMemoryBarrier read_barrier{ 1372 const VkImageMemoryBarrier read_barrier{
1355 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 1373 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
1356 .pNext = nullptr, 1374 .pNext = nullptr,
@@ -1369,6 +1387,20 @@ void Image::DownloadMemory(VkBuffer buffer, VkDeviceSize offset,
1369 .layerCount = VK_REMAINING_ARRAY_LAYERS, 1387 .layerCount = VK_REMAINING_ARRAY_LAYERS,
1370 }, 1388 },
1371 }; 1389 };
1390 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
1391 0, read_barrier);
1392
1393 for (size_t index = 0; index < buffers.size(); index++) {
1394 cmdbuf.CopyImageToBuffer(image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, buffers[index],
1395 vk_copies[index]);
1396 }
1397
1398 const VkMemoryBarrier memory_write_barrier{
1399 .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER,
1400 .pNext = nullptr,
1401 .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT,
1402 .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT,
1403 };
1372 const VkImageMemoryBarrier image_write_barrier{ 1404 const VkImageMemoryBarrier image_write_barrier{
1373 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 1405 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
1374 .pNext = nullptr, 1406 .pNext = nullptr,
@@ -1387,15 +1419,6 @@ void Image::DownloadMemory(VkBuffer buffer, VkDeviceSize offset,
1387 .layerCount = VK_REMAINING_ARRAY_LAYERS, 1419 .layerCount = VK_REMAINING_ARRAY_LAYERS,
1388 }, 1420 },
1389 }; 1421 };
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, 1422 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1400 0, memory_write_barrier, nullptr, image_write_barrier); 1423 0, memory_write_barrier, nullptr, image_write_barrier);
1401 }); 1424 });
@@ -1405,7 +1428,13 @@ void Image::DownloadMemory(VkBuffer buffer, VkDeviceSize offset,
1405} 1428}
1406 1429
1407void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) { 1430void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) {
1408 DownloadMemory(map.buffer, map.offset, copies); 1431 std::array buffers{
1432 map.buffer,
1433 };
1434 std::array offsets{
1435 map.offset,
1436 };
1437 DownloadMemory(buffers, offsets, copies);
1409} 1438}
1410 1439
1411bool Image::IsRescaled() const noexcept { 1440bool 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..c656c5386 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 2019 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
@@ -141,6 +141,9 @@ public:
141 void DownloadMemory(VkBuffer buffer, VkDeviceSize offset, 141 void DownloadMemory(VkBuffer buffer, VkDeviceSize offset,
142 std::span<const VideoCommon::BufferImageCopy> copies); 142 std::span<const VideoCommon::BufferImageCopy> copies);
143 143
144 void DownloadMemory(std::span<VkBuffer> buffers, std::span<VkDeviceSize> offsets,
145 std::span<const VideoCommon::BufferImageCopy> copies);
146
144 void DownloadMemory(const StagingBufferRef& map, 147 void DownloadMemory(const StagingBufferRef& map,
145 std::span<const VideoCommon::BufferImageCopy> copies); 148 std::span<const VideoCommon::BufferImageCopy> copies);
146 149
@@ -371,6 +374,7 @@ struct TextureCacheParams {
371 using Sampler = Vulkan::Sampler; 374 using Sampler = Vulkan::Sampler;
372 using Framebuffer = Vulkan::Framebuffer; 375 using Framebuffer = Vulkan::Framebuffer;
373 using AsyncBuffer = Vulkan::StagingBufferRef; 376 using AsyncBuffer = Vulkan::StagingBufferRef;
377 using BufferType = VkBuffer;
374}; 378};
375 379
376using TextureCache = VideoCommon::TextureCache<TextureCacheParams>; 380using TextureCache = VideoCommon::TextureCache<TextureCacheParams>;