<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jan 22, 2018 at 3:22 PM, Nanley Chery <span dir="ltr"><<a href="mailto:nanleychery@gmail.com" target="_blank">nanleychery@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Fri, Jan 19, 2018 at 03:47:29PM -0800, Jason Ekstrand wrote:<br>
</span><div><div class="h5">> Currently, this helper does nothing but we call it every place where an<br>
> image is written through the render pipeline.  This will allow us to<br>
> properly mark the aux state so that we can handle resolves correctly.<br>
> ---<br>
>  src/intel/vulkan/anv_blorp.c       | 44 ++++++++++++++++++++++++++++++<wbr>+++++++-<br>
>  src/intel/vulkan/anv_cmd_<wbr>buffer.c  | 15 +++++++++++++<br>
>  src/intel/vulkan/anv_genX.h        |  8 +++++++<br>
>  src/intel/vulkan/anv_private.h     |  9 ++++++++<br>
>  src/intel/vulkan/genX_cmd_<wbr>buffer.c | 44 ++++++++++++++++++++++++++++++<wbr>++++++++<br>
>  5 files changed, 119 insertions(+), 1 deletion(-)<br>
><br>
> diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c<br>
> index e4e4135..05efc6d 100644<br>
> --- a/src/intel/vulkan/anv_blorp.c<br>
> +++ b/src/intel/vulkan/anv_blorp.c<br>
> @@ -283,6 +283,10 @@ void anv_CmdCopyImage(<br>
>              get_blorp_surf_for_anv_image(<wbr>cmd_buffer->device,<br>
>                                           dst_image, 1UL << aspect_bit,<br>
>                                           ANV_AUX_USAGE_DEFAULT, &dst_surf);<br>
> +            anv_cmd_buffer_mark_image_<wbr>written(cmd_buffer, dst_image,<br>
> +                                              1UL << aspect_bit,<br>
> +                                              dst_surf.aux_usage, dst_level,<br>
> +                                              dst_base_layer, layer_count);<br>
><br>
>              for (unsigned i = 0; i < layer_count; i++) {<br>
>                 blorp_copy(&batch, &src_surf, src_level, src_base_layer + i,<br>
> @@ -298,6 +302,9 @@ void anv_CmdCopyImage(<br>
>                                        ANV_AUX_USAGE_DEFAULT, &src_surf);<br>
>           get_blorp_surf_for_anv_image(<wbr>cmd_buffer->device, dst_image, dst_mask,<br>
>                                        ANV_AUX_USAGE_DEFAULT, &dst_surf);<br>
> +         anv_cmd_buffer_mark_image_<wbr>written(cmd_buffer, dst_image, dst_mask,<br>
> +                                           dst_surf.aux_usage, dst_level,<br>
> +                                           dst_base_layer, layer_count);<br>
><br>
>           for (unsigned i = 0; i < layer_count; i++) {<br>
>              blorp_copy(&batch, &src_surf, src_level, src_base_layer + i,<br>
> @@ -386,6 +393,13 @@ copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer,<br>
>                                      buffer_row_pitch, buffer_format,<br>
>                                      &buffer.surf, &buffer_isl_surf);<br>
><br>
> +      if (&image == dst) {<br>
> +         anv_cmd_buffer_mark_image_<wbr>written(cmd_buffer, anv_image,<br>
> +                                           aspect, dst->surf.aux_usage,<br>
> +                                           dst->level,<br>
> +                                           dst->offset.z, extent.depth);<br>
> +      }<br>
> +<br>
>        for (unsigned z = 0; z < extent.depth; z++) {<br>
>           blorp_copy(&batch, &src->surf, src->level, src->offset.z,<br>
>                      &dst->surf, dst->level, dst->offset.z,<br>
> @@ -545,6 +559,12 @@ void anv_CmdBlitImage(<br>
>        bool flip_y = flip_coords(&src_y0, &src_y1, &dst_y0, &dst_y1);<br>
><br>
>        const unsigned num_layers = dst_end - dst_start;<br>
> +      anv_cmd_buffer_mark_image_<wbr>written(cmd_buffer, dst_image,<br>
> +                                        dst_res->aspectMask,<br>
> +                                        dst.aux_usage,<br>
> +                                        dst_res->mipLevel,<br>
> +                                        dst_start, num_layers);<br>
> +<br>
>        for (unsigned i = 0; i < num_layers; i++) {<br>
>           unsigned dst_z = dst_start + i;<br>
>           unsigned src_z = src_start + i * src_z_step;<br>
> @@ -558,7 +578,6 @@ void anv_CmdBlitImage(<br>
>                      dst_x0, dst_y0, dst_x1, dst_y1,<br>
>                      gl_filter, flip_x, flip_y);<br>
>        }<br>
> -<br>
<br>
</div></div>  ^<br>
Random line deletion? Not a big deal.<br><div><div class="h5"></div></div></blockquote><div><br></div><div>Yup.  Rebase fail. Dropped.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
>     }<br>
><br>
>     blorp_batch_finish(&batch);<br>
> @@ -818,6 +837,11 @@ void anv_CmdClearColorImage(<br>
>              layer_count = anv_minify(image->extent.<wbr>depth, level);<br>
>           }<br>
><br>
> +         anv_cmd_buffer_mark_image_<wbr>written(cmd_buffer, image,<br>
> +                                           pRanges[r].aspectMask,<br>
> +                                           surf.aux_usage, level,<br>
> +                                           base_layer, layer_count);<br>
> +<br>
>           blorp_clear(&batch, &surf,<br>
>                       src_format.isl_format, src_format.swizzle,<br>
>                       level, base_layer, layer_count,<br>
> @@ -1215,6 +1239,13 @@ anv_cmd_buffer_clear_subpass(<wbr>struct anv_cmd_buffer *cmd_buffer)<br>
>              ANV_PIPE_RENDER_TARGET_CACHE_<wbr>FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;<br>
>        } else {<br>
>           assert(image->n_planes == 1);<br>
> +         anv_cmd_buffer_mark_image_<wbr>written(cmd_buffer, image,<br>
> +                                           VK_IMAGE_ASPECT_COLOR_BIT,<br>
> +                                           att_state->aux_usage,<br>
> +                                           iview->planes[0].isl.base_<wbr>level,<br>
> +                                           iview->planes[0].isl.base_<wbr>array_layer,<br>
> +                                           fb->layers);<br>
> +<br>
>           blorp_clear(&batch, &surf, iview->planes[0].isl.format,<br>
>                       anv_swizzle_for_render(iview-><wbr>planes[0].isl.swizzle),<br>
>                       iview->planes[0].isl.base_<wbr>level,<br>
> @@ -1355,6 +1386,8 @@ resolve_image(struct anv_device *device,<br>
>                uint32_t src_x, uint32_t src_y, uint32_t dst_x, uint32_t dst_y,<br>
>                uint32_t width, uint32_t height)<br>
>  {<br>
> +   struct anv_cmd_buffer *cmd_buffer = batch->driver_batch;<br>
> +<br>
>     assert(src_image->type == VK_IMAGE_TYPE_2D);<br>
>     assert(src_image->samples > 1);<br>
>     assert(dst_image->type == VK_IMAGE_TYPE_2D);<br>
> @@ -1369,6 +1402,10 @@ resolve_image(struct anv_device *device,<br>
>                                     ANV_AUX_USAGE_DEFAULT, &src_surf);<br>
>        get_blorp_surf_for_anv_image(<wbr>device, dst_image, 1UL << aspect_bit,<br>
>                                     ANV_AUX_USAGE_DEFAULT, &dst_surf);<br>
> +      anv_cmd_buffer_mark_image_<wbr>written(cmd_buffer, dst_image,<br>
> +                                        1UL << aspect_bit,<br>
> +                                        dst_surf.aux_usage,<br>
> +                                        dst_level, dst_layer, 1);<br>
><br>
>        assert(!src_image->format-><wbr>can_ycbcr);<br>
>        assert(!dst_image->format-><wbr>can_ycbcr);<br>
> @@ -1498,6 +1535,11 @@ anv_cmd_buffer_resolve_<wbr>subpass(struct anv_cmd_buffer *cmd_buffer)<br>
>           get_blorp_surf_for_anv_image(<wbr>cmd_buffer->device, dst_iview->image,<br>
>                                        VK_IMAGE_ASPECT_COLOR_BIT,<br>
>                                        dst_aux_usage, &dst_surf);<br>
> +         anv_cmd_buffer_mark_image_<wbr>written(cmd_buffer, dst_iview->image,<br>
> +                                           VK_IMAGE_ASPECT_COLOR_BIT,<br>
> +                                           dst_surf.aux_usage,<br>
> +                                           dst_iview->planes[0].isl.base_<wbr>level,<br>
> +                                           dst_iview->planes[0].isl.base_<wbr>array_layer, 1);<br>
<br>
</div></div>As we discussed in the office, this entire function (including this<br>
hunk) should be resolving fb->layers. This function was already broken<br>
and this new hunk doesn't break it any more, so it's fine to leave it as<br>
is. I've filed a bug about the lack of testing for this.<br><div><div class="h5"></div></div></blockquote><div><br></div><div>Sounds good.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
><br>
>           assert(!src_iview->image-><wbr>format->can_ycbcr);<br>
>           assert(!dst_iview->image-><wbr>format->can_ycbcr);<br>
> diff --git a/src/intel/vulkan/anv_cmd_<wbr>buffer.c b/src/intel/vulkan/anv_cmd_<wbr>buffer.c<br>
> index 7e7580c..7480ac2 100644<br>
> --- a/src/intel/vulkan/anv_cmd_<wbr>buffer.c<br>
> +++ b/src/intel/vulkan/anv_cmd_<wbr>buffer.c<br>
> @@ -353,6 +353,21 @@ anv_cmd_buffer_emit_state_<wbr>base_address(struct anv_cmd_buffer *cmd_buffer)<br>
>                   cmd_buffer);<br>
>  }<br>
><br>
> +void<br>
> +anv_cmd_buffer_mark_image_<wbr>written(struct anv_cmd_buffer *cmd_buffer,<br>
> +                                  const struct anv_image *image,<br>
> +                                  VkImageAspectFlagBits aspect,<br>
> +                                  enum isl_aux_usage aux_usage,<br>
> +                                  uint32_t level,<br>
> +                                  uint32_t base_layer,<br>
> +                                  uint32_t layer_count)<br>
> +{<br>
> +   anv_genX_call(&cmd_buffer-><wbr>device->info,<br>
> +                 cmd_buffer_mark_image_written,<br>
> +                 cmd_buffer, image, aspect, aux_usage,<br>
> +                 level, base_layer, layer_count);<br>
> +}<br>
> +<br>
>  void anv_CmdBindPipeline(<br>
>      VkCommandBuffer                             commandBuffer,<br>
>      VkPipelineBindPoint                         pipelineBindPoint,<br>
> diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h<br>
> index 0b7322e..9b56658 100644<br>
> --- a/src/intel/vulkan/anv_genX.h<br>
> +++ b/src/intel/vulkan/anv_genX.h<br>
> @@ -58,6 +58,14 @@ void genX(cmd_buffer_flush_compute_<wbr>state)(struct anv_cmd_buffer *cmd_buffer);<br>
>  void genX(cmd_buffer_enable_pma_<wbr>fix)(struct anv_cmd_buffer *cmd_buffer,<br>
>                                       bool enable);<br>
><br>
> +void genX(cmd_buffer_mark_image_<wbr>written)(struct anv_cmd_buffer *cmd_buffer,<br>
> +                                         const struct anv_image *image,<br>
> +                                         VkImageAspectFlagBits aspect,<br>
> +                                         enum isl_aux_usage aux_usage,<br>
> +                                         uint32_t level,<br>
> +                                         uint32_t base_layer,<br>
> +                                         uint32_t layer_count);<br>
> +<br>
>  void<br>
>  genX(emit_urb_setup)(struct anv_device *device, struct anv_batch *batch,<br>
>                       const struct gen_l3_config *l3_config,<br>
> diff --git a/src/intel/vulkan/anv_<wbr>private.h b/src/intel/vulkan/anv_<wbr>private.h<br>
> index f81f8e1..f0251e2 100644<br>
> --- a/src/intel/vulkan/anv_<wbr>private.h<br>
> +++ b/src/intel/vulkan/anv_<wbr>private.h<br>
> @@ -2542,6 +2542,15 @@ anv_can_sample_with_hiz(const struct gen_device_info * const devinfo,<br>
>  }<br>
><br>
>  void<br>
> +anv_cmd_buffer_mark_image_<wbr>written(struct anv_cmd_buffer *cmd_buffer,<br>
> +                                  const struct anv_image *image,<br>
> +                                  VkImageAspectFlagBits aspect,<br>
> +                                  enum isl_aux_usage aux_usage,<br>
> +                                  uint32_t level,<br>
> +                                  uint32_t base_layer,<br>
> +                                  uint32_t layer_count);<br>
> +<br>
> +void<br>
>  anv_image_hiz_op(struct anv_cmd_buffer *cmd_buffer,<br>
>                   const struct anv_image *image,<br>
>                   VkImageAspectFlagBits aspect, uint32_t level,<br>
> diff --git a/src/intel/vulkan/genX_cmd_<wbr>buffer.c b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> index fd27463..ad7b9fc 100644<br>
> --- a/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> +++ b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> @@ -460,6 +460,19 @@ genX(load_needs_resolve_<wbr>predicate)(struct anv_cmd_buffer *cmd_buffer,<br>
>     }<br>
>  }<br>
><br>
> +void<br>
> +genX(cmd_buffer_mark_image_<wbr>written)(struct anv_cmd_buffer *cmd_buffer,<br>
> +                                    const struct anv_image *image,<br>
> +                                    VkImageAspectFlagBits aspect,<br>
> +                                    enum isl_aux_usage aux_usage,<br>
> +                                    uint32_t level,<br>
> +                                    uint32_t base_layer,<br>
> +                                    uint32_t layer_count)<br>
> +{<br>
> +   /* The aspect must be exactly one of the image aspects. */<br>
> +   assert(_mesa_bitcount(aspect) == 1 && (aspect & image->aspects));<br>
> +}<br>
> +<br>
>  static void<br>
>  init_fast_clear_state_entry(<wbr>struct anv_cmd_buffer *cmd_buffer,<br>
>                              const struct anv_image *image,<br>
> @@ -2976,6 +2989,27 @@ cmd_buffer_emit_depth_stencil(<wbr>struct anv_cmd_buffer *cmd_buffer)<br>
>     isl_emit_depth_stencil_hiz_s(&<wbr>device->isl_dev, dw, &info);<br>
><br>
>     cmd_buffer->state.hiz_enabled = info.hiz_usage == ISL_AUX_USAGE_HIZ;<br>
> +<br>
> +   /* We may be writing depth or stencil so we need to mark the surface.<br>
> +    * Unfortunately, there's no way to know at this point whether the depth or<br>
> +    * stencil tests used will actually write to the surface.<br>
> +    */<br>
> +   if (image && (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT)) {<br>
> +      genX(cmd_buffer_mark_image_<wbr>written)(cmd_buffer, image,<br>
> +                                          VK_IMAGE_ASPECT_DEPTH_BIT,<br>
> +                                          info.hiz_usage,<br>
> +                                          info.view->base_level,<br>
> +                                          info.view->base_array_layer,<br>
> +                                          info.view->array_len);<br>
> +   }<br>
> +   if (image && (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT)) {<br>
> +      genX(cmd_buffer_mark_image_<wbr>written)(cmd_buffer, image,<br>
> +                                          VK_IMAGE_ASPECT_STENCIL_BIT,<br>
> +                                          ISL_AUX_USAGE_NONE,<br>
> +                                          info.view->base_level,<br>
> +                                          info.view->base_array_layer,<br>
> +                                          info.view->array_len);<br>
> +   }<br>
>  }<br>
><br>
><br>
> @@ -3174,6 +3208,16 @@ cmd_buffer_subpass_sync_fast_<wbr>clear_values(struct anv_cmd_buffer *cmd_buffer)<br>
>                                           false /* copy to ss */);<br>
>           }<br>
>        }<br>
> +<br>
> +      /* We assume that if we're starting a subpass, we're going to do some<br>
> +       * rendering so we may end up with compressed data.<br>
> +       */<br>
> +      genX(cmd_buffer_mark_image_<wbr>written)(cmd_buffer, iview->image,<br>
> +                                          VK_IMAGE_ASPECT_COLOR_BIT,<br>
> +                                          att_state->aux_usage,<br>
> +                                          iview->planes[0].isl.base_<wbr>level,<br>
> +                                          iview->planes[0].isl.base_<wbr>array_layer,<br>
> +                                          iview->planes[0].isl.array_<wbr>len);<br>
<br>
</div></div>The last argument should be fb->layers right?<br><div class="HOEnZb"><div class="h5"></div></div></blockquote><div><br></div><div>Yup.  Thanks for catching that.  Fixed locally.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">
>     }<br>
>  }<br>
><br>
> --<br>
> 2.5.0.400.gff86faf<br>
><br>
> ______________________________<wbr>_________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</div></div></blockquote></div><br></div></div>