Module: Mesa
Branch: main
Commit: 3cf7ac4e9c4bbe67844437fa7f1f739076a9682b
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=3cf7ac4e9c4bbe67844437fa7f1f739076a9682b

Author: Chia-I Wu <[email protected]>
Date:   Tue Mar  7 13:01:37 2023 -0800

radv: rework radv_layout_fmask_compressed

Rename radv_layout_fmask_compressed and make it return an enum.  We will
add partial compression (fmask decompressed and not expanded) in a
following commit.

Drop the check for VK_IMAGE_USAGE_STORAGE_BIT and
VK_IMAGE_USAGE_TRANSFER_DST_BIT.  When transitioning to
VK_IMAGE_LAYOUT_GENERAL, we should decompress and expand FMASK even when
those usage bits are not set.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21615>

---

 src/amd/vulkan/radv_cmd_buffer.c | 22 ++++++++++++++--------
 src/amd/vulkan/radv_image.c      | 20 +++++++++++---------
 src/amd/vulkan/radv_private.h    | 10 ++++++++--
 3 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 880d060630a..c14e2194a22 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -2665,10 +2665,10 @@ radv_emit_fb_color_state(struct radv_cmd_buffer 
*cmd_buffer, int index,
       }
    }
 
-   if (!radv_layout_fmask_compressed(
-          cmd_buffer->device, image, layout,
-          radv_image_queue_family_mask(image, cmd_buffer->qf,
-                                       cmd_buffer->qf))) {
+   const enum radv_fmask_compression fmask_comp =
+      radv_layout_fmask_compression(cmd_buffer->device, image, layout,
+            radv_image_queue_family_mask(image, cmd_buffer->qf, 
cmd_buffer->qf));
+   if (fmask_comp == RADV_FMASK_COMPRESSION_NONE) {
       cb_color_info &= C_028C70_COMPRESSION;
    }
 
@@ -10301,10 +10301,14 @@ radv_handle_color_image_transition(struct 
radv_cmd_buffer *cmd_buffer, struct ra
    }
 
    /* MSAA color decompress. */
-   if (radv_image_has_fmask(image) &&
-       (image->vk.usage & (VK_IMAGE_USAGE_STORAGE_BIT | 
VK_IMAGE_USAGE_TRANSFER_DST_BIT)) &&
-       radv_layout_fmask_compressed(cmd_buffer->device, image, src_layout, 
src_queue_mask) &&
-       !radv_layout_fmask_compressed(cmd_buffer->device, image, dst_layout, 
dst_queue_mask)) {
+   const enum radv_fmask_compression src_fmask_comp = 
radv_layout_fmask_compression(cmd_buffer->device,
+         image, src_layout, src_queue_mask);
+   const enum radv_fmask_compression dst_fmask_comp = 
radv_layout_fmask_compression(cmd_buffer->device,
+         image, dst_layout, dst_queue_mask);
+   if (src_fmask_comp <= dst_fmask_comp)
+      return;
+
+   if (src_fmask_comp == RADV_FMASK_COMPRESSION_FULL) {
       if (radv_dcc_enabled(image, range->baseMipLevel) &&
           !radv_image_use_dcc_image_stores(cmd_buffer->device, image) && 
!dcc_decompressed) {
          /* A DCC decompress is required before expanding FMASK
@@ -10319,7 +10323,9 @@ radv_handle_color_image_transition(struct 
radv_cmd_buffer *cmd_buffer, struct ra
           */
          radv_fast_clear_flush_image_inplace(cmd_buffer, image, range);
       }
+   }
 
+   if (dst_fmask_comp == RADV_FMASK_COMPRESSION_NONE) {
       struct radv_barrier_data barrier = {0};
       barrier.layout_transitions.fmask_color_expand = 1;
       radv_describe_layout_transition(cmd_buffer, &barrier);
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 7715b550ecb..4de96af2ad8 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -2449,23 +2449,25 @@ radv_layout_dcc_compressed(const struct radv_device 
*device, const struct radv_i
    return device->physical_device->rad_info.gfx_level >= GFX10 || layout != 
VK_IMAGE_LAYOUT_GENERAL;
 }
 
-bool
-radv_layout_fmask_compressed(const struct radv_device *device, const struct 
radv_image *image,
-                             VkImageLayout layout, unsigned queue_mask)
+enum radv_fmask_compression
+radv_layout_fmask_compression(const struct radv_device *device, const struct 
radv_image *image,
+                               VkImageLayout layout, unsigned queue_mask)
 {
    if (!radv_image_has_fmask(image))
-      return false;
+      return RADV_FMASK_COMPRESSION_NONE;
+
+   if (layout == VK_IMAGE_LAYOUT_GENERAL)
+      return RADV_FMASK_COMPRESSION_NONE;
 
    /* Don't compress compute transfer dst because image stores ignore FMASK 
and it needs to be
     * expanded before.
     */
-   if ((layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL || layout == 
VK_IMAGE_LAYOUT_GENERAL) &&
-       (queue_mask & (1u << RADV_QUEUE_COMPUTE)))
-      return false;
+   if (layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && (queue_mask & (1u << 
RADV_QUEUE_COMPUTE)))
+      return RADV_FMASK_COMPRESSION_NONE;
 
    /* Only compress concurrent images if TC-compat CMASK is enabled (no FMASK 
decompression). */
-   return layout != VK_IMAGE_LAYOUT_GENERAL &&
-          (queue_mask == (1u << RADV_QUEUE_GENERAL) || 
radv_image_is_tc_compat_cmask(image));
+   return (queue_mask == (1u << RADV_QUEUE_GENERAL) || 
radv_image_is_tc_compat_cmask(image)) ?
+      RADV_FMASK_COMPRESSION_FULL : RADV_FMASK_COMPRESSION_NONE;
 }
 
 unsigned
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 5a822a40746..cc1fb635c55 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -2547,8 +2547,14 @@ bool radv_layout_can_fast_clear(const struct radv_device 
*device, const struct r
 bool radv_layout_dcc_compressed(const struct radv_device *device, const struct 
radv_image *image,
                                 unsigned level, VkImageLayout layout, unsigned 
queue_mask);
 
-bool radv_layout_fmask_compressed(const struct radv_device *device, const 
struct radv_image *image,
-                                  VkImageLayout layout, unsigned queue_mask);
+enum radv_fmask_compression {
+   RADV_FMASK_COMPRESSION_NONE,
+   RADV_FMASK_COMPRESSION_FULL,
+};
+
+enum radv_fmask_compression radv_layout_fmask_compression(
+      const struct radv_device *device, const struct radv_image *image, 
VkImageLayout layout,
+      unsigned queue_mask);
 
 /**
  * Return whether the image has CMASK metadata for color surfaces.

Reply via email to