On Mon,  6 Mar 2017 20:15:05 +0000
Emmanuel Gil Peyrot <emmanuel.pey...@collabora.com> wrote:

> Weston will not repaint until previous update has been acked by a
> pageflip event coming from the drm driver. However, some buggy drivers
> won’t return those events or will stop sending them at some point and
> Weston output repaints will completely freeze. To ease developers’ task
> in testing their drivers, this patch makes compositor-drm use a timer
> to detect cases where those pageflip events stop coming.
> 
> This timeout implementation is software only and includes basic
> features usually found in a watchdog. We simply exit Weston gracefully
> with a log message and an exit code when the timout is reached.
> 
> The timeout value can be set via weston.ini by adding a
> pageflip-timeout=<MILLISECONDS> entry under a new [compositor-drm]
> section. Setting it to 0 disables the timeout feature.
> 
> v2:
> - Made sure we would get both the pageflip and the vblank events before
>   stopping the timer.
> - Reordered the error and success cases in
>   drm_output_pageflip_timer_create() to be more in line with the rest
>   of the code.
> 
> v3:
> - Reordered (de)arming of the timer with the code around it to avoid it
>   being rearmed before the current dearming.
> - Return the proper value for the dispatcher in the pageflip_timeout
>   callback.
> - Also display the output name in case the timer fires.
> 
> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=83884
> Signed-off-by: Frederic Plourde <frederic.plourde at collabora.co.uk>
> Signed-off-by: Emmanuel Gil Peyrot <emmanuel.pey...@collabora.com>
> Reviewed-by: Daniel Stone <dani...@collabora.com>
> ---
>  compositor/main.c          |  2 ++
>  libweston/compositor-drm.c | 65 
> ++++++++++++++++++++++++++++++++++++++++++++++
>  libweston/compositor-drm.h |  7 +++++
>  man/weston.ini.man         |  5 ++++
>  4 files changed, 79 insertions(+)

> @@ -749,6 +791,10 @@ drm_output_repaint(struct weston_output *output_base,
>               output_base->set_dpms(output_base, WESTON_DPMS_ON);
>       }
>  
> +     if (output->pageflip_timer)
> +             wl_event_source_timer_update(output->pageflip_timer,
> +                                          backend->pageflip_timeout);
> +
>       if (drmModePageFlip(backend->drm.fd, output->crtc_id,

Hi,

looks like you forgot to flip the order here. Should try to pageflip
first, arm the timer then.

Otherwise it all looks good, and I'll probably merge the next revision
immediately.


Thanks,
pq

>                           output->next->fb_id,
>                           DRM_MODE_PAGE_FLIP_EVENT, output) < 0) {

Attachment: pgpNwKJnrBM8o.pgp
Description: OpenPGP digital signature

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to