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

Commit 113db105 authored by Peiyong Lin's avatar Peiyong Lin Committed by android-build-merger
Browse files

Merge "[SurfaceFlinger] Query display capability when display is on the first time." into qt-dev

am: 6107273c

Change-Id: Ibdc0bd691b6774ddd17d8995dddd538f5281a465
parents df68bf4f 6107273c
Loading
Loading
Loading
Loading
+23 −16
Original line number Original line Diff line number Diff line
@@ -261,22 +261,6 @@ Display::Display(android::Hwc2::Composer& composer,
        mId(id),
        mId(id),
        mIsConnected(false),
        mIsConnected(false),
        mType(type) {
        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);
    ALOGV("Created display %" PRIu64, id);
}
}


@@ -660,6 +644,29 @@ Error Display::setPowerMode(PowerMode mode)
{
{
    auto intMode = static_cast<Hwc2::IComposerClient::PowerMode>(mode);
    auto intMode = static_cast<Hwc2::IComposerClient::PowerMode>(mode);
    auto intError = mComposer.setPowerMode(mId, intMode);
    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);
    return static_cast<Error>(intError);
}
}


+1 −0
Original line number Original line Diff line number Diff line
@@ -356,6 +356,7 @@ private:
    DisplayType mType;
    DisplayType mType;
    std::unordered_map<hwc2_layer_t, std::unique_ptr<Layer>> mLayers;
    std::unordered_map<hwc2_layer_t, std::unique_ptr<Layer>> mLayers;
    std::unordered_map<hwc2_config_t, std::shared_ptr<const Config>> mConfigs;
    std::unordered_map<hwc2_config_t, std::shared_ptr<const Config>> mConfigs;
    std::once_flag mDisplayCapabilityQueryFlag;
    std::unordered_set<DisplayCapability> mDisplayCapabilities;
    std::unordered_set<DisplayCapability> mDisplayCapabilities;
};
};
} // namespace impl
} // namespace impl
+17 −3
Original line number Original line Diff line number Diff line
@@ -253,13 +253,16 @@ struct BaseDisplayVariant {
    static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_NORMAL;
    static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_NORMAL;


    static void setupPreconditions(CompositionTest* test) {
    static void setupPreconditions(CompositionTest* test) {
        EXPECT_CALL(*test->mComposer, getDisplayCapabilities(HWC_DISPLAY, _))
        EXPECT_CALL(*test->mComposer,
                .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::DisplayCapability>({})),
                    setPowerMode(HWC_DISPLAY,
                                Return(Error::NONE)));
                                 static_cast<Hwc2::IComposerClient::PowerMode>(
                                         Derived::INIT_POWER_MODE)))
                .WillOnce(Return(Error::NONE));


        FakeHwcDisplayInjector(DEFAULT_DISPLAY_ID, HWC2::DisplayType::Physical,
        FakeHwcDisplayInjector(DEFAULT_DISPLAY_ID, HWC2::DisplayType::Physical,
                               true /* isPrimary */)
                               true /* isPrimary */)
                .setCapabilities(&test->mDefaultCapabilities)
                .setCapabilities(&test->mDefaultCapabilities)
                .setPowerMode(Derived::INIT_POWER_MODE)
                .inject(&test->mFlinger, test->mComposer);
                .inject(&test->mFlinger, test->mComposer);
        Mock::VerifyAndClear(test->mComposer);
        Mock::VerifyAndClear(test->mComposer);


@@ -281,6 +284,13 @@ struct BaseDisplayVariant {
        test->mDisplay->setLayerStack(DEFAULT_LAYER_STACK);
        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>
    template <typename Case>
    static void setupCommonCompositionCallExpectations(CompositionTest* test) {
    static void setupCommonCompositionCallExpectations(CompositionTest* test) {
        EXPECT_CALL(*test->mComposer,
        EXPECT_CALL(*test->mComposer,
@@ -392,6 +402,9 @@ struct InsecureDisplaySetupVariant : public BaseDisplayVariant<InsecureDisplaySe
struct PoweredOffDisplaySetupVariant : public BaseDisplayVariant<PoweredOffDisplaySetupVariant> {
struct PoweredOffDisplaySetupVariant : public BaseDisplayVariant<PoweredOffDisplaySetupVariant> {
    static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_OFF;
    static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_OFF;


    template <typename Case>
    static void setupPreconditionCallExpectations(CompositionTest*) {}

    template <typename Case>
    template <typename Case>
    static void setupCommonCompositionCallExpectations(CompositionTest* test) {
    static void setupCommonCompositionCallExpectations(CompositionTest* test) {
        EXPECT_CALL(*test->mRenderEngine, useNativeFenceSync()).WillRepeatedly(Return(true));
        EXPECT_CALL(*test->mRenderEngine, useNativeFenceSync()).WillRepeatedly(Return(true));
@@ -1022,6 +1035,7 @@ struct CompositionCase {
    using CompositionResult = CompositionResultCase;
    using CompositionResult = CompositionResultCase;


    static void setupCommon(CompositionTest* test) {
    static void setupCommon(CompositionTest* test) {
        Display::template setupPreconditionCallExpectations<ThisCase>(test);
        Display::setupPreconditions(test);
        Display::setupPreconditions(test);


        auto layer = Layer::createLayer(test);
        auto layer = Layer::createLayer(test);
+6 −7
Original line number Original line Diff line number Diff line
@@ -410,6 +410,7 @@ struct HwcDisplayVariant {


    // The HWC active configuration id
    // The HWC active configuration id
    static constexpr int HWC_ACTIVE_CONFIG_ID = 2001;
    static constexpr int HWC_ACTIVE_CONFIG_ID = 2001;
    static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_NORMAL;


    static void injectPendingHotplugEvent(DisplayTransactionTest* test,
    static void injectPendingHotplugEvent(DisplayTransactionTest* test,
                                          HWC2::Connection connection) {
                                          HWC2::Connection connection) {
@@ -427,6 +428,7 @@ struct HwcDisplayVariant {
                .setWidth(DisplayVariant::WIDTH)
                .setWidth(DisplayVariant::WIDTH)
                .setHeight(DisplayVariant::HEIGHT)
                .setHeight(DisplayVariant::HEIGHT)
                .setActiveConfig(HWC_ACTIVE_CONFIG_ID)
                .setActiveConfig(HWC_ACTIVE_CONFIG_ID)
                .setPowerMode(INIT_POWER_MODE)
                .inject(&test->mFlinger, test->mComposer);
                .inject(&test->mFlinger, test->mComposer);
    }
    }


@@ -435,6 +437,10 @@ struct HwcDisplayVariant {
        EXPECT_CALL(*test->mComposer, getDisplayCapabilities(HWC_DISPLAY_ID, _))
        EXPECT_CALL(*test->mComposer, getDisplayCapabilities(HWC_DISPLAY_ID, _))
                .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::DisplayCapability>({})),
                .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::DisplayCapability>({})),
                                Return(Error::NONE)));
                                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);
        injectHwcDisplayWithNoDefaultCapabilities(test);
    }
    }


@@ -467,9 +473,6 @@ struct HwcDisplayVariant {
                    getDisplayAttribute(HWC_DISPLAY_ID, HWC_ACTIVE_CONFIG_ID,
                    getDisplayAttribute(HWC_DISPLAY_ID, HWC_ACTIVE_CONFIG_ID,
                                        IComposerClient::Attribute::DPI_Y, _))
                                        IComposerClient::Attribute::DPI_Y, _))
                .WillOnce(DoAll(SetArgPointee<3>(DEFAULT_DPI), Return(Error::NONE)));
                .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) {
        if (PhysicalDisplay::HAS_IDENTIFICATION_DATA) {
            EXPECT_CALL(*test->mComposer, getDisplayIdentificationData(HWC_DISPLAY_ID, _, _))
            EXPECT_CALL(*test->mComposer, getDisplayIdentificationData(HWC_DISPLAY_ID, _, _))
@@ -1891,10 +1894,6 @@ TEST_F(HandleTransactionLockedTest, processesVirtualDisplayAdded) {
    Case::Display::setupFramebufferConsumerBufferQueueCallExpectations(this);
    Case::Display::setupFramebufferConsumerBufferQueueCallExpectations(this);
    Case::Display::setupNativeWindowSurfaceCreationCallExpectations(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, _))
    EXPECT_CALL(*surface, query(NATIVE_WINDOW_WIDTH, _))
            .WillRepeatedly(DoAll(SetArgPointee<1>(Case::Display::WIDTH), Return(NO_ERROR)));
            .WillRepeatedly(DoAll(SetArgPointee<1>(Case::Display::WIDTH), Return(NO_ERROR)));
    EXPECT_CALL(*surface, query(NATIVE_WINDOW_HEIGHT, _))
    EXPECT_CALL(*surface, query(NATIVE_WINDOW_HEIGHT, _))
+8 −0
Original line number Original line 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_REFRESH_RATE = 16'666'666;
        static constexpr int32_t DEFAULT_DPI = 320;
        static constexpr int32_t DEFAULT_DPI = 320;
        static constexpr int32_t DEFAULT_ACTIVE_CONFIG = 0;
        static constexpr int32_t DEFAULT_ACTIVE_CONFIG = 0;
        static constexpr int32_t DEFAULT_POWER_MODE = 2;


        FakeHwcDisplayInjector(DisplayId displayId, HWC2::DisplayType hwcDisplayType,
        FakeHwcDisplayInjector(DisplayId displayId, HWC2::DisplayType hwcDisplayType,
                               bool isPrimary)
                               bool isPrimary)
@@ -431,6 +432,11 @@ public:
            return *this;
            return *this;
        }
        }


        auto& setPowerMode(int mode) {
            mPowerMode = mode;
            return *this;
        }

        void inject(TestableSurfaceFlinger* flinger, Hwc2::Composer* composer) {
        void inject(TestableSurfaceFlinger* flinger, Hwc2::Composer* composer) {
            static const std::unordered_set<HWC2::Capability> defaultCapabilities;
            static const std::unordered_set<HWC2::Capability> defaultCapabilities;
            if (mCapabilities == nullptr) mCapabilities = &defaultCapabilities;
            if (mCapabilities == nullptr) mCapabilities = &defaultCapabilities;
@@ -450,6 +456,7 @@ public:
            config.setDpiY(mDpiY);
            config.setDpiY(mDpiY);
            display->mutableConfigs().emplace(mActiveConfig, config.build());
            display->mutableConfigs().emplace(mActiveConfig, config.build());
            display->mutableIsConnected() = true;
            display->mutableIsConnected() = true;
            display->setPowerMode(static_cast<HWC2::PowerMode>(mPowerMode));


            flinger->mutableHwcDisplayData()[mDisplayId].hwcDisplay = display.get();
            flinger->mutableHwcDisplayData()[mDisplayId].hwcDisplay = display.get();


@@ -474,6 +481,7 @@ public:
        int32_t mDpiX = DEFAULT_DPI;
        int32_t mDpiX = DEFAULT_DPI;
        int32_t mDpiY = DEFAULT_DPI;
        int32_t mDpiY = DEFAULT_DPI;
        int32_t mActiveConfig = DEFAULT_ACTIVE_CONFIG;
        int32_t mActiveConfig = DEFAULT_ACTIVE_CONFIG;
        int32_t mPowerMode = DEFAULT_POWER_MODE;
        const std::unordered_set<HWC2::Capability>* mCapabilities = nullptr;
        const std::unordered_set<HWC2::Capability>* mCapabilities = nullptr;
    };
    };