[Mesa-dev] [PATCH 08/22] anv/cmd_buffer: Always enable CCS_D in render passes

Nanley Chery nanleychery at gmail.com
Thu Apr 27 18:32:07 UTC 2017


The lifespan of the fast-clear data will surpass the render pass scope.
We need CCS_D to be enabled in order to invalidate blocks previously
marked as cleared and to sample cleared data correctly.

Signed-off-by: Nanley Chery <nanley.g.chery at intel.com>
---
 src/intel/vulkan/anv_blorp.c       | 15 ++----
 src/intel/vulkan/genX_cmd_buffer.c | 94 +++++++++++++++++++-------------------
 2 files changed, 52 insertions(+), 57 deletions(-)

diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
index d17b73dcc7..5e7d4b06b8 100644
--- a/src/intel/vulkan/anv_blorp.c
+++ b/src/intel/vulkan/anv_blorp.c
@@ -1383,7 +1383,8 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,
       &cmd_buffer->state.attachments[att];
 
    if (att_state->aux_usage == ISL_AUX_USAGE_NONE ||
-       att_state->aux_usage == ISL_AUX_USAGE_MCS)
+       att_state->aux_usage == ISL_AUX_USAGE_MCS ||
+       att_state->fast_clear == false)
       return; /* Nothing to resolve */
 
    assert(att_state->aux_usage == ISL_AUX_USAGE_CCS_E ||
@@ -1432,7 +1433,7 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,
           * the render pass.  We need a full resolve.
           */
          resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL;
-      } else if (att_state->fast_clear) {
+      } else {
          /* We don't know what to do with clear colors outside the render
           * pass.  We need a partial resolve. Only transparent black is
           * built into the surface state object and thus no resolve is
@@ -1443,11 +1444,6 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,
              att_state->clear_value.color.uint32[2] ||
              att_state->clear_value.color.uint32[3])
             resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL;
-      } else {
-         /* The image "natively" supports all the compression we care about
-          * and we don't need to resolve at all.  If this is the case, we also
-          * don't need to resolve for any of the input attachment cases below.
-          */
       }
    } else if (usage & ANV_SUBPASS_USAGE_INPUT) {
       /* Input attachments are clear-color aware so, at least on Sky Lake, we
@@ -1474,8 +1470,7 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,
    struct blorp_surf surf;
    get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT,
                                 att_state->aux_usage, &surf);
-   if (att_state->fast_clear)
-      surf.clear_color = vk_to_isl_color(att_state->clear_value.color);
+   surf.clear_color = vk_to_isl_color(att_state->clear_value.color);
 
    /* From the Sky Lake PRM Vol. 7, "Render Target Resolve":
     *
@@ -1504,8 +1499,6 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,
 
    /* Once we've done any sort of resolve, we're no longer fast-cleared */
    att_state->fast_clear = false;
-   if (att_state->aux_usage == ISL_AUX_USAGE_CCS_D)
-      att_state->aux_usage = ISL_AUX_USAGE_NONE;
 }
 
 void
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index ddb22c4539..0ea378fde2 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -232,6 +232,50 @@ color_attachment_compute_aux_usage(struct anv_device *device,
       att_state->input_aux_usage = ISL_AUX_USAGE_MCS;
       att_state->fast_clear = false;
       return;
+   } else if (GEN_GEN == 7 &&
+              (iview->isl.base_level > 0 ||
+               iview->isl.base_array_layer > 0 ||
+               iview->isl.array_len > 1)) {
+      /* On gen7, we can't do multi-LOD or multi-layer CCS. We technically
+       * can, but it comes with crazy restrictions that we don't want to deal
+       * with now.
+       */
+      att_state->aux_usage = ISL_AUX_USAGE_NONE;
+      att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
+      att_state->fast_clear = false;
+      return;
+   } else if (iview->image->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;
+   } else {
+      att_state->aux_usage = ISL_AUX_USAGE_CCS_D;
+      if (isl_format_supports_ccs_e(&device->info, iview->isl.format)) {
+         /* SKL can sample from CCS with one restriction.
+          *
+          * From the Sky Lake PRM, RENDER_SURFACE_STATE::AuxiliarySurfaceMode:
+          *
+          *    "If Number of Multisamples is MULTISAMPLECOUNT_1, AUX_CCS_D
+          *    setting is only allowed if Surface Format supported for Fast
+          *    Clear. In addition, if the surface is bound to the sampling
+          *    engine, Surface Format must be supported for Render Target
+          *    Compression for surfaces bound to the sampling engine."
+          *
+          * In other words, we can only sample from a fast-cleared image if it
+          * also supports color compression.
+          *
+          * TODO: Consider using a heuristic to determine if temporarily enabling
+          * CCS_E for this image view would be beneficial.
+          *
+          * While fast-clear resolves and partial resolves are fairly cheap in the
+          * case where you render to most of the pixels, full resolves are not
+          * because they potentially involve reading and writing the entire
+          * framebuffer.  If we can't texture with CCS_E, we should leave it off and
+          * limit ourselves to fast clears.
+          */
+         att_state->input_aux_usage = ISL_AUX_USAGE_CCS_D;
+      } else {
+         att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
+      }
    }
 
    assert(iview->image->aux_surface.isl.usage & ISL_SURF_USAGE_CCS_BIT);
@@ -240,6 +284,10 @@ color_attachment_compute_aux_usage(struct anv_device *device,
       color_is_zero_one(att_state->clear_value.color, iview->isl.format);
 
    if (att_state->pending_clear_aspects == VK_IMAGE_ASPECT_COLOR_BIT) {
+
+      /* We should have returned early if the aux buffer will not be used. */
+      assert(att_state->aux_usage != ISL_AUX_USAGE_NONE);
+
       /* Start off assuming fast clears are possible */
       att_state->fast_clear = true;
 
@@ -253,17 +301,6 @@ color_attachment_compute_aux_usage(struct anv_device *device,
           render_area.extent.height != iview->extent.height)
          att_state->fast_clear = false;
 
-      if (GEN_GEN <= 7) {
-         /* On gen7, we can't do multi-LOD or multi-layer fast-clears.  We
-          * technically can, but it comes with crazy restrictions that we
-          * don't want to deal with now.
-          */
-         if (iview->isl.base_level > 0 ||
-             iview->isl.base_array_layer > 0 ||
-             iview->isl.array_len > 1)
-            att_state->fast_clear = false;
-      }
-
       /* On Broadwell and earlier, we can only handle 0/1 clear colors */
       if (GEN_GEN <= 8 && !att_state->clear_color_is_zero_one)
          att_state->fast_clear = false;
@@ -275,41 +312,6 @@ color_attachment_compute_aux_usage(struct anv_device *device,
    } else {
       att_state->fast_clear = false;
    }
-
-   /**
-    * TODO: Consider using a heuristic to determine if temporarily enabling
-    * CCS_E for this image view would be beneficial.
-    *
-    * While fast-clear resolves and partial resolves are fairly cheap in the
-    * case where you render to most of the pixels, full resolves are not
-    * because they potentially involve reading and writing the entire
-    * framebuffer.  If we can't texture with CCS_E, we should leave it off and
-    * limit ourselves to fast clears.
-    */
-   if (iview->image->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;
-   } else if (att_state->fast_clear) {
-      att_state->aux_usage = ISL_AUX_USAGE_CCS_D;
-      /* From the Sky Lake PRM, RENDER_SURFACE_STATE::AuxiliarySurfaceMode:
-       *
-       *    "If Number of Multisamples is MULTISAMPLECOUNT_1, AUX_CCS_D
-       *    setting is only allowed if Surface Format supported for Fast
-       *    Clear. In addition, if the surface is bound to the sampling
-       *    engine, Surface Format must be supported for Render Target
-       *    Compression for surfaces bound to the sampling engine."
-       *
-       * In other words, we can only sample from a fast-cleared image if it
-       * also supports color compression.
-       */
-      if (isl_format_supports_ccs_e(&device->info, iview->isl.format))
-         att_state->input_aux_usage = ISL_AUX_USAGE_CCS_D;
-      else
-         att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
-   } else {
-      att_state->aux_usage = ISL_AUX_USAGE_NONE;
-      att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
-   }
 }
 
 static bool
-- 
2.12.2



More information about the mesa-dev mailing list