Merge "[SurfaceFlinger] Don't persist buffers to HWC when powered off."
diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp
index aa638b7..1953005 100644
--- a/services/surfaceflinger/CompositionEngine/src/Output.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp
@@ -551,6 +551,10 @@
ATRACE_CALL();
ALOGV(__FUNCTION__);
+ if (!getState().isEnabled) {
+ return;
+ }
+
for (auto* layer : getOutputLayersOrderedByZ()) {
layer->updateCompositionState(refreshArgs.updatingGeometryThisFrame,
refreshArgs.devOptForceClientComposition);
diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
index 95ae888..7fce520 100644
--- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
@@ -483,6 +483,31 @@
}
/*
+ * Output::updateAndWriteCompositionState()
+ */
+
+TEST_F(OutputTest, updateAndWriteCompositionState_takesEarlyOutIfNotEnabled) {
+ mOutput->editState().isEnabled = false;
+
+ CompositionRefreshArgs args;
+ mOutput->updateAndWriteCompositionState(args);
+}
+
+TEST_F(OutputTest, updateAndWriteCompositionState_updatesLayers) {
+ mOutput->editState().isEnabled = true;
+ mock::OutputLayer* outputLayer = new StrictMock<mock::OutputLayer>();
+ mOutput->injectOutputLayerForTest(std::unique_ptr<OutputLayer>(outputLayer));
+
+ EXPECT_CALL(*outputLayer, updateCompositionState(true, true)).Times(1);
+ EXPECT_CALL(*outputLayer, writeStateToHWC(true)).Times(1);
+
+ CompositionRefreshArgs args;
+ args.updatingGeometryThisFrame = true;
+ args.devOptForceClientComposition = true;
+ mOutput->updateAndWriteCompositionState(args);
+}
+
+/*
* Output::prepareFrame()
*/
diff --git a/services/surfaceflinger/tests/unittests/CompositionTest.cpp b/services/surfaceflinger/tests/unittests/CompositionTest.cpp
index 143a7a0..6d38373 100644
--- a/services/surfaceflinger/tests/unittests/CompositionTest.cpp
+++ b/services/surfaceflinger/tests/unittests/CompositionTest.cpp
@@ -168,6 +168,7 @@
std::unordered_set<HWC2::Capability> mDefaultCapabilities = {HWC2::Capability::SidebandStream};
+ bool mDisplayOff = false;
TestableSurfaceFlinger mFlinger;
sp<DisplayDevice> mDisplay;
sp<DisplayDevice> mExternalDisplay;
@@ -534,69 +535,85 @@
}
static void setupHwcSetGeometryCallExpectations(CompositionTest* test) {
- // TODO: Coverage of other values
- EXPECT_CALL(*test->mComposer,
- setLayerBlendMode(HWC_DISPLAY, HWC_LAYER, LayerProperties::BLENDMODE))
- .Times(1);
- // TODO: Coverage of other values for origin
- EXPECT_CALL(*test->mComposer,
- setLayerDisplayFrame(HWC_DISPLAY, HWC_LAYER,
- IComposerClient::Rect({0, 0, LayerProperties::WIDTH,
- LayerProperties::HEIGHT})))
- .Times(1);
- EXPECT_CALL(*test->mComposer,
- setLayerPlaneAlpha(HWC_DISPLAY, HWC_LAYER, LayerProperties::COLOR[3]))
- .Times(1);
- // TODO: Coverage of other values
- EXPECT_CALL(*test->mComposer, setLayerZOrder(HWC_DISPLAY, HWC_LAYER, 0u)).Times(1);
- // TODO: Coverage of other values
- EXPECT_CALL(*test->mComposer, setLayerInfo(HWC_DISPLAY, HWC_LAYER, 0u, 0u)).Times(1);
+ if (!test->mDisplayOff) {
+ // TODO: Coverage of other values
+ EXPECT_CALL(*test->mComposer,
+ setLayerBlendMode(HWC_DISPLAY, HWC_LAYER, LayerProperties::BLENDMODE))
+ .Times(1);
+ // TODO: Coverage of other values for origin
+ EXPECT_CALL(*test->mComposer,
+ setLayerDisplayFrame(HWC_DISPLAY, HWC_LAYER,
+ IComposerClient::Rect({0, 0, LayerProperties::WIDTH,
+ LayerProperties::HEIGHT})))
+ .Times(1);
+ EXPECT_CALL(*test->mComposer,
+ setLayerPlaneAlpha(HWC_DISPLAY, HWC_LAYER, LayerProperties::COLOR[3]))
+ .Times(1);
+ // TODO: Coverage of other values
+ EXPECT_CALL(*test->mComposer, setLayerZOrder(HWC_DISPLAY, HWC_LAYER, 0u)).Times(1);
+ // TODO: Coverage of other values
+ EXPECT_CALL(*test->mComposer, setLayerInfo(HWC_DISPLAY, HWC_LAYER, 0u, 0u)).Times(1);
- // These expectations retire on saturation as the code path these
- // expectations are for appears to make an extra call to them.
- // TODO: Investigate this extra call
- EXPECT_CALL(*test->mComposer, setLayerTransform(HWC_DISPLAY, HWC_LAYER, DEFAULT_TRANSFORM))
- .Times(AtLeast(1))
- .RetiresOnSaturation();
+ // These expectations retire on saturation as the code path these
+ // expectations are for appears to make an extra call to them.
+ // TODO: Investigate this extra call
+ EXPECT_CALL(*test->mComposer,
+ setLayerTransform(HWC_DISPLAY, HWC_LAYER, DEFAULT_TRANSFORM))
+ .Times(AtLeast(1))
+ .RetiresOnSaturation();
+ }
}
static void setupHwcSetSourceCropBufferCallExpectations(CompositionTest* test) {
- EXPECT_CALL(*test->mComposer,
- setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
- IComposerClient::FRect({0.f, 0.f, LayerProperties::WIDTH,
- LayerProperties::HEIGHT})))
- .Times(1);
+ if (!test->mDisplayOff) {
+ EXPECT_CALL(*test->mComposer,
+ setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
+ IComposerClient::FRect({0.f, 0.f, LayerProperties::WIDTH,
+ LayerProperties::HEIGHT})))
+ .Times(1);
+ }
}
static void setupHwcSetSourceCropColorCallExpectations(CompositionTest* test) {
- EXPECT_CALL(*test->mComposer,
- setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
- IComposerClient::FRect({0.f, 0.f, 0.f, 0.f})))
- .Times(1);
+ if (!test->mDisplayOff) {
+ EXPECT_CALL(*test->mComposer,
+ setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
+ IComposerClient::FRect({0.f, 0.f, 0.f, 0.f})))
+ .Times(1);
+ }
}
static void setupHwcSetPerFrameCallExpectations(CompositionTest* test) {
- EXPECT_CALL(*test->mComposer,
- setLayerVisibleRegion(HWC_DISPLAY, HWC_LAYER,
- std::vector<IComposerClient::Rect>({IComposerClient::Rect(
- {0, 0, LayerProperties::WIDTH,
- LayerProperties::HEIGHT})})))
- .Times(1);
+ if (!test->mDisplayOff) {
+ EXPECT_CALL(*test->mComposer,
+ setLayerVisibleRegion(HWC_DISPLAY, HWC_LAYER,
+ std::vector<IComposerClient::Rect>(
+ {IComposerClient::Rect(
+ {0, 0, LayerProperties::WIDTH,
+ LayerProperties::HEIGHT})})))
+ .Times(1);
+ }
}
static void setupHwcSetPerFrameColorCallExpectations(CompositionTest* test) {
- EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _)).Times(1);
+ if (!test->mDisplayOff) {
+ EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _))
+ .Times(1);
- // TODO: use COLOR
- EXPECT_CALL(*test->mComposer,
- setLayerColor(HWC_DISPLAY, HWC_LAYER,
- IComposerClient::Color({0xff, 0xff, 0xff, 0xff})))
- .Times(1);
+ // TODO: use COLOR
+ EXPECT_CALL(*test->mComposer,
+ setLayerColor(HWC_DISPLAY, HWC_LAYER,
+ IComposerClient::Color({0xff, 0xff, 0xff, 0xff})))
+ .Times(1);
+ }
}
static void setupHwcSetPerFrameBufferCallExpectations(CompositionTest* test) {
- EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _)).Times(1);
- EXPECT_CALL(*test->mComposer, setLayerBuffer(HWC_DISPLAY, HWC_LAYER, _, _, _)).Times(1);
+ if (!test->mDisplayOff) {
+ EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _))
+ .Times(1);
+ EXPECT_CALL(*test->mComposer, setLayerBuffer(HWC_DISPLAY, HWC_LAYER, _, _, _)).Times(1);
+ }
setupBufferLayerPostFrameCallExpectations(test);
}
@@ -940,9 +957,11 @@
static constexpr HWC2::Composition TYPE = static_cast<HWC2::Composition>(CompositionType);
static void setupHwcSetCallExpectations(CompositionTest* test) {
- EXPECT_CALL(*test->mComposer,
- setLayerCompositionType(HWC_DISPLAY, HWC_LAYER, CompositionType))
- .Times(1);
+ if (!test->mDisplayOff) {
+ EXPECT_CALL(*test->mComposer,
+ setLayerCompositionType(HWC_DISPLAY, HWC_LAYER, CompositionType))
+ .Times(1);
+ }
}
static void setupHwcGetCallExpectations(CompositionTest* test) {
@@ -956,9 +975,11 @@
static constexpr HWC2::Composition TYPE = static_cast<HWC2::Composition>(FinalCompositionType);
static void setupHwcSetCallExpectations(CompositionTest* test) {
- EXPECT_CALL(*test->mComposer,
- setLayerCompositionType(HWC_DISPLAY, HWC_LAYER, InitialCompositionType))
- .Times(1);
+ if (!test->mDisplayOff) {
+ EXPECT_CALL(*test->mComposer,
+ setLayerCompositionType(HWC_DISPLAY, HWC_LAYER, InitialCompositionType))
+ .Times(1);
+ }
}
static void setupHwcGetCallExpectations(CompositionTest* test) {
@@ -1341,6 +1362,7 @@
*/
TEST_F(CompositionTest, displayOffHWCComposedNormalBufferLayerWithDirtyGeometry) {
+ mDisplayOff = true;
displayRefreshCompositionDirtyGeometry<CompositionCase<
PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
@@ -1348,6 +1370,7 @@
}
TEST_F(CompositionTest, displayOffHWCComposedNormalBufferLayerWithDirtyFrame) {
+ mDisplayOff = true;
displayRefreshCompositionDirtyFrame<CompositionCase<
PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
@@ -1355,6 +1378,7 @@
}
TEST_F(CompositionTest, displayOffREComposedNormalBufferLayer) {
+ mDisplayOff = true;
displayRefreshCompositionDirtyFrame<CompositionCase<
PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
ChangeCompositionTypeVariant<IComposerClient::Composition::DEVICE,