From 7d43999e6365520a3c5b1e45a61b1590e4cb18a3 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 10 Jun 2019 08:04:10 -0700 Subject: [PATCH] panfrost: Enable AFBC on depth/stencil This seems to be a performance win, but more rigorous testing is necessary to figure out the exact circumstances when this is good/bad. Incidentally, this fixes non-aligned ZS. Signed-off-by: Alyssa Rosenzweig --- src/gallium/drivers/panfrost/pan_afbc.c | 4 +++- src/gallium/drivers/panfrost/pan_context.c | 11 +++++++---- src/gallium/drivers/panfrost/pan_resource.c | 6 ------ 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_afbc.c b/src/gallium/drivers/panfrost/pan_afbc.c index 83d93a1..0bb9d24 100644 --- a/src/gallium/drivers/panfrost/pan_afbc.c +++ b/src/gallium/drivers/panfrost/pan_afbc.c @@ -86,8 +86,10 @@ panfrost_format_supports_afbc(enum pipe_format format) if (util_format_is_rgba8_variant(desc)) return true; + if (format == PIPE_FORMAT_Z32_UNORM) + return true; + /* TODO: AFBC of other formats */ - /* TODO: AFBC of ZS */ return false; } diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 13bb4e1..e20e8e8 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -2118,9 +2118,9 @@ panfrost_set_framebuffer_state(struct pipe_context *pctx, struct panfrost_resource *tex = ((struct panfrost_resource *) ctx->pipe_framebuffer.cbufs[i]->texture); enum pipe_format format = ctx->pipe_framebuffer.cbufs[i]->format; - bool is_scanout = panfrost_is_scanout(ctx); bool can_afbc = panfrost_format_supports_afbc(format); + bool is_scanout = panfrost_is_scanout(ctx); if (!is_scanout && tex->bo->layout != PAN_AFBC && can_afbc) panfrost_enable_afbc(ctx, tex, false); @@ -2136,8 +2136,6 @@ panfrost_set_framebuffer_state(struct pipe_context *pctx, pipe_surface_reference(&ctx->pipe_framebuffer.zsbuf, zb); if (zb) { - /* FBO has depth */ - if (ctx->require_sfbd) ctx->vt_framebuffer_sfbd = panfrost_emit_sfbd(ctx); else @@ -2145,7 +2143,12 @@ panfrost_set_framebuffer_state(struct pipe_context *pctx, panfrost_attach_vt_framebuffer(ctx); - /* Keep the depth FBO linear */ + struct panfrost_resource *tex = pan_resource(zb->texture); + bool can_afbc = panfrost_format_supports_afbc(zb->format); + bool is_scanout = panfrost_is_scanout(ctx); + + if (!is_scanout && tex->bo->layout != PAN_AFBC && can_afbc) + panfrost_enable_afbc(ctx, tex, true); } } } diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index 0c45e25..bcde38a 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -251,12 +251,6 @@ panfrost_create_bo(struct panfrost_screen *screen, const struct pipe_resource *t /* Tiling textures is almost always faster, unless we only use it once */ bool should_tile = (template->usage != PIPE_USAGE_STREAM) && (template->bind & PIPE_BIND_SAMPLER_VIEW); - /* For unclear reasons, depth/stencil is faster linear than AFBC, so - * make sure it's linear */ - - if (template->bind & PIPE_BIND_DEPTH_STENCIL) - should_tile = false; - /* Set the layout appropriately */ bo->layout = should_tile ? PAN_TILED : PAN_LINEAR; -- 2.7.4