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. > + 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; > + } > +} _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev