[PATCH 2/3] present: Query the Window's CRTC every time
Chris Wilson
chris at chris-wilson.co.uk
Thu May 28 01:38:09 PDT 2015
On Thu, May 28, 2015 at 04:59:14PM +0900, Michel Dänzer wrote:
> On 27.05.2015 15:51, Chris Wilson wrote:
> > On Tue, May 26, 2015 at 02:30:32PM -0700, Keith Packard wrote:
> >> Michel Dänzer <michel at daenzer.net> writes:
> >>
> >>> The old code also called present_get_crtc() unless pixmap == NULL, so
> >>> the problem couldn't affect flips but only MSC waits.
> >>
> >> The original code was trying to let the client control which CRTC to
> >> track for each window. For PresentPixmap requests, there's an explicit
> >> CRTC argument, which allows the client to select the right one. For
> >> PresentNotifyMSC, there's no such argument.
> >>
> >> So, the code was trying to respect the client's wishes by using
> >> whichever CRTC was last associated with the window -- either implicitly
> >> through the last call to present_get_crtc or explicitly from the last
> >> crtc passed to PresentPixmap for the same window.
> >>
> >> Probably the right thing to do is to add an explicit CRTC parameter to
> >> PresentNotifyMSC, and then have both requests call present_get_crtc when
> >> an explicit CRTC is not provided.
> >>
> >> That doesn't solve the problem when an explicitly requested CRTC is
> >> disabled though, so this fix doesn't address the root cause, only one of
> >> the symptoms.
> >>
> >>> The problem I was hitting was that this code was running for an MSC wait
> >>> when the CRTC referenced by window_priv->crtc was already disabled for
> >>> DPMS off. This caused hangs at the GNOME lock screen. This patch seems
> >>> to fix that problem.
> >>
> >> Why isn't your queue_vblank function bailing when asked to queue a
> >> request for a CRTC which is disabled? If it simply fails,
> >> present_execute will get called immediately and the client would
> >> continue happily along.
> >
> > Oh, but it does fail gracefully. The problem is not that but that it
> > sends a garbage msc to a valid CRTC.
>
> The patch below is an alternative fix for the problem I'm seeing, while
> preserving the window CRTC for MSC waits when possible. Your
> description sounds like it might work for you as well, Chris. Can you
> try it?
>
>
> diff --git a/present/present.c b/present/present.c
> index a634601..dc58f25 100644
> --- a/present/present.c
> +++ b/present/present.c
> @@ -713,6 +713,7 @@ present_pixmap(WindowPtr window,
> uint64_t ust;
> uint64_t target_msc;
> uint64_t crtc_msc;
> + RRCrtcPtr new_crtc;
> int ret;
> present_vblank_ptr vblank, tmp;
> ScreenPtr screen = window->drawable.pScreen;
> @@ -734,7 +735,21 @@ present_pixmap(WindowPtr window,
> target_crtc = present_get_crtc(window);
> }
>
> - present_get_ust_msc(screen, target_crtc, &ust, &crtc_msc);
> + if (present_get_ust_msc(screen, target_crtc, &ust, &crtc_msc) != Success) {
> + /* Maybe we need to try a different CRTC?
> + */
> + new_crtc = present_get_crtc(window);
> +
> + if (new_crtc != target_crtc &&
> + present_get_ust_msc(screen, new_crtc, &ust, &crtc_msc) == Success)
> + target_crtc = new_crtc;
> + else {
> + /* Fall back to fake MSC handling
> + */
> + target_crtc = NULL;
> + present_fake_get_ust_msc(screen, &ust, &crtc_msc);
> + }
> + }
It survived for one more CRTC change, but still feeds passed msc into
the wait_vblank.
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the xorg-devel
mailing list