diff options
author | Zhao, Halley <halley.zhao@intel.com> | 2014-02-17 03:43:51 +0800 |
---|---|---|
committer | Philippe Coval <philippe.coval@open.eurogiciel.org> | 2014-11-13 17:39:58 +0100 |
commit | 9dbdd5c26b4a47f0edab79b86ba8d46d8a0c8bd4 (patch) | |
tree | f6d7b6b7fb67e767954cdc876263fb62bb9f5b6e | |
parent | 28ee87e34d97e1288b6fd2ec70978da24fa5c224 (diff) | |
download | libva-intel-driver-9dbdd5c26b4a47f0edab79b86ba8d46d8a0c8bd4.tar.gz libva-intel-driver-9dbdd5c26b4a47f0edab79b86ba8d46d8a0c8bd4.tar.bz2 libva-intel-driver-9dbdd5c26b4a47f0edab79b86ba8d46d8a0c8bd4.zip |
add LockBuffer support for VAImage/VASurface
-rw-r--r-- | src/i965_drv_video.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c index ba7c7be..a9516d1 100644 --- a/src/i965_drv_video.c +++ b/src/i965_drv_video.c @@ -4588,6 +4588,80 @@ i965_UnlockSurface( return vaStatus; } +VAStatus +i965_LockBuffer( + VADriverContextP ctx, + VABufferID buf_id, + VABufferInfo * buf_info_ptr +) +{ + struct object_buffer *obj_buffer = NULL; + struct i965_driver_data *i965 = i965_driver_data(ctx); + + obj_buffer = BUFFER(buf_id); + + assert(obj_buffer); + if (!obj_buffer) + return VA_STATUS_ERROR_INVALID_BUFFER; + + assert(obj_buffer->buffer_store); + if (!obj_buffer) + return VA_STATUS_ERROR_INVALID_BUFFER; + + assert(obj_buffer->buffer_store->bo); + if (!obj_buffer) + return VA_STATUS_ERROR_INVALID_BUFFER; + + // XXX, a flag should be added to object_buffer to indicate that the buffer is using by external ones or not + switch (obj_buffer->type) { + case VAImageBufferType: + buf_info_ptr->type = VAImageBufferType; + // XXX, fix me, don't care about the mem_size for now. + buf_info_ptr->mem_size = -1; + if (buf_info_ptr->mem_type & VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM_BO) { + buf_info_ptr->mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM_BO; + buf_info_ptr->handle = (uintptr_t)obj_buffer->buffer_store->bo; + } else if (buf_info_ptr->mem_type &VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM) { + uint32_t name; + if (drm_intel_bo_flink(obj_buffer->buffer_store->bo, &name) == 0) { + buf_info_ptr->mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM; + buf_info_ptr->handle = name; + } else { + assert(0); + return VA_STATUS_ERROR_INVALID_BUFFER; + } + } else if (buf_info_ptr->mem_type & VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME) { + int prime_fd; // libdrm use 'int' + if (drm_intel_bo_gem_export_to_prime(obj_buffer->buffer_store->bo, &prime_fd) == 0) { + buf_info_ptr->mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME; + buf_info_ptr->handle = prime_fd; + } else { + assert(0); + return VA_STATUS_ERROR_INVALID_BUFFER; + } + } else { + assert(0); + } + break; + default: + // XXX, not interest to support other typed buffer yet + assert(0); + } + + return VA_STATUS_SUCCESS; +} + +VAStatus +i965_UnlockBuffer( + VADriverContextP ctx, + VABufferID buf_id, + VABufferInfo * buf_info_ptr +) +{ + // XXX, unset the flag mentioned in i965_LockBuffer + return VA_STATUS_SUCCESS; +} + static VAStatus i965_GetSurfaceAttributes( VADriverContextP ctx, @@ -5796,6 +5870,8 @@ VA_DRIVER_INIT_FUNC( VADriverContextP ctx ) vtable->vaBufferInfo = i965_BufferInfo; vtable->vaLockSurface = i965_LockSurface; vtable->vaUnlockSurface = i965_UnlockSurface; + vtable->vaLockBuffer = i965_LockBuffer; + vtable->vaUnlockBuffer = i965_UnlockBuffer; vtable->vaGetSurfaceAttributes = i965_GetSurfaceAttributes; vtable->vaQuerySurfaceAttributes = i965_QuerySurfaceAttributes; vtable->vaCreateSurfaces2 = i965_CreateSurfaces2; |