From 6cb13bd18df7ee47500e40ccd24c6e4245150563 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Fri, 4 Aug 2023 15:42:08 +0800 Subject: [PATCH] drm/rockchip: vop2: set DRM_MODE_BLEND_PIXEL_NONE as alpha premutli DRM_MODE_BLEND_PIXEL_NONE usual be set at ARGB format and pixel alpha is 0xff, no need to do blend, but vop2 platform at the following scene, the cluster win1 and win0 do blend first, the blend result with esmart do blend, we can't direct to close layer_mix0, because the cluster win0 some area will do blend with esmart, so we keep layer0 mix alpha be enabled and set as premutli mode. zpos layer 2 cluster win1[ARGB/BLEND_COVERAGE] -->| 1 cluster win0[ARGB/BLEND_PIXEL_NONE]-->|cluster mix-->| 0 esmart[ARGB/BLEND_PIXEL_NONE] -->|layer0 mix Signed-off-by: Sandy Huang Change-Id: I4ae75a9b443ea965527fd656821016acca35afe1 --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index edf3aa19563a..b7bebd22b543 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -10502,7 +10502,8 @@ static void vop2_setup_cluster_alpha(struct vop2 *vop2, struct vop2_cluster *clu fb = top_win_vpstate->base.fb; if (!fb) return; - if (top_win_vpstate->base.pixel_blend_mode == DRM_MODE_BLEND_PREMULTI) + if (top_win_vpstate->base.pixel_blend_mode == DRM_MODE_BLEND_PREMULTI || + top_win_vpstate->base.pixel_blend_mode == DRM_MODE_BLEND_PIXEL_NONE) premulti_en = true; else premulti_en = false; @@ -10573,7 +10574,8 @@ static void vop2_setup_alpha(struct vop2_video_port *vp, */ bottom_layer_alpha_en = true; dst_global_alpha = vpstate->global_alpha; - if (pstate->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI) + if (pstate->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI || + pstate->pixel_blend_mode == DRM_MODE_BLEND_PIXEL_NONE) premulti_en = 1; else premulti_en = 0; @@ -10599,7 +10601,8 @@ static void vop2_setup_alpha(struct vop2_video_port *vp, vpstate = to_vop2_plane_state(pstate); fb = pstate->fb; - if (pstate->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI) + if (pstate->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI || + pstate->pixel_blend_mode == DRM_MODE_BLEND_PIXEL_NONE) premulti_en = 1; else premulti_en = 0; @@ -10723,7 +10726,8 @@ static void rk3576_extra_alpha(struct vop2_video_port *vp, const struct vop2_zpo pstate = extra_win->base.state; vpstate = to_vop2_plane_state(pstate); fb = pstate->fb; - if (pstate->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI) + if (pstate->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI || + pstate->pixel_blend_mode == DRM_MODE_BLEND_PIXEL_NONE) alpha_config.src_premulti_en = 1; else alpha_config.src_premulti_en = 0; @@ -10825,7 +10829,8 @@ static void vop3_setup_alpha(struct vop2_video_port *vp, */ bottom_layer_alpha_en = true; dst_global_alpha = vpstate->global_alpha; - if (pstate->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI) + if (pstate->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI || + pstate->pixel_blend_mode == DRM_MODE_BLEND_PIXEL_NONE) premulti_en = 1; else premulti_en = 0; @@ -10841,7 +10846,8 @@ static void vop3_setup_alpha(struct vop2_video_port *vp, pstate = win->base.state; vpstate = to_vop2_plane_state(pstate); fb = pstate->fb; - if (pstate->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI) + if (pstate->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI || + pstate->pixel_blend_mode == DRM_MODE_BLEND_PIXEL_NONE) premulti_en = 1; else premulti_en = 0;