Hi Hans, Jacopo, On Mon, Oct 28, 2024 at 04:02:13PM +0100, Hans Verkuil wrote: > On 28/10/2024 15:35, Jacopo Mondi wrote: > > There apparently is no reason to require 3 queued buffers to call > > streamon() for the RkISP1 as the driver operates with a scratch buffer > > where frames can be directed to if there's no available buffer provided > > by userspace. > > > > Reduce the number of required buffers to 0 to allow applications to > > operate by queueing capture buffers on-demand. > > > > Tested with libcamera, by operating with a single capture request. The > > same request (and associated capture buffer) gets recycled once > > completed. This of course causes a frame rate drop but doesn't hinder > > operations. > > > > Signed-off-by: Jacopo Mondi <jacopo.mondi@xxxxxxxxxxxxxxxx> > > --- > > The first version of this patch set min_queued_buffers to 1, but setting it > > to 0 doesn't compromise operations and it's even better as it allows application > > to queue buffers to the capture devices on-demand. If a buffer is not provided > > to the DMA engines, image data gets directed to the driver's internal scratch > > buffer. > > --- > > drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c | 4 +--- > > 1 file changed, 1 insertion(+), 3 deletions(-) > > > > diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c > > index 2bddb4fa8a5c..5fcf9731f41b 100644 > > --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c > > +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c > > @@ -35,8 +35,6 @@ > > #define RKISP1_SP_DEV_NAME RKISP1_DRIVER_NAME "_selfpath" > > #define RKISP1_MP_DEV_NAME RKISP1_DRIVER_NAME "_mainpath" > > > > -#define RKISP1_MIN_BUFFERS_NEEDED 3 > > - > > enum rkisp1_plane { > > RKISP1_PLANE_Y = 0, > > RKISP1_PLANE_CB = 1, > > @@ -1563,7 +1561,7 @@ static int rkisp1_register_capture(struct rkisp1_capture *cap) > > q->ops = &rkisp1_vb2_ops; > > q->mem_ops = &vb2_dma_contig_memops; > > q->buf_struct_size = sizeof(struct rkisp1_buffer); > > - q->min_queued_buffers = RKISP1_MIN_BUFFERS_NEEDED; > > + q->min_queued_buffers = 0; > > You can probably just drop this since the vb2_queue struct is zeroed when it > is allocated. So no need to set it to 0. > > And is the RKISP1_MIN_BUFFERS_NEEDED define still needed after this change? Probably not, as the patch drops the define :-) > Also, see my RFC I posted today: > > https://lore.kernel.org/linux-media/126cd76a-6224-483b-a18d-a3cc89e5ff2d@xxxxxxxxx/T/#u > > My main concern is that applications that just call VIDIOC_REQBUFS with count = 1 > and expect the driver to change that to a workable value, will, in fact, now just get > one buffer. And streaming that will cause lots of frame drops. > > It makes sense to leave min_queued_buffers at 0 if a scratch buffer is available, > but I'm unhappy with the fact that you get a poor experience when REQBUFS(1) is called. The rkisp1 driver requires a device-specific userspace, so I don't think we need to care about old and/or dumb applications calling REQBUFS(1). > My RFC suggests improvements in the uAPI. With that in place you can use CREATE_BUFS in > libcamera to get much better control over how many buffers should be allocated. > > > q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; > > q->lock = &node->vlock; > > q->dev = cap->rkisp1->dev; Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> -- Regards, Laurent Pinchart