[PATCH xf86-video-ati 2/2] If a TearFree flip fails, fall back to non-TearFree operation

Alex Deucher alexdeucher at gmail.com
Tue Jul 11 15:52:08 UTC 2017


On Tue, Jul 11, 2017 at 5:17 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> In order to avoid possible freeze / log file spam in that case.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99769
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

Alex

> ---
>  src/drmmode_display.c | 12 +++++++-----
>  src/drmmode_display.h |  2 ++
>  src/radeon_kms.c      | 21 +++++++++++++--------
>  3 files changed, 22 insertions(+), 13 deletions(-)
>
> diff --git a/src/drmmode_display.c b/src/drmmode_display.c
> index 4b964b7b9..840071fe7 100644
> --- a/src/drmmode_display.c
> +++ b/src/drmmode_display.c
> @@ -496,7 +496,7 @@ void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
>         return;
>  }
>
> -static void
> +void
>  drmmode_crtc_scanout_destroy(drmmode_ptr drmmode,
>                              struct drmmode_scanout *scanout)
>  {
> @@ -770,15 +770,17 @@ drmmode_crtc_scanout_update(xf86CrtcPtr crtc, DisplayModePtr mode,
>         ScreenPtr screen = scrn->pScreen;
>         drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
>
> -       drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[0],
> +       drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[scanout_id],
>                                     mode->HDisplay, mode->VDisplay);
>         if (drmmode_crtc->tear_free) {
> -               drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[1],
> +               drmmode_crtc_scanout_create(crtc,
> +                                           &drmmode_crtc->scanout[scanout_id ^ 1],
>                                             mode->HDisplay, mode->VDisplay);
>         }
>
> -       if (drmmode_crtc->scanout[0].pixmap &&
> -           (!drmmode_crtc->tear_free || drmmode_crtc->scanout[1].pixmap)) {
> +       if (drmmode_crtc->scanout[scanout_id].pixmap &&
> +           (!drmmode_crtc->tear_free ||
> +            drmmode_crtc->scanout[scanout_id ^ 1].pixmap)) {
>                 RegionPtr region;
>                 BoxPtr box;
>
> diff --git a/src/drmmode_display.h b/src/drmmode_display.h
> index ba1a7bc89..b9bc8fd8c 100644
> --- a/src/drmmode_display.h
> +++ b/src/drmmode_display.h
> @@ -192,6 +192,8 @@ extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
>  extern void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
>  extern Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn);
>
> +extern void drmmode_crtc_scanout_destroy(drmmode_ptr drmmode,
> +                                        struct drmmode_scanout *scanout);
>  extern void drmmode_scanout_free(ScrnInfoPtr scrn);
>
>  extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode);
> diff --git a/src/radeon_kms.c b/src/radeon_kms.c
> index 955efc621..b22c98406 100644
> --- a/src/radeon_kms.c
> +++ b/src/radeon_kms.c
> @@ -1008,7 +1008,9 @@ static void
>  radeon_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame, uint64_t usec,
>                               void *event_data)
>  {
> -    radeon_scanout_do_update(crtc, 0);
> +    drmmode_crtc_private_ptr drmmode_crtc = event_data;
> +
> +    radeon_scanout_do_update(crtc, drmmode_crtc->scanout_id);
>
>      radeon_scanout_update_abort(crtc, event_data);
>  }
> @@ -1027,7 +1029,6 @@ radeon_scanout_update(xf86CrtcPtr xf86_crtc)
>
>      if (!xf86_crtc->enabled ||
>         drmmode_crtc->scanout_update_pending ||
> -       !drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap ||
>         drmmode_crtc->pending_dpms_mode != DPMSModeOn)
>         return;
>
> @@ -1128,9 +1129,17 @@ radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info,
>      if (drmmode_page_flip_target_relative(pRADEONEnt, drmmode_crtc,
>                                           drmmode_crtc->flip_pending->handle,
>                                           0, drm_queue_seq, 0) != 0) {
> -       xf86DrvMsg(scrn->scrnIndex, X_WARNING, "flip queue failed in %s: %s\n",
> +       xf86DrvMsg(scrn->scrnIndex, X_WARNING, "flip queue failed in %s: %s, "
> +                  "TearFree inactive until next modeset\n",
>                    __func__, strerror(errno));
>         radeon_drm_abort_entry(drm_queue_seq);
> +       RegionCopy(DamageRegion(drmmode_crtc->scanout_damage),
> +                  &drmmode_crtc->scanout_last_region);
> +       RegionEmpty(&drmmode_crtc->scanout_last_region);
> +       radeon_scanout_update(xf86_crtc);
> +       drmmode_crtc_scanout_destroy(drmmode_crtc->drmmode,
> +                                    &drmmode_crtc->scanout[scanout_id]);
> +       drmmode_crtc->tear_free = FALSE;
>         return;
>      }
>
> @@ -1172,11 +1181,7 @@ static void RADEONBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL)
>
>             if (drmmode_crtc->tear_free)
>                 radeon_scanout_flip(pScreen, info, crtc);
> -           else if (info->shadow_primary
> -#if XF86_CRTC_VERSION >= 4
> -                    || crtc->driverIsPerformingTransform
> -#endif
> -               )
> +           else if (drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap)
>                 radeon_scanout_update(crtc);
>         }
>      }
> --
> 2.13.2
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list