Re: [RFC v4 05/17] [media] v4l: add V4L2_EVENT_OUT_FENCE event

From: Hans Verkuil
Date: Tue Oct 24 2017 - 09:09:20 EST


On 10/20/2017 11:50 PM, Gustavo Padovan wrote:
> From: Gustavo Padovan <gustavo.padovan@xxxxxxxxxxxxx>
>
> Add a new event the userspace can subscribe to receive notifications
> of the out_fence_fd when a buffer is queued onto the driver.
> The event provides the index of the queued buffer and the out_fence_fd.
>
> v3: - Rename event to V4L2_EVENT_OUT_FENCE
>
> v2: - Add missing Documentation (Mauro)
>
> Signed-off-by: Gustavo Padovan <gustavo.padovan@xxxxxxxxxxxxx>
> ---
> Documentation/media/uapi/v4l/vidioc-dqevent.rst | 23 +++++++++++++++++++++++
> Documentation/media/videodev2.h.rst.exceptions | 1 +
> include/uapi/linux/videodev2.h | 12 ++++++++++++
> 3 files changed, 36 insertions(+)
>
> diff --git a/Documentation/media/uapi/v4l/vidioc-dqevent.rst b/Documentation/media/uapi/v4l/vidioc-dqevent.rst
> index cb3565f36793..2143df63aeb1 100644
> --- a/Documentation/media/uapi/v4l/vidioc-dqevent.rst
> +++ b/Documentation/media/uapi/v4l/vidioc-dqevent.rst
> @@ -79,6 +79,10 @@ call.
> - ``src_change``
> - Event data for event V4L2_EVENT_SOURCE_CHANGE.
> * -
> + - struct :c:type:`v4l2_event_buf_queued`
> + - ``buf_queued``
> + - Event data for event V4L2_EVENT_OUT_FENCE.
> + * -
> - __u8
> - ``data``\ [64]
> - Event data. Defined by the event type. The union should be used to
> @@ -338,6 +342,25 @@ call.
> each cell in the motion detection grid, then that all cells are
> automatically assigned to the default region 0.
>
> +.. c:type:: v4l2_event_out_fence
> +
> +.. flat-table:: struct v4l2_event_out_fence
> + :header-rows: 0
> + :stub-columns: 0
> + :widths: 1 1 2
> +
> + * - __u32
> + - ``index``
> + - The index of the buffer that was queued to the driver.
> + * - __s32
> + - ``out_fence_fd``
> + - The out-fence file descriptor of the buffer that was queued to
> + the driver. It will signal when the buffer is ready, or if an
> + error happens.

What happens when the buffer has already been dequeued? This needs to be defined.

Perhaps set out_fence_fd to 0 or -1 in that case?

Regards,

Hans

> +
> +
> +
> +.. tabularcolumns:: |p{4.4cm}|p{4.4cm}|p{8.7cm}|
>
>
> .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}|
> diff --git a/Documentation/media/videodev2.h.rst.exceptions b/Documentation/media/videodev2.h.rst.exceptions
> index a5cb0a8686ac..32f3d5b37e3a 100644
> --- a/Documentation/media/videodev2.h.rst.exceptions
> +++ b/Documentation/media/videodev2.h.rst.exceptions
> @@ -462,6 +462,7 @@ replace define V4L2_EVENT_CTRL event-type
> replace define V4L2_EVENT_FRAME_SYNC event-type
> replace define V4L2_EVENT_SOURCE_CHANGE event-type
> replace define V4L2_EVENT_MOTION_DET event-type
> +replace define V4L2_EVENT_OUT_FENCE event-type
> replace define V4L2_EVENT_PRIVATE_START event-type
>
> replace define V4L2_EVENT_CTRL_CH_VALUE ctrl-changes-flags
> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
> index 185d6a0acc06..2a432e8c18e3 100644
> --- a/include/uapi/linux/videodev2.h
> +++ b/include/uapi/linux/videodev2.h
> @@ -2156,6 +2156,7 @@ struct v4l2_streamparm {
> #define V4L2_EVENT_FRAME_SYNC 4
> #define V4L2_EVENT_SOURCE_CHANGE 5
> #define V4L2_EVENT_MOTION_DET 6
> +#define V4L2_EVENT_OUT_FENCE 7
> #define V4L2_EVENT_PRIVATE_START 0x08000000
>
> /* Payload for V4L2_EVENT_VSYNC */
> @@ -2208,6 +2209,16 @@ struct v4l2_event_motion_det {
> __u32 region_mask;
> };
>
> +/**
> + * struct v4l2_event_out_fence - out fence fd event
> + * @index: index of the buffer queued in the driver
> + * @out_fence_fd: out-fence fd of the buffer queued
> + */
> +struct v4l2_event_out_fence {
> + __u32 index;
> + __s32 out_fence_fd;
> +};
> +
> struct v4l2_event {
> __u32 type;
> union {
> @@ -2216,6 +2227,7 @@ struct v4l2_event {
> struct v4l2_event_frame_sync frame_sync;
> struct v4l2_event_src_change src_change;
> struct v4l2_event_motion_det motion_det;
> + struct v4l2_event_out_fence out_fence;
> __u8 data[64];
> } u;
> __u32 pending;
>