diff options
| -rw-r--r-- | services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp | 4 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/LayerHierarchyTest.cpp | 24 |
2 files changed, 28 insertions, 0 deletions
diff --git a/services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp b/services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp index 4b0618e5aa..dd5e8bd007 100644 --- a/services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp +++ b/services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp @@ -152,6 +152,10 @@ void LayerLifecycleManager::onHandlesDestroyed( if (swapErase(linkedLayer->mirrorIds, layer.id)) { linkedLayer->changes |= RequestedLayerState::Changes::Mirror; } + if (linkedLayer->layerIdToMirror == layer.id) { + linkedLayer->layerIdToMirror = UNASSIGNED_LAYER_ID; + linkedLayer->changes |= RequestedLayerState::Changes::Mirror; + } if (linkedLayer->touchCropId == layer.id) { linkedLayer->touchCropId = UNASSIGNED_LAYER_ID; } diff --git a/services/surfaceflinger/tests/unittests/LayerHierarchyTest.cpp b/services/surfaceflinger/tests/unittests/LayerHierarchyTest.cpp index 2b333f4b87..b79bdb4231 100644 --- a/services/surfaceflinger/tests/unittests/LayerHierarchyTest.cpp +++ b/services/surfaceflinger/tests/unittests/LayerHierarchyTest.cpp @@ -777,4 +777,28 @@ TEST_F(LayerHierarchyTest, canMirrorDisplayWithMirrors) { EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected); } +// (b/343901186) +TEST_F(LayerHierarchyTest, cleanUpDanglingMirrorLayer) { + LayerHierarchyBuilder hierarchyBuilder; + hierarchyBuilder.update(mLifecycleManager); + mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 2); + UPDATE_AND_VERIFY(hierarchyBuilder); + + std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 14, 2, 2}; + EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath); + EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath); + expectedTraversalPath = {}; + EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath); + + // destroy layer handle + reparentLayer(2, UNASSIGNED_LAYER_ID); + destroyLayerHandle(2); + UPDATE_AND_VERIFY(hierarchyBuilder); + expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 14}; + EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath); + EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath); + expectedTraversalPath = {}; + EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath); +} + } // namespace android::surfaceflinger::frontend |