panfrost_attach_vt_xxx() functions are now passed a batch, and the generated FB desc is kept in panfrost_batch so we can switch FBs without forcing a flush. The postfix->framebuffer field is restored on the next attach_vt_framebuffer() call if the batch already has an FB desc.
Signed-off-by: Boris Brezillon <boris.brezil...@collabora.com> --- src/gallium/drivers/panfrost/pan_context.c | 17 +++++++++-------- src/gallium/drivers/panfrost/pan_job.h | 3 +++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index c56f404cd9e9..3e0a3e9df992 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -164,18 +164,16 @@ panfrost_clear( } static mali_ptr -panfrost_attach_vt_mfbd(struct panfrost_context *ctx) +panfrost_attach_vt_mfbd(struct panfrost_batch *batch) { - struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx); struct bifrost_framebuffer mfbd = panfrost_emit_mfbd(batch, ~0); return panfrost_upload_transient(batch, &mfbd, sizeof(mfbd)) | MALI_MFBD; } static mali_ptr -panfrost_attach_vt_sfbd(struct panfrost_context *ctx) +panfrost_attach_vt_sfbd(struct panfrost_batch *batch) { - struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx); struct mali_single_framebuffer sfbd = panfrost_emit_sfbd(batch, ~0); return panfrost_upload_transient(batch, &sfbd, sizeof(sfbd)) | MALI_SFBD; @@ -192,12 +190,15 @@ panfrost_attach_vt_framebuffer(struct panfrost_context *ctx) } struct panfrost_screen *screen = pan_screen(ctx->base.screen); - mali_ptr framebuffer = screen->require_sfbd ? - panfrost_attach_vt_sfbd(ctx) : - panfrost_attach_vt_mfbd(ctx); + struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx); + + if (!batch->framebuffer) + batch->framebuffer = screen->require_sfbd ? + panfrost_attach_vt_sfbd(batch) : + panfrost_attach_vt_mfbd(batch); for (unsigned i = 0; i < PIPE_SHADER_TYPES; ++i) - ctx->payloads[i].postfix.framebuffer = framebuffer; + ctx->payloads[i].postfix.framebuffer = batch->framebuffer; } /* Reset per-frame context, called on context initialisation as well as after diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h index ea832f2c3efe..48d483c9a724 100644 --- a/src/gallium/drivers/panfrost/pan_job.h +++ b/src/gallium/drivers/panfrost/pan_job.h @@ -115,6 +115,9 @@ struct panfrost_batch { /* Polygon list bound to the batch, or NULL if none bound yet */ struct panfrost_bo *polygon_list; + + /* Framebuffer descriptor. */ + mali_ptr framebuffer; }; /* Functions for managing the above */ -- 2.21.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev