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

Ben Widawsky ben at bwidawsk.net
Thu May 12 16:29:33 UTC 2016


lgtm

On Tue, May 10, 2016 at 10:34:28PM +0300, Topi Pohjolainen wrote:
> Until now mcs was associated to single sampled buffers only for
> 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
> v3 (Ben):
>    - Fix typo in commit message.
>    - Check for gen < 9 and return early in brw_predraw_set_aux_buffers()
>    - Check for gen < 9 and return early in intel_miptree_prepare_mcs()
> v4: Check for msaa_layput and number of samples to determine if
>     lossless compression is to used. Otherwise one cannot distuingish
>     between fast clear with and without compression.
> 
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> Reviewed-by: Ben Widawsky <ben at bwidawsk.net> (v3)
> ---
>  src/mesa/drivers/dri/i965/brw_blorp_blit.cpp  |  2 ++
>  src/mesa/drivers/dri/i965/brw_draw.c          | 20 ++++++++++++++
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 40 +++++++++++++++++++++++++++
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.h |  4 +++
>  4 files changed, 66 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> index ab2ceec..0672213 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> @@ -1881,6 +1881,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 9d034cf..dcbb681 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -391,6 +391,25 @@ brw_postdraw_set_buffers_need_resolve(struct brw_context *brw)
>     }
>  }
>  
> +static void
> +brw_predraw_set_aux_buffers(struct brw_context *brw)
> +{
> +   if (brw->gen < 9)
> +      return;
> +
> +   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);
> +      }
> +   }
> +}
> +
>  /* May fail if out of video memory for texture or vbo upload, or on
>   * fallback conditions.
>   */
> @@ -438,6 +457,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 8f6dc24..0b432ec 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> @@ -1622,6 +1622,46 @@ 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;
> +
> +   if (brw->gen < 9)
> +      return;
> +
> +   /* Single sample compression is represented re-using msaa compression
> +    * layout type: "Compressed Multisampled Surfaces".
> +    */
> +   if (mt->msaa_layout != INTEL_MSAA_LAYOUT_CMS || mt->num_samples > 1)
> +      return;
> +
> +   /* Clients are not currently capable of consuming compressed
> +    * single-sampled buffers.
> +    */
> +   if (mt->is_scanout)
> +      return;
> +
> +   assert(intel_tiling_supports_non_msrt_mcs(brw, mt->tiling) ||
> +          intel_miptree_supports_lossless_compressed(brw, mt));
> +
> +   /* Consider if lossless compression is supported but the needed
> +    * auxiliary buffer doesn't exist yet.
> +    *
> +    * 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.
> +    */
> +   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 7f6e771..4fb5b69 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,
> -- 
> 2.5.5
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev

-- 
Ben Widawsky, Intel Open Source Technology Center


More information about the mesa-dev mailing list