diff options
| author | 2021-07-21 22:39:05 -0300 | |
|---|---|---|
| committer | 2021-11-16 22:11:28 +0100 | |
| commit | 520c4a44f6dfa78a462517c807d2e99d4775b84e (patch) | |
| tree | 32324d28426af8e4adbc685ca7f77e340e77cb9a | |
| parent | shader: Fix resolution scaling pass (diff) | |
| download | yuzu-520c4a44f6dfa78a462517c807d2e99d4775b84e.tar.gz yuzu-520c4a44f6dfa78a462517c807d2e99d4775b84e.tar.xz yuzu-520c4a44f6dfa78a462517c807d2e99d4775b84e.zip | |
vk_texture_cache: Fix scaling blit validation errors
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 159 |
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 | |||
| 597 | void 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 | ||
| 598 | void TextureCacheRuntime::Init() { | 674 | void TextureCacheRuntime::Init() { |
| @@ -983,85 +1059,6 @@ void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferIm | |||
| 983 | } | 1059 | } |
| 984 | } | 1060 | } |
| 985 | 1061 | ||
| 986 | void 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 | |||
| 1065 | bool Image::ScaleUp(bool save_as_backup) { | 1062 | bool 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); |