diff options
author | Zhao, Halley <halley.zhao@intel.com> | 2014-01-27 03:03:25 +0800 |
---|---|---|
committer | Zhao, Halley <halley.zhao@intel.com> | 2014-01-27 04:08:00 +0800 |
commit | daa22bb98976acb4bae73f8d7746290082f8efb5 (patch) | |
tree | c3ba41c9c1c427f3ac29cc0706c839185fe040ae | |
parent | 43f5f8cff82dab29497537b745a8808c637c7847 (diff) | |
download | libva-intel-driver-old-tizen-20140217.tar.gz libva-intel-driver-old-tizen-20140217.tar.bz2 libva-intel-driver-old-tizen-20140217.zip |
add LockBuffer support for VAImage/VASurfacesubmit/tizen/20140209.193132accepted/tizen/ivi/20140210.174617accepted/tizen/generic/20140210.074213old-tizen-20140217
-rw-r--r--[-rwxr-xr-x] | 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 3ac5418..18abf89 100755..100644 --- a/src/i965_drv_video.c +++ b/src/i965_drv_video.c @@ -4080,6 +4080,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, @@ -4965,6 +5039,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; |