diff options
author | Dave Airlie <airlied@redhat.com> | 2011-11-14 11:22:44 +0000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-02-17 15:55:38 +0000 |
commit | e2c10455d701722ee7a9f327d992070b1df2560b (patch) | |
tree | bb5763aad67650488fab5c8822cf40511491b1b9 | |
parent | 21f90c3fdfcc6da10051e45ef771038ee7650cfb (diff) |
modesetting: add cursor fallback if kernel rejects cursor.
If the kernel rejects a cursor, cause a fallback, this isn't 100% as
we can lose the initial cursor, but it works fine once wm starts.
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | src/driver.c | 4 | ||||
-rw-r--r-- | src/drmmode_display.c | 13 | ||||
-rw-r--r-- | src/drmmode_display.h | 1 |
3 files changed, 15 insertions, 3 deletions
diff --git a/src/driver.c b/src/driver.c index 69a5fe0..7ce1ac1 100644 --- a/src/driver.c +++ b/src/driver.c @@ -477,7 +477,7 @@ PreInit(ScrnInfoPtr pScrn, int flags) return FALSE; if (xf86ReturnOptValBool(ms->Options, OPTION_SW_CURSOR, FALSE)) { - ms->SWCursor = TRUE; + ms->drmmode.sw_cursor = TRUE; } ms->shadow_enable = xf86ReturnOptValBool(ms->Options, OPTION_SHADOW_FB, TRUE); @@ -681,7 +681,7 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); /* Need to extend HWcursor support to handle mask interleave */ - if (!ms->SWCursor) + if (!ms->drmmode.sw_cursor) xf86_cursors_init(pScreen, 64, 64, HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | HARDWARE_CURSOR_ARGB); diff --git a/src/drmmode_display.c b/src/drmmode_display.c index dcf3eb3..ec39967 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -402,12 +402,23 @@ 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 < 64 * 64; i++) ptr[i] = image[i];// cpu_to_le32(image[i]); + + ret = drmModeSetCursor(drmmode_crtc->drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle, 64, 64); + 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 */ + } } diff --git a/src/drmmode_display.h b/src/drmmode_display.h index 845207a..7ede159 100644 --- a/src/drmmode_display.h +++ b/src/drmmode_display.h @@ -53,6 +53,7 @@ typedef struct { #endif drmEventContext event_context; struct dumb_bo *front_bo; + Bool sw_cursor; } drmmode_rec, *drmmode_ptr; typedef struct { |