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; };