<div dir="ltr">There are two refactors going on here that are being conflated.  One is what the commit message says where we add and use a helper.<br><div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 20, 2018 at 3:12 PM, Rafael Antognolli <span dir="ltr"><<a href="mailto:rafael.antognolli@intel.com" target="_blank">rafael.antognolli@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Wed, Apr 11, 2018 at 01:56:16PM -0700, Nanley Chery wrote:<br>
> Split out this functionality to enable a fast-clear optimization for<br>
> color miptrees in the next commit.<br>
> ---<br>
>  src/mesa/drivers/dri/i965/brw_<wbr>clear.c         | 54 ++++-----------------------<br>
>  src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.c | 22 +++++++++++<br>
>  src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.h |  7 ++++<br>
>  3 files changed, 36 insertions(+), 47 deletions(-)<br>
> <br>
> diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_clear.c b/src/mesa/drivers/dri/i965/<wbr>brw_clear.c<br>
> index 3d540d6d905..1cdc2241eac 100644<br>
> --- a/src/mesa/drivers/dri/i965/<wbr>brw_clear.c<br>
> +++ b/src/mesa/drivers/dri/i965/<wbr>brw_clear.c<br>
> @@ -108,7 +108,6 @@ brw_fast_clear_depth(struct gl_context *ctx)<br>
>     struct intel_mipmap_tree *mt = depth_irb->mt;<br>
>     struct gl_renderbuffer_attachment *depth_att = &fb->Attachment[BUFFER_DEPTH];<br>
>     const struct gen_device_info *devinfo = &brw->screen->devinfo;<br>
> -   bool same_clear_value = true;<br>
>  <br>
>     if (devinfo->gen < 6)<br>
>        return false;<br>
> @@ -176,7 +175,8 @@ brw_fast_clear_depth(struct gl_context *ctx)<br>
>     /* If we're clearing to a new clear value, then we need to resolve any clear<br>
>      * flags out of the HiZ buffer into the real depth buffer.<br>
>      */<br>
> -   if (mt->fast_clear_color.f32[0] != clear_value) {<br>
> +   const bool same_clear_value = mt->fast_clear_color.f32[0] == clear_value;<br>
> +   if (!same_clear_value) {<br>
>        for (uint32_t level = mt->first_level; level <= mt->last_level; level++) {<br>
>           if (!intel_miptree_level_has_hiz(<wbr>mt, level))<br>
>              continue;<br>
> @@ -214,7 +214,6 @@ brw_fast_clear_depth(struct gl_context *ctx)<br>
>        }<br>
>  <br>
>        intel_miptree_set_depth_clear_<wbr>value(brw, mt, clear_value);<br>
> -      same_clear_value = false;<br>
>     }<br>
>  <br>
>     bool need_clear = false;<br>
> @@ -225,56 +224,17 @@ brw_fast_clear_depth(struct gl_context *ctx)<br>
>  <br>
>        if (aux_state != ISL_AUX_STATE_CLEAR) {<br>
>           need_clear = true;<br>
> -         break;<br>
> -      }<br>
> -   }<br>
> -<br>
> -   if (!need_clear) {<br>
> -      /* If all of the layers we intend to clear are already in the clear<br>
> -       * state then simply updating the miptree fast clear value is sufficient<br>
> -       * to change their clear value.<br>
> -       */<br>
> -      if (devinfo->gen >= 10 && !same_clear_value) {<br>
> -         /* Before gen10, it was enough to just update the clear value in the<br>
> -          * miptree. But on gen10+, we let blorp update the clear value state<br>
> -          * buffer when doing a fast clear. Since we are skipping the fast<br>
> -          * clear here, we need to update the clear color ourselves.<br>
> -          */<br>
> -         uint32_t clear_offset = mt->aux_buf->clear_color_<wbr>offset;<br>
> -         union isl_color_value clear_color = { .f32 = { clear_value, } };<br>
> -<br>
> -         /* We can't update the clear color while the hardware is still using<br>
> -          * the previous one for a resolve or sampling from it. So make sure<br>
> -          * that there's no pending commands at this point.<br>
> -          */<br>
> -         brw_emit_pipe_control_flush(<wbr>brw, PIPE_CONTROL_CS_STALL);<br>
> -         for (int i = 0; i < 4; i++) {<br>
> -            brw_store_data_imm32(brw, mt->aux_buf->clear_color_bo,<br>
> -                                 clear_offset + i * 4, clear_color.u32[i]);<br>
> -         }<br>
> -         brw_emit_pipe_control_flush(<wbr>brw, PIPE_CONTROL_STATE_CACHE_<wbr>INVALIDATE);<br>
> -      }<br>
> -      return true;<br>
> -   }<br></div></div></blockquote><div><br></div><div>The other is down here where you re-order setting the indirect clear color with respect to the HiZ op.  I'd rather we split this patch into two different onces which do the two different refactors.  I think the re-order is safe but I'd like to have something for it to bisect to if not. :-)<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>
> -   for (unsigned a = 0; a < num_layers; a++) {<br>
> -      enum isl_aux_state aux_state =<br>
> -         intel_miptree_get_aux_state(<wbr>mt, depth_irb->mt_level,<br>
> -                                     depth_irb->mt_layer + a);<br>
> -<br>
> -      if (aux_state != ISL_AUX_STATE_CLEAR) {<br>
>           intel_hiz_exec(brw, mt, depth_irb->mt_level,<br>
>                          depth_irb->mt_layer + a, 1,<br>
>                          ISL_AUX_OP_FAST_CLEAR);<br>
> +         intel_miptree_set_aux_state(<wbr>brw, mt, depth_irb->mt_level,<br>
> +                                     depth_irb->mt_layer + a, 1,<br>
> +                                     ISL_AUX_STATE_CLEAR);<br>
>        }<br>
>     }<br>
>  <br>
> -   /* Now, the HiZ buffer contains data that needs to be resolved to the depth<br>
> -    * buffer.<br>
> -    */<br>
> -   intel_miptree_set_aux_state(<wbr>brw, mt, depth_irb->mt_level,<br>
> -                               depth_irb->mt_layer, num_layers,<br>
> -                               ISL_AUX_STATE_CLEAR);<br>
> +   if (!need_clear && !same_clear_value)<br>
> +      intel_miptree_update_indirect_<wbr>color(brw, mt);<br>
>  <br>
>     return true;<br>
>  }<br>
> diff --git a/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.c<br>
> index 0b6a821d08c..23e73c5419c 100644<br>
> --- a/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.c<br>
> +++ b/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.c<br>
> @@ -3831,3 +3831,25 @@ intel_miptree_get_clear_color(<wbr>const struct gen_device_info *devinfo,<br>
>        return mt->fast_clear_color;<br>
>     }<br>
>  }<br>
> +<br>
> +void<br>
> +intel_miptree_update_<wbr>indirect_color(struct brw_context *brw,<br>
> +                                    struct intel_mipmap_tree *mt)<br>
> +{<br>
> +   assert(mt->aux_buf);<br>
> +<br>
> +   if (mt->aux_buf->clear_color_bo == NULL)<br>
> +      return;<br>
> +<br>
> +   /* We can't update the clear color while the hardware is still using the<br>
> +    * previous one for a resolve or sampling from it. Make sure that there are<br>
> +    * no pending commands at this point.<br>
> +    */<br>
> +   brw_emit_pipe_control_flush(<wbr>brw, PIPE_CONTROL_CS_STALL);<br>
> +   for (int i = 0; i < 4; i++) {<br>
> +      brw_store_data_imm32(brw, mt->aux_buf->clear_color_bo,<br>
> +                           mt->aux_buf->clear_color_<wbr>offset + i * 4,<br>
> +                           mt->fast_clear_color.u32[i]);<br>
> +   }<br>
> +   brw_emit_pipe_control_flush(<wbr>brw, PIPE_CONTROL_STATE_CACHE_<wbr>INVALIDATE);<br>
> +}<br>
<br>
</div></div>Just trying to bring attention to this piece of code. Jason suggested<br>
that these PIPE_CONTROL's might not be sufficient, and that we need<br>
tests that clear and texture from the surface repeatedly (I didn't look<br>
at that yet).<br>
<br>
And I think Ken suggested that this was such an edge case that maybe the<br>
optimization wasn't worth it. I'm adding them both in copy in case they<br>
want to add something.<br>
<br>
I agree that if we are already doing it for depth surfaces, and the code<br>
can easily be shared, let's just do it. So the two patches in this<br>
series are<br>
<br>
Reviewed-by: Rafael Antognolli <<a href="mailto:rafael.antognolli@intel.com">rafael.antognolli@intel.com</a>><br>
<div class="HOEnZb"><div class="h5"><br>
> diff --git a/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.h<br>
> index bb059cf4e8f..c306a9048f3 100644<br>
> --- a/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.h<br>
> +++ b/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.h<br>
> @@ -748,6 +748,13 @@ intel_miptree_set_depth_clear_<wbr>value(struct brw_context *brw,<br>
>                                      struct intel_mipmap_tree *mt,<br>
>                                      float clear_value);<br>
>  <br>
> +/* If this miptree has an indirect clear color, update it with the value stored<br>
> + * in the miptree object.<br>
> + */<br>
> +void<br>
> +intel_miptree_update_<wbr>indirect_color(struct brw_context *brw,<br>
> +                                    struct intel_mipmap_tree *mt);<br>
> +<br>
>  #ifdef __cplusplus<br>
>  }<br>
>  #endif<br>
> -- <br>
> 2.16.2<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></div>