From 807bfa6be8915b44032d77c8ea74fe3ca9a658dc Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sat, 17 Apr 2021 11:15:50 -0700 Subject: [PATCH] freedreno/batch: Don't create fences for every batch We only need fences for batches flushed via pctx->flush(). This will serve as a useful signal about submits that can be merged. v2. disable this optimization pre-a6xx until I can debug issues that submit merging exposes Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/freedreno_batch.c | 15 ++++++++++++--- src/gallium/drivers/freedreno/freedreno_context.c | 2 ++ src/gallium/drivers/freedreno/freedreno_gmem.c | 5 +++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/freedreno/freedreno_batch.c b/src/gallium/drivers/freedreno/freedreno_batch.c index 55631d0dfbf..a82b7df6d0b 100644 --- a/src/gallium/drivers/freedreno/freedreno_batch.c +++ b/src/gallium/drivers/freedreno/freedreno_batch.c @@ -77,7 +77,14 @@ batch_init(struct fd_batch *batch) } batch->in_fence_fd = -1; - batch->fence = fd_fence_create(batch); + batch->fence = NULL; + + /* Work around problems on earlier gens with submit merging, etc, + * by always creating a fence to request that the submit is flushed + * immediately: + */ + if (ctx->screen->gpu_id < 600) + batch->fence = fd_fence_create(batch); batch->cleared = 0; batch->fast_cleared = 0; @@ -197,7 +204,8 @@ batch_fini(struct fd_batch *batch) close(batch->in_fence_fd); /* in case batch wasn't flushed but fence was created: */ - fd_fence_populate(batch->fence, 0, -1); + if (batch->fence) + fd_fence_populate(batch->fence, 0, -1); fd_fence_ref(&batch->fence, NULL); @@ -362,7 +370,8 @@ batch_flush(struct fd_batch *batch) assert_dt if (batch == batch->ctx->batch) fd_batch_reference(&batch->ctx->batch, NULL); - fd_fence_ref(&batch->ctx->last_fence, batch->fence); + if (batch->fence) + fd_fence_ref(&batch->ctx->last_fence, batch->fence); fd_gmem_render_tiles(batch); batch_reset_resources(batch); diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c index 5c94918412a..1ce2a1148bc 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.c +++ b/src/gallium/drivers/freedreno/freedreno_context.c @@ -88,6 +88,8 @@ fd_context_flush(struct pipe_context *pctx, struct pipe_fence_handle **fencep, * be waiting for */ flags &= ~PIPE_FLUSH_DEFERRED; + } else if (!batch->fence) { + batch->fence = fd_fence_create(batch); } /* In some sequence of events, we can end up with a last_fence that is diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c index 6bc77697766..7df72ab41b0 100644 --- a/src/gallium/drivers/freedreno/freedreno_gmem.c +++ b/src/gallium/drivers/freedreno/freedreno_gmem.c @@ -662,9 +662,10 @@ flush_ring(struct fd_batch *batch) fd_submit_flush(batch->submit, batch->in_fence_fd, batch->needs_out_fence_fd ? &out_fence_fd : NULL, - ×tamp); + batch->fence ? ×tamp : NULL); - fd_fence_populate(batch->fence, timestamp, out_fence_fd); + if (batch->fence) + fd_fence_populate(batch->fence, timestamp, out_fence_fd); } void