[Mesa-dev] [PATCH 1/3] i965/gen7: Skip repeated NULL depth/stencil state emits.

Ian Romanick idr at freedesktop.org
Tue Apr 8 14:57:20 PDT 2014


Even though patch 3 doesn't help performance, I think it makes the code
better.  Series is

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

One question below...

On 04/08/2014 02:31 PM, Eric Anholt wrote:
> Improves cairo performance on glamor by 2.87752% +/- 0.966977 (n=57).
> ---
>  src/mesa/drivers/dri/i965/brw_blorp.cpp      | 1 +
>  src/mesa/drivers/dri/i965/brw_context.h      | 3 +++
>  src/mesa/drivers/dri/i965/gen7_misc_state.c  | 8 ++++++++
>  src/mesa/drivers/dri/i965/gen8_depth_state.c | 8 ++++++++
>  4 files changed, 20 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp.cpp b/src/mesa/drivers/dri/i965/brw_blorp.cpp
> index 252219e..57ff30a 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp.cpp
> @@ -278,6 +278,7 @@ retry:
>      */
>     brw->state.dirty.brw = ~0;
>     brw->state.dirty.cache = ~0;
> +   brw->no_depth_or_stencil = false;
>     brw->ib.type = -1;
>  
>     /* Flush the sampler cache so any texturing from the destination is
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 487142c..f8ca58f 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1119,6 +1119,9 @@ struct brw_context
>     /* Whether a meta-operation is in progress. */
>     bool meta_in_progress;
>  
> +   /* Whether the last depth/stencil packets were both NULL. */
> +   bool no_depth_or_stencil;
> +
>     struct {
>        struct brw_vertex_element inputs[VERT_ATTRIB_MAX];
>        struct brw_vertex_buffer buffers[VERT_ATTRIB_MAX];
> diff --git a/src/mesa/drivers/dri/i965/gen7_misc_state.c b/src/mesa/drivers/dri/i965/gen7_misc_state.c
> index 8fb0eec..328b01e 100644
> --- a/src/mesa/drivers/dri/i965/gen7_misc_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_misc_state.c
> @@ -52,6 +52,12 @@ gen7_emit_depth_stencil_hiz(struct brw_context *brw,
>     const struct intel_renderbuffer *irb = NULL;
>     const struct gl_renderbuffer *rb = NULL;
>  
> +   /* Skip repeated NULL depth/stencil emits (think 2D rendering). */
> +   if (!mt && brw->no_depth_or_stencil) {
> +      assert(brw->hw_ctx);

What does this assertion catch?

> +      return;
> +   }
> +
>     intel_emit_depth_stall_flushes(brw);
>  
>     irb = intel_get_renderbuffer(fb, BUFFER_DEPTH);
> @@ -190,6 +196,8 @@ gen7_emit_depth_stencil_hiz(struct brw_context *brw,
>     OUT_BATCH(depth_mt ? depth_mt->depth_clear_value : 0);
>     OUT_BATCH(1);
>     ADVANCE_BATCH();
> +
> +   brw->no_depth_or_stencil = !mt;
>  }
>  
>  /**
> diff --git a/src/mesa/drivers/dri/i965/gen8_depth_state.c b/src/mesa/drivers/dri/i965/gen8_depth_state.c
> index 621951e..8f5718a 100644
> --- a/src/mesa/drivers/dri/i965/gen8_depth_state.c
> +++ b/src/mesa/drivers/dri/i965/gen8_depth_state.c
> @@ -49,6 +49,12 @@ emit_depth_packets(struct brw_context *brw,
>                     uint32_t lod,
>                     uint32_t min_array_element)
>  {
> +   /* Skip repeated NULL depth/stencil emits (think 2D rendering). */
> +   if (!depth_mt && !stencil_mt && brw->no_depth_or_stencil) {
> +      assert(brw->hw_ctx);
> +      return;
> +   }
> +
>     intel_emit_depth_stall_flushes(brw);
>  
>     /* _NEW_BUFFERS, _NEW_DEPTH, _NEW_STENCIL */
> @@ -130,6 +136,8 @@ emit_depth_packets(struct brw_context *brw,
>     OUT_BATCH(depth_mt ? depth_mt->depth_clear_value : 0);
>     OUT_BATCH(1);
>     ADVANCE_BATCH();
> +
> +   brw->no_depth_or_stencil = !depth_mt && !stencil_mt;
>  }
>  
>  /* Awful vtable-compatible function; should be cleaned up in the future. */
> 



More information about the mesa-dev mailing list