summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>2020-07-09 14:10:51 +0200
committerEric Engestrom <eric@engestrom.ch>2020-07-22 22:30:04 +0200
commit2d64914d00ec2bd497f26a4a59968739c736b560 (patch)
treedf6629b37753d7f8de5585aefa2da4560eda0045 /src
parent6fc1bc19acf93a46c0a5f0839e19ad63dd2fb446 (diff)
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 <bas@basnieuwenhuizen.nl> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5841> (cherry picked from commit 87ecfdfbf0a8448d1475e6da15175e68bdeb933b)
Diffstat (limited to 'src')
-rw-r--r--src/amd/common/ac_surface.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c
index 252e703d377..6336163f623 100644
--- a/src/amd/common/ac_surface.c
+++ b/src/amd/common/ac_surface.c
@@ -1307,18 +1307,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++) {