summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2021-07-22 12:51:13 -0400
committerGravatar GitHub2021-07-22 12:51:13 -0400
commitdb46f8a70c853ccab3318abed1416231a3c426db (patch)
tree92c1c8f149f96bc8c7883affa14cdb0b266e0024 /src
parentMerge pull request #6693 from lat9nq/cmd-fullscreen-mode-2 (diff)
parentvk_texture_cache: Use VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL when possible (diff)
downloadyuzu-db46f8a70c853ccab3318abed1416231a3c426db.tar.gz
yuzu-db46f8a70c853ccab3318abed1416231a3c426db.tar.xz
yuzu-db46f8a70c853ccab3318abed1416231a3c426db.zip
Merge pull request #6686 from ReinUsesLisp/vk-optimal-copy
vk_texture_cache: Use VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL when possible
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp56
1 files changed, 35 insertions, 21 deletions
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index fd01c902c..88ccf96f5 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -765,7 +765,7 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src,
765 dst_range.AddLayers(copy.dstSubresource); 765 dst_range.AddLayers(copy.dstSubresource);
766 src_range.AddLayers(copy.srcSubresource); 766 src_range.AddLayers(copy.srcSubresource);
767 } 767 }
768 const std::array read_barriers{ 768 const std::array pre_barriers{
769 VkImageMemoryBarrier{ 769 VkImageMemoryBarrier{
770 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 770 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
771 .pNext = nullptr, 771 .pNext = nullptr,
@@ -774,7 +774,7 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src,
774 VK_ACCESS_TRANSFER_WRITE_BIT, 774 VK_ACCESS_TRANSFER_WRITE_BIT,
775 .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT, 775 .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT,
776 .oldLayout = VK_IMAGE_LAYOUT_GENERAL, 776 .oldLayout = VK_IMAGE_LAYOUT_GENERAL,
777 .newLayout = VK_IMAGE_LAYOUT_GENERAL, 777 .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
778 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, 778 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
779 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, 779 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
780 .image = src_image, 780 .image = src_image,
@@ -795,29 +795,43 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src,
795 .subresourceRange = dst_range.SubresourceRange(aspect_mask), 795 .subresourceRange = dst_range.SubresourceRange(aspect_mask),
796 }, 796 },
797 }; 797 };
798 const VkImageMemoryBarrier write_barrier{ 798 const std::array post_barriers{
799 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 799 VkImageMemoryBarrier{
800 .pNext = nullptr, 800 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
801 .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, 801 .pNext = nullptr,
802 .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | 802 .srcAccessMask = 0,
803 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | 803 .dstAccessMask = 0,
804 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | 804 .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
805 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | 805 .newLayout = VK_IMAGE_LAYOUT_GENERAL,
806 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | 806 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
807 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, 807 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
808 .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 808 .image = src_image,
809 .newLayout = VK_IMAGE_LAYOUT_GENERAL, 809 .subresourceRange = src_range.SubresourceRange(aspect_mask),
810 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, 810 },
811 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, 811 VkImageMemoryBarrier{
812 .image = dst_image, 812 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
813 .subresourceRange = dst_range.SubresourceRange(aspect_mask), 813 .pNext = nullptr,
814 .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
815 .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
816 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
817 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
818 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
819 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
820 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
821 .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
822 .newLayout = VK_IMAGE_LAYOUT_GENERAL,
823 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
824 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
825 .image = dst_image,
826 .subresourceRange = dst_range.SubresourceRange(aspect_mask),
827 },
814 }; 828 };
815 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 829 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
816 0, {}, {}, read_barriers); 830 0, {}, {}, pre_barriers);
817 cmdbuf.CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, 831 cmdbuf.CopyImage(src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_image,
818 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk_copies); 832 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk_copies);
819 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 833 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
820 0, write_barrier); 834 0, {}, {}, post_barriers);
821 }); 835 });
822} 836}
823 837