From 2e6cf74e6377d79a684e316e9e20f6bac4dd75e2 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 22 Apr 2021 19:14:47 -0400 Subject: [PATCH] panfrost: Fix formats converting uninit from AFBC If no slices were valid (the resource is uninitialized), we were reading a bogus PIPE_FORMAT_NONE format from the blit.dst.format. Fix this -- and guard against scope similar issues -- by hoisting the blit assignments out of the loop so they're valid. Fixes: 9d0ad7fd2e1 ("panfrost: Patch the gallium driver to use pan_image_layout_init()") Signed-off-by: Alyssa Rosenzweig Part-of: (cherry picked from commit c220976fd077c09bbc485ff9a29091895bd39fdf) --- .pick_status.json | 2 +- src/gallium/drivers/panfrost/pan_resource.c | 33 ++++++++++----------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 2f37b9d08d5..35355c92af6 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -220,7 +220,7 @@ "description": "panfrost: Fix formats converting uninit from AFBC", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "9d0ad7fd2e1c56a1771e253086a5d4862d54e358" }, diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index 960a7816a45..c189eec2686 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -999,8 +999,7 @@ pan_resource_modifier_convert(struct panfrost_context *ctx, panfrost_resource_create_with_modifier( ctx->base.screen, &rsrc->base, modifier); struct panfrost_resource *tmp_rsrc = pan_resource(tmp_prsrc); - - struct pipe_blit_info blit = {0}; + enum pipe_format blit_fmt = pan_blit_format(tmp_rsrc->base.format); unsigned depth = rsrc->base.target == PIPE_TEXTURE_3D ? rsrc->base.depth0 : rsrc->base.array_size; @@ -1008,22 +1007,22 @@ pan_resource_modifier_convert(struct panfrost_context *ctx, struct pipe_box box = { 0, 0, 0, rsrc->base.width0, rsrc->base.height0, depth }; + struct pipe_blit_info blit = { + .dst.resource = &tmp_rsrc->base, + .dst.format = blit_fmt, + .dst.box = box, + .src.resource = &rsrc->base, + .src.format = pan_blit_format(rsrc->base.format), + .src.box = box, + .mask = util_format_get_mask(blit_fmt), + .filter = PIPE_TEX_FILTER_NEAREST + }; + for (int i = 0; i <= rsrc->base.last_level; i++) { - if (!rsrc->state.slices[i].data_valid) - continue; - - blit.dst.resource = &tmp_rsrc->base; - blit.dst.format = pan_blit_format(tmp_rsrc->base.format); - blit.dst.level = i; - blit.dst.box = box; - blit.src.resource = &rsrc->base; - blit.src.format = pan_blit_format(rsrc->base.format); - blit.src.level = i; - blit.src.box = box; - blit.mask = util_format_get_mask(blit.dst.format); - blit.filter = PIPE_TEX_FILTER_NEAREST; - - panfrost_blit(&ctx->base, &blit); + if (rsrc->state.slices[i].data_valid) { + blit.dst.level = blit.src.level = i; + panfrost_blit(&ctx->base, &blit); + } } panfrost_bo_unreference(rsrc->image.data.bo);