Message ID | 20211130233634.34173-8-jacopo@jmondi.org |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
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
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
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(+)