Mesa (staging/21.1): radv: fix various CMASK regressions on GFX9

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Apr 27 18:22:17 UTC 2021


Module: Mesa
Branch: staging/21.1
Commit: dff02e24c47331a58b6a3574c6ad22d0f077a7a4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=dff02e24c47331a58b6a3574c6ad22d0f077a7a4

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Wed Apr 21 14:11:44 2021 +0200

radv: fix various CMASK regressions on GFX9

This fixes a bunch of MSAA related CTS regressions. This restores
previous behaviour on GFX9 but it should be fixed properly.

Cc: 21.1 mesa-stable
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10374>
(cherry picked from commit a854a9fa623d3269eeebdc34c06ae442a65e2e41)

---

 .pick_status.json                |  2 +-
 src/amd/vulkan/radv_cmd_buffer.c | 26 +++++++++++++++++++++-----
 src/amd/vulkan/radv_meta_clear.c | 12 +++++++++---
 3 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index ebf310c5c19..1ac2bde69c6 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -355,7 +355,7 @@
         "description": "radv: fix various CMASK regressions on GFX9",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": null
     },
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index be06350f049..bdac6f9f07d 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -5991,11 +5991,8 @@ radv_handle_depth_image_transition(struct radv_cmd_buffer *cmd_buffer, struct ra
 
 static uint32_t
 radv_init_cmask(struct radv_cmd_buffer *cmd_buffer, struct radv_image *image,
-                const VkImageSubresourceRange *range)
+                const VkImageSubresourceRange *range, uint32_t value)
 {
-   static const uint32_t cmask_clear_values[4] = {0xffffffff, 0xdddddddd, 0xeeeeeeee, 0xffffffff};
-   uint32_t log2_samples = util_logbase2(image->info.samples);
-   uint32_t value = cmask_clear_values[log2_samples];
    struct radv_barrier_data barrier = {0};
 
    barrier.layout_transitions.init_mask_ram = 1;
@@ -6079,7 +6076,26 @@ radv_init_color_image_metadata(struct radv_cmd_buffer *cmd_buffer, struct radv_i
       radv_src_access_flush(cmd_buffer, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, image);
 
    if (radv_image_has_cmask(image)) {
-      flush_bits |= radv_init_cmask(cmd_buffer, image, range);
+      uint32_t value;
+
+      if (cmd_buffer->device->physical_device->rad_info.chip_class == GFX9) {
+         /* TODO: Fix clearing CMASK layers on GFX9. */
+         if (radv_image_is_tc_compat_cmask(image) ||
+             (radv_image_has_fmask(image) &&
+              radv_layout_can_fast_clear(cmd_buffer->device, image, dst_layout,
+                                         dst_render_loop, dst_queue_mask))) {
+            value = 0xccccccccu;
+         } else {
+            value = 0xffffffffu;
+         }
+      } else {
+         static const uint32_t cmask_clear_values[4] = {0xffffffff, 0xdddddddd, 0xeeeeeeee, 0xffffffff};
+         uint32_t log2_samples = util_logbase2(image->info.samples);
+
+         value = cmask_clear_values[log2_samples];
+      }
+
+      flush_bits |= radv_init_cmask(cmd_buffer, image, range, value);
    }
 
    if (radv_image_has_fmask(image)) {
diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c
index 0966c5b4a95..d9c09e01682 100644
--- a/src/amd/vulkan/radv_meta_clear.c
+++ b/src/amd/vulkan/radv_meta_clear.c
@@ -1242,11 +1242,17 @@ radv_clear_cmask(struct radv_cmd_buffer *cmd_buffer, struct radv_image *image,
                  const VkImageSubresourceRange *range, uint32_t value)
 {
    uint64_t offset = image->offset + image->planes[0].surface.cmask_offset;
-   unsigned slice_size = image->planes[0].surface.cmask_slice_size;
    uint64_t size;
 
-   offset += slice_size * range->baseArrayLayer;
-   size = slice_size * radv_get_layerCount(image, range);
+   if (cmd_buffer->device->physical_device->rad_info.chip_class == GFX9) {
+      /* TODO: clear layers. */
+      size = image->planes[0].surface.cmask_size;
+   } else {
+      unsigned slice_size = image->planes[0].surface.cmask_slice_size;
+
+      offset += slice_size * range->baseArrayLayer;
+      size = slice_size * radv_get_layerCount(image, range);
+   }
 
    return radv_fill_buffer(cmd_buffer, image, image->bo, offset, size, value);
 }



More information about the mesa-commit mailing list