OSDN Git Service

drm/rockchip: Disable blending for win0
authorKristian H. Kristensen <hoegsberg@gmail.com>
Wed, 18 Apr 2018 17:31:52 +0000 (10:31 -0700)
committerSean Paul <seanpaul@chromium.org>
Tue, 1 May 2018 19:56:21 +0000 (15:56 -0400)
Blending win0 with the background color doesn't seem to work
correctly. We only get the background color, no matter the contents of
the win0 framebuffer.  However, blending pre-multiplied color with the
default opaque black default background color is a no-op, so we can
just disable blending to get the correct result.

Signed-off-by: Kristian H. Kristensen <hoegsberg@chromium.org>
Cc: Sandy Huang <hjc@rock-chips.com>
Cc: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20180418173152.93246-1-hoegsberg@chromium.org
drivers/gpu/drm/rockchip/rockchip_drm_vop.c

index fe3faa7..2121345 100644 (file)
@@ -76,6 +76,9 @@
 #define VOP_WIN_GET_YRGBADDR(vop, win) \
                vop_readl(vop, win->base + win->phy->yrgb_mst.offset)
 
+#define VOP_WIN_TO_INDEX(vop_win) \
+       ((vop_win) - (vop_win)->vop->win)
+
 #define to_vop(x) container_of(x, struct vop, crtc)
 #define to_vop_win(x) container_of(x, struct vop_win, base)
 
@@ -708,6 +711,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
        dma_addr_t dma_addr;
        uint32_t val;
        bool rb_swap;
+       int win_index = VOP_WIN_TO_INDEX(vop_win);
        int format;
 
        /*
@@ -777,7 +781,14 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
        rb_swap = has_rb_swapped(fb->format->format);
        VOP_WIN_SET(vop, win, rb_swap, rb_swap);
 
-       if (fb->format->has_alpha) {
+       /*
+        * Blending win0 with the background color doesn't seem to work
+        * correctly. We only get the background color, no matter the contents
+        * of the win0 framebuffer.  However, blending pre-multiplied color
+        * with the default opaque black default background color is a no-op,
+        * so we can just disable blending to get the correct result.
+        */
+       if (fb->format->has_alpha && win_index > 0) {
                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) |