[PATCH weston] compositor-wayland: ignore frame callback's time

Pekka Paalanen ppaalanen at gmail.com
Tue Apr 7 01:29:57 PDT 2015


On Thu, 02 Apr 2015 09:14:36 -0500
Derek Foreman <derekf at osg.samsung.com> wrote:

> Makes sense, fixes the problem for me.
> 
> Reviewed-by: Derek Foreman <derekf at osg.samsung.com>

Pushed.
   f30af4e..04f8a9b  master -> master

Thanks,
pq


> On 02/04/15 08:54 AM, Pekka Paalanen wrote:
> > From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> > 
> > Weston running the Wayland backend is nested. The parent compositor uses
> > an unknown clock for the frame callback timestamps. This is quite likely
> > a different clock from what the nested Weston chose as its presentation
> > clock.
> > 
> > This means we cannot reasonably read the presentation clock and assume
> > it has any relation to the timestamp got from the frame callback. In
> > fact, this was seen to cause absurd repaint delays, trigger the insanity
> > check, reduce fraterate, etc. problems, because we assume we can read
> > the clock and compute the remaining repaint delay.
> > 
> > As we can't use the timestamp, ignore it, and read our own presentation
> > clock instead.
> > 
> > The X11 backend does not suffer from this, because there the parent
> > window system never provides us any timestamps, so we always read our
> > own clock.
> > 
> > Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> > Cc: Derek Foreman <derekf at osg.samsung.com>
> > Cc: Giulio Camuffo <giuliocamuffo at gmail.com>
> > ---
> >  src/compositor-wayland.c | 11 +++++++++--
> >  1 file changed, 9 insertions(+), 2 deletions(-)
> > 
> > diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
> > index 7e59ecd..6c33361 100644
> > --- a/src/compositor-wayland.c
> > +++ b/src/compositor-wayland.c
> > @@ -312,8 +312,15 @@ frame_done(void *data, struct wl_callback *callback, uint32_t time)
> >  	wl_callback_destroy(callback);
> >  
> >  	/* XXX: use the presentation extension for proper timings */
> > -	ts.tv_sec = time / 1000;
> > -	ts.tv_nsec = (time % 1000) * 1000000;
> > +
> > +	/*
> > +	 * This is the fallback case, where Presentation extension is not
> > +	 * available from the parent compositor. We do not know the base for
> > +	 * 'time', so we cannot feed it to finish_frame(). Do the only thing
> > +	 * we can, and pretend finish_frame time is when we process this
> > +	 * event.
> > +	 */
> > +	weston_compositor_read_presentation_clock(output->compositor, &ts);
> >  	weston_output_finish_frame(output, &ts, 0);
> >  }
> >  
> > 
> 



More information about the wayland-devel mailing list