summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/SurfaceFlinger.cpp
diff options
context:
space:
mode:
author Vishnu Nair <vishnun@google.com> 2024-07-11 23:03:02 +0000
committer Vishnu Nair <vishnun@google.com> 2024-07-11 23:03:02 +0000
commit516228f07a1078202c915092d4f4acde046053f7 (patch)
tree8f2936ee07c30a595a6d81eefa51318ff88be8ac /services/surfaceflinger/SurfaceFlinger.cpp
parentda62cb20839940ae274bf1c2307eec7721241a43 (diff)
Add a workaround to prevent duplicate layers in traces
Track and skip any duplicate layers before adding it to the trace. Capture the transaction trace to disk when we detect this issue to help identify the root cause. CL also fixes offscreen layers to capture the layers from the hierarchy. Flag: EXEMPT bugfix Bug: 335383156 Test: capture active layers trace Change-Id: If7158a19b2d090bb35af4c3a143c105b4be3d5bc
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index c75c9f5001..6c1c9c1aa8 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -6747,14 +6747,24 @@ void SurfaceFlinger::dumpOffscreenLayersProto(perfetto::protos::LayersProto& lay
rootProto->set_name("Offscreen Root");
rootProto->set_parent(-1);
- for (Layer* offscreenLayer : mOffscreenLayers) {
- // Add layer as child of the fake root
- rootProto->add_children(offscreenLayer->sequence);
+ perfetto::protos::LayersProto offscreenLayers =
+ LayerProtoFromSnapshotGenerator(mLayerSnapshotBuilder, mFrontEndDisplayInfos,
+ mLegacyLayers, traceFlags)
+ .generate(mLayerHierarchyBuilder.getOffscreenHierarchy());
- // Add layer
- auto* layerProto = offscreenLayer->writeToProto(layersProto, traceFlags);
- layerProto->set_parent(offscreenRootLayerId);
+ for (int i = 0; i < offscreenLayers.layers_size(); i++) {
+ perfetto::protos::LayerProto* layerProto = offscreenLayers.mutable_layers()->Mutable(i);
+ if (layerProto->parent() == -1) {
+ layerProto->set_parent(offscreenRootLayerId);
+ // Add layer as child of the fake root
+ rootProto->add_children(layerProto->id());
+ }
}
+
+ layersProto.mutable_layers()->Reserve(layersProto.layers_size() +
+ offscreenLayers.layers_size());
+ std::copy(offscreenLayers.layers().begin(), offscreenLayers.layers().end(),
+ RepeatedFieldBackInserter(layersProto.mutable_layers()));
}
perfetto::protos::LayersProto SurfaceFlinger::dumpProtoFromMainThread(uint32_t traceFlags) {