amd: replace SH -> SA (shader array) in comments
[mesa.git] / src / amd / vulkan / radv_meta_copy.c
index 8081057d9df8abfb804c2317fb468d99d9b66a0e..5e555a506cc7db35a5792bac47fafcabf79da6ba 100644 (file)
@@ -87,7 +87,7 @@ blit_surf_for_image_level_layer(struct radv_image *image,
 {
        VkFormat format = radv_get_aspect_format(image, aspect_mask);
 
-       if (!radv_image_has_dcc(image) &&
+       if (!radv_dcc_enabled(image, subres->mipLevel) &&
            !(radv_image_is_tc_compat_htile(image)))
                format = vk_format_for_size(vk_format_get_blocksize(format));
 
@@ -187,6 +187,24 @@ meta_copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer,
                                                        &pRegions[r].imageSubresource,
                                                        pRegions[r].imageSubresource.aspectMask);
 
+               if (!radv_is_buffer_format_supported(img_bsurf.format, NULL)) {
+                       uint32_t queue_mask = radv_image_queue_family_mask(image,
+                                                                          cmd_buffer->queue_family_index,
+                                                                          cmd_buffer->queue_family_index);
+                       bool compressed = radv_layout_dcc_compressed(cmd_buffer->device, image, layout, false, queue_mask);
+                       if (compressed) {
+                               radv_decompress_dcc(cmd_buffer, image, &(VkImageSubresourceRange) {
+                                                               .aspectMask = pRegions[r].imageSubresource.aspectMask,
+                                                               .baseMipLevel = pRegions[r].imageSubresource.mipLevel,
+                                                               .levelCount = 1,
+                                                               .baseArrayLayer = pRegions[r].imageSubresource.baseArrayLayer,
+                                                               .layerCount = pRegions[r].imageSubresource.layerCount,
+                                                       });
+                       }
+                       img_bsurf.format = vk_format_for_size(vk_format_get_blocksize(img_bsurf.format));
+                       img_bsurf.current_layout = VK_IMAGE_LAYOUT_GENERAL;
+               }
+
                struct radv_meta_blit2d_buffer buf_bsurf = {
                        .bs = img_bsurf.bs,
                        .format = img_bsurf.format,
@@ -313,6 +331,24 @@ meta_copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer,
                                                        &pRegions[r].imageSubresource,
                                                        pRegions[r].imageSubresource.aspectMask);
 
+               if (!radv_is_buffer_format_supported(img_info.format, NULL)) {
+                       uint32_t queue_mask = radv_image_queue_family_mask(image,
+                                                                          cmd_buffer->queue_family_index,
+                                                                          cmd_buffer->queue_family_index);
+                       bool compressed = radv_layout_dcc_compressed(cmd_buffer->device, image, layout, false, queue_mask);
+                       if (compressed) {
+                               radv_decompress_dcc(cmd_buffer, image, &(VkImageSubresourceRange) {
+                                                               .aspectMask = pRegions[r].imageSubresource.aspectMask,
+                                                               .baseMipLevel = pRegions[r].imageSubresource.mipLevel,
+                                                               .levelCount = 1,
+                                                               .baseArrayLayer = pRegions[r].imageSubresource.baseArrayLayer,
+                                                               .layerCount = pRegions[r].imageSubresource.layerCount,
+                                                       });
+                       }
+                       img_info.format = vk_format_for_size(vk_format_get_blocksize(img_info.format));
+                       img_info.current_layout = VK_IMAGE_LAYOUT_GENERAL;
+               }
+
                struct radv_meta_blit2d_buffer buf_info = {
                        .bs = img_info.bs,
                        .format = img_info.format,
@@ -428,11 +464,11 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer,
                        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);
+                       bool dst_compressed = radv_layout_dcc_compressed(cmd_buffer->device, dest_image, dest_image_layout, false, 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);
+                       bool src_compressed = radv_layout_dcc_compressed(cmd_buffer->device, src_image, src_image_layout, false, src_queue_mask);
 
                        if (!src_compressed || radv_dcc_formats_compatible(b_src.format, b_dst.format)) {
                                b_src.format = b_dst.format;