radv/gfx9: reduce the number of input VGPRs for the GS stage
[mesa.git] / src / amd / vulkan / radv_meta_copy.c
index a42b15a01afa5a6649af169558955fbd6e4f9603..7f7ef22efc815f7b01f43d80ec657386c1b355f9 100644 (file)
@@ -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);
 }