X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Famd%2Fvulkan%2Fradv_meta_copy.c;h=7f7ef22efc815f7b01f43d80ec657386c1b355f9;hb=2670ebb5840c2108c55607520f1cf9eb5868e27a;hp=29951f2ba44910b782ef04197199185dc440be8b;hpb=d2acf97e49e104a45fd8aa0cbe3ad30d0dc37596;p=mesa.git diff --git a/src/amd/vulkan/radv_meta_copy.c b/src/amd/vulkan/radv_meta_copy.c index 29951f2ba44..7f7ef22efc8 100644 --- a/src/amd/vulkan/radv_meta_copy.c +++ b/src/amd/vulkan/radv_meta_copy.c @@ -369,8 +369,31 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer, 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