From b75ee1a0670a3207dfd99917e4f47d064a44197f Mon Sep 17 00:00:00 2001 From: "David (Ming Qiang) Wu" Date: Fri, 26 Jan 2024 15:07:34 -0500 Subject: [PATCH] frontends/va: make vlVaSyncSurface blocking According to VA documentation, vaSyncSurface should block, so this mapping function vlVaSyncSurface is changed to be blocking. add vlVaSyncSurface2 which can be used as non-blocking version. Signed-off-by: David (Ming Qiang) Wu Reviewed-by: Boyuan Zhang Part-of: --- src/gallium/frontends/va/context.c | 2 +- src/gallium/frontends/va/surface.c | 24 ++++++++++++++++++------ src/gallium/frontends/va/va_private.h | 3 +++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/gallium/frontends/va/context.c b/src/gallium/frontends/va/context.c index 4f4f0ff5656..f33fcf733dd 100644 --- a/src/gallium/frontends/va/context.c +++ b/src/gallium/frontends/va/context.c @@ -103,7 +103,7 @@ static struct VADriverVTable vtable = &vlVaExportSurfaceHandle, #endif #if VA_CHECK_VERSION(1, 15, 0) - NULL, /* vaSyncSurface2 */ + &vlVaSyncSurface2, &vlVaSyncBuffer, #endif #if VA_CHECK_VERSION(1, 21, 0) diff --git a/src/gallium/frontends/va/surface.c b/src/gallium/frontends/va/surface.c index 2f153abde64..72cd4d6eea6 100644 --- a/src/gallium/frontends/va/surface.c +++ b/src/gallium/frontends/va/surface.c @@ -99,8 +99,8 @@ vlVaDestroySurfaces(VADriverContextP ctx, VASurfaceID *surface_list, int num_sur return VA_STATUS_SUCCESS; } -VAStatus -vlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target) +static VAStatus +_vlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target, uint64_t timeout_ns) { vlVaDriver *drv; vlVaContext *context; @@ -152,8 +152,7 @@ vlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target) if (context->decoder->get_processor_fence) ret = context->decoder->get_processor_fence(context->decoder, - surf->fence, - PIPE_DEFAULT_DECODER_FEEDBACK_TIMEOUT_NS); + surf->fence, timeout_ns); mtx_unlock(&drv->mutex); // Assume that the GPU has hung otherwise. @@ -163,8 +162,7 @@ vlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target) if (context->decoder->get_decoder_fence) ret = context->decoder->get_decoder_fence(context->decoder, - surf->fence, - PIPE_DEFAULT_DECODER_FEEDBACK_TIMEOUT_NS); + surf->fence, timeout_ns); mtx_unlock(&drv->mutex); // Assume that the GPU has hung otherwise. @@ -197,6 +195,20 @@ vlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target) return VA_STATUS_SUCCESS; } +VAStatus +vlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target) +{ + return _vlVaSyncSurface(ctx, render_target, VA_TIMEOUT_INFINITE); +} + +#if VA_CHECK_VERSION(1, 15, 0) +VAStatus +vlVaSyncSurface2(VADriverContextP ctx, VASurfaceID surface, uint64_t timeout_ns) +{ + return _vlVaSyncSurface(ctx, surface, timeout_ns); +} +#endif + VAStatus vlVaQuerySurfaceStatus(VADriverContextP ctx, VASurfaceID render_target, VASurfaceStatus *status) { diff --git a/src/gallium/frontends/va/va_private.h b/src/gallium/frontends/va/va_private.h index bd4c1e4a698..ad30f3bad2a 100644 --- a/src/gallium/frontends/va/va_private.h +++ b/src/gallium/frontends/va/va_private.h @@ -444,6 +444,9 @@ VAStatus vlVaBeginPicture(VADriverContextP ctx, VAContextID context, VASurfaceID VAStatus vlVaRenderPicture(VADriverContextP ctx, VAContextID context, VABufferID *buffers, int num_buffers); VAStatus vlVaEndPicture(VADriverContextP ctx, VAContextID context); VAStatus vlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target); +#if VA_CHECK_VERSION(1, 15, 0) +VAStatus vlVaSyncSurface2(VADriverContextP ctx, VASurfaceID surface, uint64_t timeout_ns); +#endif VAStatus vlVaQuerySurfaceStatus(VADriverContextP ctx, VASurfaceID render_target, VASurfaceStatus *status); VAStatus vlVaQuerySurfaceError(VADriverContextP ctx, VASurfaceID render_target, VAStatus error_status, void **error_info);