[Mesa-dev] [PATCH V2 1/8] i965: Add a helper function intel_get_tile_dims()

Chad Versace chad.versace at intel.com
Thu Sep 10 12:20:10 PDT 2015


On Wed 19 Aug 2015, Anuj Phogat wrote:
> V2:
> - Do the tile width/height computations in the new helper
>   function and use it later in intel_miptree_get_tile_masks().
> - Change the name to intel_get_tile_dims().
> 
> Cc: Ben Widawsky <ben at bwidawsk.net>
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> ---
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 81 +++++++++++++++++++--------
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.h |  4 ++
>  2 files changed, 63 insertions(+), 22 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> index e85c3f0..c282e94 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> @@ -563,35 +563,15 @@ static unsigned long
>  intel_get_yf_ys_bo_size(struct intel_mipmap_tree *mt, unsigned *alignment,
>                          unsigned long *pitch)
>  {
> -   const uint32_t bpp = mt->cpp * 8;
> -   const uint32_t aspect_ratio = (bpp == 16 || bpp == 64) ? 2 : 1;
>     uint32_t tile_width, tile_height;
>     unsigned long stride, size, aligned_y;
>  
>     assert(mt->tr_mode != INTEL_MIPTREE_TRMODE_NONE);
> -
> -   switch (bpp) {
> -   case 8:
> -      tile_height = 64;
> -      break;
> -   case 16:
> -   case 32:
> -      tile_height = 32;
> -      break;
> -   case 64:
> -   case 128:
> -      tile_height = 16;
> -      break;
> -   default:
> -      unreachable("not reached");
> -   }
> -
> -   if (mt->tr_mode == INTEL_MIPTREE_TRMODE_YS)
> -      tile_height *= 4;
> +   intel_get_tile_dims(mt->tiling, mt->tr_mode, mt->cpp,
> +                       &tile_width, &tile_height);
>  
>     aligned_y = ALIGN(mt->total_height, tile_height);
>     stride = mt->total_width * mt->cpp;
> -   tile_width = tile_height * mt->cpp * aspect_ratio;
>     stride = ALIGN(stride, tile_width);
>     size = stride * aligned_y;
>  
> @@ -1081,6 +1061,63 @@ intel_miptree_get_image_offset(const struct intel_mipmap_tree *mt,
>     *y = mt->level[level].slice[slice].y_offset;
>  }
>  
> +
> +/**
> + * This function computes the width and height in bytes of different tiling
> + * patterns. If the BO is untiled, the dimensions are set to cpp.
> + */

Is the tile_w parameter in units of bytes or pixels? That should be
documented at the top of the function.

Also, just to be clear, "tile height" is always unitless. The hw docs
sometime express it in units of "rows". But "rows" itself is unitless.

> +void
> +intel_get_tile_dims(uint32_t tiling, uint32_t tr_mode, uint32_t cpp,
> +                    uint32_t *tile_w, uint32_t *tile_h)
> +{
> +   if (tr_mode == INTEL_MIPTREE_TRMODE_NONE) {
> +      switch (tiling) {
> +      case I915_TILING_X:
> +         *tile_w = 512;
> +         *tile_h = 8 * cpp;

For legacy tiling formats, the height of a tile is independent of the
pixel size,  because the height is unitless. For Tile X, it's always
2^3. For Tile Y Legacy, it's always 2^5.

If tile_w is in units of bytes, then it's also independent of pixel
size. If tile_w is in units of pixels, though, then

    tile_w_pixels = tile_w_bytes / cpp


> +         break;
> +      case I915_TILING_Y:
> +         *tile_w = 128;
> +         *tile_h = 32 * cpp;
> +         break;
> +      case I915_TILING_NONE:
> +         *tile_w = cpp;
> +         *tile_h = cpp;
> +         break;
> +      default:
> +         unreachable("not reached");
> +      }
> +   } else {
> +      uint32_t aspect_ratio = 1;
> +      assert(_mesa_is_pow_two(cpp));
> +
> +      switch (cpp) {
> +      case 1:
> +         *tile_h = 64 * cpp;

I'm still reading the docs for the non-legay tiling formats Yf, and Ys.
So I can't comment on this part of the patch.

> +         break;
> +      case 2:
> +      case 4:
> +         *tile_h = 32 * cpp;
> +         break;
> +      case 8:
> +      case 16:
> +         *tile_h = 16 * cpp;
> +         break;
> +      default:
> +         unreachable("not reached");
> +      }
> +
> +      if (cpp == 2 || cpp == 8)
> +         aspect_ratio = 2;
> +
> +      if (tr_mode == INTEL_MIPTREE_TRMODE_YS)
> +         *tile_h *= 4;
> +
> +      *tile_w = *tile_h * aspect_ratio;
> +   }
> +}


More information about the mesa-dev mailing list