| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| [DartPackage="mojo_services"] |
| module mojo.gfx.composition; |
| |
| // Provides support for scheduling drawing and composition operations |
| // for a particular scene. |
| // |
| // Instances of this interface must be obtained from a |Scene|. This interface |
| // is modeled separately so as to allow applications to use different threads |
| // for scheduling work as opposed to publishing scene updates. |
| interface SceneScheduler { |
| // Asks the compositor to invoke the callback when it is a good time to |
| // draw the next frame. |
| // |
| // The rate at which the callback is invoked may depend on how the scene |
| // has been embedded. The scene will only receive frame callbacks while |
| // it is attached to a scene graph which the compositor has been asked |
| // to renderer since timing information ultimately derives from the |
| // renderer. If the same scene is being rendered to multiple destinations |
| // with different timing requirements, the compositor will perform rate |
| // adaptation as required behind the scenes. |
| // |
| // The returned |frame_info| provides information about the frame to |
| // be drawn. |
| // |
| // TODO(jeffbrown): Consider whether we should have the callback be invoked |
| // immediately rather than on schedule, letting the client set its own |
| // timers. Advantage may be a reduction in latency due to the elimination |
| // of an IPC on a timing critical path. Disadvantage may be an increase |
| // in the number of context switches and some extra client side bookkeeping. |
| // Note that although clients could predict future frame times based on the |
| // reported information, it's still better for them to schedule each frame |
| // individually so they stay in sync with one another and quickly catch |
| // up to any changes in timing. This also gives the compositor more |
| // opportunity to plan for the upcoming frame, perhaps even boost clocks |
| // in anticipation. |
| ScheduleFrame() => (FrameInfo frame_info); |
| }; |
| |
| // Provides timestamp information about a frame which has been scheduled |
| // to be drawn. |
| // |
| // As there may be latency in receiving an updated |FrameInfo| from the |
| // system, the consumer of this structure should apply compensation for |
| // skipped frames. |
| // |
| // See |mojo::gfx::composition::FrameTracker|. |
| struct FrameInfo { |
| // A timestamp indicating when the work of updating the frame was scheduled |
| // to begin which may be used to coordinate animations that require a |
| // monotonic timing reference for synchronization, even across scenes. |
| // |
| // It essentially represents the time when the work of producing a new |
| // frame began. |
| // |
| // This value monotonically increases with each frame, never repeats, and |
| // is guaranteed to represent a time in the recent past. It will always be |
| // less than or equal to the value returned by |MojoGetTimeTicksNow()| when |
| // the frame info is received as part of a |ScheduleFrame()| callback. |
| // |
| // Expressed in microseconds in the |MojoTimeTicks| timebase. |
| // TODO(jeffbrown): Time ticks may need finer resolution guarantees. |
| int64 frame_time; |
| |
| // The anticipated time interval between the currently scheduled frame |
| // and the next one. |
| // |
| // The interval is approximate and may change at any time. There is no |
| // guarantee that the next frame will occur precisely on the specified |
| // interval although that is what is expected to happen in steady state. |
| // |
| // Expressed in microseconds. |
| uint64 frame_interval; |
| |
| // A timestamp indicating when scene updates must be published and ready |
| // to be composited in order for the changes to be reflected in this frame. |
| // |
| // This value is guaranteed to be no less than |frame_time| but it is |
| // not necessarily monotonic; it may briefly go backwards if the frame |
| // interval or pipeline depth changes between frames. |
| // |
| // Expressed in microseconds in the |MojoTimeTicks| timebase. |
| int64 frame_deadline; |
| |
| // A timestamp indicating approximately when the contents of the frame |
| // will be shown on the display output assuming everything is fully rendered |
| // and submitted by the indicated |frame_deadline|. |
| // |
| // This value monotonically increases with each frame, never repeats, and |
| // is guaranteed to be no less than |frame_deadline|. |
| // |
| // Expressed in microseconds in the |MojoTimeTicks| timebase. |
| int64 presentation_time; |
| }; |