Merge "SF: Use strong pointers to Layer when moving snapshot"
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index d1e61a3..83a46ae 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -3965,14 +3965,17 @@
}
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 6a25104..999af30 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2179,13 +2179,14 @@
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 @@
{
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 @@
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 @@
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;