Merge pull request #6686 from ReinUsesLisp/vk-optimal-copy
vk_texture_cache: Use VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL when possible
This commit is contained in:
		| @@ -765,7 +765,7 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src, | ||||
|             dst_range.AddLayers(copy.dstSubresource); | ||||
|             src_range.AddLayers(copy.srcSubresource); | ||||
|         } | ||||
|         const std::array read_barriers{ | ||||
|         const std::array pre_barriers{ | ||||
|             VkImageMemoryBarrier{ | ||||
|                 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | ||||
|                 .pNext = nullptr, | ||||
| @@ -774,7 +774,7 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src, | ||||
|                                  VK_ACCESS_TRANSFER_WRITE_BIT, | ||||
|                 .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT, | ||||
|                 .oldLayout = VK_IMAGE_LAYOUT_GENERAL, | ||||
|                 .newLayout = VK_IMAGE_LAYOUT_GENERAL, | ||||
|                 .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | ||||
|                 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||
|                 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||
|                 .image = src_image, | ||||
| @@ -795,29 +795,43 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src, | ||||
|                 .subresourceRange = dst_range.SubresourceRange(aspect_mask), | ||||
|             }, | ||||
|         }; | ||||
|         const VkImageMemoryBarrier write_barrier{ | ||||
|             .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | ||||
|             .pNext = nullptr, | ||||
|             .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, | ||||
|             .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | | ||||
|                              VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | | ||||
|                              VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | | ||||
|                              VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | | ||||
|                              VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | | ||||
|                              VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, | ||||
|             .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, | ||||
|             .newLayout = VK_IMAGE_LAYOUT_GENERAL, | ||||
|             .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||
|             .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||
|             .image = dst_image, | ||||
|             .subresourceRange = dst_range.SubresourceRange(aspect_mask), | ||||
|         const std::array post_barriers{ | ||||
|             VkImageMemoryBarrier{ | ||||
|                 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | ||||
|                 .pNext = nullptr, | ||||
|                 .srcAccessMask = 0, | ||||
|                 .dstAccessMask = 0, | ||||
|                 .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | ||||
|                 .newLayout = VK_IMAGE_LAYOUT_GENERAL, | ||||
|                 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||
|                 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||
|                 .image = src_image, | ||||
|                 .subresourceRange = src_range.SubresourceRange(aspect_mask), | ||||
|             }, | ||||
|             VkImageMemoryBarrier{ | ||||
|                 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | ||||
|                 .pNext = nullptr, | ||||
|                 .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, | ||||
|                 .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | | ||||
|                                  VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | | ||||
|                                  VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | | ||||
|                                  VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | | ||||
|                                  VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | | ||||
|                                  VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, | ||||
|                 .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, | ||||
|                 .newLayout = VK_IMAGE_LAYOUT_GENERAL, | ||||
|                 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||
|                 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||
|                 .image = dst_image, | ||||
|                 .subresourceRange = dst_range.SubresourceRange(aspect_mask), | ||||
|             }, | ||||
|         }; | ||||
|         cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, | ||||
|                                0, {}, {}, read_barriers); | ||||
|         cmdbuf.CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, | ||||
|                                0, {}, {}, pre_barriers); | ||||
|         cmdbuf.CopyImage(src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_image, | ||||
|                          VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk_copies); | ||||
|         cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, | ||||
|                                0, write_barrier); | ||||
|                                0, {}, {}, post_barriers); | ||||
|     }); | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user