mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
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:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user