libcamera: pipeline_handler: Split request queueing
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> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
a645898af5
commit
6cd5c958b7
3 changed files with 42 additions and 0 deletions
|
@ -8,6 +8,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <queue>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -76,9 +77,14 @@ private:
|
||||||
void mediaDeviceDisconnected(MediaDevice *media);
|
void mediaDeviceDisconnected(MediaDevice *media);
|
||||||
virtual void disconnect();
|
virtual void disconnect();
|
||||||
|
|
||||||
|
void doQueueRequest(Request *request);
|
||||||
|
void doQueueRequests();
|
||||||
|
|
||||||
std::vector<std::shared_ptr<MediaDevice>> mediaDevices_;
|
std::vector<std::shared_ptr<MediaDevice>> mediaDevices_;
|
||||||
std::vector<std::weak_ptr<Camera>> cameras_;
|
std::vector<std::weak_ptr<Camera>> cameras_;
|
||||||
|
|
||||||
|
std::queue<Request *> waitingRequests_;
|
||||||
|
|
||||||
const char *name_;
|
const char *name_;
|
||||||
|
|
||||||
friend class PipelineHandlerFactory;
|
friend class PipelineHandlerFactory;
|
||||||
|
|
|
@ -58,6 +58,15 @@ TRACEPOINT_EVENT_INSTANCE(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
TRACEPOINT_EVENT_INSTANCE(
|
||||||
|
libcamera,
|
||||||
|
request,
|
||||||
|
request_device_queue,
|
||||||
|
TP_ARGS(
|
||||||
|
libcamera::Request *, req
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
TRACEPOINT_EVENT_INSTANCE(
|
TRACEPOINT_EVENT_INSTANCE(
|
||||||
libcamera,
|
libcamera,
|
||||||
request,
|
request,
|
||||||
|
|
|
@ -312,6 +312,17 @@ void PipelineHandler::queueRequest(Request *request)
|
||||||
{
|
{
|
||||||
LIBCAMERA_TRACEPOINT(request_queue, 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 *camera = request->_d()->camera();
|
||||||
Camera::Private *data = camera->_d();
|
Camera::Private *data = camera->_d();
|
||||||
data->queuedRequests_.push_back(request);
|
data->queuedRequests_.push_back(request);
|
||||||
|
@ -325,6 +336,22 @@ void PipelineHandler::queueRequest(Request *request)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Queue requests to the device
|
||||||
|
*
|
||||||
|
* Iterate the list of waiting requests and queue them to the device one
|
||||||
|
* by one.
|
||||||
|
*/
|
||||||
|
void PipelineHandler::doQueueRequests()
|
||||||
|
{
|
||||||
|
while (!waitingRequests_.empty()) {
|
||||||
|
Request *request = waitingRequests_.front();
|
||||||
|
waitingRequests_.pop();
|
||||||
|
|
||||||
|
doQueueRequest(request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \fn PipelineHandler::queueRequestDevice()
|
* \fn PipelineHandler::queueRequestDevice()
|
||||||
* \brief Queue a request to the device
|
* \brief Queue a request to the device
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue