diff options
author | Paul Kocialkowski <paul.kocialkowski@bootlin.com> | 2018-07-18 14:50:08 +0200 |
---|---|---|
committer | Paul Kocialkowski <paul.kocialkowski@bootlin.com> | 2018-07-18 14:51:11 +0200 |
commit | 019a0ccb42b9cabd84bb53e167c74a549deeec16 (patch) | |
tree | 49a650d8ad5a04f26776494085332160c771d0f0 /src | |
parent | 7a72782612e807a80cfc123521ddb1b43c66fef0 (diff) | |
download | libva-v4l2-request-019a0ccb42b9cabd84bb53e167c74a549deeec16.tar.gz libva-v4l2-request-019a0ccb42b9cabd84bb53e167c74a549deeec16.tar.bz2 libva-v4l2-request-019a0ccb42b9cabd84bb53e167c74a549deeec16.zip |
buffer: Add Acquire/ReleaseBufferHandle support for dma-buf export
This is the first version of dma-buf export, that does not support
specifying a DRM modifier.
Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/buffer.c | 75 | ||||
-rw-r--r-- | src/buffer.h | 5 | ||||
-rw-r--r-- | src/request.c | 2 |
3 files changed, 81 insertions, 1 deletions
diff --git a/src/buffer.c b/src/buffer.c index 6627294..a8cf97e 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -26,14 +26,18 @@ #include "buffer.h" #include "context.h" #include "request.h" +#include "surface.h" -#include <assert.h> +#include <unistd.h> +#include <fcntl.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <sys/mman.h> +#include <va/va_drmcommon.h> + #include <linux/videodev2.h> #include "utils.h" @@ -185,3 +189,72 @@ VAStatus RequestBufferInfo(VADriverContextP context, VABufferID buffer_id, return VA_STATUS_SUCCESS; } + +VAStatus RequestAcquireBufferHandle(VADriverContextP context, + VABufferID buffer_id, + VABufferInfo *buffer_info) +{ + struct sunxi_cedrus_driver_data *driver_data = + (struct sunxi_cedrus_driver_data *) context->pDriverData; + struct object_buffer *buffer_object; + struct object_surface *surface_object; + int export_fd; + int rc; + + if (buffer_info->mem_type != VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME || + driver_data->tiled_format) + return VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE; + + buffer_object = BUFFER(buffer_id); + if (buffer_object == NULL || buffer_object->type != VAImageBufferType) + return VA_STATUS_ERROR_INVALID_BUFFER; + + if (buffer_object->derived_surface_id == VA_INVALID_ID) + return VA_STATUS_ERROR_INVALID_BUFFER; + + surface_object = SURFACE(buffer_object->derived_surface_id); + if (surface_object == NULL) + return VA_STATUS_ERROR_INVALID_BUFFER; + + if (surface_object->destination_buffers_count > 1) + return VA_STATUS_ERROR_OPERATION_FAILED; + + rc = v4l2_export_buffer(driver_data->video_fd, + V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, + surface_object->destination_index, O_RDONLY, + &export_fd, 1); + if (rc < 0) + return VA_STATUS_ERROR_OPERATION_FAILED; + + buffer_info->handle = (uintptr_t) export_fd; + buffer_info->type = buffer_object->type; + buffer_info->mem_size = buffer_object->size * buffer_object->count; + + buffer_object->info = *buffer_info; + + return VA_STATUS_SUCCESS; +} + +VAStatus RequestReleaseBufferHandle(VADriverContextP context, + VABufferID buffer_id) +{ + struct sunxi_cedrus_driver_data *driver_data = + (struct sunxi_cedrus_driver_data *) context->pDriverData; + struct object_buffer *buffer_object; + int export_fd; + + buffer_object = BUFFER(buffer_id); + if (buffer_object == NULL) + return VA_STATUS_ERROR_INVALID_BUFFER; + + if (buffer_object->info.handle == (uintptr_t) -1) + return VA_STATUS_SUCCESS; + + export_fd = (int) buffer_object->info.handle; + + close(export_fd); + + buffer_object->info.handle = NULL; + + return VA_STATUS_SUCCESS; +} diff --git a/src/buffer.h b/src/buffer.h index 9a2ac35..a47b4be 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -62,5 +62,10 @@ VAStatus RequestBufferSetNumElements(VADriverContextP context, VAStatus RequestBufferInfo(VADriverContextP context, VABufferID buffer_id, VABufferType *type, unsigned int *size, unsigned int *count); +VAStatus RequestAcquireBufferHandle(VADriverContextP context, + VABufferID buffer_id, + VABufferInfo *buffer_info); +VAStatus RequestReleaseBufferHandle(VADriverContextP context, + VABufferID buffer_id); #endif diff --git a/src/request.c b/src/request.c index 6627852..0366b65 100644 --- a/src/request.c +++ b/src/request.c @@ -96,6 +96,8 @@ VAStatus VA_DRIVER_INIT_FUNC(VADriverContextP context) vtable->vaUnmapBuffer = RequestUnmapBuffer; vtable->vaDestroyBuffer = RequestDestroyBuffer; vtable->vaBufferInfo = RequestBufferInfo; + vtable->vaAcquireBufferHandle = RequestAcquireBufferHandle; + vtable->vaReleaseBufferHandle = RequestReleaseBufferHandle; vtable->vaBeginPicture = RequestBeginPicture; vtable->vaRenderPicture = RequestRenderPicture; vtable->vaEndPicture = RequestEndPicture; |