summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk@arm.linux.org.uk>2013-06-30 19:16:30 +0100
committerRussell King <rmk@arm.linux.org.uk>2013-06-30 19:17:50 +0100
commit2c26e2ab953b997f26ac317ed79e3f3cab15f6e7 (patch)
tree2e7c7aac62c8238a8256a43daf1a4d2e89bb98a6
parentb506ee1fc7b7d0a2c8823f96255dccd6173bfa06 (diff)
Probe for hardware cursor support
Not all Armada devices support hardware cursor, so probe for the kernel supporting this feature before telling the X server that it can use it. Signed-off-by: Russell King <rmk@arm.linux.org.uk>
-rw-r--r--src/armada_drm.c37
-rw-r--r--src/armada_drm.h1
2 files changed, 26 insertions, 12 deletions
diff --git a/src/armada_drm.c b/src/armada_drm.c
index 0ad8fbb..692774a 100644
--- a/src/armada_drm.c
+++ b/src/armada_drm.c
@@ -818,6 +818,10 @@ armada_drm_crtc_init(ScrnInfoPtr pScrn, struct armada_drm_info *drm,
drmc->mode_crtc = drmModeGetCrtc(drm->fd, id);
crtc->driver_private = drmc;
+ /* Test whether hardware cursor is supported */
+ if (drmModeSetCursor(drm->fd, id, 0, 0, 0))
+ drm->has_hw_cursor = FALSE;
+
drmc->cursor_bo = drm_armada_bo_dumb_create(drm->bufmgr,
CURSOR_MAX_WIDTH,
CURSOR_MAX_HEIGHT,
@@ -1227,18 +1231,24 @@ armada_drm_ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
/* software cursor */
miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
- drm->hw_cursor = xf86ReturnOptValBool(drm->Options, OPTION_HW_CURSOR, FALSE);
+ drm->hw_cursor = xf86ReturnOptValBool(drm->Options, OPTION_HW_CURSOR,
+ drm->has_hw_cursor);
+ if (drm->hw_cursor && !drm->has_hw_cursor) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "No hardware cursor support - disabling hardware cursors\n");
+ drm->hw_cursor = FALSE;
+ }
if (drm->hw_cursor &&
- xf86_cursors_init(pScreen,
- CURSOR_MAX_WIDTH, CURSOR_MAX_HEIGHT,
- HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
- HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
- HARDWARE_CURSOR_INVERT_MASK |
- HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK |
- HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
- HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
- HARDWARE_CURSOR_UPDATE_UNHIDDEN |
- HARDWARE_CURSOR_ARGB)) {
+ xf86_cursors_init(pScreen,
+ CURSOR_MAX_WIDTH, CURSOR_MAX_HEIGHT,
+ HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
+ HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
+ HARDWARE_CURSOR_INVERT_MASK |
+ HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK |
+ HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
+ HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
+ HARDWARE_CURSOR_UPDATE_UNHIDDEN |
+ HARDWARE_CURSOR_ARGB)) {
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"Using hardware cursors\n");
} else {
@@ -1330,8 +1340,11 @@ static Bool armada_drm_pre_init(ScrnInfoPtr pScrn)
pScrn->virtualX = drm->mode_res->max_width;
pScrn->virtualY = drm->mode_res->max_height;
- xf86CrtcSetSizeRange(pScrn, 320, 200, pScrn->virtualX, pScrn->virtualY);
+ xf86CrtcSetSizeRange(pScrn, drm->mode_res->min_width,
+ drm->mode_res->min_height,
+ pScrn->virtualX, pScrn->virtualY);
+ drm->has_hw_cursor = TRUE;
for (i = 0; i < drm->mode_res->count_crtcs; i++)
if (!armada_drm_crtc_init(pScrn, drm, i))
return FALSE;
diff --git a/src/armada_drm.h b/src/armada_drm.h
index 3f5dfaf..a89d395 100644
--- a/src/armada_drm.h
+++ b/src/armada_drm.h
@@ -37,6 +37,7 @@ struct armada_drm_info {
uint32_t fb_id;
drmModeResPtr mode_res;
+ Bool has_hw_cursor;
Bool hw_cursor;
Bool accel;