[PATCH] modesetting: Don't re-enable the cursor when loading the image

Michel Dänzer michel at daenzer.net
Tue Dec 16 23:41:15 PST 2014


On 17.12.2014 16:18, Keith Packard wrote:
> Hidden cursors also have their image updated; re-enabling the cursor
> each time the image is set will cause it to re-appear.
> 
> drm_mode_load_cursor_argb also checked for drmModeSetCursor failure
> and switched to software cursors. That code has been rescused from
> deletion and moved down into drmmode_show_cursor.
> 
> Signed-off-by: Keith Packard <keithp at keithp.com>
> ---
>  hw/xfree86/drivers/modesetting/drmmode_display.c | 30 ++++++++++--------------
>  1 file changed, 12 insertions(+), 18 deletions(-)
> 
> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
> index 13a96dc..ffd4e88 100644
> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
> @@ -400,27 +400,12 @@ drmmode_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
>      drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
>      int i;
>      uint32_t *ptr;
> -    uint32_t handle = drmmode_crtc->cursor_bo->handle;
> -    int ret;
>  
>      /* cursor should be mapped already */
>      ptr = (uint32_t *) (drmmode_crtc->cursor_bo->ptr);
>  
>      for (i = 0; i < ms->cursor_width * ms->cursor_height; i++)
>          ptr[i] = image[i];      // cpu_to_le32(image[i]);
> -
> -    ret =
> -        drmModeSetCursor(drmmode_crtc->drmmode->fd,
> -                         drmmode_crtc->mode_crtc->crtc_id, handle,
> -                         ms->cursor_width, ms->cursor_height);
> -    if (ret) {
> -        xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
> -        xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
> -
> -        cursor_info->MaxWidth = cursor_info->MaxHeight = 0;
> -        drmmode_crtc->drmmode->sw_cursor = TRUE;
> -        /* fallback to swcursor */
> -    }
>  }
>  
>  static void
> @@ -443,11 +428,11 @@ drmmode_show_cursor(xf86CrtcPtr crtc)
>      drmmode_ptr drmmode = drmmode_crtc->drmmode;
>      uint32_t handle = drmmode_crtc->cursor_bo->handle;
>      static Bool use_set_cursor2 = TRUE;
> +    int ret;
>  
>      if (use_set_cursor2) {
>          xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
>          CursorPtr cursor = xf86_config->cursor;
> -        int ret;
>  
>          ret =
>              drmModeSetCursor2(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
> @@ -459,8 +444,17 @@ drmmode_show_cursor(xf86CrtcPtr crtc)
>              return;
>      }
>  
> -    drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle,
> -                     ms->cursor_width, ms->cursor_height);
> +    ret = drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle,
> +                           ms->cursor_width, ms->cursor_height);
> +
> +    if (ret) {
> +        xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
> +        xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
> +
> +        cursor_info->MaxWidth = cursor_info->MaxHeight = 0;
> +        drmmode_crtc->drmmode->sw_cursor = TRUE;
> +        /* fallback to swcursor */
> +    }
>  }
>  
>  static void
> 

I don't think there's any guarantee that the new cursor image will
become visible without calling drmModeSetCursor(2), so this solution
won't work in general (e.g. with virtual hardware). Instead, you need to
remember whether or not the cursor is currently visible, and only call
drmModeSetCursor(2)[0] from drmmode_load_cursor_argb when it's visible.

[0] drmmode_load_cursor_argb should also use drmModeSetCursor2 if possible.


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer


More information about the xorg-devel mailing list