Propagate frame rate correctly to child layers
If a child layer has a valid frame rate, and its parent does not
have a valid frame rate, we need to override the parent's frame
rate to no vote.
If the parent has a valid vote, including no vote, children would
inherit this vote if it has no valid vote.
When we were updating the hierarchy, we incorrectly propagated
novote due to a child having a novote to all its siblings in the tree.
Fix this by tracking inherited frame rate separately.
Bug: 304208511
Test: presubmit
Change-Id: I873e75d678fba8c8217a1887f48726d1e4828049
diff --git a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp
index 4db2b66..2a0857d 100644
--- a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp
+++ b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp
@@ -815,9 +815,14 @@
RequestedLayerState::Changes::Hierarchy)) {
bool shouldOverrideChildren = parentSnapshot.frameRateSelectionStrategy ==
scheduler::LayerInfo::FrameRateSelectionStrategy::OverrideChildren;
- snapshot.frameRate = !requested.requestedFrameRate.isValid() || shouldOverrideChildren
- ? parentSnapshot.frameRate
- : requested.requestedFrameRate;
+ if (!requested.requestedFrameRate.isValid() || shouldOverrideChildren) {
+ snapshot.inheritedFrameRate = parentSnapshot.inheritedFrameRate;
+ } else {
+ snapshot.inheritedFrameRate = requested.requestedFrameRate;
+ }
+ // Set the framerate as the inherited frame rate and allow children to override it if
+ // needed.
+ snapshot.frameRate = snapshot.inheritedFrameRate;
snapshot.changes |= RequestedLayerState::Changes::FrameRate;
}