提交 4173c0bd 编写于 作者: E Eric Yang 提交者: Alex Deucher

drm/amd/display: Only update mpc blend config if not full update

The current mpcc insert/remove logic does not support updating
only a single mpcc. So when pixel alpha changed but no full update
we can mistakenly shuffle the mpcc layering order. With this change
we will only insert/remove mpcc if there is full update.
Signed-off-by: NEric Yang <Eric.Yang2@amd.com>
Reviewed-by: NTony Cheng <Tony.Cheng@amd.com>
Acked-by: NHarry Wentland <harry.wentland@amd.com>
Signed-off-by: NAlex Deucher <alexander.deucher@amd.com>
上级 d72eb203
...@@ -1631,6 +1631,8 @@ static void update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx) ...@@ -1631,6 +1631,8 @@ static void update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
struct mpc *mpc = dc->res_pool->mpc; struct mpc *mpc = dc->res_pool->mpc;
struct mpc_tree *mpc_tree_params = &(pipe_ctx->stream_res.opp->mpc_tree_params); struct mpc_tree *mpc_tree_params = &(pipe_ctx->stream_res.opp->mpc_tree_params);
/* TODO: proper fix once fpga works */ /* TODO: proper fix once fpga works */
if (dc->debug.surface_visual_confirm) if (dc->debug.surface_visual_confirm)
...@@ -1657,6 +1659,7 @@ static void update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx) ...@@ -1657,6 +1659,7 @@ static void update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
pipe_ctx->stream->output_color_space) pipe_ctx->stream->output_color_space)
&& per_pixel_alpha; && per_pixel_alpha;
/* /*
* TODO: remove hack * TODO: remove hack
* Note: currently there is a bug in init_hw such that * Note: currently there is a bug in init_hw such that
...@@ -1667,6 +1670,12 @@ static void update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx) ...@@ -1667,6 +1670,12 @@ static void update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
*/ */
mpcc_id = hubp->inst; mpcc_id = hubp->inst;
/* If there is no full update, don't need to touch MPC tree*/
if (!pipe_ctx->plane_state->update_flags.bits.full_update) {
mpc->funcs->update_blending(mpc, &blnd_cfg, mpcc_id);
return;
}
/* check if this MPCC is already being used */ /* check if this MPCC is already being used */
new_mpcc = mpc->funcs->get_mpcc_for_dpp(mpc_tree_params, mpcc_id); new_mpcc = mpc->funcs->get_mpcc_for_dpp(mpc_tree_params, mpcc_id);
/* remove MPCC if being used */ /* remove MPCC if being used */
......
...@@ -65,6 +65,7 @@ static void mpc1_update_blending( ...@@ -65,6 +65,7 @@ static void mpc1_update_blending(
int mpcc_id) int mpcc_id)
{ {
struct dcn10_mpc *mpc10 = TO_DCN10_MPC(mpc); struct dcn10_mpc *mpc10 = TO_DCN10_MPC(mpc);
struct mpcc *mpcc = mpc1_get_mpcc(mpc, mpcc_id);
REG_UPDATE_5(MPCC_CONTROL[mpcc_id], REG_UPDATE_5(MPCC_CONTROL[mpcc_id],
MPCC_ALPHA_BLND_MODE, blnd_cfg->alpha_mode, MPCC_ALPHA_BLND_MODE, blnd_cfg->alpha_mode,
...@@ -74,6 +75,7 @@ static void mpc1_update_blending( ...@@ -74,6 +75,7 @@ static void mpc1_update_blending(
MPCC_GLOBAL_GAIN, blnd_cfg->global_gain); MPCC_GLOBAL_GAIN, blnd_cfg->global_gain);
mpc1_set_bg_color(mpc, &blnd_cfg->black_color, mpcc_id); mpc1_set_bg_color(mpc, &blnd_cfg->black_color, mpcc_id);
mpcc->blnd_cfg = *blnd_cfg;
} }
void mpc1_update_stereo_mix( void mpc1_update_stereo_mix(
...@@ -235,8 +237,7 @@ struct mpcc *mpc1_insert_plane( ...@@ -235,8 +237,7 @@ struct mpcc *mpc1_insert_plane(
} }
/* update the blending configuration */ /* update the blending configuration */
new_mpcc->blnd_cfg = *blnd_cfg; mpc->funcs->update_blending(mpc, blnd_cfg, mpcc_id);
mpc->funcs->update_blending(mpc, &new_mpcc->blnd_cfg, mpcc_id);
/* update the stereo mix settings, if provided */ /* update the stereo mix settings, if provided */
if (sm_cfg != NULL) { if (sm_cfg != NULL) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册