Skip to content
  • Vlad Zahorodnii's avatar
    Provide expected presentation time to effects · 9f2cb0ae
    Vlad Zahorodnii authored
    Effects are given the interval between two consecutive frames. The main
    flaw of this approach is that if the Compositor transitions from the idle
    state to "active" state, i.e. when there is something to repaint,
    effects may see a very large interval between the last painted frame and
    the current. In order to address this issue, the Scene invalidates the
    timer that is used to measure time between consecutive frames before the
    Compositor is about to become idle.
    
    While this works perfectly fine with Xinerama-style rendering, with per
    screen rendering, determining whether the compositor is about to idle is
    rather a tedious task mostly because a single output can't be used for
    the test.
    
    Furthermore, since the Compositor schedules pointless repaints just to
    ensure that it's idle, it might take several attempts to figure out
    whether the scene timer must be invalidated if you use (true) per screen
    rendering.
    
    Ideally, all effects should use a timeline helper that is aware of the
    underlying render loop and its timings. However, this option is off the
    table because it will involve a lot of work to implement it.
    
    Alternative and much simpler option is to pass the expected presentation
    time to effects rather than time between consecutive frames. This means
    that effects are responsible for determining how much animation timelines
    have to be advanced. Typically, an effect would have to store the
    presentation timestamp provided in either prePaint{Screen,Window} and
    use it in the subsequent prePaint{Screen,Window} call to estimate the
    amount of time passed between the next and the last frames.
    
    Unfortunately, this is an API incompatible change. However, it shouldn't
    take a lot of work to port third-party binary effects, which don't use the
    AnimationEffect class, to the new API. On the bright side, we no longer
    need to be concerned about the Compositor getting idle.
    
    We do still try to determine whether the Compositor is about to idle,
    primarily, because the OpenGL render backend swaps buffers on present,
    but that will change with the ongoing compositing timing rework.
    9f2cb0ae