[libcamera-devel] [PATCH v2 03/12] libcamera: framebuffer: private: Add Fence

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


Add to the FrameBuffer::Private class a uniquely owned Fence instance.

The Fence will be used to signal the availability of the Framebuffer to
incoming data transfer.

Add a set of function to set, cancel and retrieve a refence to the
Fence.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 include/libcamera/framebuffer.h          |  3 +++
 include/libcamera/internal/framebuffer.h |  9 ++++++++
 src/libcamera/framebuffer.cpp            | 26 ++++++++++++++++++++++++
 3 files changed, 38 insertions(+)

diff --git a/include/libcamera/framebuffer.h b/include/libcamera/framebuffer.h
index 7f2f176af691..aa2a1f5193c7 100644
--- a/include/libcamera/framebuffer.h
+++ b/include/libcamera/framebuffer.h
@@ -19,6 +19,7 @@
 
 namespace libcamera {
 
+class Fence;
 class Request;
 
 struct FrameMetadata {
@@ -66,6 +67,8 @@ public:
 	unsigned int cookie() const { return cookie_; }
 	void setCookie(unsigned int cookie) { cookie_ = cookie; }
 
+	Fence *fence() const;
+
 	void cancel() { metadata_.status = FrameMetadata::FrameCancelled; }
 
 private:
diff --git a/include/libcamera/internal/framebuffer.h b/include/libcamera/internal/framebuffer.h
index cd33c295466e..9e1699a6875d 100644
--- a/include/libcamera/internal/framebuffer.h
+++ b/include/libcamera/internal/framebuffer.h
@@ -7,10 +7,14 @@
 #ifndef __LIBCAMERA_INTERNAL_FRAMEBUFFER_H__
 #define __LIBCAMERA_INTERNAL_FRAMEBUFFER_H__
 
+#include <memory>
+
 #include <libcamera/base/class.h>
 
 #include <libcamera/framebuffer.h>
 
+#include <libcamera/internal/fence.h>
+
 namespace libcamera {
 
 class FrameBuffer::Private : public Extensible::Private
@@ -23,8 +27,13 @@ public:
 	void setRequest(Request *request) { request_ = request; }
 	bool isContiguous() const { return isContiguous_; }
 
+	void setFence(std::unique_ptr<Fence> &&fence) { fence_ = std::move(fence); }
+	void closeFence() { fence_.reset(); }
+	Fence *fence() const { return fence_.get(); }
+
 private:
 	Request *request_;
+	std::unique_ptr<Fence> fence_;
 	bool isContiguous_;
 };
 
diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp
index 337ea1155a38..63c4ce6ab450 100644
--- a/src/libcamera/framebuffer.cpp
+++ b/src/libcamera/framebuffer.cpp
@@ -126,6 +126,23 @@ FrameBuffer::Private::Private()
  * handlers, it is called by the pipeline handlers themselves.
  */
 
+/**
+ * \fn FrameBuffer::Private::setFence()
+ * \brief Set the synchronization fence for this buffer
+ * \param[in] fence The synchronization fence
+ */
+
+/**
+ * \fn FrameBuffer::Private::closeFence()
+ * \brief Close the synchronization fence for this buffer
+ */
+
+/**
+ * \fn FrameBuffer::Private::fence()
+ * \brief Retrieve a pointer to the synchronization fence of this buffer
+ * \return A pointer to the buffer fence, nullptr if the buffer has not fence
+ */
+
 /**
  * \fn FrameBuffer::Private::isContiguous()
  * \brief Check if the frame buffer stores planes contiguously in memory
@@ -305,6 +322,15 @@ Request *FrameBuffer::request() const
  * libcamera core never modifies the buffer cookie.
  */
 
+/**
+ * \brief Retrieve a reference to the Fence associated with this Framebuffer
+ * \return A pointer to the Fence, if set, nullptr otherwise
+ */
+Fence *FrameBuffer::fence() const
+{
+	return _d()->fence();
+}
+
 /**
  * \fn FrameBuffer::cancel()
  * \brief Marks the buffer as cancelled
-- 
2.33.1



More information about the libcamera-devel mailing list