[libcamera-devel] [PATCH 05/10] libcamera: request: Add support for fences

Jacopo Mondi jacopo at jmondi.org
Thu Oct 28 13:15:15 CEST 2021


Prepare the Request::Private class to handle fences by providing a
storage vector and interface functions to handle the number of pending
and expired fences.

The intended user of the interface is the PipelineHandler class

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 include/libcamera/internal/request.h | 21 +++++++
 src/libcamera/request.cpp            | 89 +++++++++++++++++++++++++++-
 2 files changed, 109 insertions(+), 1 deletion(-)

diff --git a/include/libcamera/internal/request.h b/include/libcamera/internal/request.h
index df0cc014067e..2be4874756de 100644
--- a/include/libcamera/internal/request.h
+++ b/include/libcamera/internal/request.h
@@ -7,8 +7,12 @@
 #ifndef __LIBCAMERA_INTERNAL_REQUEST_H__
 #define __LIBCAMERA_INTERNAL_REQUEST_H__
 
+#include <vector>
+
 #include <libcamera/request.h>
 
+#include <libcamera/internal/fence.h>
+
 namespace libcamera {
 
 class Camera;
@@ -24,9 +28,26 @@ public:
 
 	Camera *camera() const { return camera_; }
 
+	unsigned int pendingFences() const { return pendingFences_; }
+	unsigned int expiredFences() const { return expiredFences_; }
+
+	void reuse();
+
+	std::vector<Fence> &fences() { return fences_; }
+	void addFence(Fence &&fence);
+	void clearFences();
+
+	void fenceExpired();
+	void fenceCompleted();
+
 private:
 	Camera *camera_;
 	bool cancelled_;
+
+	unsigned int pendingFences_ = 0;
+	unsigned int expiredFences_ = 0;
+
+	std::vector<Fence> fences_;
 };
 
 } /* namespace libcamera */
diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
index 33fee1ac05ba..e88eee1fac36 100644
--- a/src/libcamera/request.cpp
+++ b/src/libcamera/request.cpp
@@ -63,6 +63,92 @@ Request::Private::~Private()
  * request hasn't been queued
  */
 
+/**
+ * \fn Request::Private::pendingFences()
+ * \brief Retrieve the number of pending fences
+ *
+ * A Fence is pending if has not yet been signalled or it has not expired yet.
+ *
+ * \return The number of pending fences
+ */
+
+/**
+ * \fn Request::Private::expiredFences()
+ * \brief Retrieve the number of expired fences
+ * \return The number of expired fences
+ */
+
+/**
+ * \brief Reset the request for reuse
+ */
+void Request::Private::reuse()
+{
+	cancelled_ = false;
+
+	fences_.clear();
+	pendingFences_ = 0;
+	expiredFences_ = 0;
+}
+
+/**
+ * \fn Request::Private::fences()
+ * \brief Retrieve a reference to the vector of pending fences
+ * \return A reference to the vector of pending fences
+ */
+
+/**
+ * \brief Move a Fence into the Request
+ *
+ * Move a Fence into the Request and increase the pending fences
+ * counter. The Fence is now stored into the Request and the original
+ * one passed in as parameter is reset.
+ *
+ * Once the Fence completes, either because it is signalled or because
+ * it has expired, the caller shall notify the Request about this by
+ * calling fenceCompleted() or fenceExpired();
+ */
+void Request::Private::addFence(Fence &&fence)
+{
+	fences_.push_back(std::move(fence));
+	pendingFences_++;
+}
+
+/**
+ * \brief Release all Fences stored in the request
+ *
+ * Clear the vector of fences in the Request by releasing all of them.
+ * All Fences are closed and their file descriptors reset to 0.
+ */
+void Request::Private::clearFences()
+{
+	ASSERT(!pendingFences_);
+	fences_.clear();
+}
+
+/**
+ * \brief Notify that a Fence has been signalled
+ *
+ * Notify to the Request that a Fence has completed. This function decrease the
+ * number of pending Fences in the request.
+ */
+void Request::Private::fenceCompleted()
+{
+	pendingFences_--;
+}
+
+/**
+ * \brief Notify that a Fence has expired
+ *
+ * Notify to the Request that a Fence has expired. This function decrease the
+ * number of pending Fences in the request and increase the number of expired
+ * ones.
+ */
+void Request::Private::fenceExpired()
+{
+	expiredFences_++;
+	pendingFences_--;
+}
+
 /**
  * \enum Request::Status
  * Request completion status
@@ -158,10 +244,11 @@ void Request::reuse(ReuseFlag flags)
 
 	sequence_ = 0;
 	status_ = RequestPending;
-	_d()->cancelled_ = false;
 
 	controls_->clear();
 	metadata_->clear();
+
+	_d()->reuse();
 }
 
 /**
-- 
2.33.1



More information about the libcamera-devel mailing list