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

Michel Dänzer michel at daenzer.net
Thu May 28 17:48:14 PDT 2015


On 28.05.2015 18:30, Chris Wilson wrote:
> 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.

And that bug doesn't occur with your patch?


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer


More information about the xorg-devel mailing list