[PATCH 2/3] present: Query the Window's CRTC every time

Chris Wilson chris at chris-wilson.co.uk
Thu May 28 02:30:36 PDT 2015


On Thu, May 28, 2015 at 06:27:34PM +0900, Michel Dänzer wrote:
> On 28.05.2015 18:07, Chris Wilson wrote:
> > On Thu, May 28, 2015 at 05:56:15PM +0900, Michel Dänzer wrote:
> >> On 28.05.2015 17:38, Chris Wilson wrote:
> >>> On Thu, May 28, 2015 at 04:59:14PM +0900, Michel Dänzer wrote:
> >>>> 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.
> >>
> >> By how much is it off? Does it cause a hang?
> > 
> > Just a few -1000 msc, which is a pretty long wait (it would be if we
> > honoured it at least).
> 
> The kernel should immediately return / send the event in that case.

Given that it is supposedly an impossible condition in present_pixmap, it
is simple evidence of a bug.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the xorg-devel mailing list