Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba4079b0 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add a workaround to prevent duplicate layers in traces" into main

parents 57277608 516228f0
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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) {
@@ -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) {
+2 −0
Original line number Diff line number Diff line
@@ -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>
+16 −6
Original line number Diff line number Diff line
@@ -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) {
+2 −1
Original line number Diff line number Diff line
@@ -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);