summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-11-14 11:22:44 +0000
committerDave Airlie <airlied@redhat.com>2012-02-17 15:55:38 +0000
commite2c10455d701722ee7a9f327d992070b1df2560b (patch)
treebb5763aad67650488fab5c8822cf40511491b1b9
parent21f90c3fdfcc6da10051e45ef771038ee7650cfb (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.c4
-rw-r--r--src/drmmode_display.c13
-rw-r--r--src/drmmode_display.h1
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 {