summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>2018-07-18 14:50:08 +0200
committerPaul Kocialkowski <paul.kocialkowski@bootlin.com>2018-07-18 14:51:11 +0200
commit019a0ccb42b9cabd84bb53e167c74a549deeec16 (patch)
tree49a650d8ad5a04f26776494085332160c771d0f0 /src
parent7a72782612e807a80cfc123521ddb1b43c66fef0 (diff)
downloadlibva-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.c75
-rw-r--r--src/buffer.h5
-rw-r--r--src/request.c2
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;