diff options
| author | 2023-03-14 12:04:58 -0400 | |
|---|---|---|
| committer | 2023-05-09 16:49:08 -0400 | |
| commit | 008bec0bd04fb1df0273545c5958c4e596d64eb0 (patch) | |
| tree | edec562218bee6444fda6d401bf7ac0a62849398 | |
| parent | 0e4dbdb5d81b708fa7633c1140760e2989f3ef00 (diff) | |
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
| -rw-r--r-- | services/surfaceflinger/Scheduler/Scheduler.cpp | 18 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/SchedulerTest.cpp | 19 |
3 files changed, 32 insertions, 7 deletions
diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp index 6d4089324a..8e1ac362ad 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.cpp +++ b/services/surfaceflinger/Scheduler/Scheduler.cpp @@ -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) { diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index a5f4286a96..b258e043af 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -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(); diff --git a/services/surfaceflinger/tests/unittests/SchedulerTest.cpp b/services/surfaceflinger/tests/unittests/SchedulerTest.cpp index 965e37873f..16fa35e9c3 100644 --- a/services/surfaceflinger/tests/unittests/SchedulerTest.cpp +++ b/services/surfaceflinger/tests/unittests/SchedulerTest.cpp @@ -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()); |