From 49efef9d554a437efc7717b2903e1271a8b5ff59 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 27 Oct 2020 15:01:17 -0400 Subject: [PATCH] zink: add a pipe_context::fence_server_sync hook Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_context.c | 1 + src/gallium/drivers/zink/zink_fence.c | 16 ++++++++++++++++ src/gallium/drivers/zink/zink_fence.h | 3 +++ 3 files changed, 20 insertions(+) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index b425f8b59a6..b806e84b1ba 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -2340,6 +2340,7 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) ctx->base.draw_vbo = zink_draw_vbo; ctx->base.launch_grid = zink_launch_grid; + ctx->base.fence_server_sync = zink_fence_server_sync; ctx->base.flush = zink_flush; ctx->base.memory_barrier = zink_memory_barrier; ctx->base.texture_barrier = zink_texture_barrier; diff --git a/src/gallium/drivers/zink/zink_fence.c b/src/gallium/drivers/zink/zink_fence.c index ecdf6b8183e..46fe23648b8 100644 --- a/src/gallium/drivers/zink/zink_fence.c +++ b/src/gallium/drivers/zink/zink_fence.c @@ -158,6 +158,22 @@ fence_finish(struct pipe_screen *pscreen, struct pipe_context *pctx, timeout_ns); } +void +zink_fence_server_sync(struct pipe_context *pctx, struct pipe_fence_handle *pfence) +{ + struct zink_fence *fence = zink_fence(pfence); + + if (pctx && fence->deferred_ctx == pctx) + return; + + if (fence->deferred_ctx) { + zink_curr_batch(zink_context(pctx))->has_work = true; + /* this must be the current batch */ + pctx->flush(pctx, NULL, 0); + } + zink_fence_finish(zink_screen(pctx->screen), pctx, fence, PIPE_TIMEOUT_INFINITE); +} + void zink_screen_fence_init(struct pipe_screen *pscreen) { diff --git a/src/gallium/drivers/zink/zink_fence.h b/src/gallium/drivers/zink/zink_fence.h index 2a5334b82a9..d3bfa0e849d 100644 --- a/src/gallium/drivers/zink/zink_fence.h +++ b/src/gallium/drivers/zink/zink_fence.h @@ -64,6 +64,9 @@ bool zink_fence_finish(struct zink_screen *screen, struct pipe_context *pctx, struct zink_fence *fence, uint64_t timeout_ns); +void +zink_fence_server_sync(struct pipe_context *pctx, struct pipe_fence_handle *pfence); + void zink_screen_fence_init(struct pipe_screen *pscreen);