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

Commit c7edc680 authored by Patrick Williams's avatar Patrick Williams Committed by Android (Google) Code Review
Browse files

Merge "SF: Use strong pointers to Layer when moving snapshot"

parents 5cfa3a03 5c259c0e
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -3965,14 +3965,17 @@ void Layer::updateRelativeMetadataSnapshot(const LayerMetadata& relativeLayerMet
}

LayerSnapshotGuard::LayerSnapshotGuard(Layer* layer) : mLayer(layer) {
    if (mLayer) {
    LOG_ALWAYS_FATAL_IF(!mLayer, "LayerSnapshotGuard received a null layer.");
    mLayer->mLayerFE->mSnapshot = std::move(mLayer->mSnapshot);
    }
    LOG_ALWAYS_FATAL_IF(!mLayer->mLayerFE->mSnapshot,
                        "LayerFE snapshot null after taking ownership from layer");
}

LayerSnapshotGuard::~LayerSnapshotGuard() {
    if (mLayer) {
        mLayer->mSnapshot = std::move(mLayer->mLayerFE->mSnapshot);
        LOG_ALWAYS_FATAL_IF(!mLayer->mSnapshot,
                            "Layer snapshot null after taking ownership from LayerFE");
    }
}

+12 −5
Original line number Diff line number Diff line
@@ -2179,13 +2179,14 @@ void SurfaceFlinger::composite(TimePoint frameTime, VsyncId vsyncId)

    refreshArgs.updatingOutputGeometryThisFrame = mVisibleRegionsDirty;
    refreshArgs.updatingGeometryThisFrame = mGeometryDirty.exchange(false) || mVisibleRegionsDirty;
    std::vector<Layer*> layers;
    std::vector<sp<Layer>> layers;

    mDrawingState.traverseInZOrder([&refreshArgs, &layers](Layer* layer) {
        auto strongLayer = sp<Layer>::fromExisting(layer);
        if (auto layerFE = layer->getCompositionEngineLayerFE()) {
            layer->updateSnapshot(refreshArgs.updatingGeometryThisFrame);
            refreshArgs.layers.push_back(layerFE);
            layers.push_back(layer);
            layers.push_back(std::move(strongLayer));
        }
    });
    refreshArgs.blursAreExpensive = mBlursAreExpensive;
@@ -2217,8 +2218,8 @@ void SurfaceFlinger::composite(TimePoint frameTime, VsyncId vsyncId)

    {
        std::vector<LayerSnapshotGuard> layerSnapshotGuards;
        for (Layer* layer : layers) {
            layerSnapshotGuards.emplace_back(layer);
        for (auto& layer : layers) {
            layerSnapshotGuards.emplace_back(layer.get());
        }
        mCompositionEngine->present(refreshArgs);
    }
@@ -3337,7 +3338,12 @@ void SurfaceFlinger::updateCursorAsync() {

    std::vector<LayerSnapshotGuard> layerSnapshotGuards;
    mDrawingState.traverse([&layerSnapshotGuards](Layer* layer) {
        if (layer->getLayerSnapshot()->compositionType ==
        auto strongLayer = sp<Layer>::fromExisting(layer);
        const LayerSnapshot* snapshot = layer->getLayerSnapshot();
        if (!snapshot) {
            LOG_ALWAYS_FATAL("Layer snapshot unexpectedly null");
        }
        if (snapshot->compositionType ==
            aidl::android::hardware::graphics::composer3::Composition::CURSOR) {
            layer->updateSnapshot(false /* updateGeometry */);
            layerSnapshotGuards.emplace_back(layer);
@@ -6482,6 +6488,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
    std::vector<Layer*> renderedLayers;
    bool disableBlurs = false;
    traverseLayers([&](Layer* layer) FTL_FAKE_GUARD(kMainThreadContext) {
        auto strongLayer = sp<Layer>::fromExisting(layer);
        auto layerFE = layer->getCompositionEngineLayerFE();
        if (!layerFE) {
            return;