[Mesa-dev] [PATCH 11/14] anv/cmd_buffer: Sync clear values in begin_subpass

Jason Ekstrand jason at jlekstrand.net
Wed Feb 14 01:16:34 UTC 2018


On Tue, Feb 13, 2018 at 4:35 PM, Nanley Chery <nanleychery at gmail.com> wrote:

> On Mon, Feb 05, 2018 at 02:35:00PM -0800, Jason Ekstrand wrote:
> > This is quite a bit cleaner because we now sync the clear values at the
> > same time as we do the fast clear.  For loading the clear values into
> > the surface state, we now do it once when we handle the LOAD_OP_LOAD
> > instead of every subpass.
> > ---
> >  src/intel/vulkan/genX_cmd_buffer.c | 148 ++++++++++++------------------
> -------
> >  1 file changed, 48 insertions(+), 100 deletions(-)
> >
> > diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> b/src/intel/vulkan/genX_cmd_buffer.c
> > index f92e86f..4eee85a 100644
> > --- a/src/intel/vulkan/genX_cmd_buffer.c
> > +++ b/src/intel/vulkan/genX_cmd_buffer.c
> > @@ -3392,97 +3392,6 @@ cmd_buffer_subpass_transition_layouts(struct
> anv_cmd_buffer * const cmd_buffer,
> >     }
> >  }
> >
> > -/* Update the clear value dword(s) in surface state objects or the fast
> clear
> > - * state buffer entry for the color attachments used in this subpass.
> > - */
> > -static void
> > -cmd_buffer_subpass_sync_fast_clear_values(struct anv_cmd_buffer
> *cmd_buffer)
> > -{
> > -   assert(cmd_buffer && cmd_buffer->state.subpass);
> > -
> > -   const struct anv_cmd_state *state = &cmd_buffer->state;
> > -
> > -   /* Iterate through every color attachment used in this subpass. */
> > -   for (uint32_t i = 0; i < state->subpass->color_count; ++i) {
> > -
> > -      /* The attachment should be one of the attachments described in
> the
> > -       * render pass and used in the subpass.
> > -       */
> > -      const uint32_t a = state->subpass->color_
> attachments[i].attachment;
> > -      if (a == VK_ATTACHMENT_UNUSED)
> > -         continue;
> > -
> > -      assert(a < state->pass->attachment_count);
> > -
> > -      /* Store some information regarding this attachment. */
> > -      const struct anv_attachment_state *att_state =
> &state->attachments[a];
> > -      const struct anv_image_view *iview = state->framebuffer->
> attachments[a];
> > -      const struct anv_render_pass_attachment *rp_att =
> > -         &state->pass->attachments[a];
> > -
> > -      if (att_state->aux_usage == ISL_AUX_USAGE_NONE)
> > -         continue;
> > -
> > -      /* The fast clear state entry must be updated if a fast clear is
> going to
> > -       * happen. The surface state must be updated if the clear value
> from a
> > -       * prior fast clear may be needed.
> > -       */
> > -      if (att_state->pending_clear_aspects && att_state->fast_clear) {
> > -         /* Update the fast clear state entry. */
> > -         genX(copy_fast_clear_dwords)(cmd_buffer,
> att_state->color.state,
> > -                                      iview->image,
> > -                                      VK_IMAGE_ASPECT_COLOR_BIT,
> > -                                      true /* copy from ss */);
> > -
> > -         /* Fast-clears impact whether or not a resolve will be
> necessary. */
> > -         if (att_state->clear_color_is_zero) {
> > -            /* This image always has the auxiliary buffer enabled. We
> can mark
> > -             * the subresource as not needing a resolve because the
> clear color
> > -             * will match what's in every RENDER_SURFACE_STATE object
> when it's
> > -             * being used for sampling.
> > -             */
> > -            set_image_fast_clear_state(cmd_buffer, iview->image,
> > -                                       VK_IMAGE_ASPECT_COLOR_BIT,
> > -                                       ANV_FAST_CLEAR_DEFAULT_VALUE);
> > -         } else {
> > -            set_image_fast_clear_state(cmd_buffer, iview->image,
> > -                                       VK_IMAGE_ASPECT_COLOR_BIT,
> > -                                       ANV_FAST_CLEAR_ANY);
> > -         }
> > -      } else if (rp_att->load_op == VK_ATTACHMENT_LOAD_OP_LOAD &&
> > -                 iview->planes[0].isl.base_level == 0 &&
> > -                 iview->planes[0].isl.base_array_layer == 0) {
> > -         /* The attachment may have been fast-cleared in a previous
> render
> > -          * pass and the value is needed now. Update the surface
> state(s).
> > -          *
> > -          * TODO: Do this only once per render pass instead of every
> subpass.
> > -          */
> > -         genX(copy_fast_clear_dwords)(cmd_buffer,
> att_state->color.state,
> > -                                      iview->image,
> > -                                      VK_IMAGE_ASPECT_COLOR_BIT,
> > -                                      false /* copy to ss */);
> > -
> > -         if (need_input_attachment_state(rp_att) &&
> > -             att_state->input_aux_usage != ISL_AUX_USAGE_NONE) {
> > -            genX(copy_fast_clear_dwords)(cmd_buffer,
> att_state->input.state,
> > -                                         iview->image,
> > -                                         VK_IMAGE_ASPECT_COLOR_BIT,
> > -                                         false /* copy to ss */);
> > -         }
> > -      }
> > -
> > -      /* We assume that if we're starting a subpass, we're going to do
> some
> > -       * rendering so we may end up with compressed data.
> > -       */
> > -      genX(cmd_buffer_mark_image_written)(cmd_buffer, iview->image,
> > -                                          VK_IMAGE_ASPECT_COLOR_BIT,
> > -                                          att_state->aux_usage,
> > -                                          iview->planes[0].isl.base_
> level,
> > -                                          iview->planes[0].isl.base_
> array_layer,
> > -                                          state->framebuffer->layers);
> > -   }
> > -}
> > -
> >  static void
> >  cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
> >                           uint32_t subpass_id)
> > @@ -3523,15 +3432,6 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer
> *cmd_buffer,
> >      */
> >     cmd_buffer_subpass_transition_layouts(cmd_buffer, false);
> >
> > -   /* Update clear values *after* performing automatic layout
> transitions.
> > -    * This ensures that transitions from the UNDEFINED layout have had
> a chance
> > -    * to populate the clear value buffer with the correct values for the
> > -    * LOAD_OP_LOAD loadOp and that the fast-clears will update the
> buffer
> > -    * without the aforementioned layout transition overwriting the
> fast-clear
> > -    * value.
> > -    */
> > -   cmd_buffer_subpass_sync_fast_clear_values(cmd_buffer);
> > -
> >     VkRect2D render_area = cmd_buffer->state.render_area;
> >     struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
> >
> > @@ -3565,6 +3465,25 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer
> *cmd_buffer,
> >                               0, 0, 1, ISL_AUX_OP_FAST_CLEAR, false);
> >              base_layer++;
> >              layer_count--;
> > +
> > +            genX(copy_fast_clear_dwords)(cmd_buffer,
> att_state->color.state,
> > +                                         image,
> VK_IMAGE_ASPECT_COLOR_BIT,
> > +                                         true /* copy from ss */);
> > +
> > +            if (att_state->clear_color_is_zero) {
> > +               /* This image always has the auxiliary buffer enabled.
> We can
> > +                * mark the subresource as not needing a resolve because
> the
> > +                * clear color will match what's in every
> RENDER_SURFACE_STATE
> > +                * object when it's being used for sampling.
> > +                */
>
> This comment is stale. Fast-clearing to zero doesn't imply that the
> image always has the aux buffer enabled.
>

No, it doesn't.  However, this is in a block that's predicated on
att_state->fast_clear which does.  Looking at the latest version, I've
removed the word "always".


> With that updated, this patch is
> Reviewed-by: Nanley Chery <nanley.g.chery at intel.com>
>
>
> > +               set_image_fast_clear_state(cmd_buffer, iview->image,
> > +                                          VK_IMAGE_ASPECT_COLOR_BIT,
> > +                                          ANV_FAST_CLEAR_DEFAULT_VALUE);
> > +            } else {
> > +               set_image_fast_clear_state(cmd_buffer, iview->image,
> > +                                          VK_IMAGE_ASPECT_COLOR_BIT,
> > +                                          ANV_FAST_CLEAR_ANY);
> > +            }
> >           }
> >
> >           if (layer_count > 0) {
> > @@ -3605,7 +3524,36 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer
> *cmd_buffer,
> >           assert(att_state->pending_clear_aspects == 0);
> >        }
> >
> > +      if (att_state->pending_load_aspects &
> VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
> > +         if (att_state->aux_usage != ISL_AUX_USAGE_NONE) {
> > +            genX(copy_fast_clear_dwords)(cmd_buffer,
> att_state->color.state,
> > +                                         image,
> VK_IMAGE_ASPECT_COLOR_BIT,
> > +                                         false /* copy to ss */);
> > +         }
> > +
> > +         if (need_input_attachment_state(&cmd_state->pass->attachments[a])
> &&
> > +             att_state->input_aux_usage != ISL_AUX_USAGE_NONE) {
> > +            genX(copy_fast_clear_dwords)(cmd_buffer,
> att_state->input.state,
> > +                                         image,
> VK_IMAGE_ASPECT_COLOR_BIT,
> > +                                         false /* copy to ss */);
> > +         }
> > +      }
> > +
> > +      if (subpass->attachments[i].usage ==
> > +          VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
> > +         /* We assume that if we're starting a subpass, we're going to
> do some
> > +          * rendering so we may end up with compressed data.
> > +          */
> > +         genX(cmd_buffer_mark_image_written)(cmd_buffer, iview->image,
> > +                                             VK_IMAGE_ASPECT_COLOR_BIT,
> > +                                             att_state->aux_usage,
> > +                                             iview->planes[0].isl.base_
> level,
> > +                                             iview->planes[0].isl.base_
> array_layer,
> > +                                             fb->layers);
> > +      }
> > +
> >        att_state->pending_clear_aspects = 0;
> > +      att_state->pending_load_aspects = 0;
> >     }
> >
> >     cmd_buffer_emit_depth_stencil(cmd_buffer);
> > --
> > 2.5.0.400.gff86faf
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180213/08ad1e04/attachment-0001.html>


More information about the mesa-dev mailing list