[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