Skip to content

Commit d25b32a

Browse files
melissawenalexdeucher
authored andcommitted
drm/amd/display: extend delta clamping logic to CM3 LUT helper
Commit 27fc10d ("drm/amd/display: Fix the delta clamping for shaper LUT") fixed banding when using plane shaper LUT in DCN10 CM helper. The problem is also present in DCN30 CM helper, fix banding by extending the same bug delta clamping fix to CM3. Signed-off-by: Melissa Wen <[email protected]> Reviewed-by: Harry Wentland <[email protected]> Signed-off-by: Alex Deucher <[email protected]> (cherry picked from commit 0274a54)
1 parent 8f959d3 commit d25b32a

5 files changed

Lines changed: 49 additions & 25 deletions

File tree

drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,12 @@ void cm_helper_program_gamcor_xfer_func(
105105
#define NUMBER_REGIONS 32
106106
#define NUMBER_SW_SEGMENTS 16
107107

108-
bool cm3_helper_translate_curve_to_hw_format(
109-
const struct dc_transfer_func *output_tf,
110-
struct pwl_params *lut_params, bool fixpoint)
108+
#define DC_LOGGER \
109+
ctx->logger
110+
111+
bool cm3_helper_translate_curve_to_hw_format(struct dc_context *ctx,
112+
const struct dc_transfer_func *output_tf,
113+
struct pwl_params *lut_params, bool fixpoint)
111114
{
112115
struct curve_points3 *corner_points;
113116
struct pwl_result_data *rgb_resulted;
@@ -251,6 +254,10 @@ bool cm3_helper_translate_curve_to_hw_format(
251254
if (fixpoint == true) {
252255
i = 1;
253256
while (i != hw_points + 2) {
257+
uint32_t red_clamp;
258+
uint32_t green_clamp;
259+
uint32_t blue_clamp;
260+
254261
if (i >= hw_points) {
255262
if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
256263
rgb_plus_1->red = dc_fixpt_add(rgb->red,
@@ -263,9 +270,20 @@ bool cm3_helper_translate_curve_to_hw_format(
263270
rgb_minus_1->delta_blue);
264271
}
265272

266-
rgb->delta_red_reg = dc_fixpt_clamp_u0d10(rgb->delta_red);
267-
rgb->delta_green_reg = dc_fixpt_clamp_u0d10(rgb->delta_green);
268-
rgb->delta_blue_reg = dc_fixpt_clamp_u0d10(rgb->delta_blue);
273+
rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
274+
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
275+
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
276+
277+
red_clamp = dc_fixpt_clamp_u0d14(rgb->delta_red);
278+
green_clamp = dc_fixpt_clamp_u0d14(rgb->delta_green);
279+
blue_clamp = dc_fixpt_clamp_u0d14(rgb->delta_blue);
280+
281+
if (red_clamp >> 10 || green_clamp >> 10 || blue_clamp >> 10)
282+
DC_LOG_ERROR("Losing delta precision while programming shaper LUT.");
283+
284+
rgb->delta_red_reg = red_clamp & 0x3ff;
285+
rgb->delta_green_reg = green_clamp & 0x3ff;
286+
rgb->delta_blue_reg = blue_clamp & 0x3ff;
269287
rgb->red_reg = dc_fixpt_clamp_u0d14(rgb->red);
270288
rgb->green_reg = dc_fixpt_clamp_u0d14(rgb->green);
271289
rgb->blue_reg = dc_fixpt_clamp_u0d14(rgb->blue);

drivers/gpu/drm/amd/display/dc/dwb/dcn30/dcn30_cm_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ void cm_helper_program_gamcor_xfer_func(
5959
const struct pwl_params *params,
6060
const struct dcn3_xfer_func_reg *reg);
6161

62-
bool cm3_helper_translate_curve_to_hw_format(
62+
bool cm3_helper_translate_curve_to_hw_format(struct dc_context *ctx,
6363
const struct dc_transfer_func *output_tf,
6464
struct pwl_params *lut_params, bool fixpoint);
6565

drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ bool dcn30_set_blend_lut(
239239
if (plane_state->blend_tf.type == TF_TYPE_HWPWL)
240240
blend_lut = &plane_state->blend_tf.pwl;
241241
else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) {
242-
result = cm3_helper_translate_curve_to_hw_format(
242+
result = cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
243243
&plane_state->blend_tf, &dpp_base->regamma_params, false);
244244
if (!result)
245245
return result;
@@ -334,8 +334,9 @@ bool dcn30_set_input_transfer_func(struct dc *dc,
334334
if (plane_state->in_transfer_func.type == TF_TYPE_HWPWL)
335335
params = &plane_state->in_transfer_func.pwl;
336336
else if (plane_state->in_transfer_func.type == TF_TYPE_DISTRIBUTED_POINTS &&
337-
cm3_helper_translate_curve_to_hw_format(&plane_state->in_transfer_func,
338-
&dpp_base->degamma_params, false))
337+
cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
338+
&plane_state->in_transfer_func,
339+
&dpp_base->degamma_params, false))
339340
params = &dpp_base->degamma_params;
340341

341342
result = dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params);
@@ -406,7 +407,7 @@ bool dcn30_set_output_transfer_func(struct dc *dc,
406407
params = &stream->out_transfer_func.pwl;
407408
else if (pipe_ctx->stream->out_transfer_func.type ==
408409
TF_TYPE_DISTRIBUTED_POINTS &&
409-
cm3_helper_translate_curve_to_hw_format(
410+
cm3_helper_translate_curve_to_hw_format(stream->ctx,
410411
&stream->out_transfer_func,
411412
&mpc->blender_params, false))
412413
params = &mpc->blender_params;

drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -486,8 +486,9 @@ bool dcn32_set_mcm_luts(
486486
if (plane_state->blend_tf.type == TF_TYPE_HWPWL)
487487
lut_params = &plane_state->blend_tf.pwl;
488488
else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) {
489-
result = cm3_helper_translate_curve_to_hw_format(&plane_state->blend_tf,
490-
&dpp_base->regamma_params, false);
489+
result = cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
490+
&plane_state->blend_tf,
491+
&dpp_base->regamma_params, false);
491492
if (!result)
492493
return result;
493494

@@ -502,8 +503,9 @@ bool dcn32_set_mcm_luts(
502503
else if (plane_state->in_shaper_func.type == TF_TYPE_DISTRIBUTED_POINTS) {
503504
// TODO: dpp_base replace
504505
ASSERT(false);
505-
cm3_helper_translate_curve_to_hw_format(&plane_state->in_shaper_func,
506-
&dpp_base->shaper_params, true);
506+
cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
507+
&plane_state->in_shaper_func,
508+
&dpp_base->shaper_params, true);
507509
lut_params = &dpp_base->shaper_params;
508510
}
509511

@@ -543,8 +545,9 @@ bool dcn32_set_input_transfer_func(struct dc *dc,
543545
if (plane_state->in_transfer_func.type == TF_TYPE_HWPWL)
544546
params = &plane_state->in_transfer_func.pwl;
545547
else if (plane_state->in_transfer_func.type == TF_TYPE_DISTRIBUTED_POINTS &&
546-
cm3_helper_translate_curve_to_hw_format(&plane_state->in_transfer_func,
547-
&dpp_base->degamma_params, false))
548+
cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
549+
&plane_state->in_transfer_func,
550+
&dpp_base->degamma_params, false))
548551
params = &dpp_base->degamma_params;
549552

550553
dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params);
@@ -575,7 +578,7 @@ bool dcn32_set_output_transfer_func(struct dc *dc,
575578
params = &stream->out_transfer_func.pwl;
576579
else if (pipe_ctx->stream->out_transfer_func.type ==
577580
TF_TYPE_DISTRIBUTED_POINTS &&
578-
cm3_helper_translate_curve_to_hw_format(
581+
cm3_helper_translate_curve_to_hw_format(stream->ctx,
579582
&stream->out_transfer_func,
580583
&mpc->blender_params, false))
581584
params = &mpc->blender_params;

drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ void dcn401_populate_mcm_luts(struct dc *dc,
430430
if (mcm_luts.lut1d_func->type == TF_TYPE_HWPWL)
431431
m_lut_params.pwl = &mcm_luts.lut1d_func->pwl;
432432
else if (mcm_luts.lut1d_func->type == TF_TYPE_DISTRIBUTED_POINTS) {
433-
rval = cm3_helper_translate_curve_to_hw_format(
433+
rval = cm3_helper_translate_curve_to_hw_format(mpc->ctx,
434434
mcm_luts.lut1d_func,
435435
&dpp_base->regamma_params, false);
436436
m_lut_params.pwl = rval ? &dpp_base->regamma_params : NULL;
@@ -450,7 +450,7 @@ void dcn401_populate_mcm_luts(struct dc *dc,
450450
m_lut_params.pwl = &mcm_luts.shaper->pwl;
451451
else if (mcm_luts.shaper->type == TF_TYPE_DISTRIBUTED_POINTS) {
452452
ASSERT(false);
453-
rval = cm3_helper_translate_curve_to_hw_format(
453+
rval = cm3_helper_translate_curve_to_hw_format(mpc->ctx,
454454
mcm_luts.shaper,
455455
&dpp_base->regamma_params, true);
456456
m_lut_params.pwl = rval ? &dpp_base->regamma_params : NULL;
@@ -627,8 +627,9 @@ bool dcn401_set_mcm_luts(struct pipe_ctx *pipe_ctx,
627627
if (plane_state->blend_tf.type == TF_TYPE_HWPWL)
628628
lut_params = &plane_state->blend_tf.pwl;
629629
else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) {
630-
rval = cm3_helper_translate_curve_to_hw_format(&plane_state->blend_tf,
631-
&dpp_base->regamma_params, false);
630+
rval = cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
631+
&plane_state->blend_tf,
632+
&dpp_base->regamma_params, false);
632633
lut_params = rval ? &dpp_base->regamma_params : NULL;
633634
}
634635
result = mpc->funcs->program_1dlut(mpc, lut_params, mpcc_id);
@@ -639,8 +640,9 @@ bool dcn401_set_mcm_luts(struct pipe_ctx *pipe_ctx,
639640
lut_params = &plane_state->in_shaper_func.pwl;
640641
else if (plane_state->in_shaper_func.type == TF_TYPE_DISTRIBUTED_POINTS) {
641642
// TODO: dpp_base replace
642-
rval = cm3_helper_translate_curve_to_hw_format(&plane_state->in_shaper_func,
643-
&dpp_base->shaper_params, true);
643+
rval = cm3_helper_translate_curve_to_hw_format(plane_state->ctx,
644+
&plane_state->in_shaper_func,
645+
&dpp_base->shaper_params, true);
644646
lut_params = rval ? &dpp_base->shaper_params : NULL;
645647
}
646648
result &= mpc->funcs->program_shaper(mpc, lut_params, mpcc_id);
@@ -674,7 +676,7 @@ bool dcn401_set_output_transfer_func(struct dc *dc,
674676
params = &stream->out_transfer_func.pwl;
675677
else if (pipe_ctx->stream->out_transfer_func.type ==
676678
TF_TYPE_DISTRIBUTED_POINTS &&
677-
cm3_helper_translate_curve_to_hw_format(
679+
cm3_helper_translate_curve_to_hw_format(stream->ctx,
678680
&stream->out_transfer_func,
679681
&mpc->blender_params, false))
680682
params = &mpc->blender_params;

0 commit comments

Comments
 (0)