From 77c6054e486b38ec46b75f86ac59ee9b49e08417 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Sat, 18 Sep 2021 10:19:18 +0800 Subject: [PATCH] drm/rockchip: vop: fix alpha mode error for vop lite 1. vop lite can't support pixel-alpha + scale and can support global alpha + scale; 2. global alpha must be non-premul alpha mode; 3. vop lite and vop full premul alpha config bit is reversed; 4. vop full add premul and non-premul config from userspace; Signed-off-by: Sandy Huang Change-Id: Ic42892eac39f07a41d46ed1a77398862f37894c0 --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index f757c206b2ec..a0efdc02b4db 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -2095,6 +2095,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane, if ((is_alpha_support(fb->format->format) || global_alpha_en) && (s->dsp_layer_sel & 0x3) != win->win_id) { int src_blend_m0; + int pre_multi_alpha = ALPHA_SRC_PRE_MUL; if (is_alpha_support(fb->format->format) && global_alpha_en) src_blend_m0 = ALPHA_PER_PIX_GLOBAL; @@ -2103,18 +2104,20 @@ static void vop_plane_atomic_update(struct drm_plane *plane, else src_blend_m0 = ALPHA_GLOBAL; + if (vop_plane_state->blend_mode == 0 || src_blend_m0 == ALPHA_GLOBAL) + pre_multi_alpha = ALPHA_SRC_NO_PRE_MUL; + VOP_WIN_SET(vop, win, dst_alpha_ctl, DST_FACTOR_M0(ALPHA_SRC_INVERSE)); - val = SRC_ALPHA_EN(1) | SRC_COLOR_M0(ALPHA_SRC_PRE_MUL) | + val = SRC_ALPHA_EN(1) | SRC_COLOR_M0(pre_multi_alpha) | SRC_ALPHA_M0(ALPHA_STRAIGHT) | SRC_BLEND_M0(src_blend_m0) | SRC_ALPHA_CAL_M0(ALPHA_SATURATION) | SRC_FACTOR_M0(global_alpha_en ? ALPHA_SRC_GLOBAL : ALPHA_ONE); VOP_WIN_SET(vop, win, src_alpha_ctl, val); - VOP_WIN_SET(vop, win, alpha_pre_mul, - vop_plane_state->blend_mode == DRM_MODE_BLEND_PREMULTI ? 1 : 0); - VOP_WIN_SET(vop, win, alpha_mode, 1); + VOP_WIN_SET(vop, win, alpha_pre_mul, !pre_multi_alpha); /* VOP lite only */ + VOP_WIN_SET(vop, win, alpha_mode, src_blend_m0); /* VOP lite only */ VOP_WIN_SET(vop, win, alpha_en, 1); } else { VOP_WIN_SET(vop, win, src_alpha_ctl, SRC_ALPHA_EN(0));