From ede41372f4ad0d8640fbd58ffa404ef65deb131b Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Fri, 13 Jun 2025 23:05:28 +0200 Subject: [PATCH] etnaviv: use most recent shadow of resources as blit source/target The frontend does not know that etnaviv may keep multiple shadows around for a resource, so it will always pass in the base resource as blit source and destination. For those blits to work as expected by the API we need to work out which shadow is the most recent one and use those as blit source and destination resources. CC: mesa-stable Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner Part-of: --- .../drivers/etnaviv/etnaviv_clear_blit.c | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c index 55e458c45f0..1acf9a0b329 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c +++ b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c @@ -104,10 +104,32 @@ etna_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info) { struct etna_context *ctx = etna_context(pctx); struct pipe_blit_info info = *blit_info; + struct etna_resource *src = etna_resource(info.src.resource); + struct etna_resource *dst = etna_resource(info.dst.resource); if (info.render_condition_enable && !etna_render_condition_check(pctx)) return; + /* blit from most recent shadow of the source */ + if (src->render && + etna_resource_level_newer(&etna_resource(src->render)->levels[info.src.level], + &etna_resource(info.src.resource)->levels[info.src.level])) + info.src.resource = src->render; + if (src->texture && + etna_resource_level_newer(&etna_resource(src->texture)->levels[info.src.level], + &etna_resource(info.src.resource)->levels[info.src.level])) + info.src.resource = src->texture; + + /* blit to the most recent shadow of the destination */ + if (dst->render && + etna_resource_level_newer(&etna_resource(dst->render)->levels[info.dst.level], + &etna_resource(info.dst.resource)->levels[info.dst.level])) + info.dst.resource = dst->render; + if (dst->texture && + etna_resource_level_newer(&etna_resource(dst->texture)->levels[info.dst.level], + &etna_resource(info.dst.resource)->levels[info.dst.level])) + info.dst.resource = dst->texture; + if (ctx->blit(pctx, &info)) goto success;