[PATCH xserver] modesetting: always set a hardware cursor when requested to load one.

Hans de Goede hdegoede at redhat.com
Fri Sep 23 08:20:50 UTC 2016


Hi All,

On 09/16/2016 06:52 PM, Michael Thayer wrote:
> When the X server asks us to load a hardware cursor, that request is always
> followed up by a request to show it if we report success, or to hide it if
> we report failure.  Therefore it makes no sense to suppress the request if
> the cursor is not currently visible.

Ok, I've just spend the last half hour tracing (using grep) all callers of
load_cursor_argb_check and you're right, either the cursor is already
visible (XRecolorCursor does this), or it will get shown directly after
the drmmode_load_cursor_argb_check() call.

So this patch is:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans



>
> Signed-off-by: Michael Thayer <michael.thayer at oracle.com>
> ---
> Tested that both hardware and software cursors still work after applying the
> patch.
>
>  hw/xfree86/drivers/modesetting/drmmode_display.c | 11 +----------
>  hw/xfree86/drivers/modesetting/drmmode_display.h |  2 --
>  2 files changed, 1 insertion(+), 12 deletions(-)
>
> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
> index 41810d9..7d171a3 100644
> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
> @@ -813,14 +813,7 @@ drmmode_load_cursor_argb_check(xf86CrtcPtr crtc, CARD32 *image)
>      for (i = 0; i < ms->cursor_width * ms->cursor_height; i++)
>          ptr[i] = image[i];      // cpu_to_le32(image[i]);
>
> -    if (drmmode_crtc->cursor_up || !drmmode_crtc->first_cursor_load_done) {
> -        Bool ret = drmmode_set_cursor(crtc);
> -        if (!drmmode_crtc->cursor_up)
> -            drmmode_hide_cursor(crtc);
> -        drmmode_crtc->first_cursor_load_done = TRUE;
> -        return ret;
> -    }
> -    return TRUE;
> +    return drmmode_set_cursor(crtc);
>  }
>
>  static void
> @@ -830,7 +823,6 @@ drmmode_hide_cursor(xf86CrtcPtr crtc)
>      drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
>      drmmode_ptr drmmode = drmmode_crtc->drmmode;
>
> -    drmmode_crtc->cursor_up = FALSE;
>      drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0,
>                       ms->cursor_width, ms->cursor_height);
>  }
> @@ -839,7 +831,6 @@ static void
>  drmmode_show_cursor(xf86CrtcPtr crtc)
>  {
>      drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> -    drmmode_crtc->cursor_up = TRUE;
>      drmmode_set_cursor(crtc);
>  }
>
> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.h b/hw/xfree86/drivers/modesetting/drmmode_display.h
> index 50976b8..bd82968 100644
> --- a/hw/xfree86/drivers/modesetting/drmmode_display.h
> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.h
> @@ -91,9 +91,7 @@ typedef struct {
>      uint32_t vblank_pipe;
>      int dpms_mode;
>      struct dumb_bo *cursor_bo;
> -    Bool cursor_up;
>      Bool set_cursor2_failed;
> -    Bool first_cursor_load_done;
>      uint16_t lut_r[256], lut_g[256], lut_b[256];
>
>      drmmode_bo rotate_bo;
>


More information about the xorg-devel mailing list