ipa: Switch to FrameBuffer interface

Switch the IPA interfaces and implementations to use the Framebuffer
interface.

- The IPA interface is switched to use the simpler FrameBuffer::Plane
  container when carrying dmabuf descriptions (fd and length) over the
  pipeline/IPA boundary.

- The RkISP1 IPA implementation takes advantage of the new simpler and
  safer (better control over file descriptors) FrameBuffer interface.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Niklas Söderlund
2019-11-25 22:14:40 +01:00
parent de9243bdc1
commit 007517618c
7 changed files with 76 additions and 43 deletions

View File

@@ -149,15 +149,15 @@ void IPAContextWrapper::mapBuffers(const std::vector<IPABuffer> &buffers)
for (unsigned int i = 0; i < buffers.size(); ++i) {
struct ipa_buffer &c_buffer = c_buffers[i];
const IPABuffer &buffer = buffers[i];
const std::vector<Plane> &planes = buffer.memory.planes();
const std::vector<FrameBuffer::Plane> &planes = buffer.planes;
c_buffer.id = buffer.id;
c_buffer.num_planes = planes.size();
for (unsigned int j = 0; j < planes.size(); ++j) {
const Plane &plane = planes[j];
c_buffer.planes[j].dmabuf = plane.dmabuf();
c_buffer.planes[j].length = plane.length();
const FrameBuffer::Plane &plane = planes[j];
c_buffer.planes[j].dmabuf = plane.fd.fd();
c_buffer.planes[j].length = plane.length;
}
}

View File

@@ -334,11 +334,10 @@ namespace libcamera {
*/
/**
* \var IPABuffer::memory
* \brief The buffer memory description
* \var IPABuffer::planes
* \brief The buffer planes description
*
* The memory field stores the dmabuf handle and size for each plane of the
* buffer.
* Stores the dmabuf handle and length for each plane of the buffer.
*/
/**

View File

@@ -687,14 +687,22 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera,
}
for (unsigned int i = 0; i < stream->configuration().bufferCount + 1; i++) {
FrameBuffer::Plane plane;
plane.fd = FileDescriptor(paramPool_.buffers()[i].planes()[0].dmabuf());
plane.length = paramPool_.buffers()[i].planes()[0].length();
data->ipaBuffers_.push_back({ .id = RKISP1_PARAM_BASE | i,
.memory = paramPool_.buffers()[i] });
.planes = { plane } });
paramBuffers_.push(new Buffer(i));
}
for (unsigned int i = 0; i < stream->configuration().bufferCount + 1; i++) {
FrameBuffer::Plane plane;
plane.fd = FileDescriptor(statPool_.buffers()[i].planes()[0].dmabuf());
plane.length = statPool_.buffers()[i].planes()[0].length();
data->ipaBuffers_.push_back({ .id = RKISP1_STAT_BASE | i,
.memory = statPool_.buffers()[i] });
.planes = { plane } });
statBuffers_.push(new Buffer(i));
}