diff mbox

CHROMIUM: drm/rockchip: Disable blending for win0

Message ID 20180416222215.167155-1-hoegsberg@chromium.org (mailing list archive)
State New, archived
Headers show

Commit Message

Kristian Høgsberg April 16, 2018, 10:22 p.m. UTC
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>
---
As per Eric's suggestion, we can just disable blending. This replaces
the previous "Filter out alpha formats for primary plane" patch.

 drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

Comments

kernel test robot April 17, 2018, 6:34 a.m. UTC | #1
Hi Kristian,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on v4.16]
[cannot apply to rockchip/for-next drm-exynos/exynos-drm/for-next v4.17-rc1 next-20180416]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Kristian-H-Kristensen/CHROMIUM-drm-rockchip-Disable-blending-for-win0/20180417-095916
config: arm64-defconfig (attached as .config)
compiler: aarch64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=arm64 

All errors (new ones prefixed by >>):

   drivers/gpu/drm/rockchip/rockchip_drm_vop.c: In function 'vop_plane_atomic_update':
>> drivers/gpu/drm/rockchip/rockchip_drm_vop.c:800:46: error: 'win_index' undeclared (first use in this function); did you mean 'uuid_index'?
     if (is_alpha_support(fb->format->format) && win_index > 0) {
                                                 ^~~~~~~~~
                                                 uuid_index
   drivers/gpu/drm/rockchip/rockchip_drm_vop.c:800:46: note: each undeclared identifier is reported only once for each function it appears in

vim +800 drivers/gpu/drm/rockchip/rockchip_drm_vop.c

   703	
   704	static void vop_plane_atomic_update(struct drm_plane *plane,
   705			struct drm_plane_state *old_state)
   706	{
   707		struct drm_plane_state *state = plane->state;
   708		struct drm_crtc *crtc = state->crtc;
   709		struct vop_win *vop_win = to_vop_win(plane);
   710		const struct vop_win_data *win = vop_win->data;
   711		struct vop *vop = to_vop(state->crtc);
   712		struct drm_framebuffer *fb = state->fb;
   713		unsigned int actual_w, actual_h;
   714		unsigned int dsp_stx, dsp_sty;
   715		uint32_t act_info, dsp_info, dsp_st;
   716		struct drm_rect *src = &state->src;
   717		struct drm_rect *dest = &state->dst;
   718		struct drm_gem_object *obj, *uv_obj;
   719		struct rockchip_gem_object *rk_obj, *rk_uv_obj;
   720		unsigned long offset;
   721		dma_addr_t dma_addr;
   722		uint32_t val;
   723		bool rb_swap;
   724		int format;
   725	
   726		/*
   727		 * can't update plane when vop is disabled.
   728		 */
   729		if (WARN_ON(!crtc))
   730			return;
   731	
   732		if (WARN_ON(!vop->is_enabled))
   733			return;
   734	
   735		if (!state->visible) {
   736			vop_plane_atomic_disable(plane, old_state);
   737			return;
   738		}
   739	
   740		obj = rockchip_fb_get_gem_obj(fb, 0);
   741		rk_obj = to_rockchip_obj(obj);
   742	
   743		actual_w = drm_rect_width(src) >> 16;
   744		actual_h = drm_rect_height(src) >> 16;
   745		act_info = (actual_h - 1) << 16 | ((actual_w - 1) & 0xffff);
   746	
   747		dsp_info = (drm_rect_height(dest) - 1) << 16;
   748		dsp_info |= (drm_rect_width(dest) - 1) & 0xffff;
   749	
   750		dsp_stx = dest->x1 + crtc->mode.htotal - crtc->mode.hsync_start;
   751		dsp_sty = dest->y1 + crtc->mode.vtotal - crtc->mode.vsync_start;
   752		dsp_st = dsp_sty << 16 | (dsp_stx & 0xffff);
   753	
   754		offset = (src->x1 >> 16) * fb->format->cpp[0];
   755		offset += (src->y1 >> 16) * fb->pitches[0];
   756		dma_addr = rk_obj->dma_addr + offset + fb->offsets[0];
   757	
   758		format = vop_convert_format(fb->format->format);
   759	
   760		spin_lock(&vop->reg_lock);
   761	
   762		VOP_WIN_SET(vop, win, format, format);
   763		VOP_WIN_SET(vop, win, yrgb_vir, DIV_ROUND_UP(fb->pitches[0], 4));
   764		VOP_WIN_SET(vop, win, yrgb_mst, dma_addr);
   765		if (is_yuv_support(fb->format->format)) {
   766			int hsub = drm_format_horz_chroma_subsampling(fb->format->format);
   767			int vsub = drm_format_vert_chroma_subsampling(fb->format->format);
   768			int bpp = fb->format->cpp[1];
   769	
   770			uv_obj = rockchip_fb_get_gem_obj(fb, 1);
   771			rk_uv_obj = to_rockchip_obj(uv_obj);
   772	
   773			offset = (src->x1 >> 16) * bpp / hsub;
   774			offset += (src->y1 >> 16) * fb->pitches[1] / vsub;
   775	
   776			dma_addr = rk_uv_obj->dma_addr + offset + fb->offsets[1];
   777			VOP_WIN_SET(vop, win, uv_vir, DIV_ROUND_UP(fb->pitches[1], 4));
   778			VOP_WIN_SET(vop, win, uv_mst, dma_addr);
   779		}
   780	
   781		if (win->phy->scl)
   782			scl_vop_cal_scl_fac(vop, win, actual_w, actual_h,
   783					    drm_rect_width(dest), drm_rect_height(dest),
   784					    fb->format->format);
   785	
   786		VOP_WIN_SET(vop, win, act_info, act_info);
   787		VOP_WIN_SET(vop, win, dsp_info, dsp_info);
   788		VOP_WIN_SET(vop, win, dsp_st, dsp_st);
   789	
   790		rb_swap = has_rb_swapped(fb->format->format);
   791		VOP_WIN_SET(vop, win, rb_swap, rb_swap);
   792	
   793		/*
   794		 * Blending win0 with the background color doesn't seem to work
   795		 * correctly. We only get the background color, no matter the contents
   796		 * of the win0 framebuffer.  However, blending pre-multiplied color
   797		 * with the default opaque black default background color is a no-op,
   798		 * so we can just disable blending to get the correct result.
   799		 */
 > 800		if (is_alpha_support(fb->format->format) && win_index > 0) {
   801			VOP_WIN_SET(vop, win, dst_alpha_ctl,
   802				    DST_FACTOR_M0(ALPHA_SRC_INVERSE));
   803			val = SRC_ALPHA_EN(1) | SRC_COLOR_M0(ALPHA_SRC_PRE_MUL) |
   804				SRC_ALPHA_M0(ALPHA_STRAIGHT) |
   805				SRC_BLEND_M0(ALPHA_PER_PIX) |
   806				SRC_ALPHA_CAL_M0(ALPHA_NO_SATURATION) |
   807				SRC_FACTOR_M0(ALPHA_ONE);
   808			VOP_WIN_SET(vop, win, src_alpha_ctl, val);
   809		} else {
   810			VOP_WIN_SET(vop, win, src_alpha_ctl, SRC_ALPHA_EN(0));
   811		}
   812	
   813		VOP_WIN_SET(vop, win, enable, 1);
   814		spin_unlock(&vop->reg_lock);
   815	}
   816	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Sean Paul April 17, 2018, 1:37 p.m. UTC | #2
On Mon, Apr 16, 2018 at 03:22:15PM -0700, Kristian H. Kristensen wrote:
> 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>

Sandy, when you push this, could you please remove the CHROMIUM: prefix from the
subject?

Reviewed-by: Sean Paul <seanpaul@chromium.org>


> ---
> As per Eric's suggestion, we can just disable blending. This replaces
> the previous "Filter out alpha formats for primary plane" patch.
> 
>  drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index fae37b1cd691..1c1dd11d489a 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> @@ -961,7 +961,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 (is_alpha_support(fb->format->format)) {
> +	/*
> +	 * 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 (is_alpha_support(fb->format->format) && 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) |
> -- 
> 2.17.0.484.g0c8726318c-goog
>
Sean Paul April 17, 2018, 1:41 p.m. UTC | #3
On Tue, Apr 17, 2018 at 09:37:44AM -0400, Sean Paul wrote:
> On Mon, Apr 16, 2018 at 03:22:15PM -0700, Kristian H. Kristensen wrote:
> > 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>
> 
> Sandy, when you push this, could you please remove the CHROMIUM: prefix from the
> subject?
> 
> Reviewed-by: Sean Paul <seanpaul@chromium.org>

Sigh. I should read replies before opening my mouth. Looks like you'll need to
rebase on drm-misc-next and fix the compile issue.

Sean

> 
> 
> > ---
> > As per Eric's suggestion, we can just disable blending. This replaces
> > the previous "Filter out alpha formats for primary plane" patch.
> > 
> >  drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 9 ++++++++-
> >  1 file changed, 8 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> > index fae37b1cd691..1c1dd11d489a 100644
> > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> > @@ -961,7 +961,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 (is_alpha_support(fb->format->format)) {
> > +	/*
> > +	 * 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 (is_alpha_support(fb->format->format) && 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) |
> > -- 
> > 2.17.0.484.g0c8726318c-goog
> > 
> 
> -- 
> Sean Paul, Software Engineer, Google / Chromium OS
diff mbox

Patch

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index fae37b1cd691..1c1dd11d489a 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -961,7 +961,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 (is_alpha_support(fb->format->format)) {
+	/*
+	 * 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 (is_alpha_support(fb->format->format) && 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) |