On Thu, Sep 10, 2015 at 2:38 PM, Ville Syrjälä < ville.syrj...@linux.intel.com> wrote:
> On Thu, Sep 10, 2015 at 12:20:10PM -0700, Chad Versace wrote: > > 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 <b...@bwidawsk.net> > > > Signed-off-by: Anuj Phogat <anuj.pho...@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. > > As it turns out I was just looking at Yf and whatnot from display POV, > and I came to the conclusion that I'll change the kernel to just have a > function to return the tile width in bytes based on the cpp passed in, > and then I can simply compute tile height as 'tile_size / tile_width', > or tile size in pixels (if needed) as 'tile_width / cpp' > > And what I understood about Yf (the docs are no good IME, at least the > part I was looking at) is the following: > I agree that docs don't explain the new layouts very well. I also came up with the same table. Using your suggestion I will use 'tile_size / tile_width' to compute tile_height instead of using aspect ratio. > > cpp w_bytes w_pixels h aspect > 1 64 64 64 1 > 2 128 64 32 2 > 4 128 32 32 1 > 8 256 32 16 2 > 16 256 16 16 1 > > So all you really need to know is cpp and w_bytes and the rest can all > be computed as needed. > I'll send out V3 with fewer function parameters. Thanks for the suggestions. > > -- > Ville Syrjälä > Intel OTC >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev