From 50f8d8d0cddb91bdc2c9a273058389155c98ce40 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 9 Apr 2021 19:14:14 -0400 Subject: [PATCH] panfrost: Fix AFBC body_size for shared resources Accidental read-before-write due to incorrect statement ordering. I love SSA as much as anyone, but not everything is a parallel copy. Fixes faults in glamor in 21.0 when using GIMP on v5. Signed-off-by: Alyssa Rosenzweig Fixes: e8b997e1758 ("panfrost: Add AFBC slice.body_size and slice.{row,surface}_stride fields") Closes: #4389 Reviewed-by: Boris Brezillon Part-of: (cherry picked from commit 23b060bba787030542b681ab8f86916c319fd8fa) --- .pick_status.json | 2 +- src/gallium/drivers/panfrost/pan_mfbd.c | 1 + src/gallium/drivers/panfrost/pan_resource.c | 8 +++++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 45104da8f65..8811508beb3 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1426,7 +1426,7 @@ "description": "panfrost: Fix AFBC body_size for shared resources", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "e8b997e175827d8ee907b3813d1e5a05388c606a" }, diff --git a/src/gallium/drivers/panfrost/pan_mfbd.c b/src/gallium/drivers/panfrost/pan_mfbd.c index cbdb75a8015..3ed2e43017d 100644 --- a/src/gallium/drivers/panfrost/pan_mfbd.c +++ b/src/gallium/drivers/panfrost/pan_mfbd.c @@ -197,6 +197,7 @@ panfrost_mfbd_rt_set_buf(struct pipe_surface *surf, rt->afbc.chunk_size = 9; rt->midgard_afbc.sparse = true; rt->afbc.body_size = slice->afbc.body_size; + assert(rt->afbc.body_size > 0); } panfrost_get_afbc_pointers(rsrc, level, first_layer, diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index d9f61759f6f..9f230e813e1 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -144,14 +144,16 @@ panfrost_resource_from_handle(struct pipe_screen *pscreen, unsigned tile_h = panfrost_block_dim(whandle->modifier, false, 0); - rsc->layout.slices[0].afbc.body_size = - rsc->layout.slices[0].row_stride * - DIV_ROUND_UP(templat->height0, tile_h); rsc->layout.slices[0].afbc.header_size = panfrost_afbc_header_size(templat->width0, templat->height0); + rsc->layout.slices[0].afbc.row_stride = DIV_ROUND_UP(templat->width0, tile_w) * AFBC_HEADER_BYTES_PER_TILE; + + rsc->layout.slices[0].afbc.body_size = + rsc->layout.slices[0].row_stride * + DIV_ROUND_UP(templat->height0, tile_h); } if (dev->ro) {