mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-17 16:06:42 +07:00
drm/amd/display: Set gamma not working on MPO planes
[Why] Set gamma not working on certain planes in MPO configuration Root cause is that video format (YUV-420) isn't allowed for IGAM where gamma is applied. Fix is not easy though: 1. allowing will not work because IGAM is before ICSC so RGB gamma would be applied on YUV pixels. 2. Moving OS gamma to DGAM or RGAM resulted in weird artifacts. Ultimately the root cause for these artifacts was due to handling end points and the fact that YUV->RGB conversion will frequently "overshoot" FP 1.0 value. DCE has a single end point and slope, so we would take max. In nightlight mode, blue channel is reduced, sometimes to flat 0 line, but red is virtually unchanged. Any "overshot" in blue will be clipped to 1 (max R,G,B) instead of max blue value. [How] Fortunately, this can be fixed on DCN where we have end point and slope for all three color channels. We cannot fix this problem on DCE. Other things fixed: - switch (back) to using RGAM for OS gamma instead of IGAM - add coeffs for 709 YUV->RGB (we used RGB->YUV for both conversions) - switch color temperature method to scaled bradford - otherwise we would have clipping problems that caused us to switch to IGAM for OS gamma in the first place. - comments and some minor improvements - there are some more issues but they will be addressed in separate commits. Signed-off-by: Krunoslav Kovac <Krunoslav.Kovac@amd.com> Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> Acked-by: Leo Li <sunpeng.li@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
6e82c6e066
commit
0975780913
@ -71,39 +71,39 @@ void cm_helper_program_xfer_func(
|
||||
unsigned int i = 0;
|
||||
|
||||
REG_SET_2(reg->start_cntl_b, 0,
|
||||
exp_region_start, params->arr_points[0].custom_float_x,
|
||||
exp_region_start, params->corner_points[0].blue.custom_float_x,
|
||||
exp_resion_start_segment, 0);
|
||||
REG_SET_2(reg->start_cntl_g, 0,
|
||||
exp_region_start, params->arr_points[0].custom_float_x,
|
||||
exp_region_start, params->corner_points[0].green.custom_float_x,
|
||||
exp_resion_start_segment, 0);
|
||||
REG_SET_2(reg->start_cntl_r, 0,
|
||||
exp_region_start, params->arr_points[0].custom_float_x,
|
||||
exp_region_start, params->corner_points[0].red.custom_float_x,
|
||||
exp_resion_start_segment, 0);
|
||||
|
||||
REG_SET(reg->start_slope_cntl_b, 0,
|
||||
field_region_linear_slope, params->arr_points[0].custom_float_slope);
|
||||
field_region_linear_slope, params->corner_points[0].blue.custom_float_slope);
|
||||
REG_SET(reg->start_slope_cntl_g, 0,
|
||||
field_region_linear_slope, params->arr_points[0].custom_float_slope);
|
||||
field_region_linear_slope, params->corner_points[0].green.custom_float_slope);
|
||||
REG_SET(reg->start_slope_cntl_r, 0,
|
||||
field_region_linear_slope, params->arr_points[0].custom_float_slope);
|
||||
field_region_linear_slope, params->corner_points[0].red.custom_float_slope);
|
||||
|
||||
REG_SET(reg->start_end_cntl1_b, 0,
|
||||
field_region_end, params->arr_points[1].custom_float_x);
|
||||
field_region_end, params->corner_points[1].blue.custom_float_x);
|
||||
REG_SET_2(reg->start_end_cntl2_b, 0,
|
||||
field_region_end_slope, params->arr_points[1].custom_float_slope,
|
||||
field_region_end_base, params->arr_points[1].custom_float_y);
|
||||
field_region_end_slope, params->corner_points[1].blue.custom_float_slope,
|
||||
field_region_end_base, params->corner_points[1].blue.custom_float_y);
|
||||
|
||||
REG_SET(reg->start_end_cntl1_g, 0,
|
||||
field_region_end, params->arr_points[1].custom_float_x);
|
||||
field_region_end, params->corner_points[1].green.custom_float_x);
|
||||
REG_SET_2(reg->start_end_cntl2_g, 0,
|
||||
field_region_end_slope, params->arr_points[1].custom_float_slope,
|
||||
field_region_end_base, params->arr_points[1].custom_float_y);
|
||||
field_region_end_slope, params->corner_points[1].green.custom_float_slope,
|
||||
field_region_end_base, params->corner_points[1].green.custom_float_y);
|
||||
|
||||
REG_SET(reg->start_end_cntl1_r, 0,
|
||||
field_region_end, params->arr_points[1].custom_float_x);
|
||||
field_region_end, params->corner_points[1].red.custom_float_x);
|
||||
REG_SET_2(reg->start_end_cntl2_r, 0,
|
||||
field_region_end_slope, params->arr_points[1].custom_float_slope,
|
||||
field_region_end_base, params->arr_points[1].custom_float_y);
|
||||
field_region_end_slope, params->corner_points[1].red.custom_float_slope,
|
||||
field_region_end_base, params->corner_points[1].red.custom_float_y);
|
||||
|
||||
for (reg_region_cur = reg->region_start;
|
||||
reg_region_cur <= reg->region_end;
|
||||
@ -127,7 +127,7 @@ void cm_helper_program_xfer_func(
|
||||
|
||||
bool cm_helper_convert_to_custom_float(
|
||||
struct pwl_result_data *rgb_resulted,
|
||||
struct curve_points *arr_points,
|
||||
struct curve_points3 *corner_points,
|
||||
uint32_t hw_points_num,
|
||||
bool fixpoint)
|
||||
{
|
||||
@ -141,20 +141,53 @@ bool cm_helper_convert_to_custom_float(
|
||||
fmt.mantissa_bits = 12;
|
||||
fmt.sign = false;
|
||||
|
||||
if (!convert_to_custom_float_format(arr_points[0].x, &fmt,
|
||||
&arr_points[0].custom_float_x)) {
|
||||
/* corner_points[0] - beginning base, slope offset for R,G,B
|
||||
* corner_points[1] - end base, slope offset for R,G,B
|
||||
*/
|
||||
if (!convert_to_custom_float_format(corner_points[0].red.x, &fmt,
|
||||
&corner_points[0].red.custom_float_x)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[0].green.x, &fmt,
|
||||
&corner_points[0].green.custom_float_x)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[0].blue.x, &fmt,
|
||||
&corner_points[0].blue.custom_float_x)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!convert_to_custom_float_format(arr_points[0].offset, &fmt,
|
||||
&arr_points[0].custom_float_offset)) {
|
||||
if (!convert_to_custom_float_format(corner_points[0].red.offset, &fmt,
|
||||
&corner_points[0].red.custom_float_offset)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[0].green.offset, &fmt,
|
||||
&corner_points[0].green.custom_float_offset)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[0].blue.offset, &fmt,
|
||||
&corner_points[0].blue.custom_float_offset)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!convert_to_custom_float_format(arr_points[0].slope, &fmt,
|
||||
&arr_points[0].custom_float_slope)) {
|
||||
if (!convert_to_custom_float_format(corner_points[0].red.slope, &fmt,
|
||||
&corner_points[0].red.custom_float_slope)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[0].green.slope, &fmt,
|
||||
&corner_points[0].green.custom_float_slope)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[0].blue.slope, &fmt,
|
||||
&corner_points[0].blue.custom_float_slope)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
@ -162,22 +195,59 @@ bool cm_helper_convert_to_custom_float(
|
||||
fmt.mantissa_bits = 10;
|
||||
fmt.sign = false;
|
||||
|
||||
if (!convert_to_custom_float_format(arr_points[1].x, &fmt,
|
||||
&arr_points[1].custom_float_x)) {
|
||||
if (!convert_to_custom_float_format(corner_points[1].red.x, &fmt,
|
||||
&corner_points[1].red.custom_float_x)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[1].green.x, &fmt,
|
||||
&corner_points[1].green.custom_float_x)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[1].blue.x, &fmt,
|
||||
&corner_points[1].blue.custom_float_x)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fixpoint == true)
|
||||
arr_points[1].custom_float_y = dc_fixpt_clamp_u0d14(arr_points[1].y);
|
||||
else if (!convert_to_custom_float_format(arr_points[1].y, &fmt,
|
||||
&arr_points[1].custom_float_y)) {
|
||||
if (fixpoint == true) {
|
||||
corner_points[1].red.custom_float_y =
|
||||
dc_fixpt_clamp_u0d14(corner_points[1].red.y);
|
||||
corner_points[1].green.custom_float_y =
|
||||
dc_fixpt_clamp_u0d14(corner_points[1].green.y);
|
||||
corner_points[1].blue.custom_float_y =
|
||||
dc_fixpt_clamp_u0d14(corner_points[1].blue.y);
|
||||
} else {
|
||||
if (!convert_to_custom_float_format(corner_points[1].red.y,
|
||||
&fmt, &corner_points[1].red.custom_float_y)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[1].green.y,
|
||||
&fmt, &corner_points[1].green.custom_float_y)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[1].blue.y,
|
||||
&fmt, &corner_points[1].blue.custom_float_y)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!convert_to_custom_float_format(corner_points[1].red.slope, &fmt,
|
||||
&corner_points[1].red.custom_float_slope)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!convert_to_custom_float_format(arr_points[1].slope, &fmt,
|
||||
&arr_points[1].custom_float_slope)) {
|
||||
if (!convert_to_custom_float_format(corner_points[1].green.slope, &fmt,
|
||||
&corner_points[1].green.custom_float_slope)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
if (!convert_to_custom_float_format(corner_points[1].blue.slope, &fmt,
|
||||
&corner_points[1].blue.custom_float_slope)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
}
|
||||
@ -242,15 +312,10 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||
const struct dc_transfer_func *output_tf,
|
||||
struct pwl_params *lut_params, bool fixpoint)
|
||||
{
|
||||
struct curve_points *arr_points;
|
||||
struct curve_points3 *corner_points;
|
||||
struct pwl_result_data *rgb_resulted;
|
||||
struct pwl_result_data *rgb;
|
||||
struct pwl_result_data *rgb_plus_1;
|
||||
struct fixed31_32 y_r;
|
||||
struct fixed31_32 y_g;
|
||||
struct fixed31_32 y_b;
|
||||
struct fixed31_32 y1_min;
|
||||
struct fixed31_32 y3_max;
|
||||
|
||||
int32_t region_start, region_end;
|
||||
int32_t i;
|
||||
@ -261,7 +326,7 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||
|
||||
PERF_TRACE();
|
||||
|
||||
arr_points = lut_params->arr_points;
|
||||
corner_points = lut_params->corner_points;
|
||||
rgb_resulted = lut_params->rgb_resulted;
|
||||
hw_points = 0;
|
||||
|
||||
@ -327,31 +392,37 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||
rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
|
||||
rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
|
||||
|
||||
arr_points[0].x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
// All 3 color channels have same x
|
||||
corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
dc_fixpt_from_int(region_start));
|
||||
arr_points[1].x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
corner_points[0].green.x = corner_points[0].red.x;
|
||||
corner_points[0].blue.x = corner_points[0].red.x;
|
||||
|
||||
corner_points[1].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
dc_fixpt_from_int(region_end));
|
||||
corner_points[1].green.x = corner_points[1].red.x;
|
||||
corner_points[1].blue.x = corner_points[1].red.x;
|
||||
|
||||
y_r = rgb_resulted[0].red;
|
||||
y_g = rgb_resulted[0].green;
|
||||
y_b = rgb_resulted[0].blue;
|
||||
corner_points[0].red.y = rgb_resulted[0].red;
|
||||
corner_points[0].green.y = rgb_resulted[0].green;
|
||||
corner_points[0].blue.y = rgb_resulted[0].blue;
|
||||
|
||||
y1_min = dc_fixpt_min(y_r, dc_fixpt_min(y_g, y_b));
|
||||
|
||||
arr_points[0].y = y1_min;
|
||||
arr_points[0].slope = dc_fixpt_div(arr_points[0].y, arr_points[0].x);
|
||||
y_r = rgb_resulted[hw_points - 1].red;
|
||||
y_g = rgb_resulted[hw_points - 1].green;
|
||||
y_b = rgb_resulted[hw_points - 1].blue;
|
||||
corner_points[0].red.slope = dc_fixpt_div(corner_points[0].red.y,
|
||||
corner_points[0].red.x);
|
||||
corner_points[0].green.slope = dc_fixpt_div(corner_points[0].green.y,
|
||||
corner_points[0].green.x);
|
||||
corner_points[0].blue.slope = dc_fixpt_div(corner_points[0].blue.y,
|
||||
corner_points[0].blue.x);
|
||||
|
||||
/* see comment above, m_arrPoints[1].y should be the Y value for the
|
||||
* region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1)
|
||||
*/
|
||||
y3_max = dc_fixpt_max(y_r, dc_fixpt_max(y_g, y_b));
|
||||
|
||||
arr_points[1].y = y3_max;
|
||||
|
||||
arr_points[1].slope = dc_fixpt_zero;
|
||||
corner_points[1].red.y = rgb_resulted[hw_points - 1].red;
|
||||
corner_points[1].green.y = rgb_resulted[hw_points - 1].green;
|
||||
corner_points[1].blue.y = rgb_resulted[hw_points - 1].blue;
|
||||
corner_points[1].red.slope = dc_fixpt_zero;
|
||||
corner_points[1].green.slope = dc_fixpt_zero;
|
||||
corner_points[1].blue.slope = dc_fixpt_zero;
|
||||
|
||||
if (output_tf->tf == TRANSFER_FUNCTION_PQ) {
|
||||
/* for PQ, we want to have a straight line from last HW X point,
|
||||
@ -360,9 +431,15 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||
const struct fixed31_32 end_value =
|
||||
dc_fixpt_from_int(125);
|
||||
|
||||
arr_points[1].slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, arr_points[1].y),
|
||||
dc_fixpt_sub(end_value, arr_points[1].x));
|
||||
corner_points[1].red.slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, corner_points[1].red.y),
|
||||
dc_fixpt_sub(end_value, corner_points[1].red.x));
|
||||
corner_points[1].green.slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, corner_points[1].green.y),
|
||||
dc_fixpt_sub(end_value, corner_points[1].green.x));
|
||||
corner_points[1].blue.slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, corner_points[1].blue.y),
|
||||
dc_fixpt_sub(end_value, corner_points[1].blue.x));
|
||||
}
|
||||
|
||||
lut_params->hw_points_num = hw_points;
|
||||
@ -411,7 +488,7 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||
++i;
|
||||
}
|
||||
cm_helper_convert_to_custom_float(rgb_resulted,
|
||||
lut_params->arr_points,
|
||||
lut_params->corner_points,
|
||||
hw_points, fixpoint);
|
||||
|
||||
return true;
|
||||
@ -424,15 +501,10 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
||||
const struct dc_transfer_func *output_tf,
|
||||
struct pwl_params *lut_params)
|
||||
{
|
||||
struct curve_points *arr_points;
|
||||
struct curve_points3 *corner_points;
|
||||
struct pwl_result_data *rgb_resulted;
|
||||
struct pwl_result_data *rgb;
|
||||
struct pwl_result_data *rgb_plus_1;
|
||||
struct fixed31_32 y_r;
|
||||
struct fixed31_32 y_g;
|
||||
struct fixed31_32 y_b;
|
||||
struct fixed31_32 y1_min;
|
||||
struct fixed31_32 y3_max;
|
||||
|
||||
int32_t region_start, region_end;
|
||||
int32_t i;
|
||||
@ -443,7 +515,7 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
||||
|
||||
PERF_TRACE();
|
||||
|
||||
arr_points = lut_params->arr_points;
|
||||
corner_points = lut_params->corner_points;
|
||||
rgb_resulted = lut_params->rgb_resulted;
|
||||
hw_points = 0;
|
||||
|
||||
@ -489,31 +561,28 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
||||
rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
|
||||
rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
|
||||
|
||||
arr_points[0].x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
dc_fixpt_from_int(region_start));
|
||||
arr_points[1].x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
corner_points[0].green.x = corner_points[0].red.x;
|
||||
corner_points[0].blue.x = corner_points[0].red.x;
|
||||
corner_points[1].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
dc_fixpt_from_int(region_end));
|
||||
corner_points[1].green.x = corner_points[1].red.x;
|
||||
corner_points[1].blue.x = corner_points[1].red.x;
|
||||
|
||||
y_r = rgb_resulted[0].red;
|
||||
y_g = rgb_resulted[0].green;
|
||||
y_b = rgb_resulted[0].blue;
|
||||
|
||||
y1_min = dc_fixpt_min(y_r, dc_fixpt_min(y_g, y_b));
|
||||
|
||||
arr_points[0].y = y1_min;
|
||||
arr_points[0].slope = dc_fixpt_div(arr_points[0].y, arr_points[0].x);
|
||||
y_r = rgb_resulted[hw_points - 1].red;
|
||||
y_g = rgb_resulted[hw_points - 1].green;
|
||||
y_b = rgb_resulted[hw_points - 1].blue;
|
||||
corner_points[0].red.y = rgb_resulted[0].red;
|
||||
corner_points[0].green.y = rgb_resulted[0].green;
|
||||
corner_points[0].blue.y = rgb_resulted[0].blue;
|
||||
|
||||
/* see comment above, m_arrPoints[1].y should be the Y value for the
|
||||
* region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1)
|
||||
*/
|
||||
y3_max = dc_fixpt_max(y_r, dc_fixpt_max(y_g, y_b));
|
||||
|
||||
arr_points[1].y = y3_max;
|
||||
|
||||
arr_points[1].slope = dc_fixpt_zero;
|
||||
corner_points[1].red.y = rgb_resulted[hw_points - 1].red;
|
||||
corner_points[1].green.y = rgb_resulted[hw_points - 1].green;
|
||||
corner_points[1].blue.y = rgb_resulted[hw_points - 1].blue;
|
||||
corner_points[1].red.slope = dc_fixpt_zero;
|
||||
corner_points[1].green.slope = dc_fixpt_zero;
|
||||
corner_points[1].blue.slope = dc_fixpt_zero;
|
||||
|
||||
if (output_tf->tf == TRANSFER_FUNCTION_PQ) {
|
||||
/* for PQ, we want to have a straight line from last HW X point,
|
||||
@ -522,9 +591,15 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
||||
const struct fixed31_32 end_value =
|
||||
dc_fixpt_from_int(125);
|
||||
|
||||
arr_points[1].slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, arr_points[1].y),
|
||||
dc_fixpt_sub(end_value, arr_points[1].x));
|
||||
corner_points[1].red.slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, corner_points[1].red.y),
|
||||
dc_fixpt_sub(end_value, corner_points[1].red.x));
|
||||
corner_points[1].green.slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, corner_points[1].green.y),
|
||||
dc_fixpt_sub(end_value, corner_points[1].green.x));
|
||||
corner_points[1].blue.slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, corner_points[1].blue.y),
|
||||
dc_fixpt_sub(end_value, corner_points[1].blue.x));
|
||||
}
|
||||
|
||||
lut_params->hw_points_num = hw_points;
|
||||
@ -564,7 +639,7 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
||||
++i;
|
||||
}
|
||||
cm_helper_convert_to_custom_float(rgb_resulted,
|
||||
lut_params->arr_points,
|
||||
lut_params->corner_points,
|
||||
hw_points, false);
|
||||
|
||||
return true;
|
||||
|
@ -98,7 +98,7 @@ void cm_helper_program_xfer_func(
|
||||
|
||||
bool cm_helper_convert_to_custom_float(
|
||||
struct pwl_result_data *rgb_resulted,
|
||||
struct curve_points *arr_points,
|
||||
struct curve_points3 *corner_points,
|
||||
uint32_t hw_points_num,
|
||||
bool fixpoint);
|
||||
|
||||
|
@ -53,6 +53,12 @@ struct curve_points {
|
||||
uint32_t custom_float_slope;
|
||||
};
|
||||
|
||||
struct curve_points3 {
|
||||
struct curve_points red;
|
||||
struct curve_points green;
|
||||
struct curve_points blue;
|
||||
};
|
||||
|
||||
struct pwl_result_data {
|
||||
struct fixed31_32 red;
|
||||
struct fixed31_32 green;
|
||||
@ -71,9 +77,17 @@ struct pwl_result_data {
|
||||
uint32_t delta_blue_reg;
|
||||
};
|
||||
|
||||
/* arr_curve_points - regamma regions/segments specification
|
||||
* arr_points - beginning and end point specified separately (only one on DCE)
|
||||
* corner_points - beginning and end point for all 3 colors (DCN)
|
||||
* rgb_resulted - final curve
|
||||
*/
|
||||
struct pwl_params {
|
||||
struct gamma_curve arr_curve_points[34];
|
||||
struct curve_points arr_points[2];
|
||||
union {
|
||||
struct curve_points arr_points[2];
|
||||
struct curve_points3 corner_points[2];
|
||||
};
|
||||
struct pwl_result_data rgb_resulted[256 + 3];
|
||||
uint32_t hw_points_num;
|
||||
};
|
||||
|
@ -1542,7 +1542,7 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
|
||||
/* we can use hardcoded curve for plain SRGB TF */
|
||||
if (output_tf->type == TF_TYPE_PREDEFINED && canRomBeUsed == true &&
|
||||
output_tf->tf == TRANSFER_FUNCTION_SRGB &&
|
||||
(!mapUserRamp && ramp->type == GAMMA_RGB_256))
|
||||
(ramp->is_identity || (!mapUserRamp && ramp->type == GAMMA_RGB_256)))
|
||||
return true;
|
||||
|
||||
output_tf->type = TF_TYPE_DISTRIBUTED_POINTS;
|
||||
|
Loading…
Reference in New Issue
Block a user