drm/amd/display: Reuse MPC OGRAM for 1D blender

[Why & How]
Reuse existent code path and in order to do that apply de gamma
in 1D blender LUT and re use MPC OGAM.
Follow up is required.

Signed-off-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Acked-by: Krunoslav Kovac <Krunoslav.Kovac@amd.com>
Acked-by: Vitaly Prosyak <Vitaly.Prosyak@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Vitaly Prosyak 2019-04-18 09:51:12 -05:00 committed by Alex Deucher
parent be4b289f10
commit f62b09b134
2 changed files with 40 additions and 17 deletions

View File

@ -240,16 +240,27 @@ struct dividers {
struct fixed31_32 divider3; struct fixed31_32 divider3;
}; };
static void build_coefficients(struct gamma_coefficients *coefficients, bool is_2_4) enum gamma_type_index {
gamma_type_index_2_4,
gamma_type_index_2_2,
gamma_type_index_2_2_flat
};
static void build_coefficients(struct gamma_coefficients *coefficients, enum gamma_type_index type)
{ {
static const int32_t numerator01[] = { 31308, 180000}; static const int32_t numerator01[] = { 31308, 180000, 0};
static const int32_t numerator02[] = { 12920, 4500}; static const int32_t numerator02[] = { 12920, 4500, 0};
static const int32_t numerator03[] = { 55, 99}; static const int32_t numerator03[] = { 55, 99, 0};
static const int32_t numerator04[] = { 55, 99}; static const int32_t numerator04[] = { 55, 99, 0};
static const int32_t numerator05[] = { 2400, 2200}; static const int32_t numerator05[] = { 2400, 2200, 2200};
uint32_t i = 0; uint32_t i = 0;
uint32_t index = is_2_4 == true ? 0:1; uint32_t index = 0;
if (type == gamma_type_index_2_2)
index = 1;
else if (type == gamma_type_index_2_2_flat)
index = 2;
do { do {
coefficients->a0[i] = dc_fixpt_from_fraction( coefficients->a0[i] = dc_fixpt_from_fraction(
@ -697,7 +708,7 @@ static void build_de_pq(struct pwl_float_data_ex *de_pq,
static void build_regamma(struct pwl_float_data_ex *rgb_regamma, static void build_regamma(struct pwl_float_data_ex *rgb_regamma,
uint32_t hw_points_num, uint32_t hw_points_num,
const struct hw_x_point *coordinate_x, bool is_2_4) const struct hw_x_point *coordinate_x, enum gamma_type_index type)
{ {
uint32_t i; uint32_t i;
@ -705,7 +716,7 @@ static void build_regamma(struct pwl_float_data_ex *rgb_regamma,
struct pwl_float_data_ex *rgb = rgb_regamma; struct pwl_float_data_ex *rgb = rgb_regamma;
const struct hw_x_point *coord_x = coordinate_x; const struct hw_x_point *coord_x = coordinate_x;
build_coefficients(&coeff, is_2_4); build_coefficients(&coeff, type);
i = 0; i = 0;
@ -892,13 +903,13 @@ static bool build_freesync_hdr(struct pwl_float_data_ex *rgb_regamma,
static void build_degamma(struct pwl_float_data_ex *curve, static void build_degamma(struct pwl_float_data_ex *curve,
uint32_t hw_points_num, uint32_t hw_points_num,
const struct hw_x_point *coordinate_x, bool is_2_4) const struct hw_x_point *coordinate_x, enum gamma_type_index type)
{ {
uint32_t i; uint32_t i;
struct gamma_coefficients coeff; struct gamma_coefficients coeff;
uint32_t begin_index, end_index; uint32_t begin_index, end_index;
build_coefficients(&coeff, is_2_4); build_coefficients(&coeff, type);
i = 0; i = 0;
/* X points is 2^-25 to 2^7 /* X points is 2^-25 to 2^7
@ -1614,7 +1625,7 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
coordinates_x, coordinates_x,
output_tf->sdr_ref_white_level); output_tf->sdr_ref_white_level);
} else if (tf == TRANSFER_FUNCTION_GAMMA22 && } else if (tf == TRANSFER_FUNCTION_GAMMA22 &&
fs_params != NULL) { fs_params != NULL && fs_params->skip_tm == 0) {
build_freesync_hdr(rgb_regamma, build_freesync_hdr(rgb_regamma,
MAX_HW_POINTS, MAX_HW_POINTS,
coordinates_x, coordinates_x,
@ -1627,7 +1638,9 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
build_regamma(rgb_regamma, build_regamma(rgb_regamma,
MAX_HW_POINTS, MAX_HW_POINTS,
coordinates_x, tf == TRANSFER_FUNCTION_SRGB ? true:false); coordinates_x, tf == TRANSFER_FUNCTION_SRGB ? gamma_type_index_2_4 :
tf == TRANSFER_FUNCTION_GAMMA22 ?
gamma_type_index_2_2_flat : gamma_type_index_2_2);
} }
map_regamma_hw_to_x_user(ramp, coeff, rgb_user, map_regamma_hw_to_x_user(ramp, coeff, rgb_user,
coordinates_x, axis_x, rgb_regamma, coordinates_x, axis_x, rgb_regamma,
@ -1832,7 +1845,9 @@ bool mod_color_calculate_degamma_params(struct dc_transfer_func *input_tf,
build_degamma(curve, build_degamma(curve,
MAX_HW_POINTS, MAX_HW_POINTS,
coordinates_x, coordinates_x,
tf == TRANSFER_FUNCTION_SRGB ? true : false); tf == TRANSFER_FUNCTION_SRGB ?
gamma_type_index_2_4 : tf == TRANSFER_FUNCTION_GAMMA22 ?
gamma_type_index_2_2_flat : gamma_type_index_2_2);
else if (tf == TRANSFER_FUNCTION_LINEAR) { else if (tf == TRANSFER_FUNCTION_LINEAR) {
// just copy coordinates_x into curve // just copy coordinates_x into curve
i = 0; i = 0;
@ -1932,7 +1947,10 @@ bool mod_color_calculate_curve(enum dc_transfer_func_predefined trans,
build_regamma(rgb_regamma, build_regamma(rgb_regamma,
MAX_HW_POINTS, MAX_HW_POINTS,
coordinates_x, trans == TRANSFER_FUNCTION_SRGB ? true:false); coordinates_x,
trans == TRANSFER_FUNCTION_SRGB ?
gamma_type_index_2_4 : trans == TRANSFER_FUNCTION_GAMMA22 ?
gamma_type_index_2_2_flat : gamma_type_index_2_2);
for (i = 0; i <= MAX_HW_POINTS ; i++) { for (i = 0; i <= MAX_HW_POINTS ; i++) {
points->red[i] = rgb_regamma[i].r; points->red[i] = rgb_regamma[i].r;
points->green[i] = rgb_regamma[i].g; points->green[i] = rgb_regamma[i].g;
@ -2002,7 +2020,8 @@ bool mod_color_calculate_degamma_curve(enum dc_transfer_func_predefined trans,
kvfree(rgb_degamma); kvfree(rgb_degamma);
} else if (trans == TRANSFER_FUNCTION_SRGB || } else if (trans == TRANSFER_FUNCTION_SRGB ||
trans == TRANSFER_FUNCTION_BT709) { trans == TRANSFER_FUNCTION_BT709 ||
trans == TRANSFER_FUNCTION_GAMMA22) {
rgb_degamma = kvcalloc(MAX_HW_POINTS + _EXTRA_POINTS, rgb_degamma = kvcalloc(MAX_HW_POINTS + _EXTRA_POINTS,
sizeof(*rgb_degamma), sizeof(*rgb_degamma),
GFP_KERNEL); GFP_KERNEL);
@ -2011,7 +2030,10 @@ bool mod_color_calculate_degamma_curve(enum dc_transfer_func_predefined trans,
build_degamma(rgb_degamma, build_degamma(rgb_degamma,
MAX_HW_POINTS, MAX_HW_POINTS,
coordinates_x, trans == TRANSFER_FUNCTION_SRGB ? true:false); coordinates_x,
trans == TRANSFER_FUNCTION_SRGB ?
gamma_type_index_2_4 : trans == TRANSFER_FUNCTION_GAMMA22 ?
gamma_type_index_2_2_flat : gamma_type_index_2_2);
for (i = 0; i <= MAX_HW_POINTS ; i++) { for (i = 0; i <= MAX_HW_POINTS ; i++) {
points->red[i] = rgb_degamma[i].r; points->red[i] = rgb_degamma[i].r;
points->green[i] = rgb_degamma[i].g; points->green[i] = rgb_degamma[i].g;

View File

@ -79,6 +79,7 @@ struct freesync_hdr_tf_params {
unsigned int max_content; // luminance in nits unsigned int max_content; // luminance in nits
unsigned int min_display; // luminance in 1/10000 nits unsigned int min_display; // luminance in 1/10000 nits
unsigned int max_display; // luminance in nits unsigned int max_display; // luminance in nits
unsigned int skip_tm; // skip tm
}; };
void setup_x_points_distribution(void); void setup_x_points_distribution(void);