SF: avoid a composition cycle when the FrameRate votes updates
SF would still do a composition if the display mode changes, but
it is not required for every frame rate vote change.
Bug: 339759346
Test: android.platform.test.scenario.gmail.OpenCloseComposeEmailMicrobenchmark#testOpenCloseComposeEmail
Change-Id: Ia01a13b1a167b3a0a67cf7be3db5e64b9405580a
diff --git a/services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp b/services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp
index 4b0618e..52f8bea 100644
--- a/services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp
+++ b/services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp
@@ -41,7 +41,8 @@
return;
}
- mGlobalChanges |= RequestedLayerState::Changes::Hierarchy;
+ mGlobalChanges |= RequestedLayerState::Changes::Hierarchy |
+ RequestedLayerState::Changes::RequiresComposition;
for (auto& newLayer : newLayers) {
RequestedLayerState& layer = *newLayer.get();
auto [it, inserted] = mIdToLayer.try_emplace(layer.id, References{.owner = layer});
@@ -104,7 +105,8 @@
if (!layer.canBeDestroyed()) {
continue;
}
- layer.changes |= RequestedLayerState::Changes::Destroyed;
+ layer.changes |= RequestedLayerState::Changes::Destroyed |
+ RequestedLayerState::Changes::RequiresComposition;
layersToBeDestroyed.emplace_back(layerId);
}
@@ -112,7 +114,8 @@
return;
}
- mGlobalChanges |= RequestedLayerState::Changes::Hierarchy;
+ mGlobalChanges |= RequestedLayerState::Changes::Hierarchy |
+ RequestedLayerState::Changes::RequiresComposition;
for (size_t i = 0; i < layersToBeDestroyed.size(); i++) {
uint32_t layerId = layersToBeDestroyed[i];
auto it = mIdToLayer.find(layerId);
@@ -142,7 +145,8 @@
if (linkedLayer->parentId == layer.id) {
linkedLayer->parentId = UNASSIGNED_LAYER_ID;
if (linkedLayer->canBeDestroyed()) {
- linkedLayer->changes |= RequestedLayerState::Changes::Destroyed;
+ linkedLayer->changes |= RequestedLayerState::Changes::Destroyed |
+ RequestedLayerState::Changes::RequiresComposition;
layersToBeDestroyed.emplace_back(linkedLayer->id);
}
}
@@ -249,7 +253,8 @@
layer_state_t::eDataspaceChanged | layer_state_t::eAlphaChanged;
bgColorLayer->changes |= RequestedLayerState::Changes::Content;
mChangedLayers.push_back(bgColorLayer);
- mGlobalChanges |= RequestedLayerState::Changes::Content;
+ mGlobalChanges |= RequestedLayerState::Changes::Content |
+ RequestedLayerState::Changes::RequiresComposition;
}
}
@@ -407,7 +412,8 @@
layer.relativeParentId = unlinkLayer(layer.relativeParentId, layer.id);
layer.changes |=
RequestedLayerState::Changes::Hierarchy | RequestedLayerState::Changes::RelativeParent;
- mGlobalChanges |= RequestedLayerState::Changes::Hierarchy;
+ mGlobalChanges |= RequestedLayerState::Changes::Hierarchy |
+ RequestedLayerState::Changes::RequiresComposition;
}
// Some layers mirror the entire display stack. Since we don't have a single root layer per display
diff --git a/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp b/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
index 5631fac..f5e5b02 100644
--- a/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
+++ b/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
@@ -58,7 +58,8 @@
parentId(args.parentId),
layerIdToMirror(args.layerIdToMirror) {
layerId = static_cast<int32_t>(args.sequence);
- changes |= RequestedLayerState::Changes::Created;
+ changes |= RequestedLayerState::Changes::Created |
+ RequestedLayerState::Changes::RequiresComposition;
metadata.merge(args.metadata);
changes |= RequestedLayerState::Changes::Metadata;
handleAlive = true;
@@ -248,7 +249,8 @@
if (hadSomethingToDraw != hasSomethingToDraw()) {
changes |= RequestedLayerState::Changes::Visibility |
- RequestedLayerState::Changes::VisibleRegion;
+ RequestedLayerState::Changes::VisibleRegion |
+ RequestedLayerState::Changes::RequiresComposition;
}
if (clientChanges & layer_state_t::HIERARCHY_CHANGES)
changes |= RequestedLayerState::Changes::Hierarchy;
@@ -258,6 +260,8 @@
changes |= RequestedLayerState::Changes::Geometry;
if (clientChanges & layer_state_t::AFFECTS_CHILDREN)
changes |= RequestedLayerState::Changes::AffectsChildren;
+ if (clientChanges & layer_state_t::REQUIRES_COMPOSITION)
+ changes |= RequestedLayerState::Changes::RequiresComposition;
if (clientChanges & layer_state_t::INPUT_CHANGES)
changes |= RequestedLayerState::Changes::Input;
if (clientChanges & layer_state_t::VISIBLE_REGION_CHANGES)
diff --git a/services/surfaceflinger/FrontEnd/RequestedLayerState.h b/services/surfaceflinger/FrontEnd/RequestedLayerState.h
index 09f33de..4829d4c 100644
--- a/services/surfaceflinger/FrontEnd/RequestedLayerState.h
+++ b/services/surfaceflinger/FrontEnd/RequestedLayerState.h
@@ -57,6 +57,7 @@
BufferSize = 1u << 18,
GameMode = 1u << 19,
BufferUsageFlags = 1u << 20,
+ RequiresComposition = 1u << 21,
};
static Rect reduce(const Rect& win, const Region& exclude);
RequestedLayerState(const LayerCreationArgs&);