@@ -335,6 +335,10 @@ int SoftwareIspPipelineGpu::start()
/* Raw bayer input as texture */
eglImageBayerIn_ = std::make_unique<eGLImage>(gpuIspShaderPassDemosiac_.glFormat_, inputConfig_.stride / gpuIspShaderPassDemosiac_.getBytesPerPixel(), height_, inputConfig_.stride, GL_TEXTURE0, 0);
+ /* Intermediary ping/pong textures */
+ eglImagePingPong_[0] = std::make_unique<eGLImage>(gpuIspShaderPassDemosiac_.glFormat_, outputSize_.width, outputSize_.height, outputConfig_.stride, GL_TEXTURE1, 1);
+ eglImagePingPong_[1] = std::make_unique<eGLImage>(gpuIspShaderPassDemosiac_.glFormat_, outputSize_.width, outputSize_.height, outputConfig_.stride, GL_TEXTURE2, 2);
+
/* Texture we will render to */
eglImageRGBAOut_ = std::make_unique<eGLImage>(GL_RGBA, outputSize_.width, outputSize_.height, outputConfig_.stride, GL_TEXTURE3, 3);
@@ -344,6 +348,8 @@ int SoftwareIspPipelineGpu::start()
void SoftwareIspPipelineGpu::stop()
{
eglImageRGBAOut_.reset();
+ eglImagePingPong_[1].reset();
+ eglImagePingPong_[0].reset();
eglImageBayerIn_.reset();
gpuIspShaderPassDemosiac_.stop();
@@ -65,6 +65,7 @@ private:
/* Pointer to object representing input texture */
std::unique_ptr<eGLImage> eglImageBayerIn_;
+ std::unique_ptr<eGLImage> eglImagePingPong_[2];
std::unique_ptr<eGLImage> eglImageRGBAOut_;
std::unique_ptr<SwStatsCpu> stats_;
Add in the Ping/Pong texture buffers, don't bind them to anything yet. Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> --- src/libcamera/software_isp/software_isp_pipeline_gpu.cpp | 6 ++++++ src/libcamera/software_isp/software_isp_pipeline_gpu.h | 1 + 2 files changed, 7 insertions(+)