[PATCH xf86-video-ati 2/2] Don't try DRI2/Present flipping while the HW cursor can't be used
Alex Deucher
alexdeucher at gmail.com
Fri Mar 18 14:40:41 UTC 2016
On Fri, Mar 18, 2016 at 3:28 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> 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 <michel.daenzer at amd.com>
For the series:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> 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
> xorg-driver-ati at lists.x.org
> https://lists.x.org/mailman/listinfo/xorg-driver-ati
More information about the xorg-driver-ati
mailing list