[libcamera-devel] [PATCH v2 09/11] libcamera: ipu3: Map buffers in IPA

Niklas Söderlund niklas.soderlund at ragnatech.se
Wed Feb 3 11:29:52 CET 2021


Hi Jacopo,

Thanks for your comments.

On 2021-01-07 17:37:01 +0100, Jacopo Mondi wrote:
> Hi Niklas,
> 
> On Tue, Dec 29, 2020 at 05:03:16PM +0100, Niklas Söderlund wrote:
> > Map and unmap the parameters and statistic buffers in the IPA when the
> > pipeline handler allocates and frees the buffers.
> >
> > Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > ---
> >  src/libcamera/pipeline/ipu3/ipu3.cpp | 26 ++++++++++++++++++++++++++
> >  1 file changed, 26 insertions(+)
> >
> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > index 95f1b75dc8be5d40..141066c528890c8e 100644
> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > @@ -138,6 +138,8 @@ private:
> >  	ImgUDevice imgu1_;
> >  	MediaDevice *cio2MediaDev_;
> >  	MediaDevice *imguMediaDev_;
> > +
> > +	std::vector<IPABuffer> ipaBuffers_;
> >  };
> >
> >  IPU3CameraConfiguration::IPU3CameraConfiguration(IPU3CameraData *data)
> > @@ -583,6 +585,23 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera)
> >  	if (ret < 0)
> >  		return ret;
> >
> > +	/* Map buffers to the IPA. */
> > +	unsigned int ipaBufferId = 1;
> > +
> > +	for (const std::unique_ptr<FrameBuffer> &buffer : imgu->paramBuffers_) {
> > +		buffer->setCookie(ipaBufferId++);
> > +		ipaBuffers_.push_back({ .id = buffer->cookie(),
> 
> You can reserve space in ipaBuffers_

I could but I think it is a case of premature optimization as it makes 
the code harder to understand and as we know this will be redone with 
the new IPC framework I would like to have it as simple as possible 
until then.

> 
> > +					.planes = buffer->planes() });
> > +	}
> > +
> > +	for (const std::unique_ptr<FrameBuffer> &buffer : imgu->statBuffers_) {
> > +		buffer->setCookie(ipaBufferId++);
> > +		ipaBuffers_.push_back({ .id = buffer->cookie(),
> > +					.planes = buffer->planes() });
> > +	}
> > +
> > +	data->ipa_->mapBuffers(ipaBuffers_);
> > +
> >  	return 0;
> >  }
> >
> > @@ -590,6 +609,13 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera)
> >  {
> >  	IPU3CameraData *data = cameraData(camera);
> >
> > +	std::vector<unsigned int> ids;
> 
> You can reserve(ipaBuffers_.size())
> 
> > +	for (IPABuffer &ipabuf : ipaBuffers_)
> > +		ids.push_back(ipabuf.id);
> > +
> > +	data->ipa_->unmapBuffers(ids);
> > +	ipaBuffers_.clear();
> > +
> 
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> 
> Thanks
>   j
> 
> >  	data->imgu_->freeBuffers();
> >
> >  	return 0;
> > --
> > 2.29.2
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel at lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list