summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/display/modules/color/color_gamma.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
index 81b842270db9..7480f072c375 100644
--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
+++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
@@ -820,6 +820,7 @@ static bool build_freesync_hdr(struct pwl_float_data_ex *rgb_regamma,
struct fixed31_32 clip = dc_fixpt_one;
struct fixed31_32 output;
bool use_eetf = false;
+ bool is_clipped = false;
struct fixed31_32 sdr_white_level = dc_fixpt_from_int(fs_params->sdr_white_level);
if (fs_params == NULL || fs_params->max_content == 0 ||
@@ -844,25 +845,32 @@ static bool build_freesync_hdr(struct pwl_float_data_ex *rgb_regamma,
rgb += 32; // first 32 points have problems with fixed point, too small
coord_x += 32;
for (i = 32; i <= hw_points_num; i++) {
- if (use_eetf) {
- /*max content is equal 1 */
- scaledX1 = dc_fixpt_div(coord_x->x,
- dc_fixpt_div(max_content, sdr_white_level));
- hermite_spline_eetf(scaledX1, max_display, min_display,
- max_content, &scaledX);
- } else
- scaledX = dc_fixpt_div(coord_x->x,
- dc_fixpt_div(max_display, sdr_white_level));
-
- if (dc_fixpt_lt(scaledX, clip)) {
- if (dc_fixpt_lt(scaledX, dc_fixpt_zero))
- output = dc_fixpt_zero;
- else
- output = calculate_gamma22(scaledX);
+ if (!is_clipped) {
+ if (use_eetf) {
+ /*max content is equal 1 */
+ scaledX1 = dc_fixpt_div(coord_x->x,
+ dc_fixpt_div(max_content, sdr_white_level));
+ hermite_spline_eetf(scaledX1, max_display, min_display,
+ max_content, &scaledX);
+ } else
+ scaledX = dc_fixpt_div(coord_x->x,
+ dc_fixpt_div(max_display, sdr_white_level));
+
+ if (dc_fixpt_lt(scaledX, clip)) {
+ if (dc_fixpt_lt(scaledX, dc_fixpt_zero))
+ output = dc_fixpt_zero;
+ else
+ output = calculate_gamma22(scaledX);
- rgb->r = output;
- rgb->g = output;
- rgb->b = output;
+ rgb->r = output;
+ rgb->g = output;
+ rgb->b = output;
+ } else {
+ is_clipped = true;
+ rgb->r = clip;
+ rgb->g = clip;
+ rgb->b = clip;
+ }
} else {
rgb->r = clip;
rgb->g = clip;