Improve blur caching heuristic
This allows for caching the following scenario where notification shade
applies a background blur radius: If the layers behind the notification
shade are not changing, the notification shade's blur radius not
changing, but the notification shade's buffer does change, then we want
to cache the contribution of the blur radius onto the resulting
CachedSet.
Bug: 187705068
Test: Enable blur and swipe notification shade very slowly
Change-Id: I7019be4b8438b79ebb29b2a05e8860916198f18f
diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
index 6677f40..52e0428 100644
--- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
@@ -3784,6 +3784,46 @@
EXPECT_TRUE(0 != mLayers[2].mOutputLayerState.clientCompositionTimestamp);
}
+MATCHER_P(ClientCompositionTargetSettingsBlurSettingsEq, expectedBlurSetting, "") {
+ *result_listener << "ClientCompositionTargetSettings' BlurSettings aren't equal \n";
+ *result_listener << "expected " << expectedBlurSetting << "\n";
+ *result_listener << "actual " << arg.blurSetting << "\n";
+
+ return expectedBlurSetting == arg.blurSetting;
+}
+
+TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, overridesBlur) {
+ LayerFE::LayerSettings mShadowSettings;
+ mShadowSettings.source.solidColor = {0.1f, 0.1f, 0.1f};
+
+ mLayers[2].mOutputLayerState.overrideInfo.disableBackgroundBlur = true;
+
+ EXPECT_CALL(*mLayers[0].mLayerFE, prepareClientCompositionList(_))
+ .WillOnce(Return(std::vector<LayerFE::LayerSettings>()));
+ EXPECT_CALL(*mLayers[1].mLayerFE, prepareClientCompositionList(_))
+ .WillOnce(Return(std::vector<LayerFE::LayerSettings>({mLayers[1].mLayerSettings})));
+ EXPECT_CALL(*mLayers[2].mLayerFE,
+ prepareClientCompositionList(ClientCompositionTargetSettingsBlurSettingsEq(
+ LayerFE::ClientCompositionTargetSettings::BlurSetting::BlurRegionsOnly)))
+ .WillOnce(Return(std::vector<LayerFE::LayerSettings>(
+ {mShadowSettings, mLayers[2].mLayerSettings})));
+
+ Region accumClearRegion(Rect(10, 11, 12, 13));
+ auto requests = mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */,
+ accumClearRegion, kDisplayDataspace);
+ ASSERT_EQ(3u, requests.size());
+ EXPECT_EQ(mLayers[1].mLayerSettings, requests[0]);
+ EXPECT_EQ(mShadowSettings, requests[1]);
+ EXPECT_EQ(mLayers[2].mLayerSettings, requests[2]);
+
+ EXPECT_THAT(accumClearRegion, RegionEq(Region(Rect(10, 11, 12, 13))));
+
+ // Check that a timestamp was set for the layers that generated requests
+ EXPECT_TRUE(0 == mLayers[0].mOutputLayerState.clientCompositionTimestamp);
+ EXPECT_TRUE(0 != mLayers[1].mOutputLayerState.clientCompositionTimestamp);
+ EXPECT_TRUE(0 != mLayers[2].mOutputLayerState.clientCompositionTimestamp);
+}
+
TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
onlyClientComposesClientComposedLayersIfNoClearingNeeded) {
EXPECT_CALL(mLayers[0].mOutputLayer, requiresClientComposition()).WillOnce(Return(false));
@@ -3867,7 +3907,7 @@
kDisplayDataspace,
false /* realContentIsVisible */,
true /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(kDisplayFrame),
@@ -3879,7 +3919,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
LayerFE::LayerSettings mBlackoutSettings = mLayers[1].mLayerSettings;
@@ -3923,7 +3963,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
Region(Rect(0, 0, 30, 30)),
@@ -3935,7 +3975,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(Rect(0, 0, 40, 201)),
@@ -3947,7 +3987,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
EXPECT_CALL(*mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -3979,7 +4019,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
Region(kDisplayFrame),
@@ -3991,7 +4031,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(kDisplayFrame),
@@ -4003,7 +4043,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
EXPECT_CALL(*mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -4035,7 +4075,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
@@ -4048,7 +4088,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(kDisplayFrame),
@@ -4060,7 +4100,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
EXPECT_CALL(*mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -4091,7 +4131,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
Region(kDisplayFrame),
@@ -4103,7 +4143,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(kDisplayFrame),
@@ -4115,7 +4155,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
EXPECT_CALL(*mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -4144,7 +4184,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
Region(kDisplayFrame),
@@ -4156,7 +4196,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(kDisplayFrame),
@@ -4168,7 +4208,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
EXPECT_CALL(*mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -4306,7 +4346,7 @@
kOutputDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
EXPECT_CALL(leftLayer.mOutputLayer, requiresClientComposition()).WillRepeatedly(Return(true));
@@ -4324,7 +4364,7 @@
kOutputDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
EXPECT_CALL(rightLayer.mOutputLayer, requiresClientComposition()).WillRepeatedly(Return(true));
@@ -4358,7 +4398,7 @@
kDisplayDataspace,
false /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
LayerFE::LayerSettings mShadowSettings;
@@ -4404,7 +4444,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
- false /* disabledBlurs */,
+ compositionengine::LayerFE::ClientCompositionTargetSettings::BlurSetting::Enabled,
};
EXPECT_CALL(mLayers[0].mOutputLayer, requiresClientComposition()).WillOnce(Return(false));