modesetting: Use load_cursor_argb_check for sw cursor fallback
The modesetting driver still has an everlasting bug of invisible cursor on cirrus and other KMS drivers where no hardware cursor is supported. This patch is a part of an attempt to address it. This patch particularly converts the current load_cursor_argb callback of modesetting driver to load_cursor_argb_check so that it can return whether the driver handles the hw cursor or falls back to the sw cursor. Signed-off-by: Takashi Iwai <tiwai@suse.de> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> [hdegoede@redhat.com: Add extra comment suggested by Kenneth] Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
074cf58769
commit
14c21ea1c9
|
@ -779,7 +779,7 @@ drmmode_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
|
|||
drmModeMoveCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, x, y);
|
||||
}
|
||||
|
||||
static void
|
||||
static Bool
|
||||
drmmode_set_cursor(xf86CrtcPtr crtc)
|
||||
{
|
||||
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
||||
|
@ -797,7 +797,7 @@ drmmode_set_cursor(xf86CrtcPtr crtc)
|
|||
handle, ms->cursor_width, ms->cursor_height,
|
||||
cursor->bits->xhot, cursor->bits->yhot);
|
||||
if (!ret)
|
||||
return;
|
||||
return TRUE;
|
||||
|
||||
use_set_cursor2 = FALSE;
|
||||
}
|
||||
|
@ -812,11 +812,22 @@ drmmode_set_cursor(xf86CrtcPtr crtc)
|
|||
cursor_info->MaxWidth = cursor_info->MaxHeight = 0;
|
||||
drmmode_crtc->drmmode->sw_cursor = TRUE;
|
||||
/* fallback to swcursor */
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
drmmode_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
|
||||
static void drmmode_hide_cursor(xf86CrtcPtr crtc);
|
||||
|
||||
/*
|
||||
* The load_cursor_argb_check driver hook.
|
||||
*
|
||||
* Sets the hardware cursor by calling the drmModeSetCursor2 ioctl.
|
||||
* On failure, returns FALSE indicating that the X server should fall
|
||||
* back to software cursors.
|
||||
*/
|
||||
static Bool
|
||||
drmmode_load_cursor_argb_check(xf86CrtcPtr crtc, CARD32 *image)
|
||||
{
|
||||
modesettingPtr ms = modesettingPTR(crtc->scrn);
|
||||
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
||||
|
@ -830,7 +841,8 @@ drmmode_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
|
|||
ptr[i] = image[i]; // cpu_to_le32(image[i]);
|
||||
|
||||
if (drmmode_crtc->cursor_up)
|
||||
drmmode_set_cursor(crtc);
|
||||
return drmmode_set_cursor(crtc);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1119,7 +1131,7 @@ static const xf86CrtcFuncsRec drmmode_crtc_funcs = {
|
|||
.set_cursor_position = drmmode_set_cursor_position,
|
||||
.show_cursor = drmmode_show_cursor,
|
||||
.hide_cursor = drmmode_hide_cursor,
|
||||
.load_cursor_argb = drmmode_load_cursor_argb,
|
||||
.load_cursor_argb_check = drmmode_load_cursor_argb_check,
|
||||
|
||||
.gamma_set = drmmode_crtc_gamma_set,
|
||||
.destroy = NULL, /* XXX */
|
||||
|
|
Loading…
Reference in New Issue
Block a user