diff --git a/va/va.c b/va/va.c index 8b0bee6f0..6e1c1bfaf 100644 --- a/va/va.c +++ b/va/va.c @@ -2247,3 +2247,41 @@ vaQueryVideoProcPipelineCaps( VA_TRACE_RET(dpy, status); return status; } + +VAStatus +vaCopy( + VADisplay dpy, + VACopyObject *dst, + VACopyObject *src, + VACopyOption option, + uintptr_t* sync_handle +) +{ + VAStatus va_status; + VADriverContextP ctx; + CHECK_DISPLAY(dpy); + ctx = CTX(dpy); + + if(ctx->vtable->vaCopy == NULL) + va_status = VA_STATUS_ERROR_UNIMPLEMENTED; + else + va_status = ctx->vtable->vaCopy( ctx, dst, src, option, sync_handle); + return va_status; +} + +VAStatus +vaHWAccelCopyWait( + VADisplay dpy, + uintptr_t sync_handle +) +{ + VAStatus va_status; + VADriverContextP ctx; + CHECK_DISPLAY(dpy); + ctx = CTX(dpy); + if(ctx->vtable->vaCopyWait == NULL) + va_status = VA_STATUS_ERROR_UNIMPLEMENTED; + else + va_status = ctx->vtable->vaCopyWait( ctx, sync_handle); + return va_status; +} diff --git a/va/va.h b/va/va.h index ac18067c2..606294535 100755 --- a/va/va.h +++ b/va/va.h @@ -4623,6 +4623,59 @@ typedef struct _VAPictureHEVC */ #define VA_PICTURE_HEVC_RPS_LT_CURR 0x00000040 +typedef enum{ + VACopyObjectSurface = 0, + VACopyObjectBuffer = 1, +} VACopyObjectType; + +typedef struct _VACopyObject { + VACopyObjectType obj_type; // type of object. + union + { + VASurfaceID surface_id; + VABufferID buffer_id; + } object; + + uint32_t va_reserved[VA_PADDING_LOW]; +} VACopyObject; + +#define VA_COPY_SYNC_BLOCK 0x0 +#define VA_COPY_SYNC_NONBLOCK 0x1 + +#define VA_COPY_MODE_BALANCE 0x0 +#define VA_COPY_MODE_PERF 0x1 +#define VA_COPY_MODE_POWER_SAVING 0x2 + +typedef union _VACopyOption{ + struct { + /** \brief va copy synchronization, the value should be VA_COPY_SYNC_XXX + * if it equal VA_COPY_SYNC_NONBLOCK , sync handle should be retrieved. + */ + uint32_t va_copy_sync : 2; + /** \brief va copy mode, the value should be VA_COPY_MODE_XXX */ + uint32_t va_copy_mode : 4; + uint32_t reserved :26; + }bits; + uint32_t value; +}VACopyOption; + +/** \brief Copies an object. + * + * Copies specified object (surface or buffer). If non-blocking copy + * is requested (VA_COPY_NONBLOCK), sync_handle will contain a handle + * to pass to vaCopyWait to wait for completion. + * + * @param[in] dpy the VA display + * @param[in] dst Destination object to copy to + * @param[in] src Source object to copy from + * @param[in] option VA copy option + * @param[out] sync_handle Synchronization handle to sync on + * @return VA_STATUS_SUCCESS if successful + */ +VAStatus vaCopy(VADisplay dpy, VACopyObject * dst, VACopyObject * src, VACopyOption option, uintptr_t* sync_handle); + +VAStatus vaCopyWait(VADisplay dpy, uintptr_t sync_handle); + #include #include #include diff --git a/va/va_backend.h b/va/va_backend.h index f2cd7b0f3..91f24ca5b 100644 --- a/va/va_backend.h +++ b/va/va_backend.h @@ -484,9 +484,23 @@ struct VADriverVTable uint32_t flags, /* in */ void *descriptor /* out */ ); + VAStatus + (*vaCopy)( + VADriverContextP ctx, /* in */ + VACopyObject *dst, /* in */ + VACopyObject *src, /* in */ + VACopyOption option, /* in */ + uintptr_t* sync_handle /* out */ + ); + + VAStatus + (*vaCopyWait)( + VADriverContextP ctx, /* in */ + uintptr_t sync_handle /* in */ + ); /** \brief Reserved bytes for future use, must be zero */ - unsigned long reserved[57]; + unsigned long reserved[55]; }; struct VADriverContext