[PATCH weston 5/7] Don't delay initial output paint
Pekka Paalanen
ppaalanen at gmail.com
Fri Feb 17 14:22:13 UTC 2017
On Thu, 16 Feb 2017 14:53:39 +0000
Daniel Stone <daniel at fooishbar.org> wrote:
> Hi,
>
> On 16 February 2017 at 14:31, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> > On Tue, 14 Feb 2017 13:18:05 +0000
> > Daniel Stone <daniels at collabora.com> wrote:
> >> On startup, we cannot lock on to the repaint timer because it is unknown
> >> to us. We deal with this by claiming that the moment of entry into the
> >> repaint loop is the moment a frame returned, causing finish_frame to
> >> delay our initial repaint to (refresh_time - repaint_delay), typically
> >> around 9ms of utterly wasted time.
> >
> > I wonder. The reason the repaint_delay exists is that clients would not
> > race to who gets to submit its frame first and kick everyone else to
> > the following refresh cycle. That's a concern when weston is in
> > continuous update mode.
> >
> > This patch is for repainting from idle instead. Do we still have the
> > same concern? I suppose one can say it makes no difference, because it's
> > not the compositor triggering client actions with e.g. frame callbacks,
> > clients wake up at arbitrary times.
>
> It's not repainting from idle, but rather repainting (make that
> 'painting': we have no framebuffer) from dead. I'll try to clarify the
> commit message beyond the 'On startup ...' introduction. If we can't
> query any times at all, then we schedule our _initial_ paint for
> now+7ms. That is purely random: we don't have a repaint cycle to lock
> on to, because the clocks may not even be running. Even if they were,
> we have no idea what they are.
Ooh, I missed that. "On startup", indeed, when there is not just
missing the FB, but the CRTC might be off to begin with, hence vblank
timestamp query can fail. I never thought of that before.
You are completely right.
> I was about to say 'this doesn't gain us anything', except if all
> clients do submit and trigger repaint immediately, there's a 7ms grace
> period where we could potentially group repaints together. I don't
> think that's something we should be relying on though: desktop-shell
> has the desktop_ready request for this exact purpose. If anything else
> is relying on the arbitrary 7ms delay to group the initial repaint
> together, then someone (to be clear: not me) should fix that.
Agreed.
> >> Add an explicit stamp == NULL, to determine that we are just beginning
> >> our repaint loop, that the timings are in fact totally invalid, and that
> >> it would be beneficial to repaint the output immediately.
> >
> > This is probably the more important justifaction for you, to get rid of
> > fake timestamps?
>
> It's not ...
>
> >> --- a/libweston/compositor-drm.c
> >> +++ b/libweston/compositor-drm.c
> >> @@ -862,8 +862,7 @@ drm_output_start_repaint_loop(struct weston_output *output_base)
> >>
> >> finish_frame:
> >> /* if we cannot page-flip, immediately finish frame */
> >> - weston_compositor_read_presentation_clock(output_base->compositor, &ts);
> >> - weston_output_finish_frame(output_base, &ts,
> >> + weston_output_finish_frame(output_base, NULL,
> >> WP_PRESENTATION_FEEDBACK_INVALID);
> >
> > This is a pattern used by practically every backend. Shouldn't they all
> > be fixed alike?
>
> fbdev is pretty much beyond hope, so I don't propose to fix that; I'd
> far sooner delete it. RDP copied fbdev, so doesn't discern between the
> start-from-dead and start-from-idle cases; I can't even test that, so
> don't propose to fix that either. The Wayland backend attaches a
> transparent buffer to the surface, so it can lock on to the repaint
> loop; it could certainly have this path removed to use the same
> fallback path, but that's more invasive than I'd hoped for right now.
> The X11 backend is like fbdev and RDP, except it repaints every 10ms
> instead of 16; I could guess why, but don't actually know.
>
> Anyway, in summary, a good cleanup task for later, but nothing I want
> to touch right now.
Yeah, though I more thought that if you are calling
weston_output_finish_frame() with FEEDBACK_INVALID, would there ever be
use for the (fake) timestamp?
But that's not important now.
> > OTOH, for DRM-backend this is the fallback of the fallback path, so
> > hardly important.
>
> It never gets hit on regular usage, but it does get hit on startup.
> For actually-atomic modesetting (cf. cover letter), we need to ensure
> that all the repaints land together. Having a real genuine 'as soon as
> possible, because I don't know times' is thus pretty important there.
Yes, forgot the startup.
> >> diff --git a/libweston/compositor.c b/libweston/compositor.c
> >> index 9eab0e298..ed8ef90fd 100644
> >> --- a/libweston/compositor.c
> >> +++ b/libweston/compositor.c
> >> @@ -2383,6 +2383,12 @@ weston_output_finish_frame(struct weston_output *output,
> >> TL_POINT("core_repaint_finished", TLP_OUTPUT(output),
> >> TLP_VBLANK(stamp), TLP_END);
> >
> > I suppose there could be an
> > assert(stamp || (presented_flags & WP_PRESENTATION_FEEDBACK_INVALID))?
>
> Good point; will add.
>
> >> @@ -2415,6 +2421,7 @@ weston_output_finish_frame(struct weston_output *output,
> >> if (presented_flags == WP_PRESENTATION_FEEDBACK_INVALID && msec_rel < 0)
> >> msec_rel += refresh_nsec / 1000000;
> >>
> >> +out:
> >> if (msec_rel < 1)
> >> output_repaint_timer_handler(output);
> >> else
> >
> > Right. Feel free to ignore my thinking-out-loud, and slap a:
> > Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
>
> I will, thanks. :) In the meantime, it's not exactly going to go in
> before the release, so if you want to follow up on anything, we've
> still got time. Thanks for the review!
Nope, all seems good here. :-)
Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 801 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20170217/2db42685/attachment.sig>
More information about the wayland-devel
mailing list