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); |             dst_range.AddLayers(copy.dstSubresource); | ||||||
|             src_range.AddLayers(copy.srcSubresource); |             src_range.AddLayers(copy.srcSubresource); | ||||||
|         } |         } | ||||||
|         const std::array read_barriers{ |         const std::array pre_barriers{ | ||||||
|             VkImageMemoryBarrier{ |             VkImageMemoryBarrier{ | ||||||
|                 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, |                 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | ||||||
|                 .pNext = nullptr, |                 .pNext = nullptr, | ||||||
| @@ -774,7 +774,7 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src, | |||||||
|                                  VK_ACCESS_TRANSFER_WRITE_BIT, |                                  VK_ACCESS_TRANSFER_WRITE_BIT, | ||||||
|                 .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT, |                 .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT, | ||||||
|                 .oldLayout = VK_IMAGE_LAYOUT_GENERAL, |                 .oldLayout = VK_IMAGE_LAYOUT_GENERAL, | ||||||
|                 .newLayout = VK_IMAGE_LAYOUT_GENERAL, |                 .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | ||||||
|                 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, |                 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||||
|                 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, |                 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||||
|                 .image = src_image, |                 .image = src_image, | ||||||
| @@ -795,7 +795,20 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src, | |||||||
|                 .subresourceRange = dst_range.SubresourceRange(aspect_mask), |                 .subresourceRange = dst_range.SubresourceRange(aspect_mask), | ||||||
|             }, |             }, | ||||||
|         }; |         }; | ||||||
|         const VkImageMemoryBarrier write_barrier{ |         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, |                 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | ||||||
|                 .pNext = nullptr, |                 .pNext = nullptr, | ||||||
|                 .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, |                 .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, | ||||||
| @@ -811,13 +824,14 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src, | |||||||
|                 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, |                 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||||||
|                 .image = dst_image, |                 .image = dst_image, | ||||||
|                 .subresourceRange = dst_range.SubresourceRange(aspect_mask), |                 .subresourceRange = dst_range.SubresourceRange(aspect_mask), | ||||||
|  |             }, | ||||||
|         }; |         }; | ||||||
|         cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, |         cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, | ||||||
|                                0, {}, {}, read_barriers); |                                0, {}, {}, pre_barriers); | ||||||
|         cmdbuf.CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, |         cmdbuf.CopyImage(src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_image, | ||||||
|                          VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk_copies); |                          VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk_copies); | ||||||
|         cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, |         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