# Frame Activation and Deadline
On commiting a frame, we may have to wait showing it.
The window is often divided into several parts and all children parts must be ready before showing a new frame committed.
This is Frame Activation.
On the other hand, we may need to forcibly show a frame before all parts are ready so that the user don't have to wait too long.
This is Frame Deadline.
Let's see each concept.
## Frame Activation
On [viz::Surface::CommitFrame](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.cc;l=246;drc=d708cc843536cc344f0f7679a978634cc14d6153), it [UpdateActivationDependencies](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.cc;l=647;drc=d708cc843536cc344f0f7679a978634cc14d6153) and add a new surface id to [`activation_dependencies_`](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.h;l=426;drc=d708cc843536cc344f0f7679a978634cc14d6153) who is stored as a flat_set of SurfaceId.
This is held to block the frame activation if one of the dependent frame is not yet ready.
[Surface::ActivateFrame](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.cc;l=547;drc=d708cc843536cc344f0f7679a978634cc14d6153) will literally activate the frame.
If `activation_dependencies_` is empty, which implies all dependent frame if any are ready, there is no blocker so activate it.
If there is, add frame to `pending_frame_data_` and wait until [ActivePendingFrame](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.cc;l=403;drc=d708cc843536cc344f0f7679a978634cc14d6153) is called.
There are two locations who call ActivationPendingFrame.
One is from [ActivatePendingFrameForDeadline](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.cc;l=370;drc=d708cc843536cc344f0f7679a978634cc14d6153) which will be explained on the next section.
Another is [OnActivationDependencyResolved](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.cc;l=358;drc=d708cc843536cc344f0f7679a978634cc14d6153).
## Frame Deadline
As mentioned above, CompositorFrame needs to be synchronized before being activated.
However, there may be a case where frame synchronization takes too long.
In such case, it's better to show something even though it's not correctly synchronized.
We have [FrameDeadline](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/frame_deadline.h;l=27;drc=8ba1bad80dc22235693a0dd41fe55c0fd2dbdabd) class for such use.
It represents a CompositorFrame's deadline for activation and used by CompositorFrame.
[`deadline`](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/compositor_frame_metadata.h;l=128;drc=d708cc843536cc344f0f7679a978634cc14d6153) in CompositorFrameMetadata specifies a deadline for this CompositorFrame.
CompositorFrame will be forcibly activated when deadline passes.
This metadata is constructed inside [LayerTreeHostImpl::GenerateCompositorFrame](https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_host_impl.cc;l=2785;drc=e235f5f3dd85405849d69b529ef04c40eaad53b8) and stored to CompositorFrame.
On [viz::Surface::CommitFrame](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.cc;l=246;drc=d708cc843536cc344f0f7679a978634cc14d6153), `deadline` metadata attached to CompositorFrame is set to [`deadline_`](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.h;l=399;drc=d708cc843536cc344f0f7679a978634cc14d6153) of viz::Surface as [SurfaceDependencyDeadline](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface_dependency_deadline.h;l=22;drc=d708cc843536cc344f0f7679a978634cc14d6153).
On CommitFrame, as mentioned in Frame Activation section, it activates a frame immedialtely if there is no pending_frame_data_.
If there is, we first check whether the pending frame exceeds a deadline.
[HasDeadlinePassed](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface_dependency_deadline.cc;l=30;drc=d708cc843536cc344f0f7679a978634cc14d6153) returns true if `NowTicks` is larger than `deadline_` time.
If it exceeds, call [ActivatePendingFrameForDeadline](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.cc;l=370;drc=d708cc843536cc344f0f7679a978634cc14d6153) which calls [ActivatePendingFrame](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/surfaces/surface.cc;l=403;drc=d708cc843536cc344f0f7679a978634cc14d6153) so that the pending frame is forcibly activated.
If not, proceed with a result `QueueFrameResult::ACCEPTED_PENDING` and wait until the frame is being activated.