X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Famd%2Fvulkan%2Fradv_meta_copy.c;h=7f7ef22efc815f7b01f43d80ec657386c1b355f9;hb=2670ebb5840c2108c55607520f1cf9eb5868e27a;hp=a42b15a01afa5a6649af169558955fbd6e4f9603;hpb=c8ea55ddda270687e048f88f440b1a543e4520e2;p=mesa.git diff --git a/src/amd/vulkan/radv_meta_copy.c b/src/amd/vulkan/radv_meta_copy.c index a42b15a01af..7f7ef22efc8 100644 --- a/src/amd/vulkan/radv_meta_copy.c +++ b/src/amd/vulkan/radv_meta_copy.c @@ -79,6 +79,7 @@ vk_format_for_size(int bs) static struct radv_meta_blit2d_surf blit_surf_for_image_level_layer(struct radv_image *image, + VkImageLayout layout, const VkImageSubresourceLayers *subres) { VkFormat format = image->vk_format; @@ -87,7 +88,8 @@ blit_surf_for_image_level_layer(struct radv_image *image, else if (subres->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) format = vk_format_stencil_only(format); - if (!image->surface.dcc_size) + if (!image->surface.dcc_size && + !(image->surface.htile_size && image->tc_compatible_htile)) format = vk_format_for_size(vk_format_get_blocksize(format)); return (struct radv_meta_blit2d_surf) { @@ -97,6 +99,7 @@ blit_surf_for_image_level_layer(struct radv_image *image, .layer = subres->baseArrayLayer, .image = image, .aspect_mask = subres->aspectMask, + .current_layout = layout, }; } @@ -104,6 +107,7 @@ static void meta_copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer* buffer, struct radv_image* image, + VkImageLayout layout, uint32_t regionCount, const VkBufferImageCopy* pRegions) { @@ -155,6 +159,7 @@ meta_copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, /* Create blit surfaces */ struct radv_meta_blit2d_surf img_bsurf = blit_surf_for_image_level_layer(image, + layout, &pRegions[r].imageSubresource); struct radv_meta_blit2d_buffer buf_bsurf = { @@ -214,7 +219,7 @@ void radv_CmdCopyBufferToImage( RADV_FROM_HANDLE(radv_image, dest_image, destImage); RADV_FROM_HANDLE(radv_buffer, src_buffer, srcBuffer); - meta_copy_buffer_to_image(cmd_buffer, src_buffer, dest_image, + meta_copy_buffer_to_image(cmd_buffer, src_buffer, dest_image, destImageLayout, regionCount, pRegions); } @@ -222,6 +227,7 @@ static void meta_copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer* buffer, struct radv_image* image, + VkImageLayout layout, uint32_t regionCount, const VkBufferImageCopy* pRegions) { @@ -266,6 +272,7 @@ meta_copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, /* Create blit surfaces */ struct radv_meta_blit2d_surf img_info = blit_surf_for_image_level_layer(image, + layout, &pRegions[r].imageSubresource); struct radv_meta_blit2d_buffer buf_info = { @@ -318,13 +325,16 @@ void radv_CmdCopyImageToBuffer( RADV_FROM_HANDLE(radv_buffer, dst_buffer, destBuffer); meta_copy_image_to_buffer(cmd_buffer, dst_buffer, src_image, + srcImageLayout, regionCount, pRegions); } static void meta_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, + VkImageLayout src_image_layout, struct radv_image *dest_image, + VkImageLayout dest_image_layout, uint32_t regionCount, const VkImageCopy *pRegions) { @@ -351,14 +361,39 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer, /* Create blit surfaces */ struct radv_meta_blit2d_surf b_src = blit_surf_for_image_level_layer(src_image, + src_image_layout, &pRegions[r].srcSubresource); struct radv_meta_blit2d_surf b_dst = blit_surf_for_image_level_layer(dest_image, + dest_image_layout, &pRegions[r].dstSubresource); - /* for DCC */ - b_src.format = b_dst.format; + uint32_t dst_queue_mask = radv_image_queue_family_mask(dest_image, + cmd_buffer->queue_family_index, + cmd_buffer->queue_family_index); + bool dst_compressed = radv_layout_dcc_compressed(dest_image, dest_image_layout, dst_queue_mask); + uint32_t src_queue_mask = radv_image_queue_family_mask(src_image, + cmd_buffer->queue_family_index, + cmd_buffer->queue_family_index); + bool src_compressed = radv_layout_dcc_compressed(src_image, src_image_layout, src_queue_mask); + + if (!src_compressed || radv_dcc_formats_compatible(b_src.format, b_dst.format)) { + b_src.format = b_dst.format; + } else if (!dst_compressed) { + b_dst.format = b_src.format; + } else { + radv_decompress_dcc(cmd_buffer, dest_image, &(VkImageSubresourceRange) { + .aspectMask = pRegions[r].dstSubresource.aspectMask, + .baseMipLevel = pRegions[r].dstSubresource.mipLevel, + .levelCount = 1, + .baseArrayLayer = pRegions[r].dstSubresource.baseArrayLayer, + .layerCount = pRegions[r].dstSubresource.layerCount, + }); + b_dst.format = b_src.format; + b_dst.current_layout = VK_IMAGE_LAYOUT_GENERAL; + } + /** * From the Vulkan 1.0.6 spec: 18.4 Copying Data Between Buffers and Images @@ -429,7 +464,9 @@ void radv_CmdCopyImage( RADV_FROM_HANDLE(radv_image, src_image, srcImage); RADV_FROM_HANDLE(radv_image, dest_image, destImage); - meta_copy_image(cmd_buffer, src_image, dest_image, + meta_copy_image(cmd_buffer, + src_image, srcImageLayout, + dest_image, destImageLayout, regionCount, pRegions); } @@ -449,6 +486,7 @@ void radv_blit_to_prime_linear(struct radv_cmd_buffer *cmd_buffer, image_copy.extent.height = image->info.height; image_copy.extent.depth = 1; - meta_copy_image(cmd_buffer, image, linear_image, + meta_copy_image(cmd_buffer, image, VK_IMAGE_LAYOUT_GENERAL, linear_image, + VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy); }