[Mesa-dev] [v5 05/11] i965: Deferred allocation of mcs for lossless compressed

Ben Widawsky ben at bwidawsk.net
Fri May 6 02:28:53 UTC 2016


On Mon, Apr 25, 2016 at 08:10:02PM +0300, Topi Pohjolainen wrote:
> Until not mcs was associated to single sampled buffers only for
         ^ now

> fast clear purposes and it was therefore the responsibility of the
> clear logic to allocate the aux buffer when needed. Now that normal
> 3D render or blorp blit may render with mcs enabled also, they need
> to prepare the mcs just as well.
> 
> v2: Do not enable for scanout buffers
> 
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_blorp_blit.cpp  |  2 ++
>  src/mesa/drivers/dri/i965/brw_draw.c          | 17 ++++++++++++++
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 34 +++++++++++++++++++++++++++
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.h |  4 ++++
>  4 files changed, 57 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> index 7556d6a..30206f2 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> @@ -82,6 +82,8 @@ brw_blorp_blit_miptrees(struct brw_context *brw,
>     intel_miptree_slice_resolve_depth(brw, src_mt, src_level, src_layer);
>     intel_miptree_slice_resolve_depth(brw, dst_mt, dst_level, dst_layer);
>  
> +   intel_miptree_prepare_mcs(brw, dst_mt);
> +
>     DBG("%s from %dx %s mt %p %d %d (%f,%f) (%f,%f)"
>         "to %dx %s mt %p %d %d (%f,%f) (%f,%f) (flip %d,%d)\n",
>         __func__,
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
> index afa8a4e..4fa0f4e 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -371,6 +371,22 @@ brw_postdraw_set_buffers_need_resolve(struct brw_context *brw)
>     }
>  }
>  
> +static void
> +brw_predraw_set_aux_buffers(struct brw_context *brw)
> +{
> +   struct gl_context *ctx = &brw->ctx;
> +   struct gl_framebuffer *fb = ctx->DrawBuffer;
> +
> +   for (unsigned i = 0; i < fb->_NumColorDrawBuffers; i++) {
> +      struct intel_renderbuffer *irb =
> +         intel_renderbuffer(fb->_ColorDrawBuffers[i]);
> +
> +      if (irb) {
> +         intel_miptree_prepare_mcs(brw, irb->mt);
> +      }
> +   }
> +}
> +

I wonder if it makes sense to put the gen check in this function to avoid
unnecessary pointer derefs.

>  /* May fail if out of video memory for texture or vbo upload, or on
>   * fallback conditions.
>   */
> @@ -416,6 +432,7 @@ brw_try_draw_prims(struct gl_context *ctx,
>        _mesa_fls(ctx->VertexProgram._Current->Base.SamplersUsed);
>  
>     intel_prepare_render(brw);
> +   brw_predraw_set_aux_buffers(brw);
>  
>     /* This workaround has to happen outside of brw_upload_render_state()
>      * because it may flush the batchbuffer for a blit, affecting the state
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> index cdf2fbd..758b9dd 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> @@ -1624,6 +1624,40 @@ intel_miptree_alloc_non_msrt_mcs(struct brw_context *brw,
>     return mt->mcs_mt;
>  }
>  
> +void
> +intel_miptree_prepare_mcs(struct brw_context *brw,
> +                          struct intel_mipmap_tree *mt)
> +{
> +   if (mt->mcs_mt)
> +      return;
> +

I'm in favor of easily readable early gen checks, but up to you:
if (brw->gen < 9)
   return;

> +   /* Consider if lossless compression is supported but the needed
> +    * auxiliary buffer doesn't exist yet.
> +    */
> +   if (brw->gen >= 9 &&
> +       intel_tiling_supports_non_msrt_mcs(brw, mt->tiling) &&
> +       intel_miptree_supports_non_msrt_fast_clear(brw, mt) &&
> +       intel_miptree_supports_lossless_compressed(mt->format)) {
> +
> +      /* Clients are not currently capable of consuming compressed
> +       * single-sampled buffers.
> +       */
> +      if (mt->is_scanout)
> +         return;
> +
> +      /* Failing to allocate the auxiliary buffer means running out of
> +       * memory. The pointer to the aux miptree is left NULL which should
> +       * signal non-compressed behavior.
                   ^ uncompressed
> +       */
> +      if (!intel_miptree_alloc_non_msrt_mcs(brw, mt)) {
> +         _mesa_warning(NULL,
> +                       "Failed to allocated aux buffer for lossless"
> +                       " compressed %p %u:%u %s\n",
> +                       mt, mt->logical_width0, mt->logical_height0,
> +                       _mesa_get_format_name(mt->format));
> +      }
> +   }
> +}
>  
>  /**
>   * Helper for intel_miptree_alloc_hiz() that sets
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> index bb06522..e0d543b 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> @@ -693,6 +693,10 @@ bool
>  intel_miptree_alloc_non_msrt_mcs(struct brw_context *brw,
>                                   struct intel_mipmap_tree *mt);
>  
> +void
> +intel_miptree_prepare_mcs(struct brw_context *brw,
> +                          struct intel_mipmap_tree *mt);
> +
>  enum {
>     MIPTREE_LAYOUT_ACCELERATED_UPLOAD       = 1 << 0,
>     MIPTREE_LAYOUT_FORCE_ALL_SLICE_AT_LOD   = 1 << 1,

lgtm:
Reviewed-by: Ben Widawsky <ben at bwidawsk.net>


More information about the mesa-dev mailing list