Browse Source

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: Eric Yang <Eric.Yang2@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Eric Yang 7 years ago
parent
commit
4173c0bdd7

+ 9 - 0
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c

@@ -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)
 			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)
 	 */
 	 */
 	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 */

+ 3 - 2
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c

@@ -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(
 			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(
 	}
 	}
 
 
 	/* update the blending configuration */
 	/* update the blending configuration */
-	new_mpcc->blnd_cfg = *blnd_cfg;
-	mpc->funcs->update_blending(mpc, &new_mpcc->blnd_cfg, mpcc_id);
+	mpc->funcs->update_blending(mpc, 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) {