class ReleaseFenceManager
Defined at line 66 of file ../../src/ui/scenic/lib/flatland/engine/release_fence_manager.h
ReleaseFenceManager is a helper which encapsulates the logic for signaling release fences, and
for invoking frame-presented callbacks according to the contract with FrameScheduler.
=== Design Requirements for signaling client release fences ===
Client release fences are signaled as soon as it is safe to do so without risking visual
artifacts. The time that it becomes safe depends on whether a frame is GPU-composited or
direct-scanout.
GPU-composition case: fences can be signaled as soon as Vulkan is finished rendering the frame.
Direct-scanout case: client images are directly read by the display controller, and so the fences
cannot be signaled until the *next* frame is displayed on-screen.
ReleaseFenceManager handles these cases separately, in order to minimize the latency before
clients can reuse their images.
=== Design Requirements for invoking FramePresentedCallback ===
The contract with FrameScheduler requires that these callbacks are invoked in the order that they
are received. As a result, callback invocation may be delayed even though all of the information
required by the callback is known (i.e. render-finished time and frame-presented time), when an
earlier callback is not yet ready to invoke.
For example, this can happen when a GPU-composited frame misses a vsync because rendering is
still not finished, even though the subsequent direct-scanout frame is already on the screen.
Ordinarily, the callback for the second frame could be invoked, but in this scenario it cannot
because it must wait for the first callback to be invoked, which must wait until Vulkan signals
the render-finished fence.
=== Usage ===
ReleaseFenceManager is very simple to use. Each frame, the caller (typically DisplayCompositor)
calls either OnGpuCompositedFrame() or OnDirectScanoutFrame(). The caller has two other
responsibilities:
1) for GPU-composited frames, to signal the |render_finished_event| (typically done via a Vulkan
semaphore).
2) to call OnVsync() when a frame is presented on the display
=== Thread Safety ===
ReleaseFenceManager is not thread-safe; methods should only be called from the "main thread",
i.e. the same thread as used by the |dispatcher| passed to the constructor. Due to the use
of this dispatcher, it is not safe to use from multiple threads even if externally
synchronized, e.g. via a mutex.
Public Methods
void ReleaseFenceManager (async_dispatcher_t * dispatcher)
|dispatcher| is used for waiting on the |render_finished_fence| arg to OnCpuCompositedFrame().
Defined at line 27 of file ../../src/ui/scenic/lib/flatland/engine/release_fence_manager.cc
void OnGpuCompositedFrame (uint64_t frame_number, zx::event render_finished_fence, std::vector<zx::event> release_fences, scheduling::FramePresentedCallback frame_presented_callback)
Stores a record for a new GPU-composited frame. |frame_number| must be one larger than the
previous frame. Later, when it is safe, signals |release_fences| (see class comment).
Invokes |frame_presented_callback| when:
- |render_finished_fence| has been signaled, and:
- corresponding OnVsync() has been called, and:
- all previous callbacks have been invoked
Defined at line 31 of file ../../src/ui/scenic/lib/flatland/engine/release_fence_manager.cc
void OnDirectScanoutFrame (uint64_t frame_number, std::vector<zx::event> release_fences, scheduling::FramePresentedCallback frame_presented_callback)
Stores a record for a new direct-scanout frame. |frame_number| must be one larger than the
previous frame. Later, when it is safe, signals |release_fences| (see class comment).
Invokes |frame_presented_callback| when:
- corresponding OnVsync() has been called, and:
- all previous callbacks have been invoked
Defined at line 44 of file ../../src/ui/scenic/lib/flatland/engine/release_fence_manager.cc
void OnVsync (uint64_t frame_number, zx::time_monotonic timestamp)
Called when the specified frame has appeared on screen. |frame_number| must monotonically
increase with each subsequent call (repeats are OK).
Defined at line 55 of file ../../src/ui/scenic/lib/flatland/engine/release_fence_manager.cc
void ReleaseFenceManager (const ReleaseFenceManager & )
Defined at line 70 of file ../../src/ui/scenic/lib/flatland/engine/release_fence_manager.h
void ReleaseFenceManager (ReleaseFenceManager && )
Defined at line 71 of file ../../src/ui/scenic/lib/flatland/engine/release_fence_manager.h
size_t frame_record_count ()
For testing. Return the number of frame records currently held by the manager.
Defined at line 96 of file ../../src/ui/scenic/lib/flatland/engine/release_fence_manager.h