[Mesa-dev] [PATCH 14/14] anv: Add support for MSAA fast-clears

Jason Ekstrand jason at jlekstrand.net
Mon Nov 13 16:12:54 UTC 2017


This speeds up the Sascha Willems multisampling demo by around 25% when
using 8x MSAA.
---
 src/intel/vulkan/anv_blorp.c       |  6 ++++++
 src/intel/vulkan/genX_cmd_buffer.c | 22 ++++++++++++----------
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
index 266cb9a..1e15797 100644
--- a/src/intel/vulkan/anv_blorp.c
+++ b/src/intel/vulkan/anv_blorp.c
@@ -1549,6 +1549,12 @@ anv_cmd_buffer_resolve_subpass(struct anv_cmd_buffer *cmd_buffer)
          get_blorp_surf_for_anv_image(src_iview->image,
                                       VK_IMAGE_ASPECT_COLOR_BIT,
                                       src_aux_usage, &src_surf);
+         if (src_aux_usage == ISL_AUX_USAGE_MCS) {
+            src_surf.clear_color_addr = anv_to_blorp_address(
+               anv_image_get_clear_color_addr(cmd_buffer->device,
+                                              src_iview->image,
+                                              VK_IMAGE_ASPECT_COLOR_BIT, 0));
+         }
          get_blorp_surf_for_anv_image(dst_iview->image,
                                       VK_IMAGE_ASPECT_COLOR_BIT,
                                       dst_aux_usage, &dst_surf);
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index 2491b1d..1c1c644 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -244,8 +244,6 @@ color_attachment_compute_aux_usage(struct anv_device * device,
    } else if (iview->image->planes[0].aux_usage == ISL_AUX_USAGE_MCS) {
       att_state->aux_usage = ISL_AUX_USAGE_MCS;
       att_state->input_aux_usage = ISL_AUX_USAGE_MCS;
-      att_state->fast_clear = false;
-      return;
    } else if (iview->image->planes[0].aux_usage == ISL_AUX_USAGE_CCS_E) {
       att_state->aux_usage = ISL_AUX_USAGE_CCS_E;
       att_state->input_aux_usage = ISL_AUX_USAGE_CCS_E;
@@ -281,7 +279,8 @@ color_attachment_compute_aux_usage(struct anv_device * device,
       }
    }
 
-   assert(iview->image->planes[0].aux_surface.isl.usage & ISL_SURF_USAGE_CCS_BIT);
+   assert(iview->image->planes[0].aux_surface.isl.usage &
+            (ISL_SURF_USAGE_CCS_BIT | ISL_SURF_USAGE_MCS_BIT));
 
    att_state->clear_color_is_zero_one =
       color_is_zero_one(att_state->clear_value.color, iview->planes[0].isl.format);
@@ -726,9 +725,6 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
        * if the initial layout is COLOR_ATTACHMENT_OPTIMAL.
        */
       return;
-   } else if (image->samples > 1) {
-      /* MCS buffers don't need resolving. */
-      return;
    }
 
    /* Perform a resolve to synchronize data between the main and aux buffer.
@@ -760,10 +756,16 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
 
       genX(load_needs_resolve_predicate)(cmd_buffer, image, aspect, level);
 
-      anv_ccs_resolve(cmd_buffer, image, aspect, level, base_layer, layer_count,
-                      image->planes[plane].aux_usage == ISL_AUX_USAGE_CCS_E ?
-                      BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL :
-                      BLORP_FAST_CLEAR_OP_RESOLVE_FULL);
+      if (image->samples > 1) {
+         anv_mcs_partial_resolve(cmd_buffer, image, aspect,
+                                 base_layer, layer_count);
+      } else {
+         anv_ccs_resolve(cmd_buffer, image, aspect,
+                         level, base_layer, layer_count,
+                         image->planes[plane].aux_usage == ISL_AUX_USAGE_CCS_E ?
+                         BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL :
+                         BLORP_FAST_CLEAR_OP_RESOLVE_FULL);
+      }
 
       genX(set_image_needs_resolve)(cmd_buffer, image, aspect, level, false);
    }
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list