Skip to content

Commit efaf157

Browse files
Relja Vojvodicalexdeucher
authored andcommitted
drm/amd/display: Add sharpness control interface
- Add interface for controlling shapness level input into DCN. - Update SPL to support custom sharpness values. - Add support for different sharpness values depending on YUV/RGB content. Reviewed-by: Samson Tam <samson.tam@amd.com> Signed-off-by: Relja Vojvodic <Relja.Vojvodic@amd.com> Signed-off-by: Hamza Mahfooz <hamza.mahfooz@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 6e84109 commit efaf157

9 files changed

Lines changed: 138 additions & 192 deletions

File tree

drivers/gpu/drm/amd/display/dc/core/dc.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2690,6 +2690,9 @@ static enum surface_update_type check_update_surfaces_for_stream(
26902690
stream_update->vrr_active_variable || stream_update->vrr_active_fixed))
26912691
su_flags->bits.fams_changed = 1;
26922692

2693+
if (stream_update->scaler_sharpener_update)
2694+
su_flags->bits.scaler_sharpener = 1;
2695+
26932696
if (su_flags->raw != 0)
26942697
overall_type = UPDATE_TYPE_FULL;
26952698

@@ -3022,6 +3025,8 @@ static void copy_stream_update_to_stream(struct dc *dc,
30223025
update->dsc_config = NULL;
30233026
}
30243027
}
3028+
if (update->scaler_sharpener_update)
3029+
stream->scaler_sharpener_update = *update->scaler_sharpener_update;
30253030
}
30263031

30273032
static void backup_planes_and_stream_state(
@@ -4713,7 +4718,8 @@ static bool full_update_required(struct dc *dc,
47134718
stream_update->func_shaper ||
47144719
stream_update->lut3d_func ||
47154720
stream_update->pending_test_pattern ||
4716-
stream_update->crtc_timing_adjust))
4721+
stream_update->crtc_timing_adjust ||
4722+
stream_update->scaler_sharpener_update))
47174723
return true;
47184724

47194725
if (stream) {

drivers/gpu/drm/amd/display/dc/dc.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,7 @@ struct dc_debug_options {
10521052
unsigned int disable_spl;
10531053
unsigned int force_easf;
10541054
unsigned int force_sharpness;
1055+
unsigned int force_sharpness_level;
10551056
unsigned int force_lls;
10561057
bool notify_dpia_hr_bw;
10571058
bool enable_ips_visual_confirm;
@@ -1348,7 +1349,7 @@ struct dc_plane_state {
13481349
enum mpcc_movable_cm_location mcm_location;
13491350
struct dc_csc_transform cursor_csc_color_matrix;
13501351
bool adaptive_sharpness_en;
1351-
unsigned int sharpnessX1000;
1352+
int sharpness_level;
13521353
enum linear_light_scaling linear_light_scaling;
13531354
};
13541355

drivers/gpu/drm/amd/display/dc/dc_spl_translate.c

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -139,24 +139,36 @@ void translate_SPL_in_params_from_pipe_ctx(struct pipe_ctx *pipe_ctx, struct spl
139139
else if (pipe_ctx->stream->ctx->dc->debug.force_easf == 2)
140140
spl_in->disable_easf = true;
141141
/* Translate adaptive sharpening preference */
142-
if (pipe_ctx->stream->ctx->dc->debug.force_sharpness > 0) {
143-
spl_in->adaptive_sharpness.enable = (pipe_ctx->stream->ctx->dc->debug.force_sharpness > 1) ? true : false;
144-
if (pipe_ctx->stream->ctx->dc->debug.force_sharpness == 2)
145-
spl_in->adaptive_sharpness.sharpness = SHARPNESS_LOW;
146-
else if (pipe_ctx->stream->ctx->dc->debug.force_sharpness == 3)
147-
spl_in->adaptive_sharpness.sharpness = SHARPNESS_MID;
148-
else if (pipe_ctx->stream->ctx->dc->debug.force_sharpness >= 4)
149-
spl_in->adaptive_sharpness.sharpness = SHARPNESS_HIGH;
150-
} else {
151-
spl_in->adaptive_sharpness.enable = plane_state->adaptive_sharpness_en;
152-
if (plane_state->sharpnessX1000 == 0)
142+
unsigned int sharpness_setting = pipe_ctx->stream->ctx->dc->debug.force_sharpness;
143+
unsigned int force_sharpness_level = pipe_ctx->stream->ctx->dc->debug.force_sharpness_level;
144+
if (sharpness_setting == SHARPNESS_HW_OFF)
145+
spl_in->adaptive_sharpness.enable = false;
146+
else if (sharpness_setting == SHARPNESS_ZERO) {
147+
spl_in->adaptive_sharpness.enable = true;
148+
spl_in->adaptive_sharpness.sharpness_level = 0;
149+
} else if (sharpness_setting == SHARPNESS_CUSTOM) {
150+
spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_min = 0;
151+
spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_max = 1750;
152+
spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_mid = 750;
153+
spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_min = 0;
154+
spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_max = 3500;
155+
spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_mid = 1500;
156+
spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_min = 0;
157+
spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_max = 2750;
158+
spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_mid = 1500;
159+
160+
if (force_sharpness_level > 0) {
161+
if (force_sharpness_level > 10)
162+
force_sharpness_level = 10;
163+
spl_in->adaptive_sharpness.enable = true;
164+
spl_in->adaptive_sharpness.sharpness_level = force_sharpness_level;
165+
} else if (!plane_state->adaptive_sharpness_en) {
153166
spl_in->adaptive_sharpness.enable = false;
154-
else if (plane_state->sharpnessX1000 < 999)
155-
spl_in->adaptive_sharpness.sharpness = SHARPNESS_LOW;
156-
else if (plane_state->sharpnessX1000 < 1999)
157-
spl_in->adaptive_sharpness.sharpness = SHARPNESS_MID;
158-
else // Any other value is high sharpness
159-
spl_in->adaptive_sharpness.sharpness = SHARPNESS_HIGH;
167+
spl_in->adaptive_sharpness.sharpness_level = 0;
168+
} else {
169+
spl_in->adaptive_sharpness.enable = true;
170+
spl_in->adaptive_sharpness.sharpness_level = plane_state->sharpness_level;
171+
}
160172
}
161173
// Translate linear light scaling preference
162174
if (pipe_ctx->stream->ctx->dc->debug.force_lls > 0)

drivers/gpu/drm/amd/display/dc/dc_stream.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ union stream_update_flags {
142142
uint32_t mst_bw : 1;
143143
uint32_t crtc_timing_adjust : 1;
144144
uint32_t fams_changed : 1;
145+
uint32_t scaler_sharpener : 1;
145146
} bits;
146147

147148
uint32_t raw;
@@ -308,6 +309,7 @@ struct dc_stream_state {
308309
bool is_phantom;
309310

310311
struct luminance_data lumin_data;
312+
bool scaler_sharpener_update;
311313
};
312314

313315
#define ABM_LEVEL_IMMEDIATE_DISABLE 255
@@ -353,6 +355,7 @@ struct dc_stream_update {
353355
struct dc_cursor_attributes *cursor_attributes;
354356
struct dc_cursor_position *cursor_position;
355357
bool *hw_cursor_req;
358+
bool *scaler_sharpener_update;
356359
};
357360

358361
bool dc_is_stream_unchanged(

drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp_dscl.c

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,7 @@ static void dpp401_dscl_set_isharp_filter(
957957
*/
958958
static void dpp401_dscl_program_isharp(struct dpp *dpp_base,
959959
const struct scaler_data *scl_data,
960+
bool program_isharp_1dlut,
960961
bool *bs_coeffs_updated)
961962
{
962963
struct dcn401_dpp *dpp = TO_DCN401_DPP(dpp_base);
@@ -1015,7 +1016,8 @@ static void dpp401_dscl_program_isharp(struct dpp *dpp_base,
10151016
ISHARP_LBA_PWL_BASE_SEG5, scl_data->dscl_prog_data.isharp_lba.base_seg[5]);
10161017

10171018
/* ISHARP_DELTA_LUT */
1018-
dpp401_dscl_set_isharp_filter(dpp, scl_data->dscl_prog_data.isharp_delta);
1019+
if (!program_isharp_1dlut)
1020+
dpp401_dscl_set_isharp_filter(dpp, scl_data->dscl_prog_data.isharp_delta);
10191021

10201022
/* ISHARP_NLDELTA_SOFT_CLIP */
10211023
REG_SET_6(ISHARP_NLDELTA_SOFT_CLIP, 0,
@@ -1071,13 +1073,29 @@ void dpp401_dscl_set_scaler_manual_scale(struct dpp *dpp_base,
10711073
dpp_base, scl_data, dpp_base->ctx->dc->debug.always_scale);
10721074
bool ycbcr = scl_data->format >= PIXEL_FORMAT_VIDEO_BEGIN
10731075
&& scl_data->format <= PIXEL_FORMAT_VIDEO_END;
1076+
bool program_isharp_1dlut = false;
10741077
bool bs_coeffs_updated = false;
10751078

1079+
10761080
if (memcmp(&dpp->scl_data, scl_data, sizeof(*scl_data)) == 0)
10771081
return;
10781082

10791083
PERF_TRACE();
10801084

1085+
/* If only sharpness has changed, then only update 1dlut, then return */
1086+
if (scl_data->dscl_prog_data.isharp_en &&
1087+
(dpp->scl_data.dscl_prog_data.sharpness_level
1088+
!= scl_data->dscl_prog_data.sharpness_level)) {
1089+
/* ISHARP_DELTA_LUT */
1090+
dpp401_dscl_set_isharp_filter(dpp, scl_data->dscl_prog_data.isharp_delta);
1091+
dpp->scl_data.dscl_prog_data.sharpness_level = scl_data->dscl_prog_data.sharpness_level;
1092+
dpp->scl_data.dscl_prog_data.isharp_delta = scl_data->dscl_prog_data.isharp_delta;
1093+
1094+
if (memcmp(&dpp->scl_data, scl_data, sizeof(*scl_data)) == 0)
1095+
return;
1096+
program_isharp_1dlut = true;
1097+
}
1098+
10811099
dpp->scl_data = *scl_data;
10821100

10831101
if ((dpp->base.ctx->dc->config.use_spl) && (!dpp->base.ctx->dc->debug.disable_spl)) {
@@ -1131,7 +1149,7 @@ void dpp401_dscl_set_scaler_manual_scale(struct dpp *dpp_base,
11311149
if (dscl_mode == DSCL_MODE_SCALING_444_BYPASS) {
11321150
if (dpp->base.ctx->dc->config.prefer_easf)
11331151
dpp401_dscl_disable_easf(dpp_base, scl_data);
1134-
dpp401_dscl_program_isharp(dpp_base, scl_data, &bs_coeffs_updated);
1152+
dpp401_dscl_program_isharp(dpp_base, scl_data, program_isharp_1dlut, &bs_coeffs_updated);
11351153
return;
11361154
}
11371155

@@ -1165,7 +1183,7 @@ void dpp401_dscl_set_scaler_manual_scale(struct dpp *dpp_base,
11651183
* WB scaler coeffs and toggle coeff RAM together
11661184
*/
11671185
//if (dpp->base.ctx->dc->config.prefer_easf)
1168-
dpp401_dscl_program_isharp(dpp_base, scl_data, &bs_coeffs_updated);
1186+
dpp401_dscl_program_isharp(dpp_base, scl_data, program_isharp_1dlut, &bs_coeffs_updated);
11691187

11701188
dpp401_dscl_set_scl_filter(dpp, scl_data, ycbcr, bs_coeffs_updated);
11711189
/* Edge adaptive scaler function configuration */

drivers/gpu/drm/amd/display/dc/spl/dc_spl.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1662,8 +1662,10 @@ static void spl_set_isharp_data(struct dscl_prog_data *dscl_prog_data,
16621662
dscl_prog_data->isharp_lba.base_seg[5] = 0; // ISHARP LBA PWL for Seg 5. BASE value in U0.6 format
16631663
}
16641664

1665-
spl_build_isharp_1dlut_from_reference_curve(ratio, setup, adp_sharpness.sharpness);
1665+
1666+
spl_build_isharp_1dlut_from_reference_curve(ratio, setup, adp_sharpness);
16661667
dscl_prog_data->isharp_delta = spl_get_pregen_filter_isharp_1D_lut(setup);
1668+
dscl_prog_data->sharpness_level = adp_sharpness.sharpness_level;
16671669

16681670
// Program the nldelta soft clip values
16691671
if (lls_pref == LLS_PREF_YES) {

0 commit comments

Comments
 (0)