[PATCH] drm/meson: fix vsync buffer update

Neil Armstrong narmstrong at baylibre.com
Tue Feb 20 01:04:54 PST 2018


On 19/02/2018 16:19, Daniel Vetter wrote:
> On Thu, Feb 15, 2018 at 11:19:36AM +0100, Neil Armstrong wrote:
>> The plane buffer address/stride/height was incorrectly updated in the
>> plane_atomic_update operation instead of the vsync irq.
>> This patch delays this operation in the vsync irq along with the
>> other plane delayed setup.
>>
>> This issue was masked using legacy framebuffer and X11 modesetting, but
>> is clearly visible using gbm rendering when buffer is submitted late after
>> vblank, like using software decoding and OpenGL rendering in Kodi.
>> With this patch, tearing and other artifacts disappears completely.
> 
> You mean the frontbuffer rendering nature of X11 with all it's tearing
> made the issue not noticeable? I'm also not clear what you mean with
> legacy framebuffer ...

Yeah I don't have to correct technical terms, sorry.

> 
> Either way looks reasonable:
> Acked-by: Daniel Vetter <daniel.vetter at ffwll.ch>

Thanks,

Pushed to drm-misc-fixes.

Neil

> 
>> Cc: Michal Lazo <michal.lazo at gmail.com>
>> Fixes: bbbe775ec5b5 ("drm: Add support for Amlogic Meson Graphic Controller")
>> Signed-off-by: Neil Armstrong <narmstrong at baylibre.com>
>> ---
>>  drivers/gpu/drm/meson/meson_crtc.c  | 6 ++++++
>>  drivers/gpu/drm/meson/meson_drv.h   | 3 +++
>>  drivers/gpu/drm/meson/meson_plane.c | 7 +++----
>>  3 files changed, 12 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/meson/meson_crtc.c b/drivers/gpu/drm/meson/meson_crtc.c
>> index 5155f01..0552020 100644
>> --- a/drivers/gpu/drm/meson/meson_crtc.c
>> +++ b/drivers/gpu/drm/meson/meson_crtc.c
>> @@ -36,6 +36,7 @@
>>  #include "meson_venc.h"
>>  #include "meson_vpp.h"
>>  #include "meson_viu.h"
>> +#include "meson_canvas.h"
>>  #include "meson_registers.h"
>>  
>>  /* CRTC definition */
>> @@ -192,6 +193,11 @@ void meson_crtc_irq(struct meson_drm *priv)
>>  		} else
>>  			meson_vpp_disable_interlace_vscaler_osd1(priv);
>>  
>> +		meson_canvas_setup(priv, MESON_CANVAS_ID_OSD1,
>> +			   priv->viu.osd1_addr, priv->viu.osd1_stride,
>> +			   priv->viu.osd1_height, MESON_CANVAS_WRAP_NONE,
>> +			   MESON_CANVAS_BLKMODE_LINEAR);
>> +
>>  		/* Enable OSD1 */
>>  		writel_bits_relaxed(VPP_OSD1_POSTBLEND, VPP_OSD1_POSTBLEND,
>>  				    priv->io_base + _REG(VPP_MISC));
>> diff --git a/drivers/gpu/drm/meson/meson_drv.h b/drivers/gpu/drm/meson/meson_drv.h
>> index 5e8b392..8450d6ac 100644
>> --- a/drivers/gpu/drm/meson/meson_drv.h
>> +++ b/drivers/gpu/drm/meson/meson_drv.h
>> @@ -43,6 +43,9 @@ struct meson_drm {
>>  		bool osd1_commit;
>>  		uint32_t osd1_ctrl_stat;
>>  		uint32_t osd1_blk0_cfg[5];
>> +		uint32_t osd1_addr;
>> +		uint32_t osd1_stride;
>> +		uint32_t osd1_height;
>>  	} viu;
>>  
>>  	struct {
>> diff --git a/drivers/gpu/drm/meson/meson_plane.c b/drivers/gpu/drm/meson/meson_plane.c
>> index d0a6ac8..27bd350 100644
>> --- a/drivers/gpu/drm/meson/meson_plane.c
>> +++ b/drivers/gpu/drm/meson/meson_plane.c
>> @@ -164,10 +164,9 @@ static void meson_plane_atomic_update(struct drm_plane *plane,
>>  	/* Update Canvas with buffer address */
>>  	gem = drm_fb_cma_get_gem_obj(fb, 0);
>>  
>> -	meson_canvas_setup(priv, MESON_CANVAS_ID_OSD1,
>> -			   gem->paddr, fb->pitches[0],
>> -			   fb->height, MESON_CANVAS_WRAP_NONE,
>> -			   MESON_CANVAS_BLKMODE_LINEAR);
>> +	priv->viu.osd1_addr = gem->paddr;
>> +	priv->viu.osd1_stride = fb->pitches[0];
>> +	priv->viu.osd1_height = fb->height;
>>  
>>  	spin_unlock_irqrestore(&priv->drm->event_lock, flags);
>>  }
>> -- 
>> 2.7.4
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
> 




More information about the linux-arm-kernel mailing list