[PATCH i-g-t v4 1/5] lib/intel_blt: Add helpers for calculating stride and aligned height
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Thu Feb 1 19:07:43 UTC 2024
On Thu, Feb 01, 2024 at 01:05:20PM +0100, Karolina Stolarek wrote:
> On 1.02.2024 11:07, Zbigniew Kempczyński wrote:
> > Tiled surfaces have stride / aligned height constraints. Currently
> > blt library has limitation and doesn't work properly when surface
> > stride is not valid for specific tiling.
> >
> > As an example lets say we want to copy from linear to xmajor
> > 33 x 33 x 32bpp surface. Xmajor surface expects stride aligned to
> > 512 bytes and height to 8 rows so this surface will occupy 512B x 40
> > (128 x 40 x 32 bpp).
> >
> > Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> > Cc: Karolina Drobnik <karolina.drobnik at intel.com>
>
> Just a bunch of nits, nothing major.
>
> > ---
> > v2: Fix stride/aligned height calculation for Tile64
> > v3: Fix stride calculation for xmajor
> > Make helpers public (fixes compilation warning due to lack
> > or static function users)
> > ---
> > lib/intel_blt.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++
> > lib/intel_blt.h | 4 ++++
> > 2 files changed, 68 insertions(+)
> >
> > diff --git a/lib/intel_blt.c b/lib/intel_blt.c
> > index 25d251c4f8..13b1dbba4f 100644
> > --- a/lib/intel_blt.c
> > +++ b/lib/intel_blt.c
> > @@ -521,6 +521,70 @@ static int __block_tiling(enum blt_tiling_type tiling)
> > return 0;
> > }
> > +/**
> > + * blt_get_min_stride
> > + * @width: width in pixels
> > + * @bpp: bits per pixel
> > + * @tiling: tiling
> > + *
> > + * Function returns minimum posibble stride in bytes for width, bpp and tiling.
>
> "return" is already described, we could say "calculates minimum possible
> stride..."
Agree, repeating same looks odd.
>
> > + *
> > + * Returns:
> > + * minimum possible stride in bytes.
> > + */
> > +uint32_t blt_get_min_stride(uint32_t width, uint32_t bpp,
> > + enum blt_tiling_type tiling)
> > +{
> > + switch (tiling) {
> > + case T_LINEAR:
> > + return width * bpp / 8;
> > + case T_XMAJOR:
> > + return ALIGN(width * bpp / 8, 512);
> > + case T_TILE64:
> > + if (bpp == 8)
> > + return ALIGN(width, 256);
> > + else if (bpp == 16 || bpp == 32)
> > + return ALIGN(width * bpp / 8, 512);
> > + return ALIGN(width * bpp / 8, 1024);
> > +
> > + default:
> > + return ALIGN(width * bpp / 8, 128);
> > + }
> > +}
> > +
> > +/**
> > + * blt_get_aligned_height
> > + * @height: height in pixels
> > + * @bpp: bits per pixel (used for Tile64 due to different tile organization
> > + * in pixels)
> > + * @tiling: tiling
> > + *
> > + * Function returns aligned height for specific tiling. Height returned is
> > + * important from memory allocation perspective, because each tiling has
> > + * specific memory constraints.
>
> I'd move the comment on Tile64 to the description body and integrate it
> with the last sentence. You could say that each tiling has constrains
> dependent on bpp and mention a different pixel order for Tile64 as an
> example.
I've added some note about Tile64 to commit message to explain why
we need to pass bpp either.
Thanks for the review.
>
> Apart from that, it's looking good to me:
>
> Reviewed-by: Karolina Stolarek <karolina.stolarek at intel.com>
R-b taken.
--
Zbigniew
>
> > + *
> > + * Returns:
> > + * height (rows) expected for specific tiling
> > + */
> > +uint32_t blt_get_aligned_height(uint32_t height, uint32_t bpp,
> > + enum blt_tiling_type tiling)
> > +{
> > + switch (tiling) {
> > + case T_LINEAR:
> > + return height;
> > + case T_XMAJOR:
> > + return ALIGN(height, 8);
> > + case T_TILE64:
> > + if (bpp == 8)
> > + return ALIGN(height, 256);
> > + else if (bpp == 16 || bpp == 32)
> > + return ALIGN(height, 128);
> > + return ALIGN(height, 64);
> > + default:
> > + return ALIGN(height, 32);
> > + }
> > +}
> > +
> > static int __special_mode(const struct blt_copy_data *blt)
> > {
> > if (blt->src.handle == blt->dst.handle &&
> > diff --git a/lib/intel_blt.h b/lib/intel_blt.h
> > index d9be22fdf4..e3084dc0cd 100644
> > --- a/lib/intel_blt.h
> > +++ b/lib/intel_blt.h
> > @@ -212,6 +212,10 @@ bool blt_block_copy_supports_compression(int fd);
> > bool blt_uses_extended_block_copy(int fd);
> > const char *blt_tiling_name(enum blt_tiling_type tiling);
> > +uint32_t blt_get_min_stride(uint32_t width, uint32_t bpp,
> > + enum blt_tiling_type tiling);
> > +uint32_t blt_get_aligned_height(uint32_t height, uint32_t bpp,
> > + enum blt_tiling_type tiling);
> > void blt_copy_init(int fd, struct blt_copy_data *blt);
More information about the igt-dev
mailing list