On Thu, Apr 27, 2017 at 11:32 AM, Nanley Chery <nanleych...@gmail.com>
wrote:

> 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.ch...@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;
> +      }
>

Is this refactor needed?  I don't see how this code does anything different
from what we had before.


>     }
>
>     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
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to