Optimize mirror layer management
We currently have to traverse the whole hierarchy twice to
update mirror layer info. While a long term rearchitecture may avoid
this entirely, we can optimize the hotpath by avoiding both traversals
when there are no mirror layers in existence.
Bug: 186200583
Test: Existing tests pass
Change-Id: I63f1fb239aa51e6db4fb1f4cb3cd3a87113d35d9
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 8df0852..87965dd 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -3266,7 +3266,9 @@
}
commitOffscreenLayers();
- mDrawingState.traverse([&](Layer* layer) { layer->updateMirrorInfo(); });
+ if (mNumClones > 0) {
+ mDrawingState.traverse([&](Layer* layer) { layer->updateMirrorInfo(); });
+ }
}
void SurfaceFlinger::commitOffscreenLayers() {
@@ -3372,7 +3374,9 @@
mBootStage = BootStage::BOOTANIMATION;
}
- mDrawingState.traverse([&](Layer* layer) { layer->updateCloneBufferInfo(); });
+ if (mNumClones > 0) {
+ mDrawingState.traverse([&](Layer* layer) { layer->updateCloneBufferInfo(); });
+ }
// Only continue with the refresh if there is actually new work to do
return !mLayersWithQueuedFrames.empty() && newDataLatched;
@@ -4257,7 +4261,7 @@
return result;
}
- mirrorLayer->mClonedChild = mirrorFrom->createClone();
+ mirrorLayer->setClonedChild(mirrorFrom->createClone());
}
*outLayerId = mirrorLayer->sequence;