SF: Only update layer snapshots if there is something to draw
Avoid doing unnecessary work when preparing composition state.
Fixing a regression from the recent frontend refactors.
Bug: 246680021, 245680157, 238781169
Test: simpleperf with bouncy ball
Change-Id: I3f0bf29bf10ae3ec2d84b851f409ced023410e45
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 6cd57c4..5a0f87f 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2179,8 +2179,8 @@
std::vector<Layer*> layers;
mDrawingState.traverseInZOrder([&refreshArgs, &layers](Layer* layer) {
- layer->updateSnapshot(refreshArgs.updatingGeometryThisFrame);
if (auto layerFE = layer->getCompositionEngineLayerFE()) {
+ layer->updateSnapshot(refreshArgs.updatingGeometryThisFrame);
refreshArgs.layers.push_back(layerFE);
layers.push_back(layer);
}
@@ -6447,6 +6447,10 @@
std::vector<Layer*> renderedLayers;
bool disableBlurs = false;
traverseLayers([&](Layer* layer) FTL_FAKE_GUARD(kMainThreadContext) {
+ auto layerFE = layer->getCompositionEngineLayerFE();
+ if (!layerFE) {
+ return;
+ }
// Layer::prepareClientComposition uses the layer's snapshot to populate the resulting
// LayerSettings. Calling Layer::updateSnapshot ensures that LayerSettings are
// generated with the layer's current buffer and geometry.
@@ -6472,11 +6476,6 @@
isHdrLayer(layer) ? displayBrightnessNits : sdrWhitePointNits,
};
- auto layerFE = layer->getCompositionEngineLayerFE();
- if (!layerFE) {
- return;
- }
-
std::optional<compositionengine::LayerFE::LayerSettings> settings;
{
LayerSnapshotGuard layerSnapshotGuard(layer);