libcamera: add DmaBufAllocator::exportBuffers()

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>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Harvey Yang 2024-10-22 07:43:37 +00:00 committed by Kieran Bingham
parent 83c5ad0fac
commit 168488275a
2 changed files with 70 additions and 0 deletions

View file

@ -7,11 +7,17 @@
#pragma once
#include <memory>
#include <string>
#include <vector>
#include <libcamera/base/flags.h>
#include <libcamera/base/unique_fd.h>
namespace libcamera {
class FrameBuffer;
class DmaBufAllocator
{
public:
@ -28,7 +34,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> &planeSizes,
std::vector<std::unique_ptr<FrameBuffer>> *buffers);
private:
std::unique_ptr<FrameBuffer> createBuffer(
std::string name, const std::vector<unsigned int> &planeSizes);
UniqueFD allocFromHeap(const char *name, std::size_t size);
UniqueFD allocFromUDmaBuf(const char *name, std::size_t size);
UniqueFD providerHandle_;

View file

@ -22,6 +22,9 @@
#include <libcamera/base/log.h>
#include <libcamera/base/memfd.h>
#include <libcamera/base/shared_fd.h>
#include <libcamera/framebuffer.h>
/**
* \file dma_buf_allocator.cpp
@ -205,4 +208,58 @@ 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] planeSizes The sizes of planes in each FrameBuffer
* \param[out] buffers Array of buffers successfully allocated
*
* Planes in a FrameBuffer are allocated with a single dma buf.
* \todo Add the option to allocate each plane with a dma buf respectively.
*
* \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> &planeSizes,
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), planeSizes);
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> &planeSizes)
{
std::vector<FrameBuffer::Plane> planes;
unsigned int frameSize = 0, offset = 0;
for (auto planeSize : planeSizes)
frameSize += planeSize;
SharedFD fd(alloc(name.c_str(), frameSize));
if (!fd.isValid())
return nullptr;
for (auto planeSize : planeSizes) {
planes.emplace_back(FrameBuffer::Plane{ fd, offset, planeSize });
offset += planeSize;
}
return std::make_unique<FrameBuffer>(planes);
}
} /* namespace libcamera */