From 3cc2212c38630ffcdc6b38e0bd867845adee5ed9 Mon Sep 17 00:00:00 2001 From: Dmitry Ermilov Date: Wed, 22 Apr 2020 14:12:44 -0400 Subject: Add vaSyncSurface2 with timeout Fixes #397 Signed-off-by: Dmitry Ermilov --- va/va.c | 22 ++++++++++++++++++++++ va/va.h | 31 +++++++++++++++++++++++++++++++ va/va_backend.h | 8 +++++++- va/va_trace.c | 17 +++++++++++++++++ va/va_trace.h | 7 +++++++ 5 files changed, 84 insertions(+), 1 deletion(-) diff --git a/va/va.c b/va/va.c index 77517ba..4bbd3e5 100644 --- a/va/va.c +++ b/va/va.c @@ -1639,6 +1639,28 @@ VAStatus vaSyncSurface ( return va_status; } +VAStatus vaSyncSurface2 ( + VADisplay dpy, + VASurfaceID surface, + uint64_t timeout_ns +) +{ + VAStatus va_status; + VADriverContextP ctx; + + CHECK_DISPLAY(dpy); + ctx = CTX(dpy); + + if (ctx->vtable->vaSyncSurface2) + va_status = ctx->vtable->vaSyncSurface2( ctx, surface, timeout_ns ); + else + va_status = VA_STATUS_ERROR_UNIMPLEMENTED; + VA_TRACE_LOG(va_TraceSyncSurface2, dpy, surface, timeout_ns); + VA_TRACE_RET(dpy, va_status); + + return va_status; +} + VAStatus vaQuerySurfaceStatus ( VADisplay dpy, VASurfaceID render_target, diff --git a/va/va.h b/va/va.h index 318e99e..fda8673 100644 --- a/va/va.h +++ b/va/va.h @@ -213,6 +213,8 @@ typedef int VAStatus; /** Return status type from functions */ #define VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE 0x00000024 /** \brief Indicate allocated buffer size is not enough for input or output. */ #define VA_STATUS_ERROR_NOT_ENOUGH_BUFFER 0x00000025 +/** \brief Indicate an operation isn't completed because time-out interval elapsed. */ +#define VA_STATUS_ERROR_TIMEDOUT 0x00000026 #define VA_STATUS_ERROR_UNKNOWN 0xFFFFFFFF /** @@ -3724,6 +3726,35 @@ VAStatus vaSyncSurface ( VASurfaceID render_target ); +/** \brief Indicates an infinite timeout. */ +#define VA_TIMEOUT_INFINITE 0xFFFFFFFFFFFFFFFF + +/** + * \brief Synchronizes pending operations associated with the supplied surface. + * + * This function blocks during specified timeout (in nanoseconds) until + * all pending operations on the render target have been completed. + * If timeout is zero, the function returns immediately. + * + * Possible errors: + * - \ref VA_STATUS_ERROR_UNIMPLEMENTED: the VA driver implementation + * does not support this interface + * - \ref VA_STATUS_ERROR_INVALID_DISPLAY: an invalid display was supplied + * - \ref VA_STATUS_ERROR_INVALID_SURFACE: an invalid surface was supplied + * - \ref VA_STATUS_ERROR_TIMEDOUT: synchronization is still in progress, + * client should call the function again to complete synchronization + * + * @param[in] dpy the VA display + * @param[in] surface the surface for which synchronization is performed + * @param[in] timeout_ns the timeout in nanoseconds + * + */ +VAStatus vaSyncSurface2 ( + VADisplay dpy, + VASurfaceID surface, + uint64_t timeout_ns +); + typedef enum { VASurfaceRendering = 1, /* Rendering in progress */ diff --git a/va/va_backend.h b/va/va_backend.h index f2cd7b0..f3d8998 100644 --- a/va/va_backend.h +++ b/va/va_backend.h @@ -485,8 +485,14 @@ struct VADriverVTable void *descriptor /* out */ ); + VAStatus (*vaSyncSurface2) ( + VADriverContextP ctx, + VASurfaceID surface, + uint64_t timeout_ns + ); + /** \brief Reserved bytes for future use, must be zero */ - unsigned long reserved[57]; + unsigned long reserved[56]; }; struct VADriverContext diff --git a/va/va_trace.c b/va/va_trace.c index 14c73cd..f726b50 100644 --- a/va/va_trace.c +++ b/va/va_trace.c @@ -5455,6 +5455,23 @@ void va_TraceSyncSurface( DPY2TRACE_VIRCTX_EXIT(pva_trace); } +void va_TraceSyncSurface2( + VADisplay dpy, + VASurfaceID surface, + uint64_t timeout_ns +) +{ + DPY2TRACE_VIRCTX(dpy); + + TRACE_FUNCNAME(idx); + + va_TraceMsg(trace_ctx, "\tsurface = 0x%08x\n", surface); + va_TraceMsg(trace_ctx, "\ttimeout_ns = %d\n", timeout_ns); + va_TraceMsg(trace_ctx, NULL); + + DPY2TRACE_VIRCTX_EXIT(pva_trace); +} + void va_TraceQuerySurfaceAttributes( VADisplay dpy, VAConfigID config, diff --git a/va/va_trace.h b/va/va_trace.h index 3e919b2..6a3d166 100644 --- a/va/va_trace.h +++ b/va/va_trace.h @@ -212,6 +212,13 @@ void va_TraceSyncSurface( VASurfaceID render_target ); +DLL_HIDDEN +void va_TraceSyncSurface2( + VADisplay dpy, + VASurfaceID surface, + uint64_t timeout_ns +); + DLL_HIDDEN void va_TraceQuerySurfaceAttributes( VADisplay dpy, -- cgit v1.2.1