radv: Use correct color format for fast clears
[mesa.git] / src / amd / vulkan / radv_meta_resolve.c
index 1828eb37f46ebc3765dd43773c50475aa9d4f2bf..d4d3552f317a1676bb331a28c4e1dc15ebbdcc84 100644 (file)
@@ -358,6 +358,8 @@ static void radv_pick_resolve_method_images(struct radv_image *src_image,
                *method = RESOLVE_COMPUTE;
        else if (vk_format_is_int(src_image->vk_format))
                *method = RESOLVE_COMPUTE;
+       else if (src_image->info.array_size > 1)
+               *method = RESOLVE_COMPUTE;
        
        if (radv_layout_dcc_compressed(dest_image, dest_image_layout, queue_mask)) {
                *method = RESOLVE_FRAGMENT;
@@ -689,18 +691,16 @@ radv_decompress_resolve_subpass_src(struct radv_cmd_buffer *cmd_buffer)
                    dest_att.attachment == VK_ATTACHMENT_UNUSED)
                        continue;
 
-               struct radv_image_view *src_iview =
-                       fb->attachments[src_att.attachment].attachment;
+               struct radv_image *src_image =
+                       fb->attachments[src_att.attachment].attachment->image;
 
-               VkImageSubresourceRange range;
-               range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
-               range.baseMipLevel = 0;
-               range.levelCount = 1;
-               range.baseArrayLayer = 0;
-               range.layerCount = 1;
+               VkImageResolve region = {};
+               region.srcSubresource.baseArrayLayer = 0;
+               region.srcSubresource.mipLevel = 0;
+               region.srcSubresource.layerCount = src_image->info.array_size;
 
-               radv_fast_clear_flush_image_inplace(cmd_buffer,
-                                                   src_iview->image, &range);
+               radv_decompress_resolve_src(cmd_buffer, src_image,
+                                           src_att.layout, 1, &region);
        }
 }
 
@@ -710,6 +710,7 @@ radv_decompress_resolve_subpass_src(struct radv_cmd_buffer *cmd_buffer)
 void
 radv_decompress_resolve_src(struct radv_cmd_buffer *cmd_buffer,
                            struct radv_image *src_image,
+                           VkImageLayout src_image_layout,
                            uint32_t region_count,
                            const VkImageResolve *regions)
 {
@@ -725,6 +726,17 @@ radv_decompress_resolve_src(struct radv_cmd_buffer *cmd_buffer,
                range.baseArrayLayer = src_base_layer;
                range.layerCount = region->srcSubresource.layerCount;
 
-               radv_fast_clear_flush_image_inplace(cmd_buffer, src_image, &range);
+               uint32_t queue_mask =
+                       radv_image_queue_family_mask(src_image,
+                                                    cmd_buffer->queue_family_index,
+                                                    cmd_buffer->queue_family_index);
+
+               if (radv_layout_dcc_compressed(src_image, src_image_layout,
+                                              queue_mask)) {
+                       radv_decompress_dcc(cmd_buffer, src_image, &range);
+               } else {
+                       radv_fast_clear_flush_image_inplace(cmd_buffer,
+                                                           src_image, &range);
+               }
        }
 }