aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorBoris Brezillon <[email protected]>2019-08-02 19:18:42 +0200
committerBoris Brezillon <[email protected]>2019-08-02 21:54:58 +0200
commit17d6ee2bd14fa81c33b4024e0a18fb8cf1f0ce25 (patch)
treeaa35a1d68c8d02427f8a7a0f55b5c125863ac55c /src/gallium
parentb5ca1e545843375560378cea19be8e50eb152de8 (diff)
panfrost: Delay FB descriptor allocation
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 <[email protected]> Reviewed-by: Alyssa Rosenzweig <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/panfrost/pan_context.c21
-rw-r--r--src/gallium/drivers/panfrost/pan_context.h3
2 files changed, 6 insertions, 18 deletions
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index ba2df2ce66a..a88e6a4607d 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;
@@ -2383,12 +2380,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 d930f12a537..d8dbd4d66f6 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -138,9 +138,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];