diff options
| author | 2022-11-09 15:48:19 +0000 | |
|---|---|---|
| committer | 2022-11-09 15:48:19 +0000 | |
| commit | c7edc6801d1e1944570a8a278fd03db12551f898 (patch) | |
| tree | 29d0d06687d49eedddcb8c7783f8aa05911de0f8 | |
| parent | 5cfa3a03783f6e2d823f350ff8a461e82461dc78 (diff) | |
| parent | 5c259c0e07395b7d80a43a36d500ba6412606689 (diff) | |
Merge "SF: Use strong pointers to Layer when moving snapshot"
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 9 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 17 |
2 files changed, 18 insertions, 8 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index d1e61a3273..83a46ae3df 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -3965,14 +3965,17 @@ void Layer::updateRelativeMetadataSnapshot(const LayerMetadata& relativeLayerMet } LayerSnapshotGuard::LayerSnapshotGuard(Layer* layer) : mLayer(layer) { - if (mLayer) { - mLayer->mLayerFE->mSnapshot = std::move(mLayer->mSnapshot); - } + 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"); } } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 6a25104a95..999af304ef 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -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; |