From ded82cf4bdd9a74eded2a9a95ab14e2c0d907c0a Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Tue, 15 Nov 2022 09:19:19 -0800 Subject: [PATCH] freedreno/a6xx: Remove unneeded MSAA clear fallback This was added in commit 911ce374caf ("freedreno/a6xx: Fix MSAA clear"), but the only case that can't handle fast-clear is sysmem blitter clear path. Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/a6xx/fd6_blitter.c | 5 +++++ src/gallium/drivers/freedreno/a6xx/fd6_draw.c | 10 +++++++--- src/gallium/drivers/freedreno/freedreno_screen.h | 1 + 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c index 6976e6c707f..010e43c150f 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c @@ -806,6 +806,11 @@ fd6_clear_surface(struct fd_context *ctx, struct fd_ringbuffer *ring, } uint32_t nr_samples = fd_resource_nr_samples(psurf->texture); + + /* TODO the trick of multiplying the dimensions for MSAA sysmem clears + * works for linear, but falls apart with tiled/ubwc. + */ + OUT_PKT4(ring, REG_A6XX_GRAS_2D_DST_TL, 2); OUT_RING(ring, A6XX_GRAS_2D_DST_TL_X(box2d->x * nr_samples) | A6XX_GRAS_2D_DST_TL_Y(box2d->y)); diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c index 3ce6e7d5e2c..3fffb2a88f8 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c @@ -475,9 +475,13 @@ fd6_clear(struct fd_context *ctx, unsigned buffers, const bool has_depth = pfb->zsbuf; unsigned color_buffers = buffers >> 2; - /* we need to do multisample clear on 3d pipe, so fallback to u_blitter: */ - if (pfb->samples > 1) - return false; + /* multisample clear does not work properly for sysmem: */ + if (pfb->samples > 1) { + /* layered rendering forces sysmem, so just bail now: */ + if (pfb->layers > 1) + return false; + ctx->batch->gmem_reason |= FD_GMEM_MSAA_CLEAR; + } /* If we're clearing after draws, fallback to 3D pipe clears. We could * use blitter clears in the draw batch but then we'd have to patch up the diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h index 0aa0e2357c4..c76b3d3d6b6 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.h +++ b/src/gallium/drivers/freedreno/freedreno_screen.h @@ -57,6 +57,7 @@ enum fd_gmem_reason { FD_GMEM_BLEND_ENABLED = BIT(3), FD_GMEM_LOGICOP_ENABLED = BIT(4), FD_GMEM_FB_READ = BIT(5), + FD_GMEM_MSAA_CLEAR = BIT(6), }; struct fd_screen {