From bd6f3e30f2e8bde00542a18eb8b30551748fbf92 Mon Sep 17 00:00:00 2001 From: "Leder, Brendan Steve" Date: Mon, 30 Sep 2024 13:25:55 -0400 Subject: [PATCH] amd/vpelib: Fix output_ctx gamma curve cache bug [Why] Reprogramming gamma curve unnecessary and wastes power/time. [How] Bool array checked instead of bool inside said array, add index. [Testing] Tested with corresponding test cases. Reviewed-by: Roy Chan Reviewed-by: Krunoslav Kovac Acked-by: Chih-Wei Chien Signed-off-by: Brendan Leder Part-of: --- .../src/chip/vpe10/inc/vpe10_cm_common.h | 6 +-- .../vpelib/src/chip/vpe10/vpe10_cm_common.c | 46 +++++++++---------- src/amd/vpelib/src/chip/vpe10/vpe10_dpp_cm.c | 3 +- src/amd/vpelib/src/chip/vpe10/vpe10_mpc.c | 11 +++-- 4 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/amd/vpelib/src/chip/vpe10/inc/vpe10_cm_common.h b/src/amd/vpelib/src/chip/vpe10/inc/vpe10_cm_common.h index 8b366ea605b..376b61b8d9c 100644 --- a/src/amd/vpelib/src/chip/vpe10/inc/vpe10_cm_common.h +++ b/src/amd/vpelib/src/chip/vpe10/inc/vpe10_cm_common.h @@ -120,11 +120,11 @@ void vpe10_cm_helper_program_color_matrices(struct config_writer *config_writer, void vpe10_cm_helper_program_gamcor_xfer_func(struct config_writer *config_writer, const struct pwl_params *params, const struct vpe10_xfer_func_reg *reg); -bool vpe10_cm_helper_translate_curve_to_hw_format( - const struct transfer_func *output_tf, struct pwl_params *lut_params, bool fixpoint); +bool vpe10_cm_helper_translate_curve_to_hw_format(const struct transfer_func *tf, + struct pwl_params *lut_params, bool fixpoint, bool dirty); bool vpe10_cm_helper_translate_curve_to_degamma_hw_format( - const struct transfer_func *output_tf, struct pwl_params *lut_params); + const struct transfer_func *tf, struct pwl_params *lut_params, bool dirty); #ifdef __cplusplus } diff --git a/src/amd/vpelib/src/chip/vpe10/vpe10_cm_common.c b/src/amd/vpelib/src/chip/vpe10/vpe10_cm_common.c index 7ade007b378..be043048b38 100644 --- a/src/amd/vpelib/src/chip/vpe10/vpe10_cm_common.c +++ b/src/amd/vpelib/src/chip/vpe10/vpe10_cm_common.c @@ -220,7 +220,7 @@ static bool cm_helper_convert_to_custom_float(struct pwl_result_data *rgb_result #define NUMBER_SW_SEGMENTS 16 bool vpe10_cm_helper_translate_curve_to_hw_format( - const struct transfer_func *output_tf, struct pwl_params *lut_params, bool fixpoint) + const struct transfer_func *tf, struct pwl_params *lut_params, bool fixpoint, bool dirty) { struct curve_points3 *corner_points; struct pwl_result_data *rgb_resulted; @@ -232,8 +232,8 @@ bool vpe10_cm_helper_translate_curve_to_hw_format( int32_t i; uint32_t j, k, seg_distr[MAX_REGIONS_NUMBER], increment, start_index, hw_points; - if (output_tf == NULL || lut_params == NULL || output_tf->type == TF_TYPE_BYPASS || - (!output_tf->dirty && (lut_params->hw_points_num != 0))) + if (tf == NULL || lut_params == NULL || tf->type == TF_TYPE_BYPASS || + (!dirty && (lut_params->hw_points_num != 0))) return false; corner_points = lut_params->corner_points; @@ -243,7 +243,7 @@ bool vpe10_cm_helper_translate_curve_to_hw_format( memset(lut_params, 0, sizeof(struct pwl_params)); memset(seg_distr, 0, sizeof(seg_distr)); - if (output_tf->tf == TRANSFER_FUNC_PQ2084) { + if (tf->tf == TRANSFER_FUNC_PQ2084) { for (i = 0; i < MAX_LOW_POINT; i++) seg_distr[i] = 3; @@ -252,7 +252,7 @@ bool vpe10_cm_helper_translate_curve_to_hw_format( seg_distr[i] = 1; region_start = -MAX_LOW_POINT; region_end = 1; - } else if (output_tf->tf == TRANSFER_FUNC_LINEAR) { + } else if (tf->tf == TRANSFER_FUNC_LINEAR) { int num_regions_linear = MAX_LOW_POINT + 3; @@ -296,18 +296,18 @@ bool vpe10_cm_helper_translate_curve_to_hw_format( i += increment) { if (j == hw_points - 1) break; - rgb_resulted[j].red = output_tf->tf_pts.red[i]; - rgb_resulted[j].green = output_tf->tf_pts.green[i]; - rgb_resulted[j].blue = output_tf->tf_pts.blue[i]; + rgb_resulted[j].red = tf->tf_pts.red[i]; + rgb_resulted[j].green = tf->tf_pts.green[i]; + rgb_resulted[j].blue = tf->tf_pts.blue[i]; j++; } } /* last point */ start_index = (uint32_t)((region_end + MAX_LOW_POINT) * NUMBER_SW_SEGMENTS); - rgb_resulted[hw_points - 1].red = output_tf->tf_pts.red[start_index]; - 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]; + rgb_resulted[hw_points - 1].red = tf->tf_pts.red[start_index]; + rgb_resulted[hw_points - 1].green = tf->tf_pts.green[start_index]; + rgb_resulted[hw_points - 1].blue = tf->tf_pts.blue[start_index]; rgb_resulted[hw_points].red = rgb_resulted[hw_points - 1].red; rgb_resulted[hw_points].green = rgb_resulted[hw_points - 1].green; @@ -393,9 +393,9 @@ bool vpe10_cm_helper_translate_curve_to_hw_format( corner_points[0].red.y = vpe_fixpt_zero; corner_points[0].green.y = vpe_fixpt_zero; corner_points[0].blue.y = vpe_fixpt_zero; - corner_points[0].red.offset = output_tf->start_base; - corner_points[0].green.offset = output_tf->start_base; - corner_points[0].blue.offset = output_tf->start_base; + corner_points[0].red.offset = tf->start_base; + corner_points[0].green.offset = tf->start_base; + corner_points[0].blue.offset = tf->start_base; cm_helper_convert_to_custom_float(rgb_resulted, lut_params->corner_points, hw_points, fixpoint); @@ -407,7 +407,7 @@ bool vpe10_cm_helper_translate_curve_to_hw_format( #define MAX_HW_POINTS_DEGAMMA 257 bool vpe10_cm_helper_translate_curve_to_degamma_hw_format( - const struct transfer_func *output_tf, struct pwl_params *lut_params) + const struct transfer_func *tf, struct pwl_params *lut_params, bool dirty) { struct curve_points3 *corner_points; struct pwl_result_data *rgb_resulted; @@ -418,8 +418,8 @@ bool vpe10_cm_helper_translate_curve_to_degamma_hw_format( int32_t i; uint32_t k, seg_distr[MAX_REGIONS_NUMBER_DEGAMMA], num_segments, hw_points; - if (output_tf == NULL || lut_params == NULL || output_tf->type == TF_TYPE_BYPASS || - (!output_tf->dirty && (lut_params->hw_points_num != 0))) + if (tf == NULL || lut_params == NULL || tf->type == TF_TYPE_BYPASS || + (!dirty && (lut_params->hw_points_num != 0))) return false; corner_points = lut_params->corner_points; @@ -433,9 +433,9 @@ bool vpe10_cm_helper_translate_curve_to_degamma_hw_format( region_end = 0; for (i = 0; i < MAX_HW_POINTS_DEGAMMA; i++) { - rgb_resulted[i].red = output_tf->tf_pts.red[i]; - rgb_resulted[i].green = output_tf->tf_pts.green[i]; - rgb_resulted[i].blue = output_tf->tf_pts.blue[i]; + rgb_resulted[i].red = tf->tf_pts.red[i]; + rgb_resulted[i].green = tf->tf_pts.green[i]; + rgb_resulted[i].blue = tf->tf_pts.blue[i]; } for (k = (uint32_t)(region_end - region_start); k < MAX_REGIONS_NUMBER_DEGAMMA; k++) @@ -512,9 +512,9 @@ bool vpe10_cm_helper_translate_curve_to_degamma_hw_format( corner_points[0].red.y = vpe_fixpt_zero; corner_points[0].green.y = vpe_fixpt_zero; corner_points[0].blue.y = vpe_fixpt_zero; - corner_points[0].red.offset = output_tf->start_base; - corner_points[0].green.offset = output_tf->start_base; - corner_points[0].blue.offset = output_tf->start_base; + corner_points[0].red.offset = tf->start_base; + corner_points[0].green.offset = tf->start_base; + corner_points[0].blue.offset = tf->start_base; cm_helper_convert_to_custom_float(rgb_resulted, lut_params->corner_points, hw_points, false); diff --git a/src/amd/vpelib/src/chip/vpe10/vpe10_dpp_cm.c b/src/amd/vpelib/src/chip/vpe10/vpe10_dpp_cm.c index 14b3bbf338e..d33081bfb76 100644 --- a/src/amd/vpelib/src/chip/vpe10/vpe10_dpp_cm.c +++ b/src/amd/vpelib/src/chip/vpe10/vpe10_dpp_cm.c @@ -197,7 +197,8 @@ void vpe10_dpp_program_input_transfer_func(struct dpp *dpp, struct transfer_func // VPE always do NL scaling using gamcor, thus skipping dgam (default bypass) // dpp->funcs->program_pre_dgam(dpp, tf); if (input_tf->type == TF_TYPE_DISTRIBUTED_POINTS) { - vpe10_cm_helper_translate_curve_to_degamma_hw_format(input_tf, &dpp->degamma_params); + vpe10_cm_helper_translate_curve_to_degamma_hw_format( + input_tf, &dpp->degamma_params, input_tf->dirty[dpp->inst]); params = &dpp->degamma_params; } diff --git a/src/amd/vpelib/src/chip/vpe10/vpe10_mpc.c b/src/amd/vpelib/src/chip/vpe10/vpe10_mpc.c index 1524da4fb6c..7182f10f8f4 100644 --- a/src/amd/vpelib/src/chip/vpe10/vpe10_mpc.c +++ b/src/amd/vpelib/src/chip/vpe10/vpe10_mpc.c @@ -1253,8 +1253,8 @@ void vpe10_mpc_set_mpc_shaper_3dlut( // get the shaper lut params if (func_shaper) { if (func_shaper->type == TF_TYPE_DISTRIBUTED_POINTS) { - vpe10_cm_helper_translate_curve_to_hw_format( - func_shaper, &mpc->shaper_params, true); // should init shaper_params first + vpe10_cm_helper_translate_curve_to_hw_format(func_shaper, &mpc->shaper_params, true, + func_shaper->dirty[mpc->inst]); // should init shaper_params first shaper_lut = &mpc->shaper_params; // are there shaper prams in dpp instead? } else if (func_shaper->type == TF_TYPE_HWPWL) { shaper_lut = &func_shaper->pwl; @@ -1286,7 +1286,7 @@ void vpe10_mpc_set_output_transfer_func(struct mpc *mpc, struct output_ctx *outp if (output_ctx->output_tf->type == TF_TYPE_DISTRIBUTED_POINTS) { vpe10_cm_helper_translate_curve_to_hw_format( // this is cm3.0 version instead 1.0 // as DCN3.2 - output_ctx->output_tf, &mpc->regamma_params, false); + output_ctx->output_tf, &mpc->regamma_params, false, output_ctx->output_tf->dirty[mpc->inst]); params = &mpc->regamma_params; } /* there are no ROM LUTs in OUTGAM */ @@ -1317,9 +1317,10 @@ void vpe10_mpc_set_blend_lut(struct mpc *mpc, struct transfer_func *blend_tf) if (gamma_type == CM_DEGAM) vpe10_cm_helper_translate_curve_to_degamma_hw_format( - blend_tf, &mpc->blender_params); // TODO should init regamma_params first + blend_tf, &mpc->blender_params, blend_tf->dirty[mpc->inst]); // TODO should init regamma_params first else - vpe10_cm_helper_translate_curve_to_hw_format(blend_tf, &mpc->blender_params, false); + vpe10_cm_helper_translate_curve_to_hw_format( + blend_tf, &mpc->blender_params, false, blend_tf->dirty[mpc->inst]); blend_lut = &mpc->blender_params; }