Merge "sf-caching: Skip hole punch for layer that blends" into tm-dev
diff --git a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
index 42c1263..aaca4fe 100644
--- a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
@@ -307,7 +307,12 @@
}
const auto& layerFE = mLayers[0].getState()->getOutputLayer()->getLayerFE();
- if (layerFE.getCompositionState()->forceClientComposition) {
+ const auto* compositionState = layerFE.getCompositionState();
+ if (compositionState->forceClientComposition) {
+ return false;
+ }
+
+ if (compositionState->blendMode != hal::BlendMode::NONE) {
return false;
}
diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp
index 4ae921d..8a99e4e 100644
--- a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp
@@ -539,6 +539,8 @@
TEST_F(CachedSetTest, holePunch_requiresBuffer) {
CachedSet::Layer& layer1 = *mTestLayers[0]->cachedSetLayer.get();
+ auto& layerFECompositionState = mTestLayers[0]->layerFECompositionState;
+ layerFECompositionState.blendMode = hal::BlendMode::NONE;
sp<mock::LayerFE> layerFE1 = mTestLayers[0]->layerFE;
CachedSet cachedSet(layer1);
@@ -549,7 +551,9 @@
TEST_F(CachedSetTest, holePunch_requiresRoundedCorners) {
CachedSet::Layer& layer1 = *mTestLayers[0]->cachedSetLayer.get();
- mTestLayers[0]->layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ auto& layerFECompositionState = mTestLayers[0]->layerFECompositionState;
+ layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ layerFECompositionState.blendMode = hal::BlendMode::NONE;
CachedSet cachedSet(layer1);
@@ -558,7 +562,9 @@
TEST_F(CachedSetTest, holePunch_requiresSingleLayer) {
CachedSet::Layer& layer1 = *mTestLayers[0]->cachedSetLayer.get();
- mTestLayers[0]->layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ auto& layerFECompositionState = mTestLayers[0]->layerFECompositionState;
+ layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ layerFECompositionState.blendMode = hal::BlendMode::NONE;
sp<mock::LayerFE> layerFE = mTestLayers[0]->layerFE;
EXPECT_CALL(*layerFE, hasRoundedCorners()).WillRepeatedly(Return(true));
@@ -575,7 +581,9 @@
mTestLayers[0]->layerState->update(&mTestLayers[0]->outputLayer);
CachedSet::Layer& layer = *mTestLayers[0]->cachedSetLayer.get();
- mTestLayers[0]->layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ auto& layerFECompositionState = mTestLayers[0]->layerFECompositionState;
+ layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ layerFECompositionState.blendMode = hal::BlendMode::NONE;
sp<mock::LayerFE> layerFE = mTestLayers[0]->layerFE;
CachedSet cachedSet(layer);
@@ -589,7 +597,22 @@
mTestLayers[0]->layerState->update(&mTestLayers[0]->outputLayer);
CachedSet::Layer& layer = *mTestLayers[0]->cachedSetLayer.get();
- mTestLayers[0]->layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ auto& layerFECompositionState = mTestLayers[0]->layerFECompositionState;
+ layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ layerFECompositionState.blendMode = hal::BlendMode::NONE;
+ sp<mock::LayerFE> layerFE = mTestLayers[0]->layerFE;
+
+ CachedSet cachedSet(layer);
+ EXPECT_CALL(*layerFE, hasRoundedCorners()).WillRepeatedly(Return(true));
+
+ EXPECT_FALSE(cachedSet.requiresHolePunch());
+}
+
+TEST_F(CachedSetTest, holePunch_requiresNoBlending) {
+ CachedSet::Layer& layer = *mTestLayers[0]->cachedSetLayer.get();
+ auto& layerFECompositionState = mTestLayers[0]->layerFECompositionState;
+ layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ layerFECompositionState.blendMode = hal::BlendMode::PREMULTIPLIED;
sp<mock::LayerFE> layerFE = mTestLayers[0]->layerFE;
CachedSet cachedSet(layer);
@@ -600,7 +623,9 @@
TEST_F(CachedSetTest, requiresHolePunch) {
CachedSet::Layer& layer = *mTestLayers[0]->cachedSetLayer.get();
- mTestLayers[0]->layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ auto& layerFECompositionState = mTestLayers[0]->layerFECompositionState;
+ layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ layerFECompositionState.blendMode = hal::BlendMode::NONE;
sp<mock::LayerFE> layerFE = mTestLayers[0]->layerFE;
CachedSet cachedSet(layer);
@@ -614,6 +639,7 @@
sp<mock::LayerFE> layerFE = mTestLayers[0]->layerFE;
auto& layerFECompositionState = mTestLayers[0]->layerFECompositionState;
layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ layerFECompositionState.blendMode = hal::BlendMode::NONE;
layerFECompositionState.forceClientComposition = true;
CachedSet cachedSet(layer);
diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp
index 656ef9a..96c28c9 100644
--- a/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp
@@ -633,6 +633,7 @@
auto& layerState3 = mTestLayers[2]->layerState;
const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer;
+ mTestLayers[2]->layerFECompositionState.blendMode = hal::BlendMode::NONE;
EXPECT_CALL(*mTestLayers[2]->layerFE, hasRoundedCorners()).WillRepeatedly(Return(true));
@@ -706,6 +707,7 @@
// a rounded updating layer
auto& layerState1 = mTestLayers[1]->layerState;
const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer;
+ mTestLayers[1]->layerFECompositionState.blendMode = hal::BlendMode::NONE;
EXPECT_CALL(*mTestLayers[1]->layerFE, hasRoundedCorners()).WillRepeatedly(Return(true));
@@ -777,6 +779,7 @@
// a rounded updating layer
auto& layerState1 = mTestLayers[1]->layerState;
const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer;
+ mTestLayers[1]->layerFECompositionState.blendMode = hal::BlendMode::NONE;
EXPECT_CALL(*mTestLayers[1]->layerFE, hasRoundedCorners()).WillRepeatedly(Return(true));