In newer DCN families, there is no hw predefined curves. So, when
setting predefined TFs to gamm_corr, shaper, blend and regamma, the
driver resorts to the color modules and program those predefined curves
using LUTs. The driver is using the same LUT segmentation when
translating EOTF and inverse EOTF to hw points by using the same color
management helper to translate curve to hw points, however, LUT
representing EOTF may not follow the same region/segment distributions
of inverse EOTF. This is causing banding on blend when PQ predefined
curve is set. Use different helpers when linearizing and delinearizing.
This is the first step to fix banding but already mitigates the issue by
increase the number of points per segment from 8 to 16.

Signed-off-by: Melissa Wen <[email protected]>
---
 .../gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c    | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c
index b45ceb570a5c..17d54aadb5e1 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c
@@ -493,9 +493,8 @@ bool dcn32_set_mcm_luts(
        if (plane_state->blend_tf.type == TF_TYPE_HWPWL)
                lut_params = &plane_state->blend_tf.pwl;
        else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) {
-               result = 
cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
-                                                                
&plane_state->blend_tf,
-                                                                
&dpp_base->regamma_params, false);
+               result = 
cm3_helper_translate_curve_to_degamma_hw_format(&plane_state->blend_tf,
+                                                                        
&dpp_base->regamma_params);
                if (!result)
                        return result;
 
@@ -551,9 +550,8 @@ bool dcn32_set_input_transfer_func(struct dc *dc,
        if (plane_state->in_transfer_func.type == TF_TYPE_HWPWL)
                params = &plane_state->in_transfer_func.pwl;
        else if (plane_state->in_transfer_func.type == 
TF_TYPE_DISTRIBUTED_POINTS &&
-               cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
-                                                       
&plane_state->in_transfer_func,
-                                                       
&dpp_base->degamma_params, false))
+               
cm3_helper_translate_curve_to_degamma_hw_format(&plane_state->in_transfer_func,
+                                                               
&dpp_base->degamma_params))
                params = &dpp_base->degamma_params;
 
        dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params);
-- 
2.53.0

Reply via email to