Loading services/surfaceflinger/LayerProtoHelper.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -266,6 +266,7 @@ void LayerProtoHelper::readFromProto(const perfetto::protos::BlurRegion& proto, perfetto::protos::LayersProto LayerProtoFromSnapshotGenerator::generate( const frontend::LayerHierarchy& root) { mLayersProto.clear_layers(); mVisitedLayers.clear(); std::unordered_set<uint64_t> stackIdsToSkip; if ((mTraceFlags & LayerTracing::TRACE_VIRTUAL_DISPLAYS) == 0) { for (const auto& [layerStack, displayInfo] : mDisplayInfos) { Loading Loading @@ -326,6 +327,10 @@ void LayerProtoFromSnapshotGenerator::writeHierarchyToProto( perfetto::protos::LayerProto* layerProto = mLayersProto.add_layers(); const frontend::RequestedLayerState& layer = *root.getLayer(); frontend::LayerSnapshot* snapshot = getSnapshot(path, layer); if (mVisitedLayers.find(snapshot->uniqueSequence) != mVisitedLayers.end()) { TransactionTraceWriter::getInstance().invoke("DuplicateLayer", /* overwrite= */ false); return; } LayerProtoHelper::writeSnapshotToProto(layerProto, layer, *snapshot, mTraceFlags); for (const auto& [child, variant] : root.mChildren) { Loading services/surfaceflinger/LayerProtoHelper.h +2 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,8 @@ private: const frontend::DisplayInfos& mDisplayInfos; uint32_t mTraceFlags; perfetto::protos::LayersProto mLayersProto; std::unordered_set<uint32_t> mVisitedLayers; // winscope expects all the layers, so provide a snapshot even if it not currently drawing std::unordered_map<frontend::LayerHierarchy::TraversalPath, frontend::LayerSnapshot, frontend::LayerHierarchy::TraversalPathHash> Loading services/surfaceflinger/SurfaceFlinger.cpp +16 −6 Original line number Diff line number Diff line Loading @@ -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); 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) { Loading services/surfaceflinger/SurfaceFlinger.h +2 −1 Original line number Diff line number Diff line Loading @@ -1184,7 +1184,8 @@ private: perfetto::protos::LayersProto dumpDrawingStateProto(uint32_t traceFlags) const REQUIRES(kMainThreadContext); void dumpOffscreenLayersProto(perfetto::protos::LayersProto& layersProto, uint32_t traceFlags = LayerTracing::TRACE_ALL) const; uint32_t traceFlags = LayerTracing::TRACE_ALL) const REQUIRES(kMainThreadContext); google::protobuf::RepeatedPtrField<perfetto::protos::DisplayProto> dumpDisplayProto() const; void doActiveLayersTracingIfNeeded(bool isCompositionComputed, bool visibleRegionDirty, TimePoint, VsyncId) REQUIRES(kMainThreadContext); Loading Loading
services/surfaceflinger/LayerProtoHelper.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -266,6 +266,7 @@ void LayerProtoHelper::readFromProto(const perfetto::protos::BlurRegion& proto, perfetto::protos::LayersProto LayerProtoFromSnapshotGenerator::generate( const frontend::LayerHierarchy& root) { mLayersProto.clear_layers(); mVisitedLayers.clear(); std::unordered_set<uint64_t> stackIdsToSkip; if ((mTraceFlags & LayerTracing::TRACE_VIRTUAL_DISPLAYS) == 0) { for (const auto& [layerStack, displayInfo] : mDisplayInfos) { Loading Loading @@ -326,6 +327,10 @@ void LayerProtoFromSnapshotGenerator::writeHierarchyToProto( perfetto::protos::LayerProto* layerProto = mLayersProto.add_layers(); const frontend::RequestedLayerState& layer = *root.getLayer(); frontend::LayerSnapshot* snapshot = getSnapshot(path, layer); if (mVisitedLayers.find(snapshot->uniqueSequence) != mVisitedLayers.end()) { TransactionTraceWriter::getInstance().invoke("DuplicateLayer", /* overwrite= */ false); return; } LayerProtoHelper::writeSnapshotToProto(layerProto, layer, *snapshot, mTraceFlags); for (const auto& [child, variant] : root.mChildren) { Loading
services/surfaceflinger/LayerProtoHelper.h +2 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,8 @@ private: const frontend::DisplayInfos& mDisplayInfos; uint32_t mTraceFlags; perfetto::protos::LayersProto mLayersProto; std::unordered_set<uint32_t> mVisitedLayers; // winscope expects all the layers, so provide a snapshot even if it not currently drawing std::unordered_map<frontend::LayerHierarchy::TraversalPath, frontend::LayerSnapshot, frontend::LayerHierarchy::TraversalPathHash> Loading
services/surfaceflinger/SurfaceFlinger.cpp +16 −6 Original line number Diff line number Diff line Loading @@ -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); 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) { Loading
services/surfaceflinger/SurfaceFlinger.h +2 −1 Original line number Diff line number Diff line Loading @@ -1184,7 +1184,8 @@ private: perfetto::protos::LayersProto dumpDrawingStateProto(uint32_t traceFlags) const REQUIRES(kMainThreadContext); void dumpOffscreenLayersProto(perfetto::protos::LayersProto& layersProto, uint32_t traceFlags = LayerTracing::TRACE_ALL) const; uint32_t traceFlags = LayerTracing::TRACE_ALL) const REQUIRES(kMainThreadContext); google::protobuf::RepeatedPtrField<perfetto::protos::DisplayProto> dumpDisplayProto() const; void doActiveLayersTracingIfNeeded(bool isCompositionComputed, bool visibleRegionDirty, TimePoint, VsyncId) REQUIRES(kMainThreadContext); Loading