From d0535b1dd3f3be3723407a2b1e4659e7a0162813 Mon Sep 17 00:00:00 2001 From: XinfengZhang Date: Fri, 28 Sep 2018 21:14:51 +0800 Subject: [PATCH] add vaCopy interface to copy surface and buffer Author:Dmitry Rogozhkin Author:XinfengZhang Signed-off-by: XinfengZhang --- va/va.c | 20 ++++++++++++++++++++ va/va.h | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ va/va_backend.h | 10 ++++++++-- 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/va/va.c b/va/va.c index 4f06a34fc..06e989e0f 100644 --- a/va/va.c +++ b/va/va.c @@ -2286,3 +2286,23 @@ vaQueryVideoProcPipelineCaps( VA_TRACE_RET(dpy, status); return status; } + +VAStatus +vaCopy( + VADisplay dpy, + VACopyObject *dst, + VACopyObject *src, + VACopyOption option +) +{ + 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); + return va_status; +} diff --git a/va/va.h b/va/va.h index f3202dc32..9ed954a84 100644 --- a/va/va.h +++ b/va/va.h @@ -4730,6 +4730,56 @@ 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_MEDIA]; +} 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), then need vaSyncBuffer or vaSyncSurface/vaSyncSurface2 + * to sync the destination object. + * + * @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 + * @return VA_STATUS_SUCCESS if successful + */ +VAStatus vaCopy(VADisplay dpy, VACopyObject * dst, VACopyObject * src, VACopyOption option); + #include #include #include diff --git a/va/va_backend.h b/va/va_backend.h index 5ab8f6abb..abac41828 100644 --- a/va/va_backend.h +++ b/va/va_backend.h @@ -484,7 +484,6 @@ struct VADriverVTable uint32_t flags, /* in */ void *descriptor /* out */ ); - VAStatus (*vaSyncSurface2) ( VADriverContextP ctx, VASurfaceID surface, @@ -497,8 +496,15 @@ struct VADriverVTable uint64_t timeout_ns ); + VAStatus + (*vaCopy)( + VADriverContextP ctx, /* in */ + VACopyObject *dst, /* in */ + VACopyObject *src, /* in */ + VACopyOption option /* in */ + ); /** \brief Reserved bytes for future use, must be zero */ - unsigned long reserved[55]; + unsigned long reserved[54]; }; struct VADriverContext