[libcamera-devel,v2,04/10] ipa: ipu3: Introduce a prepare() call to Algorithm
diff mbox series

Message ID 20210812165243.276977-5-jeanmichel.hautbois@ideasonboard.com
State Superseded
Headers show
Series
  • IPU3: Introduce modularity for algorithms
Related show

Commit Message

Jean-Michel Hautbois Aug. 12, 2021, 4:52 p.m. UTC
When a new ipu3_uapi_params buffer is ready, IPAIPU3 receives a
EventFillParams. When this is called, the algorithms should fill every
field in the parameter structure they need to update.

Demonstrate it by adding a loop on the prepare() call in IPAIPU3 and let
the Grid algorithm update the grid field.
This leads to removing this same update from the Awb algorithm.

Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
---
 src/ipa/ipu3/algorithms/algorithm.h | 2 ++
 src/ipa/ipu3/algorithms/grid.cpp    | 6 ++++++
 src/ipa/ipu3/algorithms/grid.h      | 1 +
 src/ipa/ipu3/ipu3.cpp               | 3 +++
 src/ipa/ipu3/ipu3_awb.cpp           | 1 -
 5 files changed, 12 insertions(+), 1 deletion(-)

Comments

Kieran Bingham Aug. 13, 2021, 8:48 a.m. UTC | #1
On 12/08/2021 17:52, Jean-Michel Hautbois wrote:
> When a new ipu3_uapi_params buffer is ready, IPAIPU3 receives a
> EventFillParams. When this is called, the algorithms should fill every
> field in the parameter structure they need to update.
> 
> Demonstrate it by adding a loop on the prepare() call in IPAIPU3 and let

I don't think we need to demonstrate it, we 'implement' it ;-)

> the Grid algorithm update the grid field.
> This leads to removing this same update from the Awb algorithm.
> 
> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
> ---
>  src/ipa/ipu3/algorithms/algorithm.h | 2 ++
>  src/ipa/ipu3/algorithms/grid.cpp    | 6 ++++++
>  src/ipa/ipu3/algorithms/grid.h      | 1 +
>  src/ipa/ipu3/ipu3.cpp               | 3 +++
>  src/ipa/ipu3/ipu3_awb.cpp           | 1 -
>  5 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
> index c1b37276..b571f55a 100644
> --- a/src/ipa/ipu3/algorithms/algorithm.h
> +++ b/src/ipa/ipu3/algorithms/algorithm.h
> @@ -26,6 +26,8 @@ public:
>  	{
>  		return 0;
>  	}
> +
> +	virtual void prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] ipu3_uapi_params &params) {}
>  };
>  
>  } /* namespace ipa::ipu3 */
> diff --git a/src/ipa/ipu3/algorithms/grid.cpp b/src/ipa/ipu3/algorithms/grid.cpp
> index 3578f41b..e42a760d 100644
> --- a/src/ipa/ipu3/algorithms/grid.cpp
> +++ b/src/ipa/ipu3/algorithms/grid.cpp
> @@ -78,6 +78,12 @@ int Grid::configure(IPAContext &context, const IPAConfigInfo &configInfo)
>  	return 0;
>  }
>  
> +void Grid::prepare(IPAContext &context, ipu3_uapi_params &params)
> +{
> +	/* Update the IPU3 parameters with new calculated grid */

I don't think it's a new calculated grid, as the grid is only calculated
during the configure phase.

I would say:

 Update the IPU3 parameters with the configured grid


Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> +	params.acc_param.awb.config.grid = context.configuration.grid.bdsGrid;
> +}
> +
>  } /* namespace ipa::ipu3::algorithms */
>  
>  } /* namespace libcamera */
> diff --git a/src/ipa/ipu3/algorithms/grid.h b/src/ipa/ipu3/algorithms/grid.h
> index b4a51b42..89399bd2 100644
> --- a/src/ipa/ipu3/algorithms/grid.h
> +++ b/src/ipa/ipu3/algorithms/grid.h
> @@ -19,6 +19,7 @@ public:
>  	~Grid() = default;
>  
>  	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
> +	void prepare(IPAContext &context, ipu3_uapi_params &params) override;
>  };
>  
>  } /* namespace ipa::ipu3::algorithms */
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index ef7fec86..394a7a45 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -305,6 +305,9 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
>  
>  void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
>  {
> +	for (auto const &algo : algorithms_)
> +		algo->prepare(context_, params_);
> +
>  	if (agcAlgo_->updateControls())
>  		awbAlgo_->updateWbParameters(params_, agcAlgo_->gamma());
>  
> diff --git a/src/ipa/ipu3/ipu3_awb.cpp b/src/ipa/ipu3/ipu3_awb.cpp
> index 4ee5ee6f..911760b3 100644
> --- a/src/ipa/ipu3/ipu3_awb.cpp
> +++ b/src/ipa/ipu3/ipu3_awb.cpp
> @@ -159,7 +159,6 @@ void IPU3Awb::initialise(ipu3_uapi_params &params, const Size &bdsOutputSize, st
>  	params.acc_param.awb.config.rgbs_thr_r = 8191;
>  	params.acc_param.awb.config.rgbs_thr_gb = 8191;
>  	params.acc_param.awb.config.rgbs_thr_b = 8191 | IPU3_UAPI_AWB_RGBS_THR_B_EN | IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT;
> -	params.acc_param.awb.config.grid = bdsGrid;
>  	awbGrid_ = bdsGrid;
>  
>  	params.use.acc_bnr = 1;
>
Laurent Pinchart Aug. 15, 2021, 6:02 p.m. UTC | #2
Hi Jean-Michel,

Thank you for the patch.

On Thu, Aug 12, 2021 at 06:52:37PM +0200, Jean-Michel Hautbois wrote:
> When a new ipu3_uapi_params buffer is ready, IPAIPU3 receives a
> EventFillParams. When this is called, the algorithms should fill every
> field in the parameter structure they need to update.
> 
> Demonstrate it by adding a loop on the prepare() call in IPAIPU3 and let
> the Grid algorithm update the grid field.
> This leads to removing this same update from the Awb algorithm.
> 
> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
> ---
>  src/ipa/ipu3/algorithms/algorithm.h | 2 ++
>  src/ipa/ipu3/algorithms/grid.cpp    | 6 ++++++
>  src/ipa/ipu3/algorithms/grid.h      | 1 +
>  src/ipa/ipu3/ipu3.cpp               | 3 +++
>  src/ipa/ipu3/ipu3_awb.cpp           | 1 -
>  5 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
> index c1b37276..b571f55a 100644
> --- a/src/ipa/ipu3/algorithms/algorithm.h
> +++ b/src/ipa/ipu3/algorithms/algorithm.h
> @@ -26,6 +26,8 @@ public:
>  	{
>  		return 0;
>  	}
> +
> +	virtual void prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] ipu3_uapi_params &params) {}

Line wrap.

Could you add a patch after 02/10 that adds all functions (configure(),
prepare() and process()) to the Algorithm class, and call them in the
IPAIPU3 class as appropriate ? That patch should include the
documentation of the functions, to explain how they're used. After that
the rest of the series can begin moving the algorithms to the new class.

>  };
>  
>  } /* namespace ipa::ipu3 */
> diff --git a/src/ipa/ipu3/algorithms/grid.cpp b/src/ipa/ipu3/algorithms/grid.cpp
> index 3578f41b..e42a760d 100644
> --- a/src/ipa/ipu3/algorithms/grid.cpp
> +++ b/src/ipa/ipu3/algorithms/grid.cpp
> @@ -78,6 +78,12 @@ int Grid::configure(IPAContext &context, const IPAConfigInfo &configInfo)
>  	return 0;
>  }
>  
> +void Grid::prepare(IPAContext &context, ipu3_uapi_params &params)
> +{
> +	/* Update the IPU3 parameters with new calculated grid */
> +	params.acc_param.awb.config.grid = context.configuration.grid.bdsGrid;

And this is where the spaghetti dish begins :-( It should be the
responsibility of the AWB algorithm to set params.acc_param.awb.

> +}
> +
>  } /* namespace ipa::ipu3::algorithms */
>  
>  } /* namespace libcamera */
> diff --git a/src/ipa/ipu3/algorithms/grid.h b/src/ipa/ipu3/algorithms/grid.h
> index b4a51b42..89399bd2 100644
> --- a/src/ipa/ipu3/algorithms/grid.h
> +++ b/src/ipa/ipu3/algorithms/grid.h
> @@ -19,6 +19,7 @@ public:
>  	~Grid() = default;
>  
>  	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
> +	void prepare(IPAContext &context, ipu3_uapi_params &params) override;
>  };
>  
>  } /* namespace ipa::ipu3::algorithms */
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index ef7fec86..394a7a45 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -305,6 +305,9 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
>  
>  void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
>  {
> +	for (auto const &algo : algorithms_)
> +		algo->prepare(context_, params_);
> +
>  	if (agcAlgo_->updateControls())
>  		awbAlgo_->updateWbParameters(params_, agcAlgo_->gamma());
>  
> diff --git a/src/ipa/ipu3/ipu3_awb.cpp b/src/ipa/ipu3/ipu3_awb.cpp
> index 4ee5ee6f..911760b3 100644
> --- a/src/ipa/ipu3/ipu3_awb.cpp
> +++ b/src/ipa/ipu3/ipu3_awb.cpp
> @@ -159,7 +159,6 @@ void IPU3Awb::initialise(ipu3_uapi_params &params, const Size &bdsOutputSize, st
>  	params.acc_param.awb.config.rgbs_thr_r = 8191;
>  	params.acc_param.awb.config.rgbs_thr_gb = 8191;
>  	params.acc_param.awb.config.rgbs_thr_b = 8191 | IPU3_UAPI_AWB_RGBS_THR_B_EN | IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT;
> -	params.acc_param.awb.config.grid = bdsGrid;
>  	awbGrid_ = bdsGrid;
>  
>  	params.use.acc_bnr = 1;
Jean-Michel Hautbois Aug. 16, 2021, 8:01 a.m. UTC | #3
Hi Laurent,

On 15/08/2021 20:02, Laurent Pinchart wrote:
> Hi Jean-Michel,
> 
> Thank you for the patch.
> 
> On Thu, Aug 12, 2021 at 06:52:37PM +0200, Jean-Michel Hautbois wrote:
>> When a new ipu3_uapi_params buffer is ready, IPAIPU3 receives a
>> EventFillParams. When this is called, the algorithms should fill every
>> field in the parameter structure they need to update.
>>
>> Demonstrate it by adding a loop on the prepare() call in IPAIPU3 and let
>> the Grid algorithm update the grid field.
>> This leads to removing this same update from the Awb algorithm.
>>
>> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
>> ---
>>  src/ipa/ipu3/algorithms/algorithm.h | 2 ++
>>  src/ipa/ipu3/algorithms/grid.cpp    | 6 ++++++
>>  src/ipa/ipu3/algorithms/grid.h      | 1 +
>>  src/ipa/ipu3/ipu3.cpp               | 3 +++
>>  src/ipa/ipu3/ipu3_awb.cpp           | 1 -
>>  5 files changed, 12 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
>> index c1b37276..b571f55a 100644
>> --- a/src/ipa/ipu3/algorithms/algorithm.h
>> +++ b/src/ipa/ipu3/algorithms/algorithm.h
>> @@ -26,6 +26,8 @@ public:
>>  	{
>>  		return 0;
>>  	}
>> +
>> +	virtual void prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] ipu3_uapi_params &params) {}
> 
> Line wrap.
> 
> Could you add a patch after 02/10 that adds all functions (configure(),
> prepare() and process()) to the Algorithm class, and call them in the
> IPAIPU3 class as appropriate ? That patch should include the
> documentation of the functions, to explain how they're used. After that
> the rest of the series can begin moving the algorithms to the new class.
> 

I did that in the first place, and it was a bit of a heavy patch. So I
decided to split it to introduce each of configure/prepare/process calls
step by step...

>>  };
>>  
>>  } /* namespace ipa::ipu3 */
>> diff --git a/src/ipa/ipu3/algorithms/grid.cpp b/src/ipa/ipu3/algorithms/grid.cpp
>> index 3578f41b..e42a760d 100644
>> --- a/src/ipa/ipu3/algorithms/grid.cpp
>> +++ b/src/ipa/ipu3/algorithms/grid.cpp
>> @@ -78,6 +78,12 @@ int Grid::configure(IPAContext &context, const IPAConfigInfo &configInfo)
>>  	return 0;
>>  }
>>  
>> +void Grid::prepare(IPAContext &context, ipu3_uapi_params &params)
>> +{
>> +	/* Update the IPU3 parameters with new calculated grid */
>> +	params.acc_param.awb.config.grid = context.configuration.grid.bdsGrid;
> 
> And this is where the spaghetti dish begins :-( It should be the
> responsibility of the AWB algorithm to set params.acc_param.awb.
> 

Yes, I moved it at least 5 times while writing the patches as I could
not decide where it should be :-p.

>> +}
>> +
>>  } /* namespace ipa::ipu3::algorithms */
>>  
>>  } /* namespace libcamera */
>> diff --git a/src/ipa/ipu3/algorithms/grid.h b/src/ipa/ipu3/algorithms/grid.h
>> index b4a51b42..89399bd2 100644
>> --- a/src/ipa/ipu3/algorithms/grid.h
>> +++ b/src/ipa/ipu3/algorithms/grid.h
>> @@ -19,6 +19,7 @@ public:
>>  	~Grid() = default;
>>  
>>  	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
>> +	void prepare(IPAContext &context, ipu3_uapi_params &params) override;
>>  };
>>  
>>  } /* namespace ipa::ipu3::algorithms */
>> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
>> index ef7fec86..394a7a45 100644
>> --- a/src/ipa/ipu3/ipu3.cpp
>> +++ b/src/ipa/ipu3/ipu3.cpp
>> @@ -305,6 +305,9 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
>>  
>>  void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
>>  {
>> +	for (auto const &algo : algorithms_)
>> +		algo->prepare(context_, params_);
>> +
>>  	if (agcAlgo_->updateControls())
>>  		awbAlgo_->updateWbParameters(params_, agcAlgo_->gamma());
>>  
>> diff --git a/src/ipa/ipu3/ipu3_awb.cpp b/src/ipa/ipu3/ipu3_awb.cpp
>> index 4ee5ee6f..911760b3 100644
>> --- a/src/ipa/ipu3/ipu3_awb.cpp
>> +++ b/src/ipa/ipu3/ipu3_awb.cpp
>> @@ -159,7 +159,6 @@ void IPU3Awb::initialise(ipu3_uapi_params &params, const Size &bdsOutputSize, st
>>  	params.acc_param.awb.config.rgbs_thr_r = 8191;
>>  	params.acc_param.awb.config.rgbs_thr_gb = 8191;
>>  	params.acc_param.awb.config.rgbs_thr_b = 8191 | IPU3_UAPI_AWB_RGBS_THR_B_EN | IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT;
>> -	params.acc_param.awb.config.grid = bdsGrid;
>>  	awbGrid_ = bdsGrid;
>>  
>>  	params.use.acc_bnr = 1;
>
Laurent Pinchart Aug. 16, 2021, 9:41 a.m. UTC | #4
Hi Jean-Michel,

On Mon, Aug 16, 2021 at 10:01:14AM +0200, Jean-Michel Hautbois wrote:
> On 15/08/2021 20:02, Laurent Pinchart wrote:
> > On Thu, Aug 12, 2021 at 06:52:37PM +0200, Jean-Michel Hautbois wrote:
> >> When a new ipu3_uapi_params buffer is ready, IPAIPU3 receives a
> >> EventFillParams. When this is called, the algorithms should fill every
> >> field in the parameter structure they need to update.
> >>
> >> Demonstrate it by adding a loop on the prepare() call in IPAIPU3 and let
> >> the Grid algorithm update the grid field.
> >> This leads to removing this same update from the Awb algorithm.
> >>
> >> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
> >> ---
> >>  src/ipa/ipu3/algorithms/algorithm.h | 2 ++
> >>  src/ipa/ipu3/algorithms/grid.cpp    | 6 ++++++
> >>  src/ipa/ipu3/algorithms/grid.h      | 1 +
> >>  src/ipa/ipu3/ipu3.cpp               | 3 +++
> >>  src/ipa/ipu3/ipu3_awb.cpp           | 1 -
> >>  5 files changed, 12 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
> >> index c1b37276..b571f55a 100644
> >> --- a/src/ipa/ipu3/algorithms/algorithm.h
> >> +++ b/src/ipa/ipu3/algorithms/algorithm.h
> >> @@ -26,6 +26,8 @@ public:
> >>  	{
> >>  		return 0;
> >>  	}
> >> +
> >> +	virtual void prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] ipu3_uapi_params &params) {}
> > 
> > Line wrap.
> > 
> > Could you add a patch after 02/10 that adds all functions (configure(),
> > prepare() and process()) to the Algorithm class, and call them in the
> > IPAIPU3 class as appropriate ? That patch should include the
> > documentation of the functions, to explain how they're used. After that
> > the rest of the series can begin moving the algorithms to the new class.
> 
> I did that in the first place, and it was a bit of a heavy patch. So I
> decided to split it to introduce each of configure/prepare/process calls
> step by step...

The issue with this approach is that it's harder to have an overview of
the proposed API. Is it *that* heavy to define a class with three
abstract functions and their documentation ?

> >>  };
> >>  
> >>  } /* namespace ipa::ipu3 */
> >> diff --git a/src/ipa/ipu3/algorithms/grid.cpp b/src/ipa/ipu3/algorithms/grid.cpp
> >> index 3578f41b..e42a760d 100644
> >> --- a/src/ipa/ipu3/algorithms/grid.cpp
> >> +++ b/src/ipa/ipu3/algorithms/grid.cpp
> >> @@ -78,6 +78,12 @@ int Grid::configure(IPAContext &context, const IPAConfigInfo &configInfo)
> >>  	return 0;
> >>  }
> >>  
> >> +void Grid::prepare(IPAContext &context, ipu3_uapi_params &params)
> >> +{
> >> +	/* Update the IPU3 parameters with new calculated grid */
> >> +	params.acc_param.awb.config.grid = context.configuration.grid.bdsGrid;
> > 
> > And this is where the spaghetti dish begins :-( It should be the
> > responsibility of the AWB algorithm to set params.acc_param.awb.
> 
> Yes, I moved it at least 5 times while writing the patches as I could
> not decide where it should be :-p.

As commented in patch 03/10, I don't think "grid" should be an
algorithm.

> >> +}
> >> +
> >>  } /* namespace ipa::ipu3::algorithms */
> >>  
> >>  } /* namespace libcamera */
> >> diff --git a/src/ipa/ipu3/algorithms/grid.h b/src/ipa/ipu3/algorithms/grid.h
> >> index b4a51b42..89399bd2 100644
> >> --- a/src/ipa/ipu3/algorithms/grid.h
> >> +++ b/src/ipa/ipu3/algorithms/grid.h
> >> @@ -19,6 +19,7 @@ public:
> >>  	~Grid() = default;
> >>  
> >>  	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
> >> +	void prepare(IPAContext &context, ipu3_uapi_params &params) override;
> >>  };
> >>  
> >>  } /* namespace ipa::ipu3::algorithms */
> >> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> >> index ef7fec86..394a7a45 100644
> >> --- a/src/ipa/ipu3/ipu3.cpp
> >> +++ b/src/ipa/ipu3/ipu3.cpp
> >> @@ -305,6 +305,9 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
> >>  
> >>  void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
> >>  {
> >> +	for (auto const &algo : algorithms_)
> >> +		algo->prepare(context_, params_);
> >> +
> >>  	if (agcAlgo_->updateControls())
> >>  		awbAlgo_->updateWbParameters(params_, agcAlgo_->gamma());
> >>  
> >> diff --git a/src/ipa/ipu3/ipu3_awb.cpp b/src/ipa/ipu3/ipu3_awb.cpp
> >> index 4ee5ee6f..911760b3 100644
> >> --- a/src/ipa/ipu3/ipu3_awb.cpp
> >> +++ b/src/ipa/ipu3/ipu3_awb.cpp
> >> @@ -159,7 +159,6 @@ void IPU3Awb::initialise(ipu3_uapi_params &params, const Size &bdsOutputSize, st
> >>  	params.acc_param.awb.config.rgbs_thr_r = 8191;
> >>  	params.acc_param.awb.config.rgbs_thr_gb = 8191;
> >>  	params.acc_param.awb.config.rgbs_thr_b = 8191 | IPU3_UAPI_AWB_RGBS_THR_B_EN | IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT;
> >> -	params.acc_param.awb.config.grid = bdsGrid;
> >>  	awbGrid_ = bdsGrid;
> >>  
> >>  	params.use.acc_bnr = 1;
Jean-Michel Hautbois Aug. 16, 2021, 9:43 a.m. UTC | #5
Hi Laurent,

On 16/08/2021 11:41, Laurent Pinchart wrote:
> Hi Jean-Michel,
> 
> On Mon, Aug 16, 2021 at 10:01:14AM +0200, Jean-Michel Hautbois wrote:
>> On 15/08/2021 20:02, Laurent Pinchart wrote:
>>> On Thu, Aug 12, 2021 at 06:52:37PM +0200, Jean-Michel Hautbois wrote:
>>>> When a new ipu3_uapi_params buffer is ready, IPAIPU3 receives a
>>>> EventFillParams. When this is called, the algorithms should fill every
>>>> field in the parameter structure they need to update.
>>>>
>>>> Demonstrate it by adding a loop on the prepare() call in IPAIPU3 and let
>>>> the Grid algorithm update the grid field.
>>>> This leads to removing this same update from the Awb algorithm.
>>>>
>>>> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
>>>> ---
>>>>  src/ipa/ipu3/algorithms/algorithm.h | 2 ++
>>>>  src/ipa/ipu3/algorithms/grid.cpp    | 6 ++++++
>>>>  src/ipa/ipu3/algorithms/grid.h      | 1 +
>>>>  src/ipa/ipu3/ipu3.cpp               | 3 +++
>>>>  src/ipa/ipu3/ipu3_awb.cpp           | 1 -
>>>>  5 files changed, 12 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
>>>> index c1b37276..b571f55a 100644
>>>> --- a/src/ipa/ipu3/algorithms/algorithm.h
>>>> +++ b/src/ipa/ipu3/algorithms/algorithm.h
>>>> @@ -26,6 +26,8 @@ public:
>>>>  	{
>>>>  		return 0;
>>>>  	}
>>>> +
>>>> +	virtual void prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] ipu3_uapi_params &params) {}
>>>
>>> Line wrap.
>>>
>>> Could you add a patch after 02/10 that adds all functions (configure(),
>>> prepare() and process()) to the Algorithm class, and call them in the
>>> IPAIPU3 class as appropriate ? That patch should include the
>>> documentation of the functions, to explain how they're used. After that
>>> the rest of the series can begin moving the algorithms to the new class.
>>
>> I did that in the first place, and it was a bit of a heavy patch. So I
>> decided to split it to introduce each of configure/prepare/process calls
>> step by step...
> 
> The issue with this approach is that it's harder to have an overview of
> the proposed API. Is it *that* heavy to define a class with three
> abstract functions and their documentation ?
> 

No, but as we already have a process() call in AGC it must be rewritten
accordingly.

>>>>  };
>>>>  
>>>>  } /* namespace ipa::ipu3 */
>>>> diff --git a/src/ipa/ipu3/algorithms/grid.cpp b/src/ipa/ipu3/algorithms/grid.cpp
>>>> index 3578f41b..e42a760d 100644
>>>> --- a/src/ipa/ipu3/algorithms/grid.cpp
>>>> +++ b/src/ipa/ipu3/algorithms/grid.cpp
>>>> @@ -78,6 +78,12 @@ int Grid::configure(IPAContext &context, const IPAConfigInfo &configInfo)
>>>>  	return 0;
>>>>  }
>>>>  
>>>> +void Grid::prepare(IPAContext &context, ipu3_uapi_params &params)
>>>> +{
>>>> +	/* Update the IPU3 parameters with new calculated grid */
>>>> +	params.acc_param.awb.config.grid = context.configuration.grid.bdsGrid;
>>>
>>> And this is where the spaghetti dish begins :-( It should be the
>>> responsibility of the AWB algorithm to set params.acc_param.awb.
>>
>> Yes, I moved it at least 5 times while writing the patches as I could
>> not decide where it should be :-p.
> 
> As commented in patch 03/10, I don't think "grid" should be an
> algorithm.
> 
>>>> +}
>>>> +
>>>>  } /* namespace ipa::ipu3::algorithms */
>>>>  
>>>>  } /* namespace libcamera */
>>>> diff --git a/src/ipa/ipu3/algorithms/grid.h b/src/ipa/ipu3/algorithms/grid.h
>>>> index b4a51b42..89399bd2 100644
>>>> --- a/src/ipa/ipu3/algorithms/grid.h
>>>> +++ b/src/ipa/ipu3/algorithms/grid.h
>>>> @@ -19,6 +19,7 @@ public:
>>>>  	~Grid() = default;
>>>>  
>>>>  	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
>>>> +	void prepare(IPAContext &context, ipu3_uapi_params &params) override;
>>>>  };
>>>>  
>>>>  } /* namespace ipa::ipu3::algorithms */
>>>> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
>>>> index ef7fec86..394a7a45 100644
>>>> --- a/src/ipa/ipu3/ipu3.cpp
>>>> +++ b/src/ipa/ipu3/ipu3.cpp
>>>> @@ -305,6 +305,9 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
>>>>  
>>>>  void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
>>>>  {
>>>> +	for (auto const &algo : algorithms_)
>>>> +		algo->prepare(context_, params_);
>>>> +
>>>>  	if (agcAlgo_->updateControls())
>>>>  		awbAlgo_->updateWbParameters(params_, agcAlgo_->gamma());
>>>>  
>>>> diff --git a/src/ipa/ipu3/ipu3_awb.cpp b/src/ipa/ipu3/ipu3_awb.cpp
>>>> index 4ee5ee6f..911760b3 100644
>>>> --- a/src/ipa/ipu3/ipu3_awb.cpp
>>>> +++ b/src/ipa/ipu3/ipu3_awb.cpp
>>>> @@ -159,7 +159,6 @@ void IPU3Awb::initialise(ipu3_uapi_params &params, const Size &bdsOutputSize, st
>>>>  	params.acc_param.awb.config.rgbs_thr_r = 8191;
>>>>  	params.acc_param.awb.config.rgbs_thr_gb = 8191;
>>>>  	params.acc_param.awb.config.rgbs_thr_b = 8191 | IPU3_UAPI_AWB_RGBS_THR_B_EN | IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT;
>>>> -	params.acc_param.awb.config.grid = bdsGrid;
>>>>  	awbGrid_ = bdsGrid;
>>>>  
>>>>  	params.use.acc_bnr = 1;
>
Laurent Pinchart Aug. 16, 2021, 9:49 a.m. UTC | #6
Hi Jean-Michel,

On Mon, Aug 16, 2021 at 11:43:54AM +0200, Jean-Michel Hautbois wrote:
> On 16/08/2021 11:41, Laurent Pinchart wrote:
> > On Mon, Aug 16, 2021 at 10:01:14AM +0200, Jean-Michel Hautbois wrote:
> >> On 15/08/2021 20:02, Laurent Pinchart wrote:
> >>> On Thu, Aug 12, 2021 at 06:52:37PM +0200, Jean-Michel Hautbois wrote:
> >>>> When a new ipu3_uapi_params buffer is ready, IPAIPU3 receives a
> >>>> EventFillParams. When this is called, the algorithms should fill every
> >>>> field in the parameter structure they need to update.
> >>>>
> >>>> Demonstrate it by adding a loop on the prepare() call in IPAIPU3 and let
> >>>> the Grid algorithm update the grid field.
> >>>> This leads to removing this same update from the Awb algorithm.
> >>>>
> >>>> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
> >>>> ---
> >>>>  src/ipa/ipu3/algorithms/algorithm.h | 2 ++
> >>>>  src/ipa/ipu3/algorithms/grid.cpp    | 6 ++++++
> >>>>  src/ipa/ipu3/algorithms/grid.h      | 1 +
> >>>>  src/ipa/ipu3/ipu3.cpp               | 3 +++
> >>>>  src/ipa/ipu3/ipu3_awb.cpp           | 1 -
> >>>>  5 files changed, 12 insertions(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
> >>>> index c1b37276..b571f55a 100644
> >>>> --- a/src/ipa/ipu3/algorithms/algorithm.h
> >>>> +++ b/src/ipa/ipu3/algorithms/algorithm.h
> >>>> @@ -26,6 +26,8 @@ public:
> >>>>  	{
> >>>>  		return 0;
> >>>>  	}
> >>>> +
> >>>> +	virtual void prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] ipu3_uapi_params &params) {}
> >>>
> >>> Line wrap.
> >>>
> >>> Could you add a patch after 02/10 that adds all functions (configure(),
> >>> prepare() and process()) to the Algorithm class, and call them in the
> >>> IPAIPU3 class as appropriate ? That patch should include the
> >>> documentation of the functions, to explain how they're used. After that
> >>> the rest of the series can begin moving the algorithms to the new class.
> >>
> >> I did that in the first place, and it was a bit of a heavy patch. So I
> >> decided to split it to introduce each of configure/prepare/process calls
> >> step by step...
> > 
> > The issue with this approach is that it's harder to have an overview of
> > the proposed API. Is it *that* heavy to define a class with three
> > abstract functions and their documentation ?
> 
> No, but as we already have a process() call in AGC it must be rewritten
> accordingly.

The existing process() function takes different parameters, so the
compiler shouldn't complain. Worst case it could be renamed in a small
patch at the beginning of the series to move it out of the way. I agree
that adapting the algorithm is best done in a patch separate from the
introduction of the new Algorithm structure.

> >>>>  };
> >>>>  
> >>>>  } /* namespace ipa::ipu3 */
> >>>> diff --git a/src/ipa/ipu3/algorithms/grid.cpp b/src/ipa/ipu3/algorithms/grid.cpp
> >>>> index 3578f41b..e42a760d 100644
> >>>> --- a/src/ipa/ipu3/algorithms/grid.cpp
> >>>> +++ b/src/ipa/ipu3/algorithms/grid.cpp
> >>>> @@ -78,6 +78,12 @@ int Grid::configure(IPAContext &context, const IPAConfigInfo &configInfo)
> >>>>  	return 0;
> >>>>  }
> >>>>  
> >>>> +void Grid::prepare(IPAContext &context, ipu3_uapi_params &params)
> >>>> +{
> >>>> +	/* Update the IPU3 parameters with new calculated grid */
> >>>> +	params.acc_param.awb.config.grid = context.configuration.grid.bdsGrid;
> >>>
> >>> And this is where the spaghetti dish begins :-( It should be the
> >>> responsibility of the AWB algorithm to set params.acc_param.awb.
> >>
> >> Yes, I moved it at least 5 times while writing the patches as I could
> >> not decide where it should be :-p.
> > 
> > As commented in patch 03/10, I don't think "grid" should be an
> > algorithm.
> > 
> >>>> +}
> >>>> +
> >>>>  } /* namespace ipa::ipu3::algorithms */
> >>>>  
> >>>>  } /* namespace libcamera */
> >>>> diff --git a/src/ipa/ipu3/algorithms/grid.h b/src/ipa/ipu3/algorithms/grid.h
> >>>> index b4a51b42..89399bd2 100644
> >>>> --- a/src/ipa/ipu3/algorithms/grid.h
> >>>> +++ b/src/ipa/ipu3/algorithms/grid.h
> >>>> @@ -19,6 +19,7 @@ public:
> >>>>  	~Grid() = default;
> >>>>  
> >>>>  	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
> >>>> +	void prepare(IPAContext &context, ipu3_uapi_params &params) override;
> >>>>  };
> >>>>  
> >>>>  } /* namespace ipa::ipu3::algorithms */
> >>>> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> >>>> index ef7fec86..394a7a45 100644
> >>>> --- a/src/ipa/ipu3/ipu3.cpp
> >>>> +++ b/src/ipa/ipu3/ipu3.cpp
> >>>> @@ -305,6 +305,9 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
> >>>>  
> >>>>  void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
> >>>>  {
> >>>> +	for (auto const &algo : algorithms_)
> >>>> +		algo->prepare(context_, params_);
> >>>> +
> >>>>  	if (agcAlgo_->updateControls())
> >>>>  		awbAlgo_->updateWbParameters(params_, agcAlgo_->gamma());
> >>>>  
> >>>> diff --git a/src/ipa/ipu3/ipu3_awb.cpp b/src/ipa/ipu3/ipu3_awb.cpp
> >>>> index 4ee5ee6f..911760b3 100644
> >>>> --- a/src/ipa/ipu3/ipu3_awb.cpp
> >>>> +++ b/src/ipa/ipu3/ipu3_awb.cpp
> >>>> @@ -159,7 +159,6 @@ void IPU3Awb::initialise(ipu3_uapi_params &params, const Size &bdsOutputSize, st
> >>>>  	params.acc_param.awb.config.rgbs_thr_r = 8191;
> >>>>  	params.acc_param.awb.config.rgbs_thr_gb = 8191;
> >>>>  	params.acc_param.awb.config.rgbs_thr_b = 8191 | IPU3_UAPI_AWB_RGBS_THR_B_EN | IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT;
> >>>> -	params.acc_param.awb.config.grid = bdsGrid;
> >>>>  	awbGrid_ = bdsGrid;
> >>>>  
> >>>>  	params.use.acc_bnr = 1;
Jean-Michel Hautbois Aug. 18, 2021, 6:47 a.m. UTC | #7
Hi Laurent,

On 16/08/2021 11:49, Laurent Pinchart wrote:
> Hi Jean-Michel,
> 
> On Mon, Aug 16, 2021 at 11:43:54AM +0200, Jean-Michel Hautbois wrote:
>> On 16/08/2021 11:41, Laurent Pinchart wrote:
>>> On Mon, Aug 16, 2021 at 10:01:14AM +0200, Jean-Michel Hautbois wrote:
>>>> On 15/08/2021 20:02, Laurent Pinchart wrote:
>>>>> On Thu, Aug 12, 2021 at 06:52:37PM +0200, Jean-Michel Hautbois wrote:
>>>>>> When a new ipu3_uapi_params buffer is ready, IPAIPU3 receives a
>>>>>> EventFillParams. When this is called, the algorithms should fill every
>>>>>> field in the parameter structure they need to update.
>>>>>>
>>>>>> Demonstrate it by adding a loop on the prepare() call in IPAIPU3 and let
>>>>>> the Grid algorithm update the grid field.
>>>>>> This leads to removing this same update from the Awb algorithm.
>>>>>>
>>>>>> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
>>>>>> ---
>>>>>>  src/ipa/ipu3/algorithms/algorithm.h | 2 ++
>>>>>>  src/ipa/ipu3/algorithms/grid.cpp    | 6 ++++++
>>>>>>  src/ipa/ipu3/algorithms/grid.h      | 1 +
>>>>>>  src/ipa/ipu3/ipu3.cpp               | 3 +++
>>>>>>  src/ipa/ipu3/ipu3_awb.cpp           | 1 -
>>>>>>  5 files changed, 12 insertions(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
>>>>>> index c1b37276..b571f55a 100644
>>>>>> --- a/src/ipa/ipu3/algorithms/algorithm.h
>>>>>> +++ b/src/ipa/ipu3/algorithms/algorithm.h
>>>>>> @@ -26,6 +26,8 @@ public:
>>>>>>  	{
>>>>>>  		return 0;
>>>>>>  	}
>>>>>> +
>>>>>> +	virtual void prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] ipu3_uapi_params &params) {}
>>>>>
>>>>> Line wrap.
>>>>>
>>>>> Could you add a patch after 02/10 that adds all functions (configure(),
>>>>> prepare() and process()) to the Algorithm class, and call them in the
>>>>> IPAIPU3 class as appropriate ? That patch should include the
>>>>> documentation of the functions, to explain how they're used. After that
>>>>> the rest of the series can begin moving the algorithms to the new class.
>>>>
>>>> I did that in the first place, and it was a bit of a heavy patch. So I
>>>> decided to split it to introduce each of configure/prepare/process calls
>>>> step by step...
>>>
>>> The issue with this approach is that it's harder to have an overview of
>>> the proposed API. Is it *that* heavy to define a class with three
>>> abstract functions and their documentation ?
>>
>> No, but as we already have a process() call in AGC it must be rewritten
>> accordingly.
> 
> The existing process() function takes different parameters, so the
> compiler shouldn't complain. Worst case it could be renamed in a small
> patch at the beginning of the series to move it out of the way. I agree
> that adapting the algorithm is best done in a patch separate from the
> introduction of the new Algorithm structure.
> 

The compiler does not agree with you :-).

../src/ipa/ipu3/ipu3_agc.h:33:7: error:
'libcamera::ipa::ipu3::IPU3Agc::process' hides overloaded virtual
function [-Werror,-Woverloaded-virtual]
        void process(const ipu3_uapi_stats_3a *stats, uint32_t
&exposure, double &gain);
             ^
../src/ipa/ipu3/algorithms/algorithm.h:26:15: note: hidden overloaded
virtual function 'libcamera::ipa::ipu3::Algorithm::process' declared
here: different number of parameters (2 vs 3)
        virtual void process(IPAContext &context, ipu3_uapi_stats_3a
&stats);

>>>>>>  };
>>>>>>  
>>>>>>  } /* namespace ipa::ipu3 */
>>>>>> diff --git a/src/ipa/ipu3/algorithms/grid.cpp b/src/ipa/ipu3/algorithms/grid.cpp
>>>>>> index 3578f41b..e42a760d 100644
>>>>>> --- a/src/ipa/ipu3/algorithms/grid.cpp
>>>>>> +++ b/src/ipa/ipu3/algorithms/grid.cpp
>>>>>> @@ -78,6 +78,12 @@ int Grid::configure(IPAContext &context, const IPAConfigInfo &configInfo)
>>>>>>  	return 0;
>>>>>>  }
>>>>>>  
>>>>>> +void Grid::prepare(IPAContext &context, ipu3_uapi_params &params)
>>>>>> +{
>>>>>> +	/* Update the IPU3 parameters with new calculated grid */
>>>>>> +	params.acc_param.awb.config.grid = context.configuration.grid.bdsGrid;
>>>>>
>>>>> And this is where the spaghetti dish begins :-( It should be the
>>>>> responsibility of the AWB algorithm to set params.acc_param.awb.
>>>>
>>>> Yes, I moved it at least 5 times while writing the patches as I could
>>>> not decide where it should be :-p.
>>>
>>> As commented in patch 03/10, I don't think "grid" should be an
>>> algorithm.
>>>
>>>>>> +}
>>>>>> +
>>>>>>  } /* namespace ipa::ipu3::algorithms */
>>>>>>  
>>>>>>  } /* namespace libcamera */
>>>>>> diff --git a/src/ipa/ipu3/algorithms/grid.h b/src/ipa/ipu3/algorithms/grid.h
>>>>>> index b4a51b42..89399bd2 100644
>>>>>> --- a/src/ipa/ipu3/algorithms/grid.h
>>>>>> +++ b/src/ipa/ipu3/algorithms/grid.h
>>>>>> @@ -19,6 +19,7 @@ public:
>>>>>>  	~Grid() = default;
>>>>>>  
>>>>>>  	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
>>>>>> +	void prepare(IPAContext &context, ipu3_uapi_params &params) override;
>>>>>>  };
>>>>>>  
>>>>>>  } /* namespace ipa::ipu3::algorithms */
>>>>>> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
>>>>>> index ef7fec86..394a7a45 100644
>>>>>> --- a/src/ipa/ipu3/ipu3.cpp
>>>>>> +++ b/src/ipa/ipu3/ipu3.cpp
>>>>>> @@ -305,6 +305,9 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
>>>>>>  
>>>>>>  void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
>>>>>>  {
>>>>>> +	for (auto const &algo : algorithms_)
>>>>>> +		algo->prepare(context_, params_);
>>>>>> +
>>>>>>  	if (agcAlgo_->updateControls())
>>>>>>  		awbAlgo_->updateWbParameters(params_, agcAlgo_->gamma());
>>>>>>  
>>>>>> diff --git a/src/ipa/ipu3/ipu3_awb.cpp b/src/ipa/ipu3/ipu3_awb.cpp
>>>>>> index 4ee5ee6f..911760b3 100644
>>>>>> --- a/src/ipa/ipu3/ipu3_awb.cpp
>>>>>> +++ b/src/ipa/ipu3/ipu3_awb.cpp
>>>>>> @@ -159,7 +159,6 @@ void IPU3Awb::initialise(ipu3_uapi_params &params, const Size &bdsOutputSize, st
>>>>>>  	params.acc_param.awb.config.rgbs_thr_r = 8191;
>>>>>>  	params.acc_param.awb.config.rgbs_thr_gb = 8191;
>>>>>>  	params.acc_param.awb.config.rgbs_thr_b = 8191 | IPU3_UAPI_AWB_RGBS_THR_B_EN | IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT;
>>>>>> -	params.acc_param.awb.config.grid = bdsGrid;
>>>>>>  	awbGrid_ = bdsGrid;
>>>>>>  
>>>>>>  	params.use.acc_bnr = 1;
>
Laurent Pinchart Aug. 18, 2021, 8:30 a.m. UTC | #8
Hi Jean-Michel,

On Wed, Aug 18, 2021 at 08:47:28AM +0200, Jean-Michel Hautbois wrote:
> On 16/08/2021 11:49, Laurent Pinchart wrote:
> > On Mon, Aug 16, 2021 at 11:43:54AM +0200, Jean-Michel Hautbois wrote:
> >> On 16/08/2021 11:41, Laurent Pinchart wrote:
> >>> On Mon, Aug 16, 2021 at 10:01:14AM +0200, Jean-Michel Hautbois wrote:
> >>>> On 15/08/2021 20:02, Laurent Pinchart wrote:
> >>>>> On Thu, Aug 12, 2021 at 06:52:37PM +0200, Jean-Michel Hautbois wrote:
> >>>>>> When a new ipu3_uapi_params buffer is ready, IPAIPU3 receives a
> >>>>>> EventFillParams. When this is called, the algorithms should fill every
> >>>>>> field in the parameter structure they need to update.
> >>>>>>
> >>>>>> Demonstrate it by adding a loop on the prepare() call in IPAIPU3 and let
> >>>>>> the Grid algorithm update the grid field.
> >>>>>> This leads to removing this same update from the Awb algorithm.
> >>>>>>
> >>>>>> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
> >>>>>> ---
> >>>>>>  src/ipa/ipu3/algorithms/algorithm.h | 2 ++
> >>>>>>  src/ipa/ipu3/algorithms/grid.cpp    | 6 ++++++
> >>>>>>  src/ipa/ipu3/algorithms/grid.h      | 1 +
> >>>>>>  src/ipa/ipu3/ipu3.cpp               | 3 +++
> >>>>>>  src/ipa/ipu3/ipu3_awb.cpp           | 1 -
> >>>>>>  5 files changed, 12 insertions(+), 1 deletion(-)
> >>>>>>
> >>>>>> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
> >>>>>> index c1b37276..b571f55a 100644
> >>>>>> --- a/src/ipa/ipu3/algorithms/algorithm.h
> >>>>>> +++ b/src/ipa/ipu3/algorithms/algorithm.h
> >>>>>> @@ -26,6 +26,8 @@ public:
> >>>>>>  	{
> >>>>>>  		return 0;
> >>>>>>  	}
> >>>>>> +
> >>>>>> +	virtual void prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] ipu3_uapi_params &params) {}
> >>>>>
> >>>>> Line wrap.
> >>>>>
> >>>>> Could you add a patch after 02/10 that adds all functions (configure(),
> >>>>> prepare() and process()) to the Algorithm class, and call them in the
> >>>>> IPAIPU3 class as appropriate ? That patch should include the
> >>>>> documentation of the functions, to explain how they're used. After that
> >>>>> the rest of the series can begin moving the algorithms to the new class.
> >>>>
> >>>> I did that in the first place, and it was a bit of a heavy patch. So I
> >>>> decided to split it to introduce each of configure/prepare/process calls
> >>>> step by step...
> >>>
> >>> The issue with this approach is that it's harder to have an overview of
> >>> the proposed API. Is it *that* heavy to define a class with three
> >>> abstract functions and their documentation ?
> >>
> >> No, but as we already have a process() call in AGC it must be rewritten
> >> accordingly.
> > 
> > The existing process() function takes different parameters, so the
> > compiler shouldn't complain. Worst case it could be renamed in a small
> > patch at the beginning of the series to move it out of the way. I agree
> > that adapting the algorithm is best done in a patch separate from the
> > introduction of the new Algorithm structure.
> 
> The compiler does not agree with you :-).
> 
> ../src/ipa/ipu3/ipu3_agc.h:33:7: error:
> 'libcamera::ipa::ipu3::IPU3Agc::process' hides overloaded virtual
> function [-Werror,-Woverloaded-virtual]

It's a warning that we treat as an error, as all warnings. You could
disable the warning temporarily and then restore it as part of the
series to keep patches from getting large.

>         void process(const ipu3_uapi_stats_3a *stats, uint32_t
> &exposure, double &gain);
>              ^
> ../src/ipa/ipu3/algorithms/algorithm.h:26:15: note: hidden overloaded
> virtual function 'libcamera::ipa::ipu3::Algorithm::process' declared
> here: different number of parameters (2 vs 3)
>         virtual void process(IPAContext &context, ipu3_uapi_stats_3a
> &stats);
> 
> >>>>>>  };
> >>>>>>  
> >>>>>>  } /* namespace ipa::ipu3 */
> >>>>>> diff --git a/src/ipa/ipu3/algorithms/grid.cpp b/src/ipa/ipu3/algorithms/grid.cpp
> >>>>>> index 3578f41b..e42a760d 100644
> >>>>>> --- a/src/ipa/ipu3/algorithms/grid.cpp
> >>>>>> +++ b/src/ipa/ipu3/algorithms/grid.cpp
> >>>>>> @@ -78,6 +78,12 @@ int Grid::configure(IPAContext &context, const IPAConfigInfo &configInfo)
> >>>>>>  	return 0;
> >>>>>>  }
> >>>>>>  
> >>>>>> +void Grid::prepare(IPAContext &context, ipu3_uapi_params &params)
> >>>>>> +{
> >>>>>> +	/* Update the IPU3 parameters with new calculated grid */
> >>>>>> +	params.acc_param.awb.config.grid = context.configuration.grid.bdsGrid;
> >>>>>
> >>>>> And this is where the spaghetti dish begins :-( It should be the
> >>>>> responsibility of the AWB algorithm to set params.acc_param.awb.
> >>>>
> >>>> Yes, I moved it at least 5 times while writing the patches as I could
> >>>> not decide where it should be :-p.
> >>>
> >>> As commented in patch 03/10, I don't think "grid" should be an
> >>> algorithm.
> >>>
> >>>>>> +}
> >>>>>> +
> >>>>>>  } /* namespace ipa::ipu3::algorithms */
> >>>>>>  
> >>>>>>  } /* namespace libcamera */
> >>>>>> diff --git a/src/ipa/ipu3/algorithms/grid.h b/src/ipa/ipu3/algorithms/grid.h
> >>>>>> index b4a51b42..89399bd2 100644
> >>>>>> --- a/src/ipa/ipu3/algorithms/grid.h
> >>>>>> +++ b/src/ipa/ipu3/algorithms/grid.h
> >>>>>> @@ -19,6 +19,7 @@ public:
> >>>>>>  	~Grid() = default;
> >>>>>>  
> >>>>>>  	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
> >>>>>> +	void prepare(IPAContext &context, ipu3_uapi_params &params) override;
> >>>>>>  };
> >>>>>>  
> >>>>>>  } /* namespace ipa::ipu3::algorithms */
> >>>>>> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> >>>>>> index ef7fec86..394a7a45 100644
> >>>>>> --- a/src/ipa/ipu3/ipu3.cpp
> >>>>>> +++ b/src/ipa/ipu3/ipu3.cpp
> >>>>>> @@ -305,6 +305,9 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
> >>>>>>  
> >>>>>>  void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
> >>>>>>  {
> >>>>>> +	for (auto const &algo : algorithms_)
> >>>>>> +		algo->prepare(context_, params_);
> >>>>>> +
> >>>>>>  	if (agcAlgo_->updateControls())
> >>>>>>  		awbAlgo_->updateWbParameters(params_, agcAlgo_->gamma());
> >>>>>>  
> >>>>>> diff --git a/src/ipa/ipu3/ipu3_awb.cpp b/src/ipa/ipu3/ipu3_awb.cpp
> >>>>>> index 4ee5ee6f..911760b3 100644
> >>>>>> --- a/src/ipa/ipu3/ipu3_awb.cpp
> >>>>>> +++ b/src/ipa/ipu3/ipu3_awb.cpp
> >>>>>> @@ -159,7 +159,6 @@ void IPU3Awb::initialise(ipu3_uapi_params &params, const Size &bdsOutputSize, st
> >>>>>>  	params.acc_param.awb.config.rgbs_thr_r = 8191;
> >>>>>>  	params.acc_param.awb.config.rgbs_thr_gb = 8191;
> >>>>>>  	params.acc_param.awb.config.rgbs_thr_b = 8191 | IPU3_UAPI_AWB_RGBS_THR_B_EN | IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT;
> >>>>>> -	params.acc_param.awb.config.grid = bdsGrid;
> >>>>>>  	awbGrid_ = bdsGrid;
> >>>>>>  
> >>>>>>  	params.use.acc_bnr = 1;

Patch
diff mbox series

diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
index c1b37276..b571f55a 100644
--- a/src/ipa/ipu3/algorithms/algorithm.h
+++ b/src/ipa/ipu3/algorithms/algorithm.h
@@ -26,6 +26,8 @@  public:
 	{
 		return 0;
 	}
+
+	virtual void prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] ipu3_uapi_params &params) {}
 };
 
 } /* namespace ipa::ipu3 */
diff --git a/src/ipa/ipu3/algorithms/grid.cpp b/src/ipa/ipu3/algorithms/grid.cpp
index 3578f41b..e42a760d 100644
--- a/src/ipa/ipu3/algorithms/grid.cpp
+++ b/src/ipa/ipu3/algorithms/grid.cpp
@@ -78,6 +78,12 @@  int Grid::configure(IPAContext &context, const IPAConfigInfo &configInfo)
 	return 0;
 }
 
+void Grid::prepare(IPAContext &context, ipu3_uapi_params &params)
+{
+	/* Update the IPU3 parameters with new calculated grid */
+	params.acc_param.awb.config.grid = context.configuration.grid.bdsGrid;
+}
+
 } /* namespace ipa::ipu3::algorithms */
 
 } /* namespace libcamera */
diff --git a/src/ipa/ipu3/algorithms/grid.h b/src/ipa/ipu3/algorithms/grid.h
index b4a51b42..89399bd2 100644
--- a/src/ipa/ipu3/algorithms/grid.h
+++ b/src/ipa/ipu3/algorithms/grid.h
@@ -19,6 +19,7 @@  public:
 	~Grid() = default;
 
 	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
+	void prepare(IPAContext &context, ipu3_uapi_params &params) override;
 };
 
 } /* namespace ipa::ipu3::algorithms */
diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
index ef7fec86..394a7a45 100644
--- a/src/ipa/ipu3/ipu3.cpp
+++ b/src/ipa/ipu3/ipu3.cpp
@@ -305,6 +305,9 @@  void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
 
 void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
 {
+	for (auto const &algo : algorithms_)
+		algo->prepare(context_, params_);
+
 	if (agcAlgo_->updateControls())
 		awbAlgo_->updateWbParameters(params_, agcAlgo_->gamma());
 
diff --git a/src/ipa/ipu3/ipu3_awb.cpp b/src/ipa/ipu3/ipu3_awb.cpp
index 4ee5ee6f..911760b3 100644
--- a/src/ipa/ipu3/ipu3_awb.cpp
+++ b/src/ipa/ipu3/ipu3_awb.cpp
@@ -159,7 +159,6 @@  void IPU3Awb::initialise(ipu3_uapi_params &params, const Size &bdsOutputSize, st
 	params.acc_param.awb.config.rgbs_thr_r = 8191;
 	params.acc_param.awb.config.rgbs_thr_gb = 8191;
 	params.acc_param.awb.config.rgbs_thr_b = 8191 | IPU3_UAPI_AWB_RGBS_THR_B_EN | IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT;
-	params.acc_param.awb.config.grid = bdsGrid;
 	awbGrid_ = bdsGrid;
 
 	params.use.acc_bnr = 1;