Loading services/surfaceflinger/DisplayHardware/HWC2.cpp +23 −16 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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); } Loading services/surfaceflinger/DisplayHardware/HWC2.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading services/surfaceflinger/tests/unittests/CompositionTest.cpp +17 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -281,6 +284,13 @@ struct BaseDisplayVariant { test->mDisplay->setLayerStack(DEFAULT_LAYER_STACK); } 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, Loading Loading @@ -392,6 +402,9 @@ struct InsecureDisplaySetupVariant : public BaseDisplayVariant<InsecureDisplaySe struct PoweredOffDisplaySetupVariant : public BaseDisplayVariant<PoweredOffDisplaySetupVariant> { 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)); Loading Loading @@ -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); Loading services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp +6 −7 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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, _, _)) Loading Loading @@ -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, _)) Loading services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +8 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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; Loading @@ -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(); Loading @@ -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; }; Loading Loading
services/surfaceflinger/DisplayHardware/HWC2.cpp +23 −16 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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); } Loading
services/surfaceflinger/DisplayHardware/HWC2.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
services/surfaceflinger/tests/unittests/CompositionTest.cpp +17 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -281,6 +284,13 @@ struct BaseDisplayVariant { test->mDisplay->setLayerStack(DEFAULT_LAYER_STACK); } 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, Loading Loading @@ -392,6 +402,9 @@ struct InsecureDisplaySetupVariant : public BaseDisplayVariant<InsecureDisplaySe struct PoweredOffDisplaySetupVariant : public BaseDisplayVariant<PoweredOffDisplaySetupVariant> { 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)); Loading Loading @@ -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); Loading
services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp +6 −7 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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, _, _)) Loading Loading @@ -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, _)) Loading
services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +8 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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; Loading @@ -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(); Loading @@ -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; }; Loading