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

Commit 008bec0b authored by Dominik Laskowski's avatar Dominik Laskowski
Browse files

SF: Disable hardware VSYNC for any new display

Remove the special case for the primary display.

Bug: 271431077
Bug: 241286146
Bug: 241285191
Test: SchedulerTest.registerDisplay
Change-Id: I5c85852208972da7a82998f283283004ed15386b
parent 0e4dbdb5
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -123,14 +123,22 @@ void Scheduler::registerDisplayInternal(PhysicalDisplayId displayId,
                                        VsyncSchedulePtr schedulePtr) {
    demotePacesetterDisplay();

    std::shared_ptr<VsyncSchedule> pacesetterVsyncSchedule;
    {
    auto [pacesetterVsyncSchedule, isNew] = [&]() FTL_FAKE_GUARD(kMainThreadContext) {
        std::scoped_lock lock(mDisplayLock);
        mDisplays.emplace_or_replace(displayId, std::move(selectorPtr), std::move(schedulePtr));
        const bool isNew = mDisplays
                                   .emplace_or_replace(displayId, std::move(selectorPtr),
                                                       std::move(schedulePtr))
                                   .second;

        return std::make_pair(promotePacesetterDisplayLocked(), isNew);
    }();

        pacesetterVsyncSchedule = promotePacesetterDisplayLocked();
    }
    applyNewVsyncSchedule(std::move(pacesetterVsyncSchedule));

    // Disable hardware VSYNC if the registration is new, as opposed to a renewal.
    if (isNew) {
        mSchedulerCallback.setVsyncEnabled(displayId, false);
    }
}

void Scheduler::unregisterDisplay(PhysicalDisplayId displayId) {
+0 −2
Original line number Diff line number Diff line
@@ -3869,8 +3869,6 @@ void SurfaceFlinger::initScheduler(const sp<const DisplayDevice>& display) {
                                             static_cast<ISchedulerCallback&>(*this), features,
                                             std::move(modulatorPtr));
    mScheduler->registerDisplay(display->getPhysicalId(), display->holdRefreshRateSelector());

    setVsyncEnabled(display->getPhysicalId(), false);
    mScheduler->startTimers();

    const auto configs = mVsyncConfiguration->getCurrentConfigs();
+19 −0
Original line number Diff line number Diff line
@@ -155,6 +155,25 @@ TEST_F(SchedulerTest, validConnectionHandle) {
    EXPECT_EQ(kEventConnections, mScheduler->getEventThreadConnectionCount(mConnectionHandle));
}

TEST_F(SchedulerTest, registerDisplay) {
    // Hardware VSYNC should not change if the display is already registered.
    EXPECT_CALL(mSchedulerCallback, setVsyncEnabled(kDisplayId1, false)).Times(0);
    mScheduler->registerDisplay(kDisplayId1,
                                std::make_shared<RefreshRateSelector>(kDisplay1Modes,
                                                                      kDisplay1Mode60->getId()));

    // Hardware VSYNC should be disabled for newly registered displays.
    EXPECT_CALL(mSchedulerCallback, setVsyncEnabled(kDisplayId2, false)).Times(1);
    EXPECT_CALL(mSchedulerCallback, setVsyncEnabled(kDisplayId3, false)).Times(1);

    mScheduler->registerDisplay(kDisplayId2,
                                std::make_shared<RefreshRateSelector>(kDisplay2Modes,
                                                                      kDisplay2Mode60->getId()));
    mScheduler->registerDisplay(kDisplayId3,
                                std::make_shared<RefreshRateSelector>(kDisplay3Modes,
                                                                      kDisplay3Mode60->getId()));
}

TEST_F(SchedulerTest, chooseRefreshRateForContentIsNoopWhenModeSwitchingIsNotSupported) {
    // The layer is registered at creation time and deregistered at destruction time.
    sp<MockLayer> layer = sp<MockLayer>::make(mFlinger.flinger());