mirror of https://gitee.com/openkylin/linux.git
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:
parent
be4b289f10
commit
f62b09b134
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue