diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h index 56e5b87a2f9..984a78cfeb1 100644 --- a/src/gallium/drivers/v3d/v3d_context.h +++ b/src/gallium/drivers/v3d/v3d_context.h @@ -750,6 +750,10 @@ v3d_fence_unreference(struct v3d_fence **fence); struct v3d_fence *v3d_fence_create(struct v3d_context *v3d); +bool v3d_fence_wait(struct v3d_screen *screen, + struct v3d_fence *fence, + uint64_t timeout_ns); + void v3d_update_primitive_counters(struct v3d_context *v3d); bool v3d_line_smoothing_enabled(struct v3d_context *v3d); diff --git a/src/gallium/drivers/v3d/v3d_fence.c b/src/gallium/drivers/v3d/v3d_fence.c index 7076c58f9b7..3abfcd7c750 100644 --- a/src/gallium/drivers/v3d/v3d_fence.c +++ b/src/gallium/drivers/v3d/v3d_fence.c @@ -72,17 +72,14 @@ v3d_fence_unreference(struct v3d_fence **fence) v3d_fence_reference(NULL, (struct pipe_fence_handle **)fence, NULL); } -static bool -v3d_fence_finish(struct pipe_screen *pscreen, - struct pipe_context *ctx, - struct pipe_fence_handle *pf, - uint64_t timeout_ns) +bool +v3d_fence_wait(struct v3d_screen *screen, + struct v3d_fence *fence, + uint64_t timeout_ns) { - struct v3d_screen *screen = v3d_screen(pscreen); - struct v3d_fence *f = (struct v3d_fence *)pf; int ret; - unsigned syncobj; + ret = drmSyncobjCreate(screen->fd, 0, &syncobj); if (ret) { fprintf(stderr, "Failed to create syncobj to wait on: %d\n", @@ -90,7 +87,7 @@ v3d_fence_finish(struct pipe_screen *pscreen, return false; } - ret = drmSyncobjImportSyncFile(screen->fd, syncobj, f->fd); + ret = drmSyncobjImportSyncFile(screen->fd, syncobj, fence->fd); if (ret) { fprintf(stderr, "Failed to import fence to syncobj: %d\n", ret); return false; @@ -107,6 +104,18 @@ v3d_fence_finish(struct pipe_screen *pscreen, return ret >= 0; } +static bool +v3d_fence_finish(struct pipe_screen *pscreen, + struct pipe_context *ctx, + struct pipe_fence_handle *pf, + uint64_t timeout_ns) +{ + struct v3d_screen *screen = v3d_screen(pscreen); + struct v3d_fence *fence = (struct v3d_fence *)pf; + + return v3d_fence_wait(screen, fence, timeout_ns); +} + struct v3d_fence * v3d_fence_create(struct v3d_context *v3d) {