[Mesa-dev] [PATCH 11/22] anv/cmd_buffer: Ensure the fast clear values are correct

Jason Ekstrand jason at jlekstrand.net
Tue May 2 23:54:55 UTC 2017


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

> Signed-off-by: Nanley Chery <nanley.g.chery at intel.com>
> ---
>  src/intel/vulkan/genX_cmd_buffer.c | 76 ++++++++++++++++++++++++++++++
> ++++++++
>  1 file changed, 76 insertions(+)
>
> diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> b/src/intel/vulkan/genX_cmd_buffer.c
> index e3b1687121..4698270abb 100644
> --- a/src/intel/vulkan/genX_cmd_buffer.c
> +++ b/src/intel/vulkan/genX_cmd_buffer.c
> @@ -400,6 +400,57 @@ transition_depth_buffer(struct anv_cmd_buffer
> *cmd_buffer,
>  }
>
>
> +/* Copies clear value dwords between a surface state object and an image's
> + * clear value buffer.
> + */
> +static void
> +genX(transfer_clear_value)(struct anv_cmd_buffer * const cmd_buffer,
> +                           const struct anv_state surface_state,
> +                           const struct anv_image * const image,
> +                           const uint8_t level,
> +                           const bool copy_to_buffer)
> +{
> +   assert(cmd_buffer && image);
> +
> +   /* The image and its subresource must have a color auxiliary buffer. */
> +   assert(anv_image_has_color_aux(image));
> +   assert(level < anv_color_aux_levels(image));
> +
> +   const uint32_t img_clear_offset =
> +      image->offset + image->aux_surface.offset +
> +      image->aux_surface.isl.size +
> +      cmd_buffer->device->isl_dev.ss.size * level +
> +      cmd_buffer->device->isl_dev.ss.clear_value_offset;
>

I think it would be good to add an anv_image_clear_value_offset(anv_image
*, unsigned level) helper for this.  This calculation feels very much like
anv_image internals which are leaking into cmd_buffer code.


> +
> +   struct anv_bo * const ss_bo =
> +      &cmd_buffer->device->surface_state_block_pool.bo;
> +   const uint32_t ss_clear_offset = surface_state.offset +
> +      cmd_buffer->device->isl_dev.ss.clear_value_offset;
> +
> +   const uint8_t clear_value_size =
> +      cmd_buffer->device->isl_dev.ss.clear_value_size;
> +
> +   if (copy_to_buffer) {
> +      genX(cmd_buffer_gpu_memcpy)(cmd_buffer, image->bo,
> img_clear_offset,
> +                                  ss_bo, ss_clear_offset,
> clear_value_size);
> +   } else {
> +      genX(cmd_buffer_gpu_memcpy)(cmd_buffer, ss_bo, ss_clear_offset,
> +                                  image->bo, img_clear_offset,
> clear_value_size);
>

The streamout GPU memcpy stuff is a bit heavy-weight for this.  It's great
if you have lots of data to copy but setting up a full 3D pipeline per
surface state is a bit excessive.  Probably better to just use the command
streamer for this instead.


> +
> +      /* From the SKL PRM, Shared Functions -> State -> State Caching:
> +       *
> +       *    Whenever the RENDER_SURFACE_STATE object in memory pointed to
> by
> +       *    the Binding Table Pointer (BTP) and Binding Table Index (BTI)
> is
> +       *    modified [...], the L1 state cache must be invalidated to
> ensure
> +       *    the new surface or sampler state is fetched from system
> memory.
> +       *
> +       * SKL actually doesn't seem to need this, but HSW does.
> +       */
> +      cmd_buffer->state.pending_pipe_bits |=
> +         ANV_PIPE_STATE_CACHE_INVALIDATE_BIT;
> +   }
> +}
> +
>  /**
>   * Setup anv_cmd_state::attachments for vkCmdBeginRenderPass.
>   */
> @@ -538,6 +589,31 @@ genX(cmd_buffer_setup_attachments)(struct
> anv_cmd_buffer *cmd_buffer,
>              add_image_view_relocs(cmd_buffer, iview,
>                                    state->attachments[i].aux_usage,
>                                    state->attachments[i].color_rt_state);
> +
> +            /* Update the image subresource's fast-clear value as
> necessary. */
> +            if (state->attachments[i].fast_clear) {
> +               /* Update the clear value buffer. */
> +               assert(state->attachments[i].aux_usage !=
> ISL_AUX_USAGE_NONE);
> +               genX(transfer_clear_value)(cmd_buffer,
> +                  state->attachments[i].color_rt_state, iview->image,
> +                  iview->isl.base_level, true /* copy_to_buffer */);
> +            } else if (att->load_op == VK_ATTACHMENT_LOAD_OP_LOAD &&
> +                       state->attachments[i].aux_usage !=
> ISL_AUX_USAGE_NONE) {
> +               /* The attachment may have been fast-cleared in a previous
> +                * render pass. Update the clear color fields.
> +                */
> +               genX(transfer_clear_value)(cmd_buffer,
> +                  state->attachments[i].color_rt_state, iview->image,
> +                  iview->isl.base_level, false /* copy_to_ss */);
> +
> +               if (need_input_attachment_state(&pass->attachments[i]) &&
> +                   state->attachments[i].input_aux_usage !=
> +                   ISL_AUX_USAGE_NONE) {
> +                  genX(transfer_clear_value)(cmd_buffer,
> +                     state->attachments[i].input_att_state, iview->image,
> +                     iview->isl.base_level, false /* copy_to_ss */);
> +               }
> +            }
>           } else {
>              /* This field will be initialized after the first subpass
>               * transition.
> --
> 2.12.2
>
> _______________________________________________
> 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/20170502/b4fa40f7/attachment.html>


More information about the mesa-dev mailing list