v3d: add fence wait function

Waits for a V3D fence to be signaled.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Signed-off-by: Juan A. Suarez Romero <jasuarez@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10666>
This commit is contained in:
Juan A. Suarez Romero 2021-04-22 10:10:25 +02:00 committed by Marge Bot
parent c59d8a1798
commit e928aece50
2 changed files with 22 additions and 9 deletions

View File

@ -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);

View File

@ -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)
{