From: Pierre-Eric Pelloux-Prayer Date: Thu, 9 Jul 2020 12:10:51 +0000 (+0200) Subject: ac/surface: adapt surf_size when modifying surf_pitch X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=87ecfdfbf0a8448d1475e6da15175e68bdeb933b;p=mesa.git ac/surface: adapt surf_size when modifying surf_pitch Otherwise we might get VM_L2_PROTECTION_FAULT_STATUS errors. Fixes: 8275dc1ed57 ("ac/surface: fix epitch when modifying surf_pitch") Reviewed-by: Bas Nieuwenhuizen Reviewed-by: Marek Olšák Part-of: --- diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c index 41fb152d5a9..461fd503622 100644 --- a/src/amd/common/ac_surface.c +++ b/src/amd/common/ac_surface.c @@ -1464,18 +1464,27 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, surf->u.gfx9.surf_slice_size = out.sliceSize; surf->u.gfx9.surf_pitch = out.pitch; + surf->u.gfx9.surf_height = out.height; + surf->surf_size = out.surfSize; + surf->surf_alignment = out.baseAlign; + 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 */ + /* Adjust surf_pitch to be in elements units not in pixels */ 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); + /* The surface is really a surf->bpe bytes per pixel surface even if we + * use it as a surf->bpe bytes per element one. + * Adjust surf_slice_size and surf_size to reflect the change + * made to surf_pitch. + */ + surf->u.gfx9.surf_slice_size = MAX2( + surf->u.gfx9.surf_slice_size, + surf->u.gfx9.surf_pitch * out.height * surf->bpe * surf->blk_w); + surf->surf_size = surf->u.gfx9.surf_slice_size * in->numSlices; } - surf->u.gfx9.surf_height = out.height; - surf->surf_size = out.surfSize; - surf->surf_alignment = out.baseAlign; if (in->swizzleMode == ADDR_SW_LINEAR) { for (unsigned i = 0; i < in->numMipLevels; i++) {