CachedSet::append: remove mHolePunchLayer
Bug: 189899692
Test: libcompositionengine_test
When the PIP is paused, it soon becomes inactive, and then it is
appended to the CachedSet behind it. This invalidates the override
buffer, but when we create a new one, we drew the video and (because
mHolePunchLayer was unchanged) immediately erased it.
With this CL, we'll remove mHolePunchLayer when we append so that we no
longer erase the PIP.
Change-Id: I45f4f8d557da9b54680527b08df23475ae04d0bc
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h
index 801dc74..4e2f879 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h
@@ -93,6 +93,7 @@
mOutputDataspace = ui::Dataspace::UNKNOWN;
mDrawFence = nullptr;
mBlurLayer = nullptr;
+ mHolePunchLayer = nullptr;
mLayers.insert(mLayers.end(), other.mLayers.cbegin(), other.mLayers.cend());
Region boundingRegion;
diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp
index 3396ec0..8eeb0bf 100644
--- a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp
@@ -607,6 +607,25 @@
cachedSet.render(mRenderEngine, mOutputState);
}
+TEST_F(CachedSetTest, append_removesHolePunch) {
+ mTestLayers[0]->outputLayerCompositionState.displayFrame = Rect(0, 0, 5, 5);
+ mTestLayers[0]->layerFECompositionState.isOpaque = true;
+ CachedSet::Layer& layer1 = *mTestLayers[0]->cachedSetLayer.get();
+ CachedSet::Layer& layer2 = *mTestLayers[1]->cachedSetLayer.get();
+ CachedSet::Layer& layer3 = *mTestLayers[2]->cachedSetLayer.get();
+
+ CachedSet cachedSet(layer1);
+ cachedSet.addLayer(layer2.getState(), kStartTime + 10ms);
+
+ cachedSet.addHolePunchLayerIfFeasible(layer3, false);
+
+ ASSERT_EQ(&mTestLayers[2]->outputLayer, cachedSet.getHolePunchLayer());
+
+ CachedSet cachedSet3(layer3);
+ cachedSet.append(cachedSet3);
+ ASSERT_EQ(nullptr, cachedSet.getHolePunchLayer());
+}
+
TEST_F(CachedSetTest, decompose_removesHolePunch) {
mTestLayers[0]->outputLayerCompositionState.displayFrame = Rect(0, 0, 5, 5);
CachedSet::Layer& layer1 = *mTestLayers[0]->cachedSetLayer.get();