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

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Nov 21 19:07:17 CET 2021


Hi Jacopo,

Thank you for the patch.

On Sat, Nov 20, 2021 at 12:13:04PM +0100, Jacopo Mondi wrote:
> 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(); }

I think I'd call this resetFence(). Another option would be to call
setFence(nullptr) instead, and drop the function. I think resetFence()
would be better, I'm thinking it could return the
std::unique_ptr<Fence>, in order to extract the fence from the
FrameBuffer when the request completes. We would need a resetFence()
function in the FrameBuffer class too, which could replace the existing
fence() function. I'll comment further on that in subsequent patches.

> +	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

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list