freedreno: allow fence_fd fences to be recycled
authorRob Clark <robdclark@chromium.org>
Tue, 4 Aug 2020 21:24:44 +0000 (14:24 -0700)
committerMarge Bot <eric+marge@anholt.net>
Wed, 5 Aug 2020 19:05:29 +0000 (19:05 +0000)
This allows us to avoid a no-op flush if there has been no rendering,
but we hit pctx->flush(PIPE_FLUSH_FENCE_FD).

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6177>

src/gallium/drivers/freedreno/freedreno_context.c
src/gallium/drivers/freedreno/freedreno_fence.c
src/gallium/drivers/freedreno/freedreno_fence.h

index a69a194379bbcd810804d68829baf92f4c69d29f..4ebb279bc3b80487edebc1dcfec4dea1ccac14a4 100644 (file)
@@ -60,7 +60,8 @@ fd_context_flush(struct pipe_context *pctx, struct pipe_fence_handle **fencep,
         * not an "fd" fence, which results in eglDupNativeFenceFDANDROID()
         * errors.
         */
-       if (flags & PIPE_FLUSH_FENCE_FD)
+       if ((flags & PIPE_FLUSH_FENCE_FD) && ctx->last_fence &&
+                       !fd_fence_is_fd(ctx->last_fence))
                fd_fence_ref(&ctx->last_fence, NULL);
 
        /* if no rendering since last flush, ie. app just decided it needed
index 59ea1896f45e6f384d9d9e288d573f076db5f808..3477d9835c5757a0a6e609f7464597abe722f47e 100644 (file)
@@ -150,6 +150,11 @@ int fd_fence_get_fd(struct pipe_screen *pscreen,
        return os_dupfd_cloexec(fence->fence_fd);
 }
 
+bool fd_fence_is_fd(struct pipe_fence_handle *fence)
+{
+       return fence->fence_fd != -1;
+}
+
 struct pipe_fence_handle * fd_fence_create(struct fd_batch *batch)
 {
        return fence_create(batch->ctx, batch, 0, -1);
index f0bc21bc890bc47556410c2c12ce329851ae597d..efb9aaee166a56a2c8439a13aa777fd8a885aac8 100644 (file)
@@ -44,6 +44,7 @@ void fd_fence_server_sync(struct pipe_context *pctx,
                struct pipe_fence_handle *fence);
 int fd_fence_get_fd(struct pipe_screen *pscreen,
                struct pipe_fence_handle *pfence);
+bool fd_fence_is_fd(struct pipe_fence_handle *fence);
 
 struct fd_batch;
 struct pipe_fence_handle * fd_fence_create(struct fd_batch *batch);