Pushed to the git staging branch. 2014-03-10 18:47 GMT+01:00 Gwenole Beauchesne <gb.de...@gmail.com>: > Add interfaces for low-level buffer exports to suport interop with > external APIs like EGL or OpenCL (OCL). Theory of operations: > > - vaAcquireBufferHandle(): locks buffer for external API usage. This > is a synchronization point. Upon successful return, useful buffer > details are returned in a somewhat implementation-specific way to > support interop with external APIs. > > - vaReleaseBufferHandle(): unlocks buffer after usage from external > API, and deallocates any resources that were needed. > > This is a low-level API that replaces any former API specific to EGL, > DRM or OpenCL interop. External API specific extensions may be > provided in the future, in view to simplifying the end usages. The > relevant implementations would be using those low-level APIs to > achieve the same result, with less code. > > Signed-off-by: Gwenole Beauchesne <gwenole.beauche...@intel.com> > --- > va/va.c | 28 +++++++++++++++ > va/va.h | 105 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > va/va_backend.h | 13 +++++++ > 3 files changed, 146 insertions(+) > > diff --git a/va/va.c b/va/va.c > index 0d9a597..ca8bf4c 100644 > --- a/va/va.c > +++ b/va/va.c > @@ -1046,6 +1046,34 @@ VAStatus vaBufferInfo ( > return ctx->vtable->vaBufferInfo( ctx, buf_id, type, size, num_elements ); > } > > +/* Locks buffer for external API usage */ > +VAStatus > +vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo > *buf_info) > +{ > + VADriverContextP ctx; > + > + CHECK_DISPLAY(dpy); > + ctx = CTX(dpy); > + > + if (!ctx->vtable->vaAcquireBufferHandle) > + return VA_STATUS_ERROR_UNIMPLEMENTED; > + return ctx->vtable->vaAcquireBufferHandle(ctx, buf_id, buf_info); > +} > + > +/* Unlocks buffer after usage from external API */ > +VAStatus > +vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id) > +{ > + VADriverContextP ctx; > + > + CHECK_DISPLAY(dpy); > + ctx = CTX(dpy); > + > + if (!ctx->vtable->vaReleaseBufferHandle) > + return VA_STATUS_ERROR_UNIMPLEMENTED; > + return ctx->vtable->vaReleaseBufferHandle(ctx, buf_id); > +} > + > VAStatus vaBeginPicture ( > VADisplay dpy, > VAContextID context, > diff --git a/va/va.h b/va/va.h > index 9796e37..bb75b42 100644 > --- a/va/va.h > +++ b/va/va.h > @@ -78,6 +78,7 @@ > #ifndef _VA_H_ > #define _VA_H_ > > +#include <stddef.h> > #include <stdint.h> > #include <va/va_version.h> > > @@ -182,6 +183,8 @@ typedef int VAStatus; /* Return status type from > functions */ > #define VA_STATUS_ERROR_HW_BUSY 0x00000022 > /** \brief An invalid blend state was supplied. */ > #define VA_STATUS_ERROR_INVALID_BLEND_STATE 0x00000023 > +/** \brief An unsupported memory type was supplied. */ > +#define VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE 0x00000024 > #define VA_STATUS_ERROR_UNKNOWN 0xFFFFFFFF > > /* De-interlacing flags for vaPutSurface() */ > @@ -2478,6 +2481,108 @@ VAStatus vaDestroyBuffer ( > VABufferID buffer_id > ); > > +/** \brief VA buffer information */ > +typedef struct { > + /** \brief Buffer handle */ > + uintptr_t handle; > + /** \brief Buffer type (See \ref VABufferType). */ > + uint32_t type; > + /** > + * \brief Buffer memory type (See \ref VASurfaceAttribMemoryType). > + * > + * On input to vaAcquireBufferHandle(), this field can serve as a hint > + * to specify the set of memory types the caller is interested in. > + * On successful return from vaAcquireBufferHandle(), the field is > + * updated with the best matching memory type. > + */ > + uint32_t mem_type; > + /** \brief Size of the underlying buffer. */ > + size_t mem_size; > +} VABufferInfo; > + > +/** > + * \brief Acquires buffer handle for external API usage > + * > + * Locks the VA buffer object \ref buf_id for external API usage like > + * EGL or OpenCL (OCL). This function is a synchronization point. This > + * means that any pending operation is guaranteed to be completed > + * prior to returning from the function. > + * > + * If the referenced VA buffer object is the backing store of a VA > + * surface, then this function acts as if vaSyncSurface() on the > + * parent surface was called first. > + * > + * The \ref VABufferInfo argument shall be zero'ed on input. On > + * successful output, the data structure is filled in with all the > + * necessary buffer level implementation details like handle, type, > + * memory type and memory size. > + * > + * Note: the external API implementation, or the application, can > + * express the memory types it is interested in by filling in the \ref > + * mem_type field accordingly. On successful output, the memory type > + * that fits best the request and that was used is updated in the \ref > + * VABufferInfo data structure. If none of the supplied memory types > + * is supported, then a \ref VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE > + * error is returned. > + * > + * The \ref VABufferInfo data is valid until vaReleaseBufferHandle() > + * is called. Besides, no additional operation is allowed on any of > + * the buffer parent object until vaReleaseBufferHandle() is called. > + * e.g. decoding into a VA surface backed with the supplied VA buffer > + * object \ref buf_id would fail with a \ref VA_STATUS_ERROR_SURFACE_BUSY > + * error. > + * > + * 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_BUFFER: an invalid buffer was supplied > + * - \ref VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE: the implementation > + * does not support exporting buffers of the specified type > + * - \ref VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE: none of the requested > + * memory types in \ref VABufferInfo.mem_type was supported > + * > + * @param[in] dpy the VA display > + * @param[in] buf_id the VA buffer > + * @param[in,out] buf_info the associated VA buffer information > + * @return VA_STATUS_SUCCESS if successful > + */ > +VAStatus > +vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo > *buf_info); > + > +/** > + * \brief Releases buffer after usage from external API > + * > + * Unlocks the VA buffer object \ref buf_id from external API usage like > + * EGL or OpenCL (OCL). This function is a synchronization point. This > + * means that any pending operation is guaranteed to be completed > + * prior to returning from the function. > + * > + * The \ref VABufferInfo argument shall point to the original data > + * structure that was obtained from vaAcquireBufferHandle(), unaltered. > + * This is necessary so that the VA driver implementation could > + * deallocate any resources that were needed. > + * > + * In any case, returning from this function invalidates any contents > + * in \ref VABufferInfo. i.e. the underlyng buffer handle is no longer > + * valid. Therefore, VA driver implementations are free to reset this > + * data structure to safe defaults. > + * > + * 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_BUFFER: an invalid buffer was supplied > + * - \ref VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE: the implementation > + * does not support exporting buffers of the specified type > + * > + * @param[in] dpy the VA display > + * @param[in] buf_id the VA buffer > + * @return VA_STATUS_SUCCESS if successful > + */ > +VAStatus > +vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id); > + > /* > Render (Decode) Pictures > > diff --git a/va/va_backend.h b/va/va_backend.h > index 09f8245..3910df1 100644 > --- a/va/va_backend.h > +++ b/va/va_backend.h > @@ -419,6 +419,19 @@ struct VADriverVTable > VASurfaceAttrib *attrib_list, > unsigned int *num_attribs > ); > + > + VAStatus > + (*vaAcquireBufferHandle)( > + VADriverContextP ctx, > + VABufferID buf_id, /* in */ > + VABufferInfo * buf_info /* in/out */ > + ); > + > + VAStatus > + (*vaReleaseBufferHandle)( > + VADriverContextP ctx, > + VABufferID buf_id /* in */ > + ); > }; > > struct VADriverContext > -- > 1.7.9.5 >
-- Gwenole Beauchesne Intel Corporation SAS / 2 rue de Paris, 92196 Meudon Cedex, France Registration Number (RCS): Nanterre B 302 456 199 _______________________________________________ Libva mailing list Libva@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libva