From f8f0f1c5cb51511083c0d7bf48a0f079a4d71c8e Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Fri, 18 Nov 2022 18:23:37 +0100 Subject: [PATCH] etnaviv: optimize render resource update Now that we track the age at the resource level we can optimize the render surface update by only copying the single level we are going to render to. Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner Part-of: --- src/gallium/drivers/etnaviv/etnaviv_state.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.c b/src/gallium/drivers/etnaviv/etnaviv_state.c index 02e4eb5..3f06808 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_state.c +++ b/src/gallium/drivers/etnaviv/etnaviv_state.c @@ -110,18 +110,23 @@ etna_set_constant_buffer(struct pipe_context *pctx, } static void -etna_update_render_resource(struct pipe_context *pctx, struct etna_resource *base) +etna_update_render_surface(struct pipe_context *pctx, struct etna_surface *surf) { + struct etna_resource *base = etna_resource(surf->prsc); struct etna_resource *to = base, *from = base; + unsigned level = surf->base.u.tex.level; - if (base->texture && etna_resource_newer(etna_resource(base->texture), base)) + if (base->texture && + etna_resource_level_newer(&etna_resource(base->texture)->levels[level], + surf->level)) from = etna_resource(base->texture); if (base->render) to = etna_resource(base->render); - if ((to != from) && etna_resource_older(to, from)) - etna_copy_resource(pctx, &to->base, &from->base, 0, base->base.last_level); + if ((to != from) && + etna_resource_level_older(&to->levels[level], &from->levels[level])) + etna_copy_resource(pctx, &to->base, &from->base, level, level); } static void @@ -149,7 +154,7 @@ etna_set_framebuffer_state(struct pipe_context *pctx, assert((res->layout & ETNA_LAYOUT_BIT_TILE) || VIV_FEATURE(screen, chipMinorFeatures2, LINEAR_PE)); - etna_update_render_resource(pctx, etna_resource(cbuf->prsc)); + etna_update_render_surface(pctx, cbuf); if (res->layout == ETNA_LAYOUT_LINEAR) target_linear = true; @@ -251,7 +256,7 @@ etna_set_framebuffer_state(struct pipe_context *pctx, struct etna_surface *zsbuf = etna_surface(fb->zsbuf); struct etna_resource *res = etna_resource(zsbuf->base.texture); - etna_update_render_resource(pctx, etna_resource(zsbuf->prsc)); + etna_update_render_surface(pctx, zsbuf); assert(res->layout &ETNA_LAYOUT_BIT_TILE); /* Cannot render to linear surfaces */ -- 2.7.4