diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2016-03-09 18:28:47 +0900 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2016-03-23 16:52:59 +0900 |
commit | 7f3d0780ca65a90117c2a61362dbc0899bd9c0b0 (patch) | |
tree | 11674b05095f2afb217926f6955627260c3b67db | |
parent | 3de480e83c0a1824838d662d6d67c9fe85277298 (diff) |
Don't try DRI2/Present flipping while the HW cursor can't be used
Flipping doesn't interact correctly with SW cursor: A flip makes the SW
cursor disappear. It will only appear again when the cursor is moved,
but it will be surrounded by corruption, because the SW cursor code
will restore stale screen contents at the old cursor location before
drawing the cursor at the new location.
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | src/drmmode_display.c | 15 | ||||
-rw-r--r-- | src/radeon.h | 5 | ||||
-rw-r--r-- | src/radeon_dri2.c | 1 | ||||
-rw-r--r-- | src/radeon_kms.c | 7 | ||||
-rw-r--r-- | src/radeon_present.c | 3 |
5 files changed, 28 insertions, 3 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 3769e44c..3c873dc0 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -860,7 +860,20 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, } } - if (drmmode_can_use_hw_cursor(crtc)) + /* Compute index of this CRTC into xf86_config->crtc */ + for (i = 0; i < xf86_config->num_crtc; i++) { + if (xf86_config->crtc[i] != crtc) + continue; + + if (!crtc->enabled || drmmode_can_use_hw_cursor(crtc)) + info->hwcursor_disabled &= ~(1 << i); + else + info->hwcursor_disabled |= 1 << i; + + break; + } + + if (!info->hwcursor_disabled) xf86_reload_cursors(pScreen); done: diff --git a/src/radeon.h b/src/radeon.h index fe26df48..b9afd8ee 100644 --- a/src/radeon.h +++ b/src/radeon.h @@ -547,6 +547,11 @@ typedef struct { int cursor_w; int cursor_h; + /* If bit n of this field is set, xf86_config->crtc[n] currently can't + * use the HW cursor + */ + unsigned hwcursor_disabled; + #ifdef USE_GLAMOR struct { CreateGCProcPtr SavedCreateGC; diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c index 657e6a66..474611aa 100644 --- a/src/radeon_dri2.c +++ b/src/radeon_dri2.c @@ -823,6 +823,7 @@ can_flip(ScrnInfoPtr pScrn, DrawablePtr draw, return draw->type == DRAWABLE_WINDOW && info->allowPageFlip && + !info->hwcursor_disabled && !info->drmmode.present_flipping && pScrn->vtSema && DRI2CanFlip(draw) && diff --git a/src/radeon_kms.c b/src/radeon_kms.c index 8048c95f..d89c3760 100644 --- a/src/radeon_kms.c +++ b/src/radeon_kms.c @@ -1285,15 +1285,18 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags) xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TearFree enabled\n"); if (info->dri2.pKernelDRMVersion->version_minor >= 8) { + Bool sw_cursor = xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE); + info->allowPageFlip = xf86ReturnOptValBool(info->Options, OPTION_PAGE_FLIP, TRUE); - if (info->tear_free || info->shadow_primary) { + if (sw_cursor || info->tear_free || info->shadow_primary) { xf86DrvMsg(pScrn->scrnIndex, info->allowPageFlip ? X_WARNING : X_DEFAULT, "KMS Pageflipping: disabled%s\n", info->allowPageFlip ? - " because of ShadowPrimary/TearFree" : ""); + (sw_cursor ? " because of SWcursor" : + " because of ShadowPrimary/TearFree") : ""); info->allowPageFlip = FALSE; } else { xf86DrvMsg(pScrn->scrnIndex, X_INFO, diff --git a/src/radeon_present.c b/src/radeon_present.c index e0a549db..3be33600 100644 --- a/src/radeon_present.c +++ b/src/radeon_present.c @@ -244,6 +244,9 @@ radeon_present_check_flip(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap, if (!info->allowPageFlip) return FALSE; + if (info->hwcursor_disabled) + return FALSE; + if (!sync_flip) return FALSE; |