From d3a5306b91565f04f86f1aa2c40cde58939a0bd9 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Tue, 28 Nov 2023 15:13:13 +0100 Subject: [PATCH] etnaviv: blt: Extend to support MRTs Signed-off-by: Christian Gmeiner Reviewed-by: Lucas Stach Part-of: --- src/gallium/drivers/etnaviv/etnaviv_blt.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_blt.c b/src/gallium/drivers/etnaviv/etnaviv_blt.c index e2f85d132f8..049785525ed 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_blt.c +++ b/src/gallium/drivers/etnaviv/etnaviv_blt.c @@ -212,10 +212,11 @@ emit_blt_inplace(struct etna_cmd_stream *stream, const struct blt_inplace_op *op } static void -etna_blit_clear_color_blt(struct pipe_context *pctx, struct pipe_surface *dst, +etna_blit_clear_color_blt(struct pipe_context *pctx, unsigned idx, const union pipe_color_union *color) { struct etna_context *ctx = etna_context(pctx); + struct pipe_surface *dst = ctx->framebuffer_s.cbufs[idx]; struct etna_surface *surf = etna_surface(dst); uint64_t new_clear_value = etna_clear_blit_pack_rgba(surf->base.format, color); int msaa_xscale = 1, msaa_yscale = 1; @@ -256,8 +257,13 @@ etna_blit_clear_color_blt(struct pipe_context *pctx, struct pipe_surface *dst, /* This made the TS valid */ if (surf->level->ts_size) { - ctx->framebuffer.TS_COLOR_CLEAR_VALUE = new_clear_value; - ctx->framebuffer.TS_COLOR_CLEAR_VALUE_EXT = new_clear_value >> 32; + if (idx == 0) { + ctx->framebuffer.TS_COLOR_CLEAR_VALUE = new_clear_value; + ctx->framebuffer.TS_COLOR_CLEAR_VALUE_EXT = new_clear_value >> 32; + } else { + ctx->framebuffer.RT_TS_COLOR_CLEAR_VALUE[idx - 1] = new_clear_value; + ctx->framebuffer.RT_TS_COLOR_CLEAR_VALUE_EXT[idx - 1] = new_clear_value >> 32; + } /* update clear color in SW meta area of the buffer if TS is exported */ if (unlikely(new_clear_value != surf->level->clear_value && @@ -370,8 +376,10 @@ etna_clear_blt(struct pipe_context *pctx, unsigned buffers, const struct pipe_sc for (int idx = 0; idx < ctx->framebuffer_s.nr_cbufs; ++idx) { struct etna_surface *surf = etna_surface(ctx->framebuffer_s.cbufs[idx]); - etna_blit_clear_color_blt(pctx, ctx->framebuffer_s.cbufs[idx], - color); + if (!surf) + continue; + + etna_blit_clear_color_blt(pctx, idx, color); if (!etna_resource(surf->prsc)->explicit_flush) etna_context_add_flush_resource(ctx, surf->prsc);