Commit 78b56c52 authored by Dmytro Laktyushkin's avatar Dmytro Laktyushkin Committed by Alex Deucher

drm/amd/display: use clamping rather than truncation for CM fp conversions

Signed-off-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 51ca0b03
...@@ -554,6 +554,22 @@ static inline uint32_t ux_dy( ...@@ -554,6 +554,22 @@ static inline uint32_t ux_dy(
return result | fractional_part; return result | fractional_part;
} }
static inline uint32_t clamp_ux_dy(
int64_t value,
uint32_t integer_bits,
uint32_t fractional_bits,
uint32_t min_clamp)
{
uint32_t truncated_val = ux_dy(value, integer_bits, fractional_bits);
if (value >= (1LL << (integer_bits + FIXED31_32_BITS_PER_FRACTIONAL_PART)))
return (1 << (integer_bits + fractional_bits)) - 1;
else if (truncated_val > min_clamp)
return truncated_val;
else
return min_clamp;
}
uint32_t dal_fixed31_32_u2d19( uint32_t dal_fixed31_32_u2d19(
struct fixed31_32 arg) struct fixed31_32 arg)
{ {
...@@ -566,14 +582,14 @@ uint32_t dal_fixed31_32_u0d19( ...@@ -566,14 +582,14 @@ uint32_t dal_fixed31_32_u0d19(
return ux_dy(arg.value, 0, 19); return ux_dy(arg.value, 0, 19);
} }
uint32_t dal_fixed31_32_u0d14( uint32_t dal_fixed31_32_clamp_u0d14(
struct fixed31_32 arg) struct fixed31_32 arg)
{ {
return ux_dy(arg.value, 1, 14); return clamp_ux_dy(arg.value, 0, 14, 1);
} }
uint32_t dal_fixed31_32_u0d10( uint32_t dal_fixed31_32_clamp_u0d10(
struct fixed31_32 arg) struct fixed31_32 arg)
{ {
return ux_dy(arg.value, 1, 10); return clamp_ux_dy(arg.value, 0, 10, 1);
} }
...@@ -169,7 +169,7 @@ bool cm_helper_convert_to_custom_float( ...@@ -169,7 +169,7 @@ bool cm_helper_convert_to_custom_float(
} }
if (fixpoint == true) if (fixpoint == true)
arr_points[1].custom_float_y = dal_fixed31_32_u0d14(arr_points[1].y); arr_points[1].custom_float_y = dal_fixed31_32_clamp_u0d14(arr_points[1].y);
else if (!convert_to_custom_float_format(arr_points[1].y, &fmt, else if (!convert_to_custom_float_format(arr_points[1].y, &fmt,
&arr_points[1].custom_float_y)) { &arr_points[1].custom_float_y)) {
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
...@@ -395,12 +395,12 @@ bool cm_helper_translate_curve_to_hw_format( ...@@ -395,12 +395,12 @@ bool cm_helper_translate_curve_to_hw_format(
rgb->delta_blue = dal_fixed31_32_sub(rgb_plus_1->blue, rgb->blue); rgb->delta_blue = dal_fixed31_32_sub(rgb_plus_1->blue, rgb->blue);
if (fixpoint == true) { if (fixpoint == true) {
rgb->delta_red_reg = dal_fixed31_32_u0d10(rgb->delta_red); rgb->delta_red_reg = dal_fixed31_32_clamp_u0d10(rgb->delta_red);
rgb->delta_green_reg = dal_fixed31_32_u0d10(rgb->delta_green); rgb->delta_green_reg = dal_fixed31_32_clamp_u0d10(rgb->delta_green);
rgb->delta_blue_reg = dal_fixed31_32_u0d10(rgb->delta_blue); rgb->delta_blue_reg = dal_fixed31_32_clamp_u0d10(rgb->delta_blue);
rgb->red_reg = dal_fixed31_32_u0d14(rgb->red); rgb->red_reg = dal_fixed31_32_clamp_u0d14(rgb->red);
rgb->green_reg = dal_fixed31_32_u0d14(rgb->green); rgb->green_reg = dal_fixed31_32_clamp_u0d14(rgb->green);
rgb->blue_reg = dal_fixed31_32_u0d14(rgb->blue); rgb->blue_reg = dal_fixed31_32_clamp_u0d14(rgb->blue);
} }
++rgb_plus_1; ++rgb_plus_1;
......
...@@ -464,10 +464,10 @@ uint32_t dal_fixed31_32_u0d19( ...@@ -464,10 +464,10 @@ uint32_t dal_fixed31_32_u0d19(
struct fixed31_32 arg); struct fixed31_32 arg);
uint32_t dal_fixed31_32_u0d14( uint32_t dal_fixed31_32_clamp_u0d14(
struct fixed31_32 arg); struct fixed31_32 arg);
uint32_t dal_fixed31_32_u0d10( uint32_t dal_fixed31_32_clamp_u0d10(
struct fixed31_32 arg); struct fixed31_32 arg);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment