Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1336e6e1 authored by Peiyong Lin's avatar Peiyong Lin
Browse files

[SurfaceFlinger] Query display capability when display is on the first time.

Some display resource can't be allocated before the display is on, and thus
some capabilities are unknown. Thus move the query of display capability to the
first time that the display is on.

BUG: 69911676
Test: manual
Change-Id: I3488927d9a854a42432b7575d0daa14e61677c3e
parent 97071fa0
Loading
Loading
Loading
Loading
+23 −16
Original line number Diff line number Diff line
@@ -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);
}

+1 −0
Original line number Diff line number Diff line
@@ -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
+17 −3
Original line number Diff line number Diff line
@@ -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);

@@ -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,
@@ -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));
@@ -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);
+6 −7
Original line number Diff line number Diff line
@@ -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, _))
+8 −0
Original line number Diff line number Diff line
@@ -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;
    };