On Fri, Mar 18, 2016 at 3:28 AM, Michel Dänzer <[email protected]> wrote: > From: Michel Dänzer <[email protected]> > > 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. > > Signed-off-by: Michel Dänzer <[email protected]>
For the series: Reviewed-by: Alex Deucher <[email protected]> > --- > src/drmmode_display.c | 15 ++++++++++++++- > src/radeon.h | 5 +++++ > src/radeon_dri2.c | 1 + > src/radeon_kms.c | 7 +++++-- > 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 36a7957..635f71c 100644 > --- a/src/drmmode_display.c > +++ b/src/drmmode_display.c > @@ -857,7 +857,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 fe26df4..b9afd8e 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 657e6a6..474611a 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 8048c95..d89c376 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 e0a549d..3be3360 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; > > -- > 2.7.0 > > _______________________________________________ > xorg-driver-ati mailing list > [email protected] > https://lists.x.org/mailman/listinfo/xorg-driver-ati _______________________________________________ xorg-driver-ati mailing list [email protected] https://lists.x.org/mailman/listinfo/xorg-driver-ati
