[sf] Update snapshots after screenshots
Screenshots can be taken for a partial hierarchy and may require
some of the layers to be temporarily reparented and their geometry
to be updated. Sceenshots use a copy of the layer snapshots and another
instance of the composition engine to render the contents to a
buffer.
There was an issue where the snapshots were updated before they were
copied and if the screenshot was taken during a period where there
were no visible region changes (and no reason to rebuild the snapshots)
we would pass invalid snapshot data when compositing to the display.
With legacy frontend, its harder to split the screenshot path and the
display composition path, so as a fix, update the snapshots after
screenshots are taken.
Bug: 282884552
Test: instrumented load to verify snapshots are updated correctly
Test: repro steps in bug
Change-Id: Ie778b02b57c5b1ddf0f09afe82675e04c5535ee5
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index 38590e6..f7596e2 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -877,6 +877,7 @@
// TODO(b/238781169) Remove direct calls to RenderEngine::drawLayers that don't go through
// CompositionEngine to create a single path for composing layers.
void updateSnapshot(bool updateGeometry);
+ void updateChildrenSnapshots(bool updateGeometry);
void updateMetadataSnapshot(const LayerMetadata& parentMetadata);
void updateRelativeMetadataSnapshot(const LayerMetadata& relativeLayerMetadata,
std::unordered_set<Layer*>& visited);
@@ -1134,8 +1135,6 @@
bool hasSomethingToDraw() const { return hasEffect() || hasBufferOrSidebandStream(); }
- void updateChildrenSnapshots(bool updateGeometry);
-
// Fills the provided vector with the currently available JankData and removes the processed
// JankData from the pending list.
void transferAvailableJankData(const std::deque<sp<CallbackHandle>>& handles,