panfrost: Enable AFBC on depth/stencil
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 10 Jun 2019 15:04:10 +0000 (08:04 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 11 Jun 2019 15:46:43 +0000 (08:46 -0700)
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 <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/pan_afbc.c
src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pan_resource.c

index 83d93a1474260d6483804050b81e145a8241d3bc..0bb9d2491c66fadde6033ee32a803c0ce9fe5304 100644 (file)
@@ -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;
 }
index 13bb4e1e74a0fa4746c27e95cf35d69428493b37..e20e8e8d592326fe43a2f790fe8cc4f98e1ee2c5 100644 (file)
@@ -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);
                         }
                 }
         }
index 0c45e258b96a1eaa4ef9905e94ddcccdec961ea2..bcde38ae8b424b27c135f4eec9b6195d6bde75c2 100644 (file)
@@ -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;