From 88f36760195ff5879762991329005799b874f125 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Fri, 24 Mar 2023 14:07:39 -0700 Subject: [PATCH] freedreno: Optimize repeated finishes Sometimes apps (glances at stk) spin on a syncobj with very short timeouts. But ensuring the fence is flushed all the way through to the kernel (including handling TC unflushed fences) only needs to be done once. Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/freedreno_fence.c | 15 ++++++--------- src/gallium/drivers/freedreno/freedreno_fence.h | 1 + 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/freedreno/freedreno_fence.c b/src/gallium/drivers/freedreno/freedreno_fence.c index da592de2b3f..552f42a3def 100644 --- a/src/gallium/drivers/freedreno/freedreno_fence.c +++ b/src/gallium/drivers/freedreno/freedreno_fence.c @@ -42,6 +42,9 @@ fence_flush(struct pipe_context *pctx, struct pipe_fence_handle *fence, */ in_dt { + if (fence->flushed) + return true; + MESA_TRACE_FUNC(); if (!util_queue_fence_is_signalled(&fence->ready)) { @@ -61,24 +64,18 @@ fence_flush(struct pipe_context *pctx, struct pipe_fence_handle *fence, } } - if (fence->fence) - fd_fence_flush(fence->fence); - - /* We've already waited for batch to be flushed and fence->batch - * to be cleared: - */ - assert(!fence->batch); - return true; + goto out; } if (fence->batch) fd_batch_flush(fence->batch); +out: if (fence->fence) fd_fence_flush(fence->fence); assert(!fence->batch); - + fence->flushed = true; return true; } diff --git a/src/gallium/drivers/freedreno/freedreno_fence.h b/src/gallium/drivers/freedreno/freedreno_fence.h index 29d35eb6fd3..30d568ac82c 100644 --- a/src/gallium/drivers/freedreno/freedreno_fence.h +++ b/src/gallium/drivers/freedreno/freedreno_fence.h @@ -79,6 +79,7 @@ struct pipe_fence_handle { struct fd_fence *fence; bool use_fence_fd; + bool flushed; uint32_t syncobj; };