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 <hjc@rock-chips.com>
Change-Id: Ic42892eac39f07a41d46ed1a77398862f37894c0
This commit is contained in:
Sandy Huang
2021-09-18 10:19:18 +08:00
committed by Tao Huang
parent 15a4dfb123
commit 77c6054e48

View File

@@ -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));