From 1f548b7670435f022bc3ebb7ded66e6cfd62b7ad Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 8 Jan 2021 11:56:00 +0100 Subject: [PATCH] radv: decompress DCC for partial resolves using the compute path Because DCC is re-initialized to the uncompressed state after the resolve, so if the app does a partial resolve it should be decompressed first. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/radv_meta_resolve_cs.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/amd/vulkan/radv_meta_resolve_cs.c b/src/amd/vulkan/radv_meta_resolve_cs.c index 85e3d1e8c55..fa2d48a12af 100644 --- a/src/amd/vulkan/radv_meta_resolve_cs.c +++ b/src/amd/vulkan/radv_meta_resolve_cs.c @@ -768,6 +768,30 @@ void radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, radv_decompress_resolve_src(cmd_buffer, src_image, src_image_layout, region); + /* For partial resolves, DCC should be decompressed before resolving + * because the metadata is re-initialized to the uncompressed after. + */ + uint32_t queue_mask = radv_image_queue_family_mask(dest_image, + cmd_buffer->queue_family_index, + cmd_buffer->queue_family_index); + + if (radv_layout_dcc_compressed(cmd_buffer->device, dest_image, + dest_image_layout, false, queue_mask) && + (region->dstOffset.x || + region->dstOffset.y || + region->dstOffset.z || + region->extent.width != dest_image->info.width || + region->extent.height != dest_image->info.height || + region->extent.depth != dest_image->info.depth)) { + radv_decompress_dcc(cmd_buffer, dest_image, &(VkImageSubresourceRange) { + .aspectMask = region->dstSubresource.aspectMask, + .baseMipLevel = region->dstSubresource.mipLevel, + .levelCount = 1, + .baseArrayLayer = region->dstSubresource.baseArrayLayer, + .layerCount = region->dstSubresource.layerCount, + }); + } + radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS |