[v4,20/23] ipa: simple: Add a flag to indicate gpuIspEnabled
diff mbox series

Message ID 20251120233347.5046-21-bryan.odonoghue@linaro.org
State Superseded
Headers show
Series
  • Add GLES 2.0 GPUISP to libcamera
Related show

Commit Message

Bryan O'Donoghue Nov. 20, 2025, 11:33 p.m. UTC
Flag gpuIspEnabled in the simple IPA context. This flag will allow to
selectively avoid some calculations or to generate a default CCM.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
 include/libcamera/ipa/soft.mojom            |  2 +-
 src/ipa/simple/ipa_context.h                |  1 +
 src/ipa/simple/soft_simple.cpp              |  7 +++++--
 src/libcamera/software_isp/software_isp.cpp | 13 ++++++++++---
 4 files changed, 17 insertions(+), 6 deletions(-)

Comments

Barnabás Pőcze Nov. 21, 2025, 1:45 p.m. UTC | #1
2025. 11. 21. 0:33 keltezéssel, Bryan O'Donoghue írta:
> Flag gpuIspEnabled in the simple IPA context. This flag will allow to
> selectively avoid some calculations or to generate a default CCM.
> 
> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> ---
>   include/libcamera/ipa/soft.mojom            |  2 +-
>   src/ipa/simple/ipa_context.h                |  1 +
>   src/ipa/simple/soft_simple.cpp              |  7 +++++--
>   src/libcamera/software_isp/software_isp.cpp | 13 ++++++++++---
>   4 files changed, 17 insertions(+), 6 deletions(-)
> 
> diff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom
> index 77328c5fd..ab7eeb5d5 100644
> --- a/include/libcamera/ipa/soft.mojom
> +++ b/include/libcamera/ipa/soft.mojom
> @@ -18,7 +18,7 @@ interface IPASoftInterface {
>   	     libcamera.SharedFD fdParams,
>   	     libcamera.IPACameraSensorInfo sensorInfo,
>   	     libcamera.ControlInfoMap sensorControls)
> -		=> (int32 ret, libcamera.ControlInfoMap ipaControls, bool ccmEnabled);
> +		=> (int32 ret, libcamera.ControlInfoMap ipaControls, bool ccmEnabled, bool gpuIspEnabled);

I think something is not right here. Shouldn't this be a parameter? And not a return value?
I believe this should be after `sensorControls` above.


Regards,
Barnabás Pőcze


>   	start() => (int32 ret);
>   	stop();
>   	configure(IPAConfigInfo configInfo)
> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h
> index c3081e306..ee8fb6b03 100644
> --- a/src/ipa/simple/ipa_context.h
> +++ b/src/ipa/simple/ipa_context.h
> @@ -103,6 +103,7 @@ struct IPAContext {
>   	FCQueue<IPAFrameContext> frameContexts;
>   	ControlInfoMap::Map ctrlMap;
>   	bool ccmEnabled = false;
> +	bool gpuIspEnabled = false;
>   };
> 
>   } /* namespace ipa::soft */
> diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp
> index b147aca2e..523ff07b3 100644
> --- a/src/ipa/simple/soft_simple.cpp
> +++ b/src/ipa/simple/soft_simple.cpp
> @@ -56,7 +56,8 @@ public:
>   		 const IPACameraSensorInfo &sensorInfo,
>   		 const ControlInfoMap &sensorControls,
>   		 ControlInfoMap *ipaControls,
> -		 bool *ccmEnabled) override;
> +		 bool *ccmEnabled,
> +		 bool *gpuIspEnabled) override;
>   	int configure(const IPAConfigInfo &configInfo) override;
> 
>   	int start() override;
> @@ -96,7 +97,8 @@ int IPASoftSimple::init(const IPASettings &settings,
>   			const IPACameraSensorInfo &sensorInfo,
>   			const ControlInfoMap &sensorControls,
>   			ControlInfoMap *ipaControls,
> -			bool *ccmEnabled)
> +			bool *ccmEnabled,
> +			bool *gpuIspEnabled)
>   {
>   	camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);
>   	if (!camHelper_) {
> @@ -106,6 +108,7 @@ int IPASoftSimple::init(const IPASettings &settings,
>   	}
> 
>   	context_.sensorInfo = sensorInfo;
> +	context_.gpuIspEnabled = *gpuIspEnabled;
> 
>   	/* Load the tuning data file */
>   	File file(settings.configurationFile);
> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
> index 9944ca573..7f3f7b0bc 100644
> --- a/src/libcamera/software_isp/software_isp.cpp
> +++ b/src/libcamera/software_isp/software_isp.cpp
> @@ -130,12 +130,18 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,
>   		}
>   	}
> 
> +	bool gpuIspEnabled;
> +
>   #if HAVE_DEBAYER_EGL
> -	if (!softISPMode || !strcmp(softISPMode, "gpu"))
> +	if (!softISPMode || !strcmp(softISPMode, "gpu")) {
>   		debayer_ = std::make_unique<DebayerEGL>(std::move(stats), configuration);
> +		gpuIspEnabled = true;
> +	}
>   #endif
> -	if (!debayer_)
> +	if (!debayer_) {
>   		debayer_ = std::make_unique<DebayerCpu>(std::move(stats), configuration);
> +		gpuIspEnabled = false;
> +	}
> 
>   	if (!debayer_) {
>   		LOG(SoftwareIsp, Error) << "Failed to create Debayer object";
> @@ -173,7 +179,8 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,
>   			 sensorInfo,
>   			 sensor->controls(),
>   			 ipaControls,
> -			 &ccmEnabled_);
> +			 &ccmEnabled_,
> +			 &gpuIspEnabled);
>   	if (ret) {
>   		LOG(SoftwareIsp, Error) << "IPA init failed";
>   		debayer_.reset();
> --
> 2.51.2
>

Patch
diff mbox series

diff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom
index 77328c5fd..ab7eeb5d5 100644
--- a/include/libcamera/ipa/soft.mojom
+++ b/include/libcamera/ipa/soft.mojom
@@ -18,7 +18,7 @@  interface IPASoftInterface {
 	     libcamera.SharedFD fdParams,
 	     libcamera.IPACameraSensorInfo sensorInfo,
 	     libcamera.ControlInfoMap sensorControls)
-		=> (int32 ret, libcamera.ControlInfoMap ipaControls, bool ccmEnabled);
+		=> (int32 ret, libcamera.ControlInfoMap ipaControls, bool ccmEnabled, bool gpuIspEnabled);
 	start() => (int32 ret);
 	stop();
 	configure(IPAConfigInfo configInfo)
diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h
index c3081e306..ee8fb6b03 100644
--- a/src/ipa/simple/ipa_context.h
+++ b/src/ipa/simple/ipa_context.h
@@ -103,6 +103,7 @@  struct IPAContext {
 	FCQueue<IPAFrameContext> frameContexts;
 	ControlInfoMap::Map ctrlMap;
 	bool ccmEnabled = false;
+	bool gpuIspEnabled = false;
 };
 
 } /* namespace ipa::soft */
diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp
index b147aca2e..523ff07b3 100644
--- a/src/ipa/simple/soft_simple.cpp
+++ b/src/ipa/simple/soft_simple.cpp
@@ -56,7 +56,8 @@  public:
 		 const IPACameraSensorInfo &sensorInfo,
 		 const ControlInfoMap &sensorControls,
 		 ControlInfoMap *ipaControls,
-		 bool *ccmEnabled) override;
+		 bool *ccmEnabled,
+		 bool *gpuIspEnabled) override;
 	int configure(const IPAConfigInfo &configInfo) override;
 
 	int start() override;
@@ -96,7 +97,8 @@  int IPASoftSimple::init(const IPASettings &settings,
 			const IPACameraSensorInfo &sensorInfo,
 			const ControlInfoMap &sensorControls,
 			ControlInfoMap *ipaControls,
-			bool *ccmEnabled)
+			bool *ccmEnabled,
+			bool *gpuIspEnabled)
 {
 	camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);
 	if (!camHelper_) {
@@ -106,6 +108,7 @@  int IPASoftSimple::init(const IPASettings &settings,
 	}
 
 	context_.sensorInfo = sensorInfo;
+	context_.gpuIspEnabled = *gpuIspEnabled;
 
 	/* Load the tuning data file */
 	File file(settings.configurationFile);
diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
index 9944ca573..7f3f7b0bc 100644
--- a/src/libcamera/software_isp/software_isp.cpp
+++ b/src/libcamera/software_isp/software_isp.cpp
@@ -130,12 +130,18 @@  SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,
 		}
 	}
 
+	bool gpuIspEnabled;
+
 #if HAVE_DEBAYER_EGL
-	if (!softISPMode || !strcmp(softISPMode, "gpu"))
+	if (!softISPMode || !strcmp(softISPMode, "gpu")) {
 		debayer_ = std::make_unique<DebayerEGL>(std::move(stats), configuration);
+		gpuIspEnabled = true;
+	}
 #endif
-	if (!debayer_)
+	if (!debayer_) {
 		debayer_ = std::make_unique<DebayerCpu>(std::move(stats), configuration);
+		gpuIspEnabled = false;
+	}
 
 	if (!debayer_) {
 		LOG(SoftwareIsp, Error) << "Failed to create Debayer object";
@@ -173,7 +179,8 @@  SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,
 			 sensorInfo,
 			 sensor->controls(),
 			 ipaControls,
-			 &ccmEnabled_);
+			 &ccmEnabled_,
+			 &gpuIspEnabled);
 	if (ret) {
 		LOG(SoftwareIsp, Error) << "IPA init failed";
 		debayer_.reset();