ac/surface: fix epitch when modifying surf_pitch
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Wed, 3 Jun 2020 16:20:15 +0000 (18:20 +0200)
committerMarge Bot <eric+marge@anholt.net>
Wed, 10 Jun 2020 09:11:23 +0000 (09:11 +0000)
This is needed otherwise it can cause bad rendering of UYVY files.
The align(..., 256 / surf->bpe) constraint comes from addrlib.

Fixes: 69aadc49331 ("radeonsi: fix surf_pitch for subsampled surface")
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5314>

src/amd/common/ac_surface.c

index 54bf476a2134fa5a5c8aa4edb40810ff89bfbcae..d316216fd88a60820a17d79ac247131e2b1da149 100644 (file)
@@ -1163,10 +1163,14 @@ static int gfx9_compute_miptree(ADDR_HANDLE addrlib,
 
        surf->u.gfx9.surf_slice_size = out.sliceSize;
        surf->u.gfx9.surf_pitch = out.pitch;
-       if (!compressed && surf->blk_w > 1 && out.pitch == out.pixelPitch) {
+       if (!compressed && surf->blk_w > 1 && out.pitch == out.pixelPitch &&
+           surf->u.gfx9.surf.swizzle_mode == ADDR_SW_LINEAR) {
                /* Adjust surf_pitch to be in elements units,
                 * not in pixels */
-               surf->u.gfx9.surf_pitch /= surf->blk_w;
+               surf->u.gfx9.surf_pitch =
+                       align(surf->u.gfx9.surf_pitch / surf->blk_w, 256 / surf->bpe);
+               surf->u.gfx9.surf.epitch = MAX2(surf->u.gfx9.surf.epitch,
+                                               surf->u.gfx9.surf_pitch * surf->blk_w - 1);
        }
        surf->u.gfx9.surf_height = out.height;
        surf->surf_size = out.surfSize;