Message ID | 20240827153349.2893413-1-chenghaoyang@google.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi if you really want to send vX.y updates (which I would only suggest for smaller updates when a series is very close to be collected) you have to reply to the original patch using the --in-reply-to= option of git-send-email. Please don't send updates like this as a standlone series otherwise collecting and appling them gets hard for reviewers. Not a big deal, I guess you'll need a new version of the series anyway. Thanks j On Tue, Aug 27, 2024 at 03:33:38PM GMT, Harvey Yang wrote: > Add a helper function exportBuffers in DmaBufAllocator to make it easier > to use. > > It'll be used in Virtual Pipeline Handler and SoftwareIsp. > > Signed-off-by: Harvey Yang <chenghaoyang@chromium.org> > --- > .../libcamera/internal/dma_buf_allocator.h | 12 ++++ > src/libcamera/dma_buf_allocator.cpp | 55 +++++++++++++++++++ > 2 files changed, 67 insertions(+) > > diff --git a/include/libcamera/internal/dma_buf_allocator.h b/include/libcamera/internal/dma_buf_allocator.h > index 36ec1696b..49122ed95 100644 > --- a/include/libcamera/internal/dma_buf_allocator.h > +++ b/include/libcamera/internal/dma_buf_allocator.h > @@ -7,13 +7,18 @@ > > #pragma once > > +#include <memory> > #include <stddef.h> > +#include <string> > +#include <vector> > > #include <libcamera/base/flags.h> > #include <libcamera/base/unique_fd.h> > > namespace libcamera { > > +class FrameBuffer; > + > class DmaBufAllocator > { > public: > @@ -30,7 +35,14 @@ public: > bool isValid() const { return providerHandle_.isValid(); } > UniqueFD alloc(const char *name, std::size_t size); > > + int exportBuffers(unsigned int count, > + const std::vector<unsigned int> &frameSize, > + std::vector<std::unique_ptr<FrameBuffer>> *buffers); > + > private: > + std::unique_ptr<FrameBuffer> createBuffer( > + std::string name, const std::vector<unsigned int> &frameSizes); > + > UniqueFD allocFromHeap(const char *name, std::size_t size); > UniqueFD allocFromUDmaBuf(const char *name, std::size_t size); > UniqueFD providerHandle_; > diff --git a/src/libcamera/dma_buf_allocator.cpp b/src/libcamera/dma_buf_allocator.cpp > index be6efb89f..d2ac175f0 100644 > --- a/src/libcamera/dma_buf_allocator.cpp > +++ b/src/libcamera/dma_buf_allocator.cpp > @@ -23,6 +23,10 @@ > #include <libcamera/base/log.h> > #include <libcamera/base/memfd.h> > > +#include <libcamera/framebuffer.h> > + > +#include "libcamera/internal/formats.h" > + > /** > * \file dma_buf_allocator.cpp > * \brief dma-buf allocator > @@ -205,4 +209,55 @@ UniqueFD DmaBufAllocator::alloc(const char *name, std::size_t size) > return allocFromHeap(name, size); > } > > +/** > + * \brief Allocate and export buffers from the DmaBufAllocator > + * \param[in] count The number of requested FrameBuffers > + * \param[in] frameSizes The sizes of planes in each FrameBuffer > + * \param[out] buffers Array of buffers successfully allocated > + * > + * \return The number of allocated buffers on success or a negative error code > + * otherwise > + */ > +int DmaBufAllocator::exportBuffers(unsigned int count, > + const std::vector<unsigned int> &frameSizes, > + std::vector<std::unique_ptr<FrameBuffer>> *buffers) > +{ > + for (unsigned int i = 0; i < count; ++i) { > + std::unique_ptr<FrameBuffer> buffer = > + createBuffer("frame-" + std::to_string(i), frameSizes); > + if (!buffer) { > + LOG(DmaBufAllocator, Error) << "Unable to create buffer"; > + > + buffers->clear(); > + return -EINVAL; > + } > + > + buffers->push_back(std::move(buffer)); > + } > + > + return count; > +} > + > +std::unique_ptr<FrameBuffer> > +DmaBufAllocator::createBuffer(std::string name, > + const std::vector<unsigned int> &frameSizes) > +{ > + std::vector<FrameBuffer::Plane> planes; > + > + unsigned int bufferSize = 0, offset = 0; > + for (auto frameSize : frameSizes) > + bufferSize += frameSize; > + > + SharedFD fd(alloc(name.c_str(), bufferSize)); > + if (!fd.isValid()) > + return nullptr; > + > + for (auto frameSize : frameSizes) { > + planes.emplace_back(FrameBuffer::Plane{ fd, offset, frameSize }); > + offset += frameSize; > + } > + > + return std::make_unique<FrameBuffer>(planes); > +} > + > } /* namespace libcamera */ > -- > 2.46.0.295.g3b9ea8a38a-goog >
diff --git a/include/libcamera/internal/dma_buf_allocator.h b/include/libcamera/internal/dma_buf_allocator.h index 36ec1696b..49122ed95 100644 --- a/include/libcamera/internal/dma_buf_allocator.h +++ b/include/libcamera/internal/dma_buf_allocator.h @@ -7,13 +7,18 @@ #pragma once +#include <memory> #include <stddef.h> +#include <string> +#include <vector> #include <libcamera/base/flags.h> #include <libcamera/base/unique_fd.h> namespace libcamera { +class FrameBuffer; + class DmaBufAllocator { public: @@ -30,7 +35,14 @@ public: bool isValid() const { return providerHandle_.isValid(); } UniqueFD alloc(const char *name, std::size_t size); + int exportBuffers(unsigned int count, + const std::vector<unsigned int> &frameSize, + std::vector<std::unique_ptr<FrameBuffer>> *buffers); + private: + std::unique_ptr<FrameBuffer> createBuffer( + std::string name, const std::vector<unsigned int> &frameSizes); + UniqueFD allocFromHeap(const char *name, std::size_t size); UniqueFD allocFromUDmaBuf(const char *name, std::size_t size); UniqueFD providerHandle_; diff --git a/src/libcamera/dma_buf_allocator.cpp b/src/libcamera/dma_buf_allocator.cpp index be6efb89f..d2ac175f0 100644 --- a/src/libcamera/dma_buf_allocator.cpp +++ b/src/libcamera/dma_buf_allocator.cpp @@ -23,6 +23,10 @@ #include <libcamera/base/log.h> #include <libcamera/base/memfd.h> +#include <libcamera/framebuffer.h> + +#include "libcamera/internal/formats.h" + /** * \file dma_buf_allocator.cpp * \brief dma-buf allocator @@ -205,4 +209,55 @@ UniqueFD DmaBufAllocator::alloc(const char *name, std::size_t size) return allocFromHeap(name, size); } +/** + * \brief Allocate and export buffers from the DmaBufAllocator + * \param[in] count The number of requested FrameBuffers + * \param[in] frameSizes The sizes of planes in each FrameBuffer + * \param[out] buffers Array of buffers successfully allocated + * + * \return The number of allocated buffers on success or a negative error code + * otherwise + */ +int DmaBufAllocator::exportBuffers(unsigned int count, + const std::vector<unsigned int> &frameSizes, + std::vector<std::unique_ptr<FrameBuffer>> *buffers) +{ + for (unsigned int i = 0; i < count; ++i) { + std::unique_ptr<FrameBuffer> buffer = + createBuffer("frame-" + std::to_string(i), frameSizes); + if (!buffer) { + LOG(DmaBufAllocator, Error) << "Unable to create buffer"; + + buffers->clear(); + return -EINVAL; + } + + buffers->push_back(std::move(buffer)); + } + + return count; +} + +std::unique_ptr<FrameBuffer> +DmaBufAllocator::createBuffer(std::string name, + const std::vector<unsigned int> &frameSizes) +{ + std::vector<FrameBuffer::Plane> planes; + + unsigned int bufferSize = 0, offset = 0; + for (auto frameSize : frameSizes) + bufferSize += frameSize; + + SharedFD fd(alloc(name.c_str(), bufferSize)); + if (!fd.isValid()) + return nullptr; + + for (auto frameSize : frameSizes) { + planes.emplace_back(FrameBuffer::Plane{ fd, offset, frameSize }); + offset += frameSize; + } + + return std::make_unique<FrameBuffer>(planes); +} + } /* namespace libcamera */
Add a helper function exportBuffers in DmaBufAllocator to make it easier to use. It'll be used in Virtual Pipeline Handler and SoftwareIsp. Signed-off-by: Harvey Yang <chenghaoyang@chromium.org> --- .../libcamera/internal/dma_buf_allocator.h | 12 ++++ src/libcamera/dma_buf_allocator.cpp | 55 +++++++++++++++++++ 2 files changed, 67 insertions(+)