From 2fc91a16abe0e517dfb46517dc4795857f0a9343 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Thu, 5 Sep 2019 19:14:25 +0200 Subject: [PATCH] panfrost: Move the fence creation in panfrost_flush() panfrost_flush() is about to be reworked to flush all pending batches, but we want the fence to block on the last one. Let's move the fence creation logic in panfrost_flush() to prepare for this situation. Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig --- src/gallium/drivers/panfrost/pan_context.c | 13 +++++++++---- src/gallium/drivers/panfrost/pan_context.h | 3 +++ src/gallium/drivers/panfrost/pan_drm.c | 11 ++--------- src/gallium/drivers/panfrost/pan_screen.h | 3 +-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index de11dae0fc2..ed4bf6dca82 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -1316,7 +1316,6 @@ panfrost_queue_draw(struct panfrost_context *ctx) static void panfrost_submit_frame(struct panfrost_context *ctx, bool flush_immediate, - struct pipe_fence_handle **fence, struct panfrost_batch *batch) { panfrost_batch_submit(batch); @@ -1324,14 +1323,14 @@ panfrost_submit_frame(struct panfrost_context *ctx, bool flush_immediate, /* If visual, we can stall a frame */ if (!flush_immediate) - panfrost_drm_force_flush_fragment(ctx, fence); + panfrost_drm_force_flush_fragment(ctx); ctx->last_fragment_flushed = false; ctx->last_batch = batch; /* If readback, flush now (hurts the pipelined performance) */ if (flush_immediate) - panfrost_drm_force_flush_fragment(ctx, fence); + panfrost_drm_force_flush_fragment(ctx); } static void @@ -1460,7 +1459,13 @@ panfrost_flush( bool flush_immediate = /*flags & PIPE_FLUSH_END_OF_FRAME*/true; /* Submit the frame itself */ - panfrost_submit_frame(ctx, flush_immediate, fence, batch); + panfrost_submit_frame(ctx, flush_immediate, batch); + + if (fence) { + struct panfrost_fence *f = panfrost_fence_create(ctx); + pipe->screen->fence_reference(pipe->screen, fence, NULL); + *fence = (struct pipe_fence_handle *)f; + } /* Prepare for the next frame */ panfrost_invalidate_frame(ctx); diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h index 8400b7541e9..e60f737360d 100644 --- a/src/gallium/drivers/panfrost/pan_context.h +++ b/src/gallium/drivers/panfrost/pan_context.h @@ -297,6 +297,9 @@ pan_context(struct pipe_context *pcontext) return (struct panfrost_context *) pcontext; } +struct panfrost_fence * +panfrost_fence_create(struct panfrost_context *ctx); + struct pipe_context * panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags); diff --git a/src/gallium/drivers/panfrost/pan_drm.c b/src/gallium/drivers/panfrost/pan_drm.c index 81f922abd1c..f6ab9339057 100644 --- a/src/gallium/drivers/panfrost/pan_drm.c +++ b/src/gallium/drivers/panfrost/pan_drm.c @@ -294,7 +294,7 @@ panfrost_drm_submit_vs_fs_batch(struct panfrost_batch *batch, bool has_draws) return ret; } -static struct panfrost_fence * +struct panfrost_fence * panfrost_fence_create(struct panfrost_context *ctx) { struct pipe_context *gallium = (struct pipe_context *) ctx; @@ -321,8 +321,7 @@ panfrost_fence_create(struct panfrost_context *ctx) } void -panfrost_drm_force_flush_fragment(struct panfrost_context *ctx, - struct pipe_fence_handle **fence) +panfrost_drm_force_flush_fragment(struct panfrost_context *ctx) { struct pipe_context *gallium = (struct pipe_context *) ctx; struct panfrost_screen *screen = pan_screen(gallium->screen); @@ -334,12 +333,6 @@ panfrost_drm_force_flush_fragment(struct panfrost_context *ctx, /* The job finished up, so we're safe to clean it up now */ panfrost_free_batch(ctx->last_batch); } - - if (fence) { - struct panfrost_fence *f = panfrost_fence_create(ctx); - gallium->screen->fence_reference(gallium->screen, fence, NULL); - *fence = (struct pipe_fence_handle *)f; - } } unsigned diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h index 96044b8c8b9..d20f150e3be 100644 --- a/src/gallium/drivers/panfrost/pan_screen.h +++ b/src/gallium/drivers/panfrost/pan_screen.h @@ -134,8 +134,7 @@ panfrost_drm_export_bo(struct panfrost_screen *screen, const struct panfrost_bo int panfrost_drm_submit_vs_fs_batch(struct panfrost_batch *batch, bool has_draws); void -panfrost_drm_force_flush_fragment(struct panfrost_context *ctx, - struct pipe_fence_handle **fence); +panfrost_drm_force_flush_fragment(struct panfrost_context *ctx); unsigned panfrost_drm_query_gpu_version(struct panfrost_screen *screen); int -- 2.30.2