[Libva] [PATCH v2 intel-driver] Add support for new VA buffer export APIs.

Gwenole Beauchesne gb.devel at gmail.com
Mon Jun 16 09:23:22 PDT 2014


FYI, I will push this by the end of this week along with the
associated demo code.

2014-06-16 18:18 GMT+02:00 Gwenole Beauchesne <gb.devel at gmail.com>:
> Implement va{Acquire,Release}BufferHandle() hooks so that to allow
> VA surface or VA image buffer sharing with thirdparty APIs like EGL,
> OpenCL, etc.
>
> v2: made sure to sync bo before export, improved VA buffer type check.
>
> Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
> ---
>  src/i965_drv_video.c |   83 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 83 insertions(+)
>
> diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
> index 575b5d6..9dedc80 100755
> --- a/src/i965_drv_video.c
> +++ b/src/i965_drv_video.c
> @@ -5145,6 +5145,85 @@ i965_QuerySurfaceAttributes(VADriverContextP ctx,
>      return vaStatus;
>  }
>
> +/** Acquires buffer handle for external API usage */
> +static VAStatus
> +i965_AcquireBufferHandle(VADriverContextP ctx, VABufferID buf_id,
> +    VABufferInfo *buf_info)
> +{
> +    struct i965_driver_data * const i965 = i965_driver_data(ctx);
> +    struct object_buffer * const obj_buffer = BUFFER(buf_id);
> +    struct buffer_store *buffer_store;
> +    uint32_t i, mem_type;
> +
> +    /* List of supported memory types, in preferred order */
> +    static const uint32_t mem_types[] = {
> +        VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME,
> +        VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM,
> +        0
> +    };
> +
> +    if (!obj_buffer)
> +        return VA_STATUS_ERROR_INVALID_BUFFER;
> +    /* XXX: only VA surface|image like buffers are supported for now */
> +    if (obj_buffer->type != VAImageBufferType)
> +        return VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE;
> +
> +    if (!buf_info)
> +        return VA_STATUS_ERROR_INVALID_PARAMETER;
> +
> +    if (!buf_info->mem_type)
> +        mem_type = mem_types[0];
> +    else {
> +        mem_type = 0;
> +        for (i = 0; mem_types[i] != 0; i++) {
> +            if (buf_info->mem_type & mem_types[i]) {
> +                mem_type = buf_info->mem_type;
> +                break;
> +            }
> +        }
> +        if (!mem_type)
> +            return VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE;
> +    }
> +
> +    buffer_store = obj_buffer->buffer_store;
> +    if (!buffer_store || !buffer_store->bo)
> +        return VA_STATUS_ERROR_INVALID_BUFFER;
> +
> +    drm_intel_bo_wait_rendering(buffer_store->bo);
> +    switch (mem_type) {
> +    case VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM: {
> +        uint32_t name;
> +        if (drm_intel_bo_flink(buffer_store->bo, &name) != 0)
> +            return VA_STATUS_ERROR_INVALID_BUFFER;
> +        buf_info->handle = name;
> +        break;
> +    }
> +    case VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME: {
> +        int fd;
> +        if (drm_intel_bo_gem_export_to_prime(buffer_store->bo, &fd) != 0)
> +            return VA_STATUS_ERROR_INVALID_BUFFER;
> +        buf_info->handle = (intptr_t)fd;
> +        break;
> +    }
> +    }
> +    buf_info->type = obj_buffer->type;
> +    buf_info->mem_type = mem_type;
> +    buf_info->mem_size = obj_buffer->num_elements * obj_buffer->size_element;
> +    return VA_STATUS_SUCCESS;
> +}
> +
> +/** Releases buffer handle after usage from external API */
> +static VAStatus
> +i965_ReleaseBufferHandle(VADriverContextP ctx, VABufferID buf_id)
> +{
> +    struct i965_driver_data * const i965 = i965_driver_data(ctx);
> +    struct object_buffer * const obj_buffer = BUFFER(buf_id);
> +
> +    if (!obj_buffer)
> +        return VA_STATUS_ERROR_INVALID_BUFFER;
> +    return VA_STATUS_SUCCESS;
> +}
> +
>  static int
>  i965_os_has_ring_support(VADriverContextP ctx,
>                           int ring)
> @@ -5674,6 +5753,10 @@ VA_DRIVER_INIT_FUNC(  VADriverContextP ctx )
>      vtable->vaQuerySurfaceAttributes = i965_QuerySurfaceAttributes;
>      vtable->vaCreateSurfaces2 = i965_CreateSurfaces2;
>
> +    /* 0.36.0 */
> +    vtable->vaAcquireBufferHandle = i965_AcquireBufferHandle;
> +    vtable->vaReleaseBufferHandle = i965_ReleaseBufferHandle;
> +
>      vtable_vpp->vaQueryVideoProcFilters = i965_QueryVideoProcFilters;
>      vtable_vpp->vaQueryVideoProcFilterCaps = i965_QueryVideoProcFilterCaps;
>      vtable_vpp->vaQueryVideoProcPipelineCaps = i965_QueryVideoProcPipelineCaps;
> --
> 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


More information about the Libva mailing list