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

Commit b46e37c0 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Include offscreen layers in generated trace

Flag: EXEMPT bugfix
Bug: 359854186
Test: winscope
Change-Id: Ia8572b4df1ac2921af3c4c686fc75062e1544c8c
parent 826e9f05
Loading
Loading
Loading
Loading
+35 −4
Original line number Diff line number Diff line
@@ -263,7 +263,7 @@ void LayerProtoHelper::readFromProto(const perfetto::protos::BlurRegion& proto,
    outRegion.bottom = proto.bottom();
}

perfetto::protos::LayersProto LayerProtoFromSnapshotGenerator::generate(
LayerProtoFromSnapshotGenerator& LayerProtoFromSnapshotGenerator::with(
        const frontend::LayerHierarchy& root) {
    mLayersProto.clear_layers();
    mVisitedLayers.clear();
@@ -305,9 +305,40 @@ perfetto::protos::LayersProto LayerProtoFromSnapshotGenerator::generate(
        }
    }

    mDefaultSnapshots.clear();
    mChildToRelativeParent.clear();
    return std::move(mLayersProto);
    return *this;
}

LayerProtoFromSnapshotGenerator& LayerProtoFromSnapshotGenerator::withOffscreenLayers(
        const frontend::LayerHierarchy& offscreenRoot) {
    // Add a fake invisible root layer to the proto output and parent all the offscreen layers to
    // it.
    perfetto::protos::LayerProto* rootProto = mLayersProto.add_layers();
    const int32_t offscreenRootLayerId = INT32_MAX - 2;
    rootProto->set_id(offscreenRootLayerId);
    rootProto->set_name("Offscreen Root");
    rootProto->set_parent(-1);

    perfetto::protos::LayersProto offscreenLayers =
            LayerProtoFromSnapshotGenerator(mSnapshotBuilder, mDisplayInfos, mLegacyLayers,
                                            mTraceFlags)
                    .with(offscreenRoot)
                    .generate();

    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());
        }
    }

    mLayersProto.mutable_layers()->Reserve(mLayersProto.layers_size() +
                                           offscreenLayers.layers_size());
    std::copy(offscreenLayers.layers().begin(), offscreenLayers.layers().end(),
              RepeatedFieldBackInserter(mLayersProto.mutable_layers()));

    return *this;
}

frontend::LayerSnapshot* LayerProtoFromSnapshotGenerator::getSnapshot(
+6 −1
Original line number Diff line number Diff line
@@ -88,7 +88,12 @@ public:
            mLegacyLayers(legacyLayers),
            mDisplayInfos(displayInfos),
            mTraceFlags(traceFlags) {}
    perfetto::protos::LayersProto generate(const frontend::LayerHierarchy& root);
    LayerProtoFromSnapshotGenerator& with(const frontend::LayerHierarchy& root);
    // Creates a fake root and adds all offscreen layers from the passed in hierarchy to the fake
    // root
    LayerProtoFromSnapshotGenerator& withOffscreenLayers(
            const frontend::LayerHierarchy& offscreenRoot);
    perfetto::protos::LayersProto generate() { return mLayersProto; };

private:
    void writeHierarchyToProto(const frontend::LayerHierarchy& root,
+10 −36
Original line number Diff line number Diff line
@@ -5977,9 +5977,16 @@ perfetto::protos::LayersProto SurfaceFlinger::dumpDrawingStateProto(uint32_t tra
        }
    }

    return LayerProtoFromSnapshotGenerator(mLayerSnapshotBuilder, mFrontEndDisplayInfos,
    auto traceGenerator =
            LayerProtoFromSnapshotGenerator(mLayerSnapshotBuilder, mFrontEndDisplayInfos,
                                            mLegacyLayers, traceFlags)
            .generate(mLayerHierarchyBuilder.getHierarchy());
                    .with(mLayerHierarchyBuilder.getHierarchy());

    if (traceFlags & LayerTracing::Flag::TRACE_EXTRA) {
        traceGenerator.withOffscreenLayers(mLayerHierarchyBuilder.getOffscreenHierarchy());
    }

    return traceGenerator.generate();
}

google::protobuf::RepeatedPtrField<perfetto::protos::DisplayProto>
@@ -6013,36 +6020,6 @@ void SurfaceFlinger::dumpHwc(std::string& result) const {
    getHwComposer().dump(result);
}

void SurfaceFlinger::dumpOffscreenLayersProto(perfetto::protos::LayersProto& layersProto,
                                              uint32_t traceFlags) const {
    // Add a fake invisible root layer to the proto output and parent all the offscreen layers to
    // it.
    perfetto::protos::LayerProto* rootProto = layersProto.add_layers();
    const int32_t offscreenRootLayerId = INT32_MAX - 2;
    rootProto->set_id(offscreenRootLayerId);
    rootProto->set_name("Offscreen Root");
    rootProto->set_parent(-1);

    perfetto::protos::LayersProto offscreenLayers =
            LayerProtoFromSnapshotGenerator(mLayerSnapshotBuilder, mFrontEndDisplayInfos,
                                            mLegacyLayers, traceFlags)
                    .generate(mLayerHierarchyBuilder.getOffscreenHierarchy());

    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) {
    return mScheduler
            ->schedule([=, this]() FTL_FAKE_GUARD(kMainThreadContext) {
@@ -8582,9 +8559,6 @@ perfetto::protos::LayersSnapshotProto SurfaceFlinger::takeLayersSnapshotProto(
                                            0);

    auto layers = dumpDrawingStateProto(traceFlags);
    if (traceFlags & LayerTracing::Flag::TRACE_EXTRA) {
        dumpOffscreenLayersProto(layers);
    }
    *snapshot.mutable_layers() = std::move(layers);

    if (traceFlags & LayerTracing::Flag::TRACE_HWC) {
+0 −3
Original line number Diff line number Diff line
@@ -1133,9 +1133,6 @@ private:

    perfetto::protos::LayersProto dumpDrawingStateProto(uint32_t traceFlags) const
            REQUIRES(kMainThreadContext);
    void dumpOffscreenLayersProto(perfetto::protos::LayersProto& layersProto,
                                  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);
+4 −1
Original line number Diff line number Diff line
@@ -162,7 +162,10 @@ bool LayerTraceGenerator::generate(const perfetto::protos::TransactionTraceFile&

        auto layersProto =
                LayerProtoFromSnapshotGenerator(snapshotBuilder, displayInfos, {}, traceFlags)
                        .generate(hierarchyBuilder.getHierarchy());
                        .with(hierarchyBuilder.getHierarchy())
                        .withOffscreenLayers(hierarchyBuilder.getOffscreenHierarchy())
                        .generate();

        auto displayProtos = LayerProtoHelper::writeDisplayInfoToProto(displayInfos);
        if (!onlyLastEntry || (i == traceFile.entry_size() - 1)) {
            perfetto::protos::LayersSnapshotProto snapshotProto{};