[libcamera-devel,v3,07/11] libcamera: pipeline_handler: Split request queueing
diff mbox series

Message ID 20211130233634.34173-8-jacopo@jmondi.org
State Superseded
Headers show
Series
  • libcamera: Add support for Fence
Related show

Commit Message

Jacopo Mondi Nov. 30, 2021, 11:36 p.m. UTC
In order to prepare to handle synchronization fences at Request
queueing time, split the PipelineHandler::queueRequest() function in
two, by creating a list of waiting requests and introducing the
doQueueRequest() function that queues requests to the device in the
order the pipeline has received them.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 include/libcamera/internal/pipeline_handler.h |  6 ++++
 .../libcamera/internal/tracepoints/request.tp |  9 ++++++
 src/libcamera/pipeline_handler.cpp            | 30 +++++++++++++++++++
 3 files changed, 45 insertions(+)

Comments

Laurent Pinchart Dec. 1, 2021, 1:54 a.m. UTC | #1
Hi Jacopo,

Thank you for the patch.

On Wed, Dec 01, 2021 at 12:36:30AM +0100, Jacopo Mondi wrote:
> In order to prepare to handle synchronization fences at Request
> queueing time, split the PipelineHandler::queueRequest() function in
> two, by creating a list of waiting requests and introducing the
> doQueueRequest() function that queues requests to the device in the
> order the pipeline has received them.
> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> ---
>  include/libcamera/internal/pipeline_handler.h |  6 ++++
>  .../libcamera/internal/tracepoints/request.tp |  9 ++++++
>  src/libcamera/pipeline_handler.cpp            | 30 +++++++++++++++++++
>  3 files changed, 45 insertions(+)
> 
> diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
> index 3de27ae93645..6aa3378547ba 100644
> --- a/include/libcamera/internal/pipeline_handler.h
> +++ b/include/libcamera/internal/pipeline_handler.h
> @@ -8,6 +8,7 @@
>  #pragma once
>  
>  #include <memory>
> +#include <queue>
>  #include <set>
>  #include <string>
>  #include <sys/types.h>
> @@ -76,9 +77,14 @@ private:
>  	void mediaDeviceDisconnected(MediaDevice *media);
>  	virtual void disconnect();
>  
> +	void doQueueRequest(Request *request);
> +	void doQueueRequests();
> +
>  	std::vector<std::shared_ptr<MediaDevice>> mediaDevices_;
>  	std::vector<std::weak_ptr<Camera>> cameras_;
>  
> +	std::queue<Request *> waitingRequests_;
> +
>  	const char *name_;
>  
>  	friend class PipelineHandlerFactory;
> diff --git a/include/libcamera/internal/tracepoints/request.tp b/include/libcamera/internal/tracepoints/request.tp
> index f039ffd4f88d..f1e54497aa03 100644
> --- a/include/libcamera/internal/tracepoints/request.tp
> +++ b/include/libcamera/internal/tracepoints/request.tp
> @@ -58,6 +58,15 @@ TRACEPOINT_EVENT_INSTANCE(
>  	)
>  )
>  
> +TRACEPOINT_EVENT_INSTANCE(
> +	libcamera,
> +	request,
> +	request_device_queue,
> +	TP_ARGS(
> +		libcamera::Request *, req
> +	)
> +)
> +
>  TRACEPOINT_EVENT_INSTANCE(
>  	libcamera,
>  	request,
> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> index 67fdf1d8db01..2aa62e474195 100644
> --- a/src/libcamera/pipeline_handler.cpp
> +++ b/src/libcamera/pipeline_handler.cpp
> @@ -312,6 +312,17 @@ void PipelineHandler::queueRequest(Request *request)
>  {
>  	LIBCAMERA_TRACEPOINT(request_queue, request);
>  
> +	waitingRequests_.push(request);
> +	doQueueRequests();
> +}
> +
> +/**
> + * \brief Queue one requests to the device
> + */
> +void PipelineHandler::doQueueRequest(Request *request)
> +{
> +	LIBCAMERA_TRACEPOINT(request_device_queue, request);
> +
>  	Camera *camera = request->_d()->camera();
>  	Camera::Private *data = camera->_d();
>  	data->queuedRequests_.push_back(request);
> @@ -325,6 +336,25 @@ void PipelineHandler::queueRequest(Request *request)
>  	}
>  }
>  
> +/**
> + * \brief Queue requests to the device
> + *
> + * Iterate the lst of waiting requests and queue them to the hardware one

s/lst/list/
s/hardware/device/

> + * by one.
> + */
> +void PipelineHandler::doQueueRequests()
> +{
> +	while (true) {
> +		if (waitingRequests_.empty())
> +			return;

	while (!waitingRequests_.empty()) {

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> +
> +		Request *request = waitingRequests_.front();
> +		waitingRequests_.pop();
> +
> +		doQueueRequest(request);
> +	}
> +}
> +
>  /**
>   * \fn PipelineHandler::queueRequestDevice()
>   * \brief Queue a request to the device

Patch
diff mbox series

diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index 3de27ae93645..6aa3378547ba 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -8,6 +8,7 @@ 
 #pragma once
 
 #include <memory>
+#include <queue>
 #include <set>
 #include <string>
 #include <sys/types.h>
@@ -76,9 +77,14 @@  private:
 	void mediaDeviceDisconnected(MediaDevice *media);
 	virtual void disconnect();
 
+	void doQueueRequest(Request *request);
+	void doQueueRequests();
+
 	std::vector<std::shared_ptr<MediaDevice>> mediaDevices_;
 	std::vector<std::weak_ptr<Camera>> cameras_;
 
+	std::queue<Request *> waitingRequests_;
+
 	const char *name_;
 
 	friend class PipelineHandlerFactory;
diff --git a/include/libcamera/internal/tracepoints/request.tp b/include/libcamera/internal/tracepoints/request.tp
index f039ffd4f88d..f1e54497aa03 100644
--- a/include/libcamera/internal/tracepoints/request.tp
+++ b/include/libcamera/internal/tracepoints/request.tp
@@ -58,6 +58,15 @@  TRACEPOINT_EVENT_INSTANCE(
 	)
 )
 
+TRACEPOINT_EVENT_INSTANCE(
+	libcamera,
+	request,
+	request_device_queue,
+	TP_ARGS(
+		libcamera::Request *, req
+	)
+)
+
 TRACEPOINT_EVENT_INSTANCE(
 	libcamera,
 	request,
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 67fdf1d8db01..2aa62e474195 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -312,6 +312,17 @@  void PipelineHandler::queueRequest(Request *request)
 {
 	LIBCAMERA_TRACEPOINT(request_queue, request);
 
+	waitingRequests_.push(request);
+	doQueueRequests();
+}
+
+/**
+ * \brief Queue one requests to the device
+ */
+void PipelineHandler::doQueueRequest(Request *request)
+{
+	LIBCAMERA_TRACEPOINT(request_device_queue, request);
+
 	Camera *camera = request->_d()->camera();
 	Camera::Private *data = camera->_d();
 	data->queuedRequests_.push_back(request);
@@ -325,6 +336,25 @@  void PipelineHandler::queueRequest(Request *request)
 	}
 }
 
+/**
+ * \brief Queue requests to the device
+ *
+ * Iterate the lst of waiting requests and queue them to the hardware one
+ * by one.
+ */
+void PipelineHandler::doQueueRequests()
+{
+	while (true) {
+		if (waitingRequests_.empty())
+			return;
+
+		Request *request = waitingRequests_.front();
+		waitingRequests_.pop();
+
+		doQueueRequest(request);
+	}
+}
+
 /**
  * \fn PipelineHandler::queueRequestDevice()
  * \brief Queue a request to the device