zink: add a pipe_context::fence_server_sync hook
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Tue, 27 Oct 2020 19:01:17 +0000 (15:01 -0400)
committerMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Thu, 18 Mar 2021 03:01:28 +0000 (23:01 -0400)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9626>

src/gallium/drivers/zink/zink_context.c
src/gallium/drivers/zink/zink_fence.c
src/gallium/drivers/zink/zink_fence.h

index b425f8b..b806e84 100644 (file)
@@ -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;
index ecdf6b8..46fe236 100644 (file)
@@ -159,6 +159,22 @@ fence_finish(struct pipe_screen *pscreen, struct pipe_context *pctx,
 }
 
 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)
 {
    pscreen->fence_reference = fence_reference;
index 2a5334b..d3bfa0e 100644 (file)
@@ -65,6 +65,9 @@ zink_fence_finish(struct zink_screen *screen, struct pipe_context *pctx, struct
                   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);
 
 #endif