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

Michel Dänzer michel at daenzer.net
Thu May 28 01:56:15 PDT 2015


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

By how much is it off? Does it cause a hang?

What's your test-case? Mine is the GNOME lock screen, i.e. basically
DPMS off vs vblank waits and flips.


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


More information about the xorg-devel mailing list