[libcamera-devel] [PATCH v2 04/12] libcamera: request: Add Fence to Request::addBuffer()

Jacopo Mondi jacopo at jmondi.org
Sat Nov 20 12:13:05 CET 2021


Add an overloaded version of Request::addBuffer() that allows
application to specify a Fence instance to be associated with the
Framebuffer.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 include/libcamera/request.h |  5 ++++
 src/libcamera/request.cpp   | 58 ++++++++++++++++++++++++++++---------
 2 files changed, 50 insertions(+), 13 deletions(-)

diff --git a/include/libcamera/request.h b/include/libcamera/request.h
index f0c5163d987e..37aebc41834e 100644
--- a/include/libcamera/request.h
+++ b/include/libcamera/request.h
@@ -22,6 +22,7 @@ namespace libcamera {
 
 class Camera;
 class CameraControlValidator;
+class Fence;
 class FrameBuffer;
 class Stream;
 
@@ -52,6 +53,8 @@ public:
 	ControlList &metadata() { return *metadata_; }
 	const BufferMap &buffers() const { return bufferMap_; }
 	int addBuffer(const Stream *stream, FrameBuffer *buffer);
+	int addBuffer(const Stream *stream, FrameBuffer *buffer,
+		      std::unique_ptr<Fence> &&fence);
 	FrameBuffer *findBuffer(const Stream *stream) const;
 
 	uint32_t sequence() const;
@@ -65,6 +68,8 @@ public:
 private:
 	LIBCAMERA_DISABLE_COPY(Request)
 
+	int _addBuffer(const Stream *stream, FrameBuffer *buffer);
+
 	ControlList *controls_;
 	ControlList *metadata_;
 	BufferMap bufferMap_;
diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
index 90c436648405..1d47698a6263 100644
--- a/src/libcamera/request.cpp
+++ b/src/libcamera/request.cpp
@@ -19,6 +19,7 @@
 
 #include "libcamera/internal/camera.h"
 #include "libcamera/internal/camera_controls.h"
+#include "libcamera/internal/fence.h"
 #include "libcamera/internal/framebuffer.h"
 #include "libcamera/internal/tracepoints.h"
 
@@ -316,6 +317,26 @@ void Request::reuse(ReuseFlag flags)
  * \return The map of Stream to FrameBuffer
  */
 
+int Request::_addBuffer(const Stream *stream, FrameBuffer *buffer)
+{
+	if (!stream) {
+		LOG(Request, Error) << "Invalid stream reference";
+		return -EINVAL;
+	}
+
+	auto it = bufferMap_.find(stream);
+	if (it != bufferMap_.end()) {
+		LOG(Request, Error) << "FrameBuffer already set for stream";
+		return -EEXIST;
+	}
+
+	buffer->_d()->setRequest(this);
+	_d()->pending_.insert(buffer);
+	bufferMap_[stream] = buffer;
+
+	return 0;
+}
+
 /**
  * \brief Add a FrameBuffer with its associated Stream to the Request
  * \param[in] stream The stream the buffer belongs to
@@ -334,22 +355,33 @@ void Request::reuse(ReuseFlag flags)
  */
 int Request::addBuffer(const Stream *stream, FrameBuffer *buffer)
 {
-	if (!stream) {
-		LOG(Request, Error) << "Invalid stream reference";
-		return -EINVAL;
-	}
+	int ret = _addBuffer(stream, buffer);
+	if (ret)
+		return ret;
+
+	/*
+	 * Drop the buffer Fence, if any.
+	 *
+	 * Buffers can be re-used and might still have a Fence associated from
+	 * a previous run if the Fence has failed. Drop it here.
+	 */
+	buffer->_d()->closeFence();
 
-	auto it = bufferMap_.find(stream);
-	if (it != bufferMap_.end()) {
-		LOG(Request, Error) << "FrameBuffer already set for stream";
-		return -EEXIST;
-	}
+	return 0;
+}
 
-	buffer->_d()->setRequest(this);
-	_d()->pending_.insert(buffer);
-	bufferMap_[stream] = buffer;
+/**
+ * \brief Add a FrameBuffer with its associated Stream and Fence
+ * \copydoc Request::addBuffer(const Stream *stream, FrameBuffer *buffer)
+ * \param[in] fence The synchronization fence associated with \a buffer
+ */
+int Request::addBuffer(const Stream *stream, FrameBuffer *buffer,
+		       std::unique_ptr<Fence> &&fence)
+{
+	if (fence->isValid())
+		buffer->_d()->setFence(std::move(fence));
 
-	return 0;
+	return _addBuffer(stream, buffer);
 }
 
 /**
-- 
2.33.1



More information about the libcamera-devel mailing list