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