Mesa (master): zink: create framebuffer and renderpass objects just before vkCmdBeginRenderPass()

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Feb 24 02:08:19 UTC 2021


Module: Mesa
Branch: master
Commit: b37cba82718bcf2dd25d7b519ab4ca0e09f14ed8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b37cba82718bcf2dd25d7b519ab4ca0e09f14ed8

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Wed Sep 16 14:57:49 2020 -0400

zink: create framebuffer and renderpass objects just before vkCmdBeginRenderPass()

this lets us remove a flush and accumulate clears to perform in the renderpass

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9206>

---

 src/gallium/drivers/zink/zink_context.c | 34 ++++++++++++++++-----------------
 1 file changed, 16 insertions(+), 18 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index c9a33e54497..8d525f8f7dd 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -816,13 +816,26 @@ framebuffer_state_buffer_barriers_setup(struct zink_context *ctx,
    }
 }
 
+static void
+setup_framebuffer(struct zink_context *ctx)
+{
+   struct zink_screen *screen = zink_screen(ctx->base.screen);
+   struct zink_framebuffer *fb = create_framebuffer(ctx);
+
+   zink_framebuffer_reference(screen, &ctx->framebuffer, fb);
+   if (fb->rp != ctx->gfx_pipeline_state.render_pass)
+      ctx->gfx_pipeline_state.dirty = true;
+   ctx->gfx_pipeline_state.render_pass = fb->rp;
+}
+
 void
 zink_begin_render_pass(struct zink_context *ctx, struct zink_batch *batch)
 {
    struct zink_screen *screen = zink_screen(ctx->base.screen);
    assert(batch == zink_curr_batch(ctx));
-   assert(ctx->gfx_pipeline_state.render_pass);
 
+   setup_framebuffer(ctx);
+   assert(ctx->gfx_pipeline_state.render_pass);
    struct pipe_framebuffer_state *fb_state = &ctx->fb_state;
 
    VkRenderPassBeginInfo rpbi = {};
@@ -837,7 +850,6 @@ zink_begin_render_pass(struct zink_context *ctx, struct zink_batch *batch)
    rpbi.framebuffer = ctx->framebuffer->fb;
 
    assert(ctx->gfx_pipeline_state.render_pass && ctx->framebuffer);
-   assert(!batch->fb || batch->fb == ctx->framebuffer);
 
    framebuffer_state_buffer_barriers_setup(ctx, fb_state, batch);
 
@@ -903,20 +915,9 @@ zink_set_framebuffer_state(struct pipe_context *pctx,
                            const struct pipe_framebuffer_state *state)
 {
    struct zink_context *ctx = zink_context(pctx);
-   struct zink_screen *screen = zink_screen(pctx->screen);
 
    util_copy_framebuffer_state(&ctx->fb_state, state);
 
-   struct zink_framebuffer *fb = ctx->framebuffer;
-   /* explicitly unref previous fb to ensure it gets destroyed */
-   if (fb)
-      zink_framebuffer_reference(screen, &fb, NULL);
-   fb = create_framebuffer(ctx);
-   zink_framebuffer_reference(screen, &ctx->framebuffer, fb);
-   if (ctx->gfx_pipeline_state.render_pass != fb->rp)
-      ctx->gfx_pipeline_state.dirty = true;
-   ctx->gfx_pipeline_state.render_pass = fb->rp;
-
    uint8_t rast_samples = util_framebuffer_get_num_samples(state);
    /* in vulkan, gl_SampleMask needs to be explicitly ignored for sampleCount == 1 */
    if ((ctx->gfx_pipeline_state.rast_samples > 1) != (rast_samples > 1))
@@ -928,11 +929,8 @@ zink_set_framebuffer_state(struct pipe_context *pctx,
       ctx->gfx_pipeline_state.dirty = true;
    ctx->gfx_pipeline_state.num_attachments = state->nr_cbufs;
 
-   /* need to start a new renderpass */
-   if (zink_curr_batch(ctx)->in_rp)
-      flush_batch(ctx);
-
-   framebuffer_state_buffer_barriers_setup(ctx, &ctx->fb_state, zink_curr_batch(ctx));
+   /* need to ensure we start a new rp on next draw */
+   zink_batch_no_rp(ctx);
 }
 
 static void



More information about the mesa-commit mailing list