[3/9] panfrost: Delay FB descriptor allocation

Submitted by Boris Brezillon on Aug. 2, 2019, 10:12 a.m.

Details

Message ID 20190802101257.10495-4-boris.brezillon@collabora.com
State Accepted
Commit 17d6ee2bd14fa81c33b4024e0a18fb8cf1f0ce25
Headers show
Series "panfrost: Allocate the polygon lists on-demand" ( rev: 1 ) in Mesa

Commit Message

Boris Brezillon Aug. 2, 2019, 10:12 a.m.
No need to emit SFBD/MFBD at frame invalidation. They can be emitted
when the framebuffer is attached, which saves us a potential FB desc
re-allocation if a new FB is bound after the swap.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
---
 src/gallium/drivers/panfrost/pan_context.c | 21 ++++++---------------
 src/gallium/drivers/panfrost/pan_context.h |  3 ---
 2 files changed, 6 insertions(+), 18 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index 014f8f6a9d07..b63023a16cda 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -189,13 +189,17 @@  panfrost_clear(
 static mali_ptr
 panfrost_attach_vt_mfbd(struct panfrost_context *ctx)
 {
-        return panfrost_upload_transient(ctx, &ctx->vt_framebuffer_mfbd, sizeof(ctx->vt_framebuffer_mfbd)) | MALI_MFBD;
+        struct bifrost_framebuffer mfbd = panfrost_emit_mfbd(ctx, ~0);
+
+        return panfrost_upload_transient(ctx, &mfbd, sizeof(mfbd)) | MALI_MFBD;
 }
 
 static mali_ptr
 panfrost_attach_vt_sfbd(struct panfrost_context *ctx)
 {
-        return panfrost_upload_transient(ctx, &ctx->vt_framebuffer_sfbd, sizeof(ctx->vt_framebuffer_sfbd)) | MALI_SFBD;
+        struct mali_single_framebuffer sfbd = panfrost_emit_sfbd(ctx, ~0);
+
+        return panfrost_upload_transient(ctx, &sfbd, sizeof(sfbd)) | MALI_SFBD;
 }
 
 static void
@@ -223,13 +227,6 @@  panfrost_attach_vt_framebuffer(struct panfrost_context *ctx, bool skippable)
 static void
 panfrost_invalidate_frame(struct panfrost_context *ctx)
 {
-        struct panfrost_screen *screen = pan_screen(ctx->base.screen);
-
-        if (screen->require_sfbd)
-                ctx->vt_framebuffer_sfbd = panfrost_emit_sfbd(ctx, ~0);
-        else
-                ctx->vt_framebuffer_mfbd = panfrost_emit_mfbd(ctx, ~0);
-
         for (unsigned i = 0; i < PIPE_SHADER_TYPES; ++i)
                 ctx->payloads[i].postfix.framebuffer = 0;
 
@@ -2378,12 +2375,6 @@  panfrost_set_framebuffer_state(struct pipe_context *pctx,
         struct panfrost_screen *screen = pan_screen(ctx->base.screen);
 
         panfrost_hint_afbc(screen, &ctx->pipe_framebuffer);
-
-        if (screen->require_sfbd)
-                ctx->vt_framebuffer_sfbd = panfrost_emit_sfbd(ctx, ~0);
-        else
-                ctx->vt_framebuffer_mfbd = panfrost_emit_mfbd(ctx, ~0);
-
         panfrost_attach_vt_framebuffer(ctx, false);
 }
 
diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index a90dbb04e833..ac4b21678e65 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -137,9 +137,6 @@  struct panfrost_context {
 
         union mali_attr attributes[PIPE_MAX_ATTRIBS];
 
-        struct mali_single_framebuffer vt_framebuffer_sfbd;
-        struct bifrost_framebuffer vt_framebuffer_mfbd;
-
         /* TODO: Multiple uniform buffers (index =/= 0), finer updates? */
 
         struct panfrost_constant_buffer constant_buffer[PIPE_SHADER_TYPES];

Comments