<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Sep 10, 2015 at 2:38 PM, Ville Syrjälä <span dir="ltr"><<a href="mailto:ville.syrjala@linux.intel.com" target="_blank">ville.syrjala@linux.intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5">On Thu, Sep 10, 2015 at 12:20:10PM -0700, Chad Versace wrote:<br>
> On Wed 19 Aug 2015, Anuj Phogat wrote:<br>
> > V2:<br>
> > - Do the tile width/height computations in the new helper<br>
> >   function and use it later in intel_miptree_get_tile_masks().<br>
> > - Change the name to intel_get_tile_dims().<br>
> ><br>
> > Cc: Ben Widawsky <<a href="mailto:ben@bwidawsk.net">ben@bwidawsk.net</a>><br>
> > Signed-off-by: Anuj Phogat <<a href="mailto:anuj.phogat@gmail.com">anuj.phogat@gmail.com</a>><br>
> > ---<br>
> >  src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 81 +++++++++++++++++++--------<br>
> >  src/mesa/drivers/dri/i965/intel_mipmap_tree.h |  4 ++<br>
> >  2 files changed, 63 insertions(+), 22 deletions(-)<br>
> ><br>
> > diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c<br>
> > index e85c3f0..c282e94 100644<br>
> > --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c<br>
> > +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c<br>
> > @@ -563,35 +563,15 @@ static unsigned long<br>
> >  intel_get_yf_ys_bo_size(struct intel_mipmap_tree *mt, unsigned *alignment,<br>
> >                          unsigned long *pitch)<br>
> >  {<br>
> > -   const uint32_t bpp = mt->cpp * 8;<br>
> > -   const uint32_t aspect_ratio = (bpp == 16 || bpp == 64) ? 2 : 1;<br>
> >     uint32_t tile_width, tile_height;<br>
> >     unsigned long stride, size, aligned_y;<br>
> ><br>
> >     assert(mt->tr_mode != INTEL_MIPTREE_TRMODE_NONE);<br>
> > -<br>
> > -   switch (bpp) {<br>
> > -   case 8:<br>
> > -      tile_height = 64;<br>
> > -      break;<br>
> > -   case 16:<br>
> > -   case 32:<br>
> > -      tile_height = 32;<br>
> > -      break;<br>
> > -   case 64:<br>
> > -   case 128:<br>
> > -      tile_height = 16;<br>
> > -      break;<br>
> > -   default:<br>
> > -      unreachable("not reached");<br>
> > -   }<br>
> > -<br>
> > -   if (mt->tr_mode == INTEL_MIPTREE_TRMODE_YS)<br>
> > -      tile_height *= 4;<br>
> > +   intel_get_tile_dims(mt->tiling, mt->tr_mode, mt->cpp,<br>
> > +                       &tile_width, &tile_height);<br>
> ><br>
> >     aligned_y = ALIGN(mt->total_height, tile_height);<br>
> >     stride = mt->total_width * mt->cpp;<br>
> > -   tile_width = tile_height * mt->cpp * aspect_ratio;<br>
> >     stride = ALIGN(stride, tile_width);<br>
> >     size = stride * aligned_y;<br>
> ><br>
> > @@ -1081,6 +1061,63 @@ intel_miptree_get_image_offset(const struct intel_mipmap_tree *mt,<br>
> >     *y = mt->level[level].slice[slice].y_offset;<br>
> >  }<br>
> ><br>
> > +<br>
> > +/**<br>
> > + * This function computes the width and height in bytes of different tiling<br>
> > + * patterns. If the BO is untiled, the dimensions are set to cpp.<br>
> > + */<br>
><br>
> Is the tile_w parameter in units of bytes or pixels? That should be<br>
> documented at the top of the function.<br>
><br>
> Also, just to be clear, "tile height" is always unitless. The hw docs<br>
> sometime express it in units of "rows". But "rows" itself is unitless.<br>
><br>
> > +void<br>
> > +intel_get_tile_dims(uint32_t tiling, uint32_t tr_mode, uint32_t cpp,<br>
> > +                    uint32_t *tile_w, uint32_t *tile_h)<br>
> > +{<br>
> > +   if (tr_mode == INTEL_MIPTREE_TRMODE_NONE) {<br>
> > +      switch (tiling) {<br>
> > +      case I915_TILING_X:<br>
> > +         *tile_w = 512;<br>
> > +         *tile_h = 8 * cpp;<br>
><br>
> For legacy tiling formats, the height of a tile is independent of the<br>
> pixel size,  because the height is unitless. For Tile X, it's always<br>
> 2^3. For Tile Y Legacy, it's always 2^5.<br>
><br>
> If tile_w is in units of bytes, then it's also independent of pixel<br>
> size. If tile_w is in units of pixels, though, then<br>
><br>
>     tile_w_pixels = tile_w_bytes / cpp<br>
><br>
><br>
> > +         break;<br>
> > +      case I915_TILING_Y:<br>
> > +         *tile_w = 128;<br>
> > +         *tile_h = 32 * cpp;<br>
> > +         break;<br>
> > +      case I915_TILING_NONE:<br>
> > +         *tile_w = cpp;<br>
> > +         *tile_h = cpp;<br>
> > +         break;<br>
> > +      default:<br>
> > +         unreachable("not reached");<br>
> > +      }<br>
> > +   } else {<br>
> > +      uint32_t aspect_ratio = 1;<br>
> > +      assert(_mesa_is_pow_two(cpp));<br>
> > +<br>
> > +      switch (cpp) {<br>
> > +      case 1:<br>
> > +         *tile_h = 64 * cpp;<br>
><br>
> I'm still reading the docs for the non-legay tiling formats Yf, and Ys.<br>
> So I can't comment on this part of the patch.<br>
<br>
</div></div>As it turns out I was just looking at Yf and whatnot from display POV,<br>
and I came to the conclusion that I'll change the kernel to just have a<br>
function to return the tile width in bytes based on the cpp passed in,<br>
and then I can simply compute tile height as 'tile_size / tile_width',<br>
or tile size in pixels (if needed) as 'tile_width / cpp'<br>
<br>
And what I understood about Yf (the docs are no good IME, at least the<br>
part I was looking at) is the following:<br></blockquote><div>I agree that docs don't explain the new layouts very well. I also</div><div>came up with the same table. Using your suggestion I will use </div><div>'tile_size / tile_width' to compute tile_height instead of using aspect</div><div>ratio.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
cpp w_bytes w_pixels h  aspect<br>
1   64      64       64 1<br>
2   128     64       32 2<br>
4   128     32       32 1<br>
8   256     32       16 2<br>
16  256     16       16 1<br>
<br>
So all you really need to know is cpp and w_bytes and the rest can all<br>
be computed as needed.<br></blockquote><div>I'll send out V3 with fewer function parameters. Thanks for the suggestions.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<span class=""><font color="#888888"><br>
--<br>
Ville Syrjälä<br>
Intel OTC<br>
</font></span></blockquote></div><br></div></div>