[Mesa-dev] [PATCH V3 03/22] i965: Move intel_miptree_choose_tiling() to brw_tex_layout.c

Pohjolainen, Topi topi.pohjolainen at intel.com
Tue Jun 2 12:05:03 PDT 2015


On Tue, Jun 02, 2015 at 11:09:31AM -0700, Anuj Phogat wrote:
> and change the name to brw_miptree_choose_tiling().
> 
> V3: Remove redundant function parameters. (Topi)
> 
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
> Comment made by Topi on patch 02/22 is fixed in V3 of this patch.

Thanks Anuj, looks good to me, and you already have my tag.

> 
>  src/mesa/drivers/dri/i965/brw_tex_layout.c    | 107 +++++++++++++++++++++++++-
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 104 -------------------------
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.h |   8 --
>  3 files changed, 103 insertions(+), 116 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_tex_layout.c b/src/mesa/drivers/dri/i965/brw_tex_layout.c
> index 4e79cf5..c77c0ce 100644
> --- a/src/mesa/drivers/dri/i965/brw_tex_layout.c
> +++ b/src/mesa/drivers/dri/i965/brw_tex_layout.c
> @@ -458,6 +458,108 @@ brw_miptree_layout_texture_3d(struct brw_context *brw,
>     align_cube(mt);
>  }
>  
> +/**
> + * \brief Helper function for intel_miptree_create().
> + */
> +static uint32_t
> +brw_miptree_choose_tiling(struct brw_context *brw,
> +                          enum intel_miptree_tiling_mode requested,
> +                          const struct intel_mipmap_tree *mt)
> +{
> +   if (mt->format == MESA_FORMAT_S_UINT8) {
> +      /* The stencil buffer is W tiled. However, we request from the kernel a
> +       * non-tiled buffer because the GTT is incapable of W fencing.
> +       */
> +      return I915_TILING_NONE;
> +   }
> +
> +   /* Some usages may want only one type of tiling, like depth miptrees (Y
> +    * tiled), or temporary BOs for uploading data once (linear).
> +    */
> +   switch (requested) {
> +   case INTEL_MIPTREE_TILING_ANY:
> +      break;
> +   case INTEL_MIPTREE_TILING_Y:
> +      return I915_TILING_Y;
> +   case INTEL_MIPTREE_TILING_NONE:
> +      return I915_TILING_NONE;
> +   }
> +
> +   if (mt->num_samples > 1) {
> +      /* From p82 of the Sandy Bridge PRM, dw3[1] of SURFACE_STATE ("Tiled
> +       * Surface"):
> +       *
> +       *   [DevSNB+]: For multi-sample render targets, this field must be
> +       *   1. MSRTs can only be tiled.
> +       *
> +       * Our usual reason for preferring X tiling (fast blits using the
> +       * blitting engine) doesn't apply to MSAA, since we'll generally be
> +       * downsampling or upsampling when blitting between the MSAA buffer
> +       * and another buffer, and the blitting engine doesn't support that.
> +       * So use Y tiling, since it makes better use of the cache.
> +       */
> +      return I915_TILING_Y;
> +   }
> +
> +   GLenum base_format = _mesa_get_format_base_format(mt->format);
> +   if (base_format == GL_DEPTH_COMPONENT ||
> +       base_format == GL_DEPTH_STENCIL_EXT)
> +      return I915_TILING_Y;
> +
> +   /* 1D textures (and 1D array textures) don't get any benefit from tiling,
> +    * in fact it leads to a less efficient use of memory space and bandwidth
> +    * due to tile alignment.
> +    */
> +   if (mt->logical_height0 == 1)
> +      return I915_TILING_NONE;
> +
> +   int minimum_pitch = mt->total_width * mt->cpp;
> +
> +   /* If the width is much smaller than a tile, don't bother tiling. */
> +   if (minimum_pitch < 64)
> +      return I915_TILING_NONE;
> +
> +   if (ALIGN(minimum_pitch, 512) >= 32768 ||
> +       mt->total_width >= 32768 || mt->total_height >= 32768) {
> +      perf_debug("%dx%d miptree too large to blit, falling back to untiled",
> +                 mt->total_width, mt->total_height);
> +      return I915_TILING_NONE;
> +   }
> +
> +   /* Pre-gen6 doesn't have BLORP to handle Y-tiling, so use X-tiling. */
> +   if (brw->gen < 6)
> +      return I915_TILING_X;
> +
> +   /* From the Sandybridge PRM, Volume 1, Part 2, page 32:
> +    * "NOTE: 128BPE Format Color Buffer ( render target ) MUST be either TileX
> +    *  or Linear."
> +    * 128 bits per pixel translates to 16 bytes per pixel. This is necessary
> +    * all the way back to 965, but is permitted on Gen7+.
> +    */
> +   if (brw->gen < 7 && mt->cpp >= 16)
> +      return I915_TILING_X;
> +
> +   /* From the Ivy Bridge PRM, Vol4 Part1 2.12.2.1 (SURFACE_STATE for most
> +    * messages), on p64, under the heading "Surface Vertical Alignment":
> +    *
> +    *     This field must be set to VALIGN_4 for all tiled Y Render Target
> +    *     surfaces.
> +    *
> +    * So if the surface is renderable and uses a vertical alignment of 2,
> +    * force it to be X tiled.  This is somewhat conservative (it's possible
> +    * that the client won't ever render to this surface), but it's difficult
> +    * to know that ahead of time.  And besides, since we use a vertical
> +    * alignment of 4 as often as we can, this shouldn't happen very often.
> +    */
> +   if (brw->gen == 7 && mt->align_h == 2 &&
> +       brw->format_supported_as_render_target[mt->format]) {
> +      return I915_TILING_X;
> +   }
> +
> +   return I915_TILING_Y | I915_TILING_X;
> +}
> +
> +
>  void
>  brw_miptree_layout(struct brw_context *brw,
>                     bool for_bo,
> @@ -562,9 +664,6 @@ brw_miptree_layout(struct brw_context *brw,
>     }
>  
>     if (!for_bo)
> -      mt->tiling = intel_miptree_choose_tiling(brw, mt->format,
> -                                               mt->logical_width0,
> -                                               mt->num_samples,
> -                                               requested, mt);
> +      mt->tiling = brw_miptree_choose_tiling(brw, requested, mt);
>  }
>  
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> index 8966f89..3610030 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> @@ -469,110 +469,6 @@ intel_miptree_create_layout(struct brw_context *brw,
>     return mt;
>  }
>  
> -/**
> - * \brief Helper function for intel_miptree_create().
> - */
> -uint32_t
> -intel_miptree_choose_tiling(struct brw_context *brw,
> -                            mesa_format format,
> -                            uint32_t width0,
> -                            uint32_t num_samples,
> -                            enum intel_miptree_tiling_mode requested,
> -                            struct intel_mipmap_tree *mt)
> -{
> -   if (format == MESA_FORMAT_S_UINT8) {
> -      /* The stencil buffer is W tiled. However, we request from the kernel a
> -       * non-tiled buffer because the GTT is incapable of W fencing.
> -       */
> -      return I915_TILING_NONE;
> -   }
> -
> -   /* Some usages may want only one type of tiling, like depth miptrees (Y
> -    * tiled), or temporary BOs for uploading data once (linear).
> -    */
> -   switch (requested) {
> -   case INTEL_MIPTREE_TILING_ANY:
> -      break;
> -   case INTEL_MIPTREE_TILING_Y:
> -      return I915_TILING_Y;
> -   case INTEL_MIPTREE_TILING_NONE:
> -      return I915_TILING_NONE;
> -   }
> -
> -   if (num_samples > 1) {
> -      /* From p82 of the Sandy Bridge PRM, dw3[1] of SURFACE_STATE ("Tiled
> -       * Surface"):
> -       *
> -       *   [DevSNB+]: For multi-sample render targets, this field must be
> -       *   1. MSRTs can only be tiled.
> -       *
> -       * Our usual reason for preferring X tiling (fast blits using the
> -       * blitting engine) doesn't apply to MSAA, since we'll generally be
> -       * downsampling or upsampling when blitting between the MSAA buffer
> -       * and another buffer, and the blitting engine doesn't support that.
> -       * So use Y tiling, since it makes better use of the cache.
> -       */
> -      return I915_TILING_Y;
> -   }
> -
> -   GLenum base_format = _mesa_get_format_base_format(format);
> -   if (base_format == GL_DEPTH_COMPONENT ||
> -       base_format == GL_DEPTH_STENCIL_EXT)
> -      return I915_TILING_Y;
> -
> -   /* 1D textures (and 1D array textures) don't get any benefit from tiling,
> -    * in fact it leads to a less efficient use of memory space and bandwidth
> -    * due to tile alignment.
> -    */
> -   if (mt->logical_height0 == 1)
> -      return I915_TILING_NONE;
> -
> -   int minimum_pitch = mt->total_width * mt->cpp;
> -
> -   /* If the width is much smaller than a tile, don't bother tiling. */
> -   if (minimum_pitch < 64)
> -      return I915_TILING_NONE;
> -
> -   if (ALIGN(minimum_pitch, 512) >= 32768 ||
> -       mt->total_width >= 32768 || mt->total_height >= 32768) {
> -      perf_debug("%dx%d miptree too large to blit, falling back to untiled",
> -                 mt->total_width, mt->total_height);
> -      return I915_TILING_NONE;
> -   }
> -
> -   /* Pre-gen6 doesn't have BLORP to handle Y-tiling, so use X-tiling. */
> -   if (brw->gen < 6)
> -      return I915_TILING_X;
> -
> -   /* From the Sandybridge PRM, Volume 1, Part 2, page 32:
> -    * "NOTE: 128BPE Format Color Buffer ( render target ) MUST be either TileX
> -    *  or Linear."
> -    * 128 bits per pixel translates to 16 bytes per pixel. This is necessary
> -    * all the way back to 965, but is permitted on Gen7+.
> -    */
> -   if (brw->gen < 7 && mt->cpp >= 16)
> -      return I915_TILING_X;
> -
> -   /* From the Ivy Bridge PRM, Vol4 Part1 2.12.2.1 (SURFACE_STATE for most
> -    * messages), on p64, under the heading "Surface Vertical Alignment":
> -    *
> -    *     This field must be set to VALIGN_4 for all tiled Y Render Target
> -    *     surfaces.
> -    *
> -    * So if the surface is renderable and uses a vertical alignment of 2,
> -    * force it to be X tiled.  This is somewhat conservative (it's possible
> -    * that the client won't ever render to this surface), but it's difficult
> -    * to know that ahead of time.  And besides, since we use a vertical
> -    * alignment of 4 as often as we can, this shouldn't happen very often.
> -    */
> -   if (brw->gen == 7 && mt->align_h == 2 &&
> -       brw->format_supported_as_render_target[format]) {
> -      return I915_TILING_X;
> -   }
> -
> -   return I915_TILING_Y | I915_TILING_X;
> -}
> -
>  
>  /**
>   * Choose an appropriate uncompressed format for a requested
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> index 1d51546..0db6b44 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> @@ -784,14 +784,6 @@ intel_miptree_unmap(struct brw_context *brw,
>  		    unsigned int level,
>  		    unsigned int slice);
>  
> -uint32_t
> -intel_miptree_choose_tiling(struct brw_context *brw,
> -                            mesa_format format,
> -                            uint32_t width0,
> -                            uint32_t num_samples,
> -                            enum intel_miptree_tiling_mode requested,
> -                            struct intel_mipmap_tree *mt);
> -
>  void
>  intel_hiz_exec(struct brw_context *brw, struct intel_mipmap_tree *mt,
>  	       unsigned int level, unsigned int layer, enum gen6_hiz_op op);
> -- 
> 1.9.3
> 


More information about the mesa-dev mailing list