summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp159
1 files changed, 78 insertions, 81 deletions
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 4e05058c9..d95eeafb9 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -593,6 +593,82 @@ struct RangedBarrierRange {
593 UNREACHABLE_MSG("Invalid image format={}", format); 593 UNREACHABLE_MSG("Invalid image format={}", format);
594 return VK_FORMAT_R32_UINT; 594 return VK_FORMAT_R32_UINT;
595} 595}
596
597void BlitScale(VKScheduler& scheduler, VkImage src_image, VkImage dst_image,
598 boost::container::small_vector<VkImageBlit, 4>&& blit_regions,
599 VkImageAspectFlags aspect_mask) {
600 scheduler.RequestOutsideRenderPassOperationContext();
601 scheduler.Record([dst_image, src_image, aspect_mask,
602 regions = std::move(blit_regions)](vk::CommandBuffer cmdbuf) {
603 const VkImageSubresourceRange subresource_range{
604 .aspectMask = aspect_mask,
605 .baseMipLevel = 0,
606 .levelCount = VK_REMAINING_MIP_LEVELS,
607 .baseArrayLayer = 0,
608 .layerCount = VK_REMAINING_ARRAY_LAYERS,
609 };
610 const std::array read_barriers{
611 VkImageMemoryBarrier{
612 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
613 .pNext = nullptr,
614 .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT,
615 .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT,
616 .oldLayout = VK_IMAGE_LAYOUT_GENERAL,
617 .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
618 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
619 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
620 .image = src_image,
621 .subresourceRange = subresource_range,
622 },
623 VkImageMemoryBarrier{
624 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
625 .pNext = nullptr,
626 .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT |
627 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
628 VK_ACCESS_TRANSFER_WRITE_BIT,
629 .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
630 .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, // Discard contents
631 .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
632 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
633 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
634 .image = dst_image,
635 .subresourceRange = subresource_range,
636 },
637 };
638 const std::array write_barriers{
639 VkImageMemoryBarrier{
640 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
641 .pNext = nullptr,
642 .srcAccessMask = 0,
643 .dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_MEMORY_READ_BIT,
644 .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
645 .newLayout = VK_IMAGE_LAYOUT_GENERAL,
646 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
647 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
648 .image = src_image,
649 .subresourceRange = subresource_range,
650 },
651 VkImageMemoryBarrier{
652 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
653 .pNext = nullptr,
654 .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
655 .dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_MEMORY_READ_BIT,
656 .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
657 .newLayout = VK_IMAGE_LAYOUT_GENERAL,
658 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
659 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
660 .image = dst_image,
661 .subresourceRange = subresource_range,
662 },
663 };
664 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
665 0, nullptr, nullptr, read_barriers);
666 cmdbuf.BlitImage(src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_image,
667 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, regions, VK_FILTER_NEAREST);
668 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
669 0, nullptr, nullptr, write_barriers);
670 });
671}
596} // Anonymous namespace 672} // Anonymous namespace
597 673
598void TextureCacheRuntime::Init() { 674void TextureCacheRuntime::Init() {
@@ -983,85 +1059,6 @@ void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferIm
983 } 1059 }
984} 1060}
985 1061
986void BlitScale(VKScheduler& scheduler, VkImage src_image, VkImage dst_image,
987 boost::container::small_vector<VkImageBlit, 4>& blit_regions,
988 VkImageAspectFlags aspect_mask) {
989 scheduler.RequestOutsideRenderPassOperationContext();
990 scheduler.Record([dst_image, src_image, aspect_mask,
991 regions = std::move(blit_regions)](vk::CommandBuffer cmdbuf) {
992 const std::array read_barriers{
993 VkImageMemoryBarrier{
994 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
995 .pNext = nullptr,
996 .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT |
997 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
998 VK_ACCESS_TRANSFER_WRITE_BIT,
999 .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT,
1000 .oldLayout = VK_IMAGE_LAYOUT_GENERAL,
1001 .newLayout = VK_IMAGE_LAYOUT_GENERAL,
1002 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1003 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1004 .image = src_image,
1005 .subresourceRange{
1006 .aspectMask = aspect_mask,
1007 .baseMipLevel = 0,
1008 .levelCount = VK_REMAINING_MIP_LEVELS,
1009 .baseArrayLayer = 0,
1010 .layerCount = VK_REMAINING_ARRAY_LAYERS,
1011 },
1012 },
1013 VkImageMemoryBarrier{
1014 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
1015 .pNext = nullptr,
1016 .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT |
1017 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
1018 VK_ACCESS_TRANSFER_WRITE_BIT,
1019 .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
1020 .oldLayout = VK_IMAGE_LAYOUT_GENERAL,
1021 .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1022 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1023 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1024 .image = dst_image,
1025 .subresourceRange{
1026 .aspectMask = aspect_mask,
1027 .baseMipLevel = 0,
1028 .levelCount = VK_REMAINING_MIP_LEVELS,
1029 .baseArrayLayer = 0,
1030 .layerCount = VK_REMAINING_ARRAY_LAYERS,
1031 },
1032 },
1033 };
1034 VkImageMemoryBarrier write_barrier{
1035 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
1036 .pNext = nullptr,
1037 .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
1038 .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
1039 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
1040 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
1041 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
1042 .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1043 .newLayout = VK_IMAGE_LAYOUT_GENERAL,
1044 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1045 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1046 .image = dst_image,
1047 .subresourceRange{
1048 .aspectMask = aspect_mask,
1049 .baseMipLevel = 0,
1050 .levelCount = VK_REMAINING_MIP_LEVELS,
1051 .baseArrayLayer = 0,
1052 .layerCount = VK_REMAINING_ARRAY_LAYERS,
1053 },
1054 };
1055 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
1056 0, nullptr, nullptr, read_barriers);
1057 const VkFilter vk_filter = VK_FILTER_NEAREST;
1058 cmdbuf.BlitImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image,
1059 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, regions, vk_filter);
1060 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1061 0, write_barrier);
1062 });
1063}
1064
1065bool Image::ScaleUp(bool save_as_backup) { 1062bool Image::ScaleUp(bool save_as_backup) {
1066 if (True(flags & ImageFlagBits::Rescaled)) { 1063 if (True(flags & ImageFlagBits::Rescaled)) {
1067 return false; 1064 return false;
@@ -1155,7 +1152,7 @@ bool Image::ScaleUp(bool save_as_backup) {
1155 }, 1152 },
1156 }); 1153 });
1157 } 1154 }
1158 BlitScale(*scheduler, *image, *rescaled_image, regions, aspect_mask); 1155 BlitScale(*scheduler, *image, *rescaled_image, std::move(regions), aspect_mask);
1159 return true; 1156 return true;
1160} 1157}
1161 1158
@@ -1239,7 +1236,7 @@ bool Image::ScaleDown(bool save_as_backup) {
1239 }, 1236 },
1240 }); 1237 });
1241 } 1238 }
1242 BlitScale(*scheduler, *image, *downscaled_image, regions, aspect_mask); 1239 BlitScale(*scheduler, *image, *downscaled_image, std::move(regions), aspect_mask);
1243 if (save_as_backup) { 1240 if (save_as_backup) {
1244 backup_image = std::move(image); 1241 backup_image = std::move(image);
1245 backup_commit = std::move(commit); 1242 backup_commit = std::move(commit);