On Tue, May 08, 2018 at 02:55:24PM -0700, Nanley Chery wrote:
> On Tue, May 08, 2018 at 09:24:19AM +0300, Pohjolainen, Topi wrote:
> > On Thu, May 03, 2018 at 12:04:00PM -0700, Nanley Chery wrote:
> > > Although BLORP currently does the update when performing a fast clear,
> > > it's simpler to do it ourselves. Remove the dependency on BLORP.
> > 
> > Should we note in the commit message that until patch 17 this now gets done
> > twice in a row in those cases where the actual fast clear op is submitted? 
> > But
> > that it shouldn't matter much in practise as the subsequent flushes 
> > shouldn't
> > do anything because there isn't any work submitted between.
> > 
> 
> That was also my thinking about the flushes.
> 
> > Perhaps also a note that this allows later patch (number 15 in this series) 
> > to
> > start skipping the actual fast clear op and just update the clear color.
> > 
> 
> How about this:
> 
>    For depth buffers, we avoid fast-clearing if the aux_state is already
>    CLEAR. We do the same for color buffers only if the clear color
>    doesn't change. We require that the clear colors match because, in
>    that case, we don't update the indirect clear color outside of BLORP.
> 
>    Update the indirect clear color for color buffers as well. We'll
>    enable the same depth buffer optimization for color buffers in a
>    later patch.
> 
>    Note that we're now actually updating the indirect clear color twice
>    in the case where we use BLORP to perform the fast-clear. This is
>    only temporary. In later patches, we'll prevent BLORP from performing
>    the update.

Looks good, thanks:

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

> 
> -Nanley
> 
> > > ---
> > >  src/mesa/drivers/dri/i965/brw_clear.c         | 37 
> > > ---------------------------
> > >  src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 13 ++++++++++
> > >  2 files changed, 13 insertions(+), 37 deletions(-)
> > > 
> > > diff --git a/src/mesa/drivers/dri/i965/brw_clear.c 
> > > b/src/mesa/drivers/dri/i965/brw_clear.c
> > > index ba79447fc87..a65839a0a05 100644
> > > --- a/src/mesa/drivers/dri/i965/brw_clear.c
> > > +++ b/src/mesa/drivers/dri/i965/brw_clear.c
> > > @@ -108,7 +108,6 @@ brw_fast_clear_depth(struct gl_context *ctx)
> > >     struct intel_mipmap_tree *mt = depth_irb->mt;
> > >     struct gl_renderbuffer_attachment *depth_att = 
> > > &fb->Attachment[BUFFER_DEPTH];
> > >     const struct gen_device_info *devinfo = &brw->screen->devinfo;
> > > -   bool same_clear_value = true;
> > >  
> > >     if (devinfo->gen < 6)
> > >        return false;
> > > @@ -215,42 +214,6 @@ brw_fast_clear_depth(struct gl_context *ctx)
> > >  
> > >        const union isl_color_value clear_color = { .f32 = {clear_value, } 
> > > };
> > >        intel_miptree_set_clear_color(brw, mt, clear_color);
> > > -      same_clear_value = false;
> > > -   }
> > > -
> > > -   bool need_clear = false;
> > > -   for (unsigned a = 0; a < num_layers; a++) {
> > > -      enum isl_aux_state aux_state =
> > > -         intel_miptree_get_aux_state(mt, depth_irb->mt_level,
> > > -                                     depth_irb->mt_layer + a);
> > > -
> > > -      if (aux_state != ISL_AUX_STATE_CLEAR) {
> > > -         need_clear = true;
> > > -         break;
> > > -      }
> > > -   }
> > > -
> > > -   if (!need_clear) {
> > > -      if (devinfo->gen >= 10 && !same_clear_value) {
> > > -         /* Before gen10, it was enough to just update the clear value 
> > > in the
> > > -          * miptree. But on gen10+, we let blorp update the clear value 
> > > state
> > > -          * buffer when doing a fast clear. Since we are skipping the 
> > > fast
> > > -          * clear here, we need to update the clear color ourselves.
> > > -          */
> > > -         uint32_t clear_offset = mt->aux_buf->clear_color_offset;
> > > -         union isl_color_value clear_color = { .f32 = { clear_value, } };
> > > -
> > > -         /* We can't update the clear color while the hardware is still 
> > > using
> > > -          * the previous one for a resolve or sampling from it. So make 
> > > sure
> > > -          * that there's no pending commands at this point.
> > > -          */
> > > -         brw_emit_pipe_control_flush(brw, PIPE_CONTROL_CS_STALL);
> > > -         for (int i = 0; i < 4; i++) {
> > > -            brw_store_data_imm32(brw, mt->aux_buf->clear_color_bo,
> > > -                                 clear_offset + i * 4, 
> > > clear_color.u32[i]);
> > > -         }
> > > -         brw_emit_pipe_control_flush(brw, 
> > > PIPE_CONTROL_STATE_CACHE_INVALIDATE);
> > > -      }
> > >     }
> > >  
> > >     for (unsigned a = 0; a < num_layers; a++) {
> > > diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c 
> > > b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> > > index 07ce2ac2adf..bd4ddbc2f58 100644
> > > --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> > > +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> > > @@ -3739,6 +3739,19 @@ intel_miptree_set_clear_color(struct brw_context 
> > > *brw,
> > >  {
> > >     if (memcmp(&mt->fast_clear_color, &clear_color, sizeof(clear_color)) 
> > > != 0) {
> > >        mt->fast_clear_color = clear_color;
> > > +      if (mt->aux_buf->clear_color_bo) {
> > > +         /* We can't update the clear color while the hardware is still 
> > > using
> > > +          * the previous one for a resolve or sampling from it. Make 
> > > sure that
> > > +          * there are no pending commands at this point.
> > > +          */
> > > +         brw_emit_pipe_control_flush(brw, PIPE_CONTROL_CS_STALL);
> > > +         for (int i = 0; i < 4; i++) {
> > > +            brw_store_data_imm32(brw, mt->aux_buf->clear_color_bo,
> > > +                                 mt->aux_buf->clear_color_offset + i * 4,
> > > +                                 mt->fast_clear_color.u32[i]);
> > > +         }
> > > +         brw_emit_pipe_control_flush(brw, 
> > > PIPE_CONTROL_STATE_CACHE_INVALIDATE);
> > > +      }
> > >        brw->ctx.NewDriverState |= BRW_NEW_AUX_STATE;
> > >        return true;
> > >     }
> > > -- 
> > > 2.16.2
> > > 
> > > _______________________________________________
> > > 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