On Thu, Jan 11, 2018 at 01:50:41PM -0800, Nanley Chery wrote:
> On Fri, Dec 08, 2017 at 04:16:04PM +0200, Pohjolainen, Topi wrote:
> > On Mon, Nov 27, 2017 at 07:06:07PM -0800, Jason Ekstrand wrote:
> > > This doesn't really change much now but it will give us more/better
> > > control over clears in the future.  The one interesting functional
> > > change here is that we are now re-emitting 3DSTATE_DEPTH_BUFFERS and
> > > friends for each clear.  However, this only happens at begin_subpass
> > > time so it shouldn't be substantially more expensive.
> > > ---
> > >  src/intel/vulkan/anv_blorp.c       | 115 
> > > +++++++++++--------------------------
> > >  src/intel/vulkan/anv_private.h     |   8 +++
> > >  src/intel/vulkan/genX_cmd_buffer.c |  46 ++++++++++++++-
> > >  3 files changed, 86 insertions(+), 83 deletions(-)
> > > 
> > > diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
> > > index 46e2eb0..7401234 100644
> > > --- a/src/intel/vulkan/anv_blorp.c
> > > +++ b/src/intel/vulkan/anv_blorp.c
> > > @@ -1138,17 +1138,6 @@ subpass_needs_clear(const struct anv_cmd_buffer 
> > > *cmd_buffer)
> > >     const struct anv_cmd_state *cmd_state = &cmd_buffer->state;
> > >     uint32_t ds = cmd_state->subpass->depth_stencil_attachment.attachment;
> > >  
> > > -   for (uint32_t i = 0; i < cmd_state->subpass->color_count; ++i) {
> > > -      uint32_t a = cmd_state->subpass->color_attachments[i].attachment;
> > > -      if (a == VK_ATTACHMENT_UNUSED)
> > > -         continue;
> > > -
> > > -      assert(a < cmd_state->pass->attachment_count);
> > > -      if (cmd_state->attachments[a].pending_clear_aspects) {
> > > -         return true;
> > > -      }
> > > -   }
> > > -
> > >     if (ds != VK_ATTACHMENT_UNUSED) {
> > >        assert(ds < cmd_state->pass->attachment_count);
> > >        if (cmd_state->attachments[ds].pending_clear_aspects)
> > > @@ -1182,77 +1171,6 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer 
> > > *cmd_buffer)
> > >     };
> > >  
> > >     struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
> > > -   for (uint32_t i = 0; i < cmd_state->subpass->color_count; ++i) {
> > > -      const uint32_t a = 
> > > cmd_state->subpass->color_attachments[i].attachment;
> > > -      if (a == VK_ATTACHMENT_UNUSED)
> > > -         continue;
> > > -
> > > -      assert(a < cmd_state->pass->attachment_count);
> > > -      struct anv_attachment_state *att_state = 
> > > &cmd_state->attachments[a];
> > > -
> > > -      if (!att_state->pending_clear_aspects)
> > > -         continue;
> > > -
> > > -      assert(att_state->pending_clear_aspects == 
> > > VK_IMAGE_ASPECT_COLOR_BIT);
> > > -
> > > -      struct anv_image_view *iview = fb->attachments[a];
> > > -      const struct anv_image *image = iview->image;
> > > -      struct blorp_surf surf;
> > > -      get_blorp_surf_for_anv_image(cmd_buffer->device,
> > > -                                   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);
> > > -
> > > -         /* From the Sky Lake PRM Vol. 7, "Render Target Fast Clear":
> > > -          *
> > > -          *    "After Render target fast clear, pipe-control with color 
> > > cache
> > > -          *    write-flush must be issued before sending any DRAW 
> > > commands on
> > > -          *    that render target."
> > > -          *
> > > -          * This comment is a bit cryptic and doesn't really tell you 
> > > what's
> > > -          * going or what's really needed.  It appears that fast clear 
> > > ops are
> > > -          * not properly synchronized with other drawing.  This means 
> > > that we
> > > -          * cannot have a fast clear operation in the pipe at the same 
> > > time as
> > > -          * other regular drawing operations.  We need to use a 
> > > PIPE_CONTROL
> > > -          * to ensure that the contents of the previous draw hit the 
> > > render
> > > -          * target before we resolve and then use a second PIPE_CONTROL 
> > > after
> > > -          * the resolve to ensure that it is completed before any 
> > > additional
> > > -          * drawing occurs.
> > > -          */
> > > -         cmd_buffer->state.pending_pipe_bits |=
> > > -            ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | 
> > > ANV_PIPE_CS_STALL_BIT;
> > > -
> > > -         assert(image->n_planes == 1);
> > > -         blorp_fast_clear(&batch, &surf, iview->planes[0].isl.format,
> > > -                          iview->planes[0].isl.base_level,
> > > -                          iview->planes[0].isl.base_array_layer, 
> > > fb->layers,
> > > -                          render_area.offset.x, render_area.offset.y,
> > > -                          render_area.offset.x + 
> > > render_area.extent.width,
> > > -                          render_area.offset.y + 
> > > render_area.extent.height);
> > > -
> > > -         cmd_buffer->state.pending_pipe_bits |=
> > > -            ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | 
> > > ANV_PIPE_CS_STALL_BIT;
> > > -      } else {
> > > -         assert(image->n_planes == 1);
> > > -         anv_cmd_buffer_mark_image_written(cmd_buffer, image,
> > > -                                           VK_IMAGE_ASPECT_COLOR_BIT,
> > > -                                           att_state->aux_usage,
> > > -                                           
> > > iview->planes[0].isl.base_level);
> > > -
> > > -         blorp_clear(&batch, &surf, iview->planes[0].isl.format,
> > > -                     
> > > anv_swizzle_for_render(iview->planes[0].isl.swizzle),
> > > -                     iview->planes[0].isl.base_level,
> > > -                     iview->planes[0].isl.base_array_layer, fb->layers,
> > > -                     render_area.offset.x, render_area.offset.y,
> > > -                     render_area.offset.x + render_area.extent.width,
> > > -                     render_area.offset.y + render_area.extent.height,
> > > -                     vk_to_isl_color(att_state->clear_value.color), 
> > > NULL);
> > > -      }
> > > -
> > > -      att_state->pending_clear_aspects = 0;
> > > -   }
> > >  
> > >     const uint32_t ds = 
> > > cmd_state->subpass->depth_stencil_attachment.attachment;
> > >     assert(ds == VK_ATTACHMENT_UNUSED || ds < 
> > > cmd_state->pass->attachment_count);
> > > @@ -1617,6 +1535,39 @@ isl_to_blorp_hiz_op(enum isl_aux_op isl_op)
> > >  }
> > >  
> > >  void
> > > +anv_image_clear_color(struct anv_cmd_buffer *cmd_buffer,
> > > +                      const struct anv_image *image,
> > > +                      VkImageAspectFlagBits aspect,
> > > +                      enum isl_aux_usage aux_usage,
> > > +                      enum isl_format format, struct isl_swizzle swizzle,
> > > +                      uint32_t level, uint32_t base_layer, uint32_t 
> > > layer_count,
> > > +                      VkRect2D area, union isl_color_value clear_color)
> > > +{
> > > +   assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
> > > +
> > > +   /* We don't support planar images with multisampling yet */
> > > +   assert(image->n_planes == 1);
> > > +
> > > +   struct blorp_batch batch;
> > > +   blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
> > > +
> > > +   struct blorp_surf surf;
> > > +   get_blorp_surf_for_anv_image(cmd_buffer->device, image, aspect,
> > > +                                aux_usage, &surf);
> > > +   anv_cmd_buffer_mark_image_written(cmd_buffer, image, aspect,
> > > +                                     aux_usage, level);
> > > +
> > > +   blorp_clear(&batch, &surf, format, anv_swizzle_for_render(swizzle),
> > > +               level, base_layer, layer_count,
> > > +               area.offset.x, area.offset.y,
> > > +               area.offset.x + area.extent.width,
> > > +               area.offset.y + area.extent.height,
> > > +               clear_color, NULL);
> > > +
> > > +   blorp_batch_finish(&batch);
> > > +}
> > > +
> > > +void
> > >  anv_image_hiz_op(struct anv_cmd_buffer *cmd_buffer,
> > >                   const struct anv_image *image,
> > >                   VkImageAspectFlagBits aspect, uint32_t level,
> > > diff --git a/src/intel/vulkan/anv_private.h 
> > > b/src/intel/vulkan/anv_private.h
> > > index e875705..bc355bb 100644
> > > --- a/src/intel/vulkan/anv_private.h
> > > +++ b/src/intel/vulkan/anv_private.h
> > > @@ -2537,6 +2537,14 @@ anv_cmd_buffer_mark_image_written(struct 
> > > anv_cmd_buffer *cmd_buffer,
> > >                                    unsigned level);
> > >  
> > >  void
> > > +anv_image_clear_color(struct anv_cmd_buffer *cmd_buffer,
> > > +                      const struct anv_image *image,
> > > +                      VkImageAspectFlagBits aspect,
> > > +                      enum isl_aux_usage aux_usage,
> > > +                      enum isl_format format, struct isl_swizzle swizzle,
> > > +                      uint32_t level, uint32_t base_layer, uint32_t 
> > > layer_count,
> > > +                      VkRect2D area, union isl_color_value clear_color);
> > > +void
> > >  anv_image_hiz_op(struct anv_cmd_buffer *cmd_buffer,
> > >                   const struct anv_image *image,
> > >                   VkImageAspectFlagBits aspect, uint32_t level,
> > > diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
> > > b/src/intel/vulkan/genX_cmd_buffer.c
> > > index 56036f7..265ae44 100644
> > > --- a/src/intel/vulkan/genX_cmd_buffer.c
> > > +++ b/src/intel/vulkan/genX_cmd_buffer.c
> > > @@ -3140,7 +3140,9 @@ static void
> > >  cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
> > >                           uint32_t subpass_id)
> > >  {
> > > -   cmd_buffer->state.subpass = 
> > > &cmd_buffer->state.pass->subpasses[subpass_id];
> > > +   struct anv_cmd_state *cmd_state = &cmd_buffer->state;
> > > +   struct anv_subpass *subpass = &cmd_state->pass->subpasses[subpass_id];
> > > +   cmd_state->subpass = subpass;
> > >  
> > >     cmd_buffer->state.dirty |= ANV_CMD_DIRTY_RENDER_TARGETS;
> > >  
> > > @@ -3172,6 +3174,48 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer 
> > > *cmd_buffer,
> > >      */
> > >     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;
> > > +   for (uint32_t i = 0; i < subpass->color_count; ++i) {
> > > +      const uint32_t a = subpass->color_attachments[i].attachment;
> > > +      if (a == VK_ATTACHMENT_UNUSED)
> > > +         continue;
> > > +
> > > +      assert(a < cmd_state->pass->attachment_count);
> > > +      struct anv_attachment_state *att_state = 
> > > &cmd_state->attachments[a];
> > > +
> > > +      if (!att_state->pending_clear_aspects)
> > > +         continue;
> > > +
> > > +      assert(att_state->pending_clear_aspects == 
> > > VK_IMAGE_ASPECT_COLOR_BIT);
> > > +
> > > +      struct anv_image_view *iview = fb->attachments[a];
> > > +      const struct anv_image *image = iview->image;
> > > +
> > > +      /* Multi-planar images are not supported as attachments */
> > > +      assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
> > > +      assert(image->n_planes == 1);
> > > +
> > > +      if (att_state->fast_clear) {
> > > +         anv_image_ccs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
> > > +                          iview->planes[0].isl.base_level,
> > > +                          iview->planes[0].isl.base_array_layer,
> > > +                          fb->layers,
> > > +                          ISL_AUX_OP_FAST_CLEAR, false);
> > 
> > I didn't spot anything amiss elsewhere. Here I'm a little puzzled though. It
> > looks there is functional change as now the fast clear targets the entire
> > level. Before in anv_cmd_buffer_clear_subpass() the render area was passed 
> > to
> > blorp_fast_clear():
> > 
> >  blorp_fast_clear(&batch, &surf, iview->planes[0].isl.format,
> >                           iview->planes[0].isl.base_level,
> >                           iview->planes[0].isl.base_array_layer, fb->layers,
> >                           render_area.offset.x, render_area.offset.y,
> >                           render_area.offset.x + render_area.extent.width,
> >                           render_area.offset.y + render_area.extent.height);
> > 
> > Clearing the entire level makes sense to me and I'm more wondering that did 
> > we
> > really do partial fast clears before? Or was the render_area in practise
> > covering the entire level.
> > 
> 
> The render_area was covering the entire level. genX_cmd_buffer.c:298
> starts the comment and code that disables fast clears if the entire
> level is not covered by the render_area.

Ok, thanks for explaining! I thought it must have been something like that.
This is clearer and at least on my behalf

Reviewed-by: Topi Pohjolainen <topi.pohjolai...@intel.com>

> 
> > > +      } else {
> > > +         anv_image_clear_color(cmd_buffer, image, 
> > > VK_IMAGE_ASPECT_COLOR_BIT,
> > > +                               att_state->aux_usage,
> > > +                               iview->planes[0].isl.format,
> > > +                               iview->planes[0].isl.swizzle,
> > > +                               iview->planes[0].isl.base_level,
> > > +                               iview->planes[0].isl.base_array_layer,
> > > +                               fb->layers, render_area,
> > > +                               
> > > vk_to_isl_color(att_state->clear_value.color));
> > > +      }
> > > +
> > > +      att_state->pending_clear_aspects = 0;
> > > +   }
> > > +
> > >     cmd_buffer_emit_depth_stencil(cmd_buffer);
> > >  
> > >     anv_cmd_buffer_clear_subpass(cmd_buffer);
> > > -- 
> > > 2.5.0.400.gff86faf
> > > 
> > > _______________________________________________
> > > 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
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to