diff options
5 files changed, 55 insertions, 26 deletions
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index 3012ed8b16..c463c4e40a 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -261,22 +261,6 @@ Display::Display(android::Hwc2::Composer& composer, mId(id), mIsConnected(false), mType(type) { - std::vector<Hwc2::DisplayCapability> tmpCapabilities; - auto error = static_cast<Error>(mComposer.getDisplayCapabilities(mId, &tmpCapabilities)); - if (error == Error::None) { - for (auto capability : tmpCapabilities) { - mDisplayCapabilities.emplace(static_cast<DisplayCapability>(capability)); - } - } else if (error == Error::Unsupported) { - if (capabilities.count(Capability::SkipClientColorTransform)) { - mDisplayCapabilities.emplace(DisplayCapability::SkipClientColorTransform); - } - bool dozeSupport = false; - error = static_cast<Error>(mComposer.getDozeSupport(mId, &dozeSupport)); - if (error == Error::None && dozeSupport) { - mDisplayCapabilities.emplace(DisplayCapability::Doze); - } - } ALOGV("Created display %" PRIu64, id); } @@ -660,6 +644,29 @@ Error Display::setPowerMode(PowerMode mode) { auto intMode = static_cast<Hwc2::IComposerClient::PowerMode>(mode); auto intError = mComposer.setPowerMode(mId, intMode); + + if (mode == PowerMode::On) { + std::call_once(mDisplayCapabilityQueryFlag, [this]() { + std::vector<Hwc2::DisplayCapability> tmpCapabilities; + auto error = + static_cast<Error>(mComposer.getDisplayCapabilities(mId, &tmpCapabilities)); + if (error == Error::None) { + for (auto capability : tmpCapabilities) { + mDisplayCapabilities.emplace(static_cast<DisplayCapability>(capability)); + } + } else if (error == Error::Unsupported) { + if (mCapabilities.count(Capability::SkipClientColorTransform)) { + mDisplayCapabilities.emplace(DisplayCapability::SkipClientColorTransform); + } + bool dozeSupport = false; + error = static_cast<Error>(mComposer.getDozeSupport(mId, &dozeSupport)); + if (error == Error::None && dozeSupport) { + mDisplayCapabilities.emplace(DisplayCapability::Doze); + } + } + }); + } + return static_cast<Error>(intError); } diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index e0a5ef14dd..b7cdf7f6c4 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -356,6 +356,7 @@ private: DisplayType mType; std::unordered_map<hwc2_layer_t, std::unique_ptr<Layer>> mLayers; std::unordered_map<hwc2_config_t, std::shared_ptr<const Config>> mConfigs; + std::once_flag mDisplayCapabilityQueryFlag; std::unordered_set<DisplayCapability> mDisplayCapabilities; }; } // namespace impl diff --git a/services/surfaceflinger/tests/unittests/CompositionTest.cpp b/services/surfaceflinger/tests/unittests/CompositionTest.cpp index 7c0ecb3225..4f8ed1ae1c 100644 --- a/services/surfaceflinger/tests/unittests/CompositionTest.cpp +++ b/services/surfaceflinger/tests/unittests/CompositionTest.cpp @@ -253,13 +253,16 @@ struct BaseDisplayVariant { static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_NORMAL; static void setupPreconditions(CompositionTest* test) { - EXPECT_CALL(*test->mComposer, getDisplayCapabilities(HWC_DISPLAY, _)) - .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::DisplayCapability>({})), - Return(Error::NONE))); + EXPECT_CALL(*test->mComposer, + setPowerMode(HWC_DISPLAY, + static_cast<Hwc2::IComposerClient::PowerMode>( + Derived::INIT_POWER_MODE))) + .WillOnce(Return(Error::NONE)); FakeHwcDisplayInjector(DEFAULT_DISPLAY_ID, HWC2::DisplayType::Physical, true /* isPrimary */) .setCapabilities(&test->mDefaultCapabilities) + .setPowerMode(Derived::INIT_POWER_MODE) .inject(&test->mFlinger, test->mComposer); Mock::VerifyAndClear(test->mComposer); @@ -282,6 +285,13 @@ struct BaseDisplayVariant { } template <typename Case> + static void setupPreconditionCallExpectations(CompositionTest* test) { + EXPECT_CALL(*test->mComposer, getDisplayCapabilities(HWC_DISPLAY, _)) + .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::DisplayCapability>({})), + Return(Error::NONE))); + } + + template <typename Case> static void setupCommonCompositionCallExpectations(CompositionTest* test) { EXPECT_CALL(*test->mComposer, setColorTransform(HWC_DISPLAY, _, Hwc2::ColorTransform::IDENTITY)) @@ -393,6 +403,9 @@ struct PoweredOffDisplaySetupVariant : public BaseDisplayVariant<PoweredOffDispl static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_OFF; template <typename Case> + static void setupPreconditionCallExpectations(CompositionTest*) {} + + template <typename Case> static void setupCommonCompositionCallExpectations(CompositionTest* test) { EXPECT_CALL(*test->mRenderEngine, useNativeFenceSync()).WillRepeatedly(Return(true)); @@ -1022,6 +1035,7 @@ struct CompositionCase { using CompositionResult = CompositionResultCase; static void setupCommon(CompositionTest* test) { + Display::template setupPreconditionCallExpectations<ThisCase>(test); Display::setupPreconditions(test); auto layer = Layer::createLayer(test); diff --git a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp index 97f9e6abc5..5f58e7dce9 100644 --- a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp +++ b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp @@ -410,6 +410,7 @@ struct HwcDisplayVariant { // The HWC active configuration id static constexpr int HWC_ACTIVE_CONFIG_ID = 2001; + static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_NORMAL; static void injectPendingHotplugEvent(DisplayTransactionTest* test, HWC2::Connection connection) { @@ -427,6 +428,7 @@ struct HwcDisplayVariant { .setWidth(DisplayVariant::WIDTH) .setHeight(DisplayVariant::HEIGHT) .setActiveConfig(HWC_ACTIVE_CONFIG_ID) + .setPowerMode(INIT_POWER_MODE) .inject(&test->mFlinger, test->mComposer); } @@ -435,6 +437,10 @@ struct HwcDisplayVariant { EXPECT_CALL(*test->mComposer, getDisplayCapabilities(HWC_DISPLAY_ID, _)) .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::DisplayCapability>({})), Return(Error::NONE))); + EXPECT_CALL(*test->mComposer, + setPowerMode(HWC_DISPLAY_ID, + static_cast<Hwc2::IComposerClient::PowerMode>(INIT_POWER_MODE))) + .WillOnce(Return(Error::NONE)); injectHwcDisplayWithNoDefaultCapabilities(test); } @@ -467,9 +473,6 @@ struct HwcDisplayVariant { getDisplayAttribute(HWC_DISPLAY_ID, HWC_ACTIVE_CONFIG_ID, IComposerClient::Attribute::DPI_Y, _)) .WillOnce(DoAll(SetArgPointee<3>(DEFAULT_DPI), Return(Error::NONE))); - EXPECT_CALL(*test->mComposer, getDisplayCapabilities(HWC_DISPLAY_ID, _)) - .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::DisplayCapability>({})), - Return(Error::NONE))); if (PhysicalDisplay::HAS_IDENTIFICATION_DATA) { EXPECT_CALL(*test->mComposer, getDisplayIdentificationData(HWC_DISPLAY_ID, _, _)) @@ -1891,10 +1894,6 @@ TEST_F(HandleTransactionLockedTest, processesVirtualDisplayAdded) { Case::Display::setupFramebufferConsumerBufferQueueCallExpectations(this); Case::Display::setupNativeWindowSurfaceCreationCallExpectations(this); - EXPECT_CALL(*mComposer, getDisplayCapabilities(Case::Display::HWC_DISPLAY_ID, _)) - .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::DisplayCapability>({})), - Return(Error::NONE))); - EXPECT_CALL(*surface, query(NATIVE_WINDOW_WIDTH, _)) .WillRepeatedly(DoAll(SetArgPointee<1>(Case::Display::WIDTH), Return(NO_ERROR))); EXPECT_CALL(*surface, query(NATIVE_WINDOW_HEIGHT, _)) diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h index df14e7e45d..64d34ee102 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -386,6 +386,7 @@ public: static constexpr int32_t DEFAULT_REFRESH_RATE = 16'666'666; static constexpr int32_t DEFAULT_DPI = 320; static constexpr int32_t DEFAULT_ACTIVE_CONFIG = 0; + static constexpr int32_t DEFAULT_POWER_MODE = 2; FakeHwcDisplayInjector(DisplayId displayId, HWC2::DisplayType hwcDisplayType, bool isPrimary) @@ -431,6 +432,11 @@ public: return *this; } + auto& setPowerMode(int mode) { + mPowerMode = mode; + return *this; + } + void inject(TestableSurfaceFlinger* flinger, Hwc2::Composer* composer) { static const std::unordered_set<HWC2::Capability> defaultCapabilities; if (mCapabilities == nullptr) mCapabilities = &defaultCapabilities; @@ -450,6 +456,7 @@ public: config.setDpiY(mDpiY); display->mutableConfigs().emplace(mActiveConfig, config.build()); display->mutableIsConnected() = true; + display->setPowerMode(static_cast<HWC2::PowerMode>(mPowerMode)); flinger->mutableHwcDisplayData()[mDisplayId].hwcDisplay = display.get(); @@ -474,6 +481,7 @@ public: int32_t mDpiX = DEFAULT_DPI; int32_t mDpiY = DEFAULT_DPI; int32_t mActiveConfig = DEFAULT_ACTIVE_CONFIG; + int32_t mPowerMode = DEFAULT_POWER_MODE; const std::unordered_set<HWC2::Capability>* mCapabilities = nullptr; }; |