[Mesa-dev] [PATCH] i965: Always use Y-tiled buffers on SKL+

Pohjolainen, Topi topi.pohjolainen at intel.com
Thu Apr 21 05:03:02 UTC 2016


On Wed, Apr 20, 2016 at 09:49:02PM -0700, Ben Widawsky wrote:
> From: Ben Widawsky <benjamin.widawsky at intel.com>
> 
> Starting with Skylake, the display engine is capable of scanning out from
> Y-tiled buffers. As such, we can and should use Y-tiling for better efficiency.
> This also has the added benefit of being able to fast clear the winsys buffer.
> 
> Note that the buffer allocation done for mipmaps will already never allocate an
> X-tiled buffer for GEN9.
> 
> Here is the statistically significant difference (percentage) with this patch. I
> do not know why we did see these kind of results earlier. This is on a SKL gt3e
> with a resolution of 3200x1800.

Yes, please. A few comments but:

Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>

> 
> Benchmark          a-master->b-yscanout
> OglBatch0          8.56
> OglBatch1          6.85
> OglBatch2          5.0
> OglBatch3          4.48
> OglBatch4          4.16
> OglBatch6          3.57
> OglBatch7          2.96
> OglFillPixel       1.91
> OglGeomPoint       4.43
> OglGeomTriList     2.83
> OglPSBump8         0.32
> OglShMapVsm        6.61
> OglTerrainFlyInst  5.2
> OglVSTangent       3.03
> OglZBuffer         8.88
> egypt              14.54
> manhattan          1.59
> manhattanoff       -0.25
> triangle           15.35
> warsow             2.26
> xonotic            7.9
> 
> Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
> ---
>  src/mesa/drivers/dri/i965/brw_meta_fast_clear.c |  4 ++--
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.c   |  9 +++++++--
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.h   |  3 ++-
>  src/mesa/drivers/dri/i965/intel_screen.c        | 21 ++++++++++++++++++---
>  4 files changed, 29 insertions(+), 8 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c
> index 1fb5dc8..cf634a2 100644
> --- a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c
> +++ b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c
> @@ -240,7 +240,7 @@ get_fast_clear_rect(struct brw_context *brw, struct gl_framebuffer *fb,
>         * alignment size returned by intel_get_non_msrt_mcs_alignment(), but
>         * with X alignment multiplied by 16 and Y alignment multiplied by 32.
>         */
> -      intel_get_non_msrt_mcs_alignment(irb->mt, &x_align, &y_align);
> +      intel_get_non_msrt_mcs_alignment(brw, irb->mt, &x_align, &y_align);
>        x_align *= 16;
>  
>        /* SKL+ line alignment requirement for Y-tiled are half those of the prior
> @@ -821,7 +821,7 @@ get_resolve_rect(struct brw_context *brw,
>      * by a factor of 2.
>      */
>  
> -   intel_get_non_msrt_mcs_alignment(mt, &x_align, &y_align);
> +   intel_get_non_msrt_mcs_alignment(brw, mt, &x_align, &y_align);
>     if (brw->gen >= 9) {
>        x_scaledown = x_align * 8;
>        y_scaledown = y_align * 8;
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> index d263ff8..a793370 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> @@ -144,7 +144,8 @@ compute_msaa_layout(struct brw_context *brw, mesa_format format,
>   *   by half the block width, and Y coordinates by half the block height.
>   */
>  void
> -intel_get_non_msrt_mcs_alignment(struct intel_mipmap_tree *mt,
> +intel_get_non_msrt_mcs_alignment(const struct brw_context *brw,
> +                                 struct intel_mipmap_tree *mt,

I think you could mark mt as const while you are at it if you like.

>                                   unsigned *width_px, unsigned *height)
>  {
>     switch (mt->tiling) {
> @@ -156,6 +157,10 @@ intel_get_non_msrt_mcs_alignment(struct intel_mipmap_tree *mt,
>        *height = 4;
>        break;
>     case I915_TILING_X:
> +      /* The docs are somewhat confusing with the way the tables are displayed.
> +       * However, it does clearly state: "MCS and Lossless compression is
> +       * supported for TiledY/TileYs/TileYf non-MSRTs only." */

Comment closing on its own line. I'm also a little confused if this comment is
really related to this patch.

> +      assert(brw->gen < 9);
>        *width_px = 64 / mt->cpp;
>        *height = 2;
>     }
> @@ -1552,7 +1557,7 @@ intel_miptree_alloc_non_msrt_mcs(struct brw_context *brw,
>     const mesa_format format = MESA_FORMAT_R_UINT32;
>     unsigned block_width_px;
>     unsigned block_height;
> -   intel_get_non_msrt_mcs_alignment(mt, &block_width_px, &block_height);
> +   intel_get_non_msrt_mcs_alignment(brw, mt, &block_width_px, &block_height);
>     unsigned width_divisor = block_width_px * 4;
>     unsigned height_divisor = block_height * 8;
>  
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> index 7cdfb37..826f572 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> @@ -663,7 +663,8 @@ struct intel_mipmap_tree
>  };
>  
>  void
> -intel_get_non_msrt_mcs_alignment(struct intel_mipmap_tree *mt,
> +intel_get_non_msrt_mcs_alignment(const struct brw_context *brw,
> +                                 struct intel_mipmap_tree *mt,
>                                   unsigned *width_px, unsigned *height);
>  
>  bool
> diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
> index db9d94d..878901a 100644
> --- a/src/mesa/drivers/dri/i965/intel_screen.c
> +++ b/src/mesa/drivers/dri/i965/intel_screen.c
> @@ -516,7 +516,11 @@ intel_create_image(__DRIscreen *screen,
>     int cpp;
>     unsigned long pitch;
>  
> -   tiling = I915_TILING_X;
> +   if (intelScreen->devinfo->gen >= 9) {
> +      tiling = I915_TILING_Y;
> +   } else {
> +      tiling = I915_TILING_X;
> +   }
>     if (use & __DRI_IMAGE_USE_CURSOR) {
>        if (width != 64 || height != 64)
>  	 return NULL;
> @@ -1144,8 +1148,14 @@ intel_detect_swizzling(struct intel_screen *screen)
>     drm_intel_bo *buffer;
>     unsigned long flags = 0;
>     unsigned long aligned_pitch;
> -   uint32_t tiling = I915_TILING_X;
>     uint32_t swizzle_mode = 0;
> +   uint32_t tiling;
> +
> +   if (screen->devinfo->gen >= 9) {
> +      tiling = I915_TILING_Y;
> +   } else {
> +      tiling = I915_TILING_X;
> +   }
>  
>     buffer = drm_intel_bo_alloc_tiled(screen->bufmgr, "swizzle test",
>  				     64, 64, 4,
> @@ -1571,7 +1581,12 @@ intelAllocateBuffer(__DRIscreen *screen,
>        return NULL;
>  
>     /* The front and back buffers are color buffers, which are X tiled. */
> -   uint32_t tiling = I915_TILING_X;
> +   uint32_t tiling;
> +   if (intelScreen->devinfo->gen >= 9) {
> +      tiling = I915_TILING_Y;
> +   } else {
> +      tiling = I915_TILING_X;
> +   }
>     unsigned long pitch;
>     int cpp = format / 8;
>     intelBuffer->bo = drm_intel_bo_alloc_tiled(intelScreen->bufmgr,
> -- 
> 2.8.0
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list