[PATCH weston 3/8] compositor-drm: Don’t try to set the cursor anymore once we know it’s broken

Pekka Paalanen ppaalanen at gmail.com
Tue May 17 14:49:25 UTC 2016

On Mon,  2 May 2016 22:40:12 +0100
Emmanuel Gil Peyrot <emmanuel.peyrot at collabora.com> wrote:

> Signed-off-by: Emmanuel Gil Peyrot <emmanuel.peyrot at collabora.com>
> ---
>  src/compositor-drm.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
> index ea118fa..c11562f 100644
> --- a/src/compositor-drm.c
> +++ b/src/compositor-drm.c
> @@ -671,7 +671,8 @@ drm_output_repaint(struct weston_output *output_base,
>  	output->page_flip_pending = 1;
> -	drm_output_set_cursor(output);
> +	if (!backend->cursors_are_broken)
> +		drm_output_set_cursor(output);
>  	/*
>  	 * Now, update all the sprite surfaces


we talked about this in irc.

This is an easy-looking change, but there are subtle things hiding
behind that raised my eyebrow a bit.

drm_output_prepare_cursor_view() should already be bailing out, for
cursors_are_broken if nothing else. If that happens, then this patch
would only avoid unsetting the cursor on every frame. I can very well
understand the desire to not repeatedly unset the cursor, however you
told me unsetting was not the case.

Btw. even the unsetting case might be prone to a couple corner-cases:

- VT-switching in, you better hammer in all KMS state again. Even if
  cursors are broken for us, maybe something else managed to set one.
  We don't want to leave a stale cursor on screen.

- According to [1], some virtual hardware might be sometimes able to
  handle cursors and other times not. Or, maybe there are some other
  unknown limitations on when cursor can be used or not, but anyway,
  I'd like to guarantee there won't be a stale cursor on screen.

Funnily enough, the DRM-backend is already never going back from
cursors_are_broken when once set.

The current intended behaviour in Weston is to try to use the HW
cursor, and set cursors_are_broken in drm_output_set_cursor() the first
time it fails. That makes prepare_cursor_view() always bail out, so no
cursor is attempted again, though the cursor is unset (mostly
redundantly) on every frame.

Because it is unclear whether this patch is actually necessary, and we
could not figure it out in irc, and there is some remote possibility
for a rare regression, I'd leave this out for now.


[1] https://lists.x.org/archives/xorg-devel/2016-March/048960.html

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 811 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20160517/f0dc9767/attachment.sig>

More information about the wayland-devel mailing list