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 <[email protected]>: > 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 <[email protected]> > --- > 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 _______________________________________________ Libva mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libva
