Skip to content

Commit 46eef56

Browse files
author
Su Hong Koo
committed
SF: plumb PhysicalDisplayId to kernelIdleTimerCallback and vrrDisplayIdle
Scheduler::kernelIdleTimerCallback() and ISchedulerCallback::vrrDisplayIdle() both hardcode in active/pacesetter displays in the body. This CL adds PhysicalDisplayId as an argument to these functions and passes the display in that way instead to make it more general. Flag: EXEMPT trivial refactor Bug: 255635821 Test: presubmit Change-Id: I739e4e5bd2621e1459f6d3d9c152f06ed24f1602
1 parent 5a4fce8 commit 46eef56

File tree

6 files changed

+43
-22
lines changed

6 files changed

+43
-22
lines changed

services/surfaceflinger/Scheduler/ISchedulerCallback.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct ISchedulerCallback {
3232
virtual void onExpectedPresentTimePosted(TimePoint, ftl::NonNull<DisplayModePtr>,
3333
Fps renderRate) = 0;
3434
virtual void onCommitNotComposited() = 0;
35-
virtual void vrrDisplayIdle(bool idle) = 0;
35+
virtual void vrrDisplayIdle(PhysicalDisplayId, bool idle) = 0;
3636

3737
protected:
3838
~ISchedulerCallback() = default;

services/surfaceflinger/Scheduler/Scheduler.cpp

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -840,12 +840,23 @@ auto Scheduler::getVsyncScheduleLocked(std::optional<PhysicalDisplayId> idOpt) c
840840
return displayOpt->get().schedulePtr;
841841
}
842842

843-
void Scheduler::kernelIdleTimerCallback(TimerState state) {
843+
void Scheduler::kernelIdleTimerCallback(PhysicalDisplayId displayId, TimerState state) {
844844
SFTRACE_INT("ExpiredKernelIdleTimer", static_cast<int>(state));
845845

846-
// TODO(145561154): cleanup the kernel idle timer implementation and the refresh rate
847-
// magic number
848-
const Fps refreshRate = pacesetterSelectorPtr()->getActiveMode().modePtr->getPeakFps();
846+
Fps refreshRate;
847+
{
848+
std::scoped_lock lock(mDisplayLock);
849+
ftl::FakeGuard guard(kMainThreadContext);
850+
const auto displayOpt = mDisplays.get(displayId);
851+
if (!displayOpt) {
852+
ALOGW("%s: Invalid display %s!", __func__, to_string(displayId).c_str());
853+
return;
854+
}
855+
856+
// TODO: b/145561154 - Clean up the kernel idle timer implementation and the refresh rate
857+
// magic number
858+
refreshRate = displayOpt->get().selectorPtr->getActiveMode().modePtr->getPeakFps();
859+
}
849860

850861
constexpr Fps FPS_THRESHOLD_FOR_KERNEL_TIMER = 65_Hz;
851862
using namespace fps_approx_ops;
@@ -1010,11 +1021,24 @@ std::shared_ptr<VsyncSchedule> Scheduler::promotePacesetterDisplayLocked(
10101021
pacesetter.selectorPtr->setIdleTimerCallbacks(
10111022
{.platform = {.onReset = [this] { idleTimerCallback(TimerState::Reset); },
10121023
.onExpired = [this] { idleTimerCallback(TimerState::Expired); }},
1013-
.kernel = {.onReset = [this] { kernelIdleTimerCallback(TimerState::Reset); },
1024+
.kernel = {.onReset =
1025+
[this, pacesetterId] {
1026+
kernelIdleTimerCallback(pacesetterId,
1027+
TimerState::Reset);
1028+
},
10141029
.onExpired =
1015-
[this] { kernelIdleTimerCallback(TimerState::Expired); }},
1016-
.vrr = {.onReset = [this] { mSchedulerCallback.vrrDisplayIdle(false); },
1017-
.onExpired = [this] { mSchedulerCallback.vrrDisplayIdle(true); }}});
1030+
[this, pacesetterId] {
1031+
kernelIdleTimerCallback(pacesetterId,
1032+
TimerState::Expired);
1033+
}},
1034+
.vrr = {.onReset =
1035+
[this, pacesetterId] {
1036+
mSchedulerCallback.vrrDisplayIdle(pacesetterId, false);
1037+
},
1038+
.onExpired =
1039+
[this, pacesetterId] {
1040+
mSchedulerCallback.vrrDisplayIdle(pacesetterId, true);
1041+
}}});
10181042

10191043
pacesetter.selectorPtr->startIdleTimer();
10201044
}

services/surfaceflinger/Scheduler/Scheduler.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ class Scheduler : public IEventThreadCallback, android::impl::MessageQueue {
381381
}
382382

383383
// Update feature state machine to given state when corresponding timer resets or expires.
384-
void kernelIdleTimerCallback(TimerState) EXCLUDES(mDisplayLock);
384+
void kernelIdleTimerCallback(PhysicalDisplayId, TimerState) EXCLUDES(mDisplayLock);
385385
void idleTimerCallback(TimerState);
386386
void touchTimerCallback(TimerState);
387387
void displayPowerTimerCallback(TimerState);

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7266,19 +7266,16 @@ void SurfaceFlinger::kernelTimerChanged(bool expired) {
72667266
}));
72677267
}
72687268

7269-
void SurfaceFlinger::vrrDisplayIdle(bool idle) {
7269+
void SurfaceFlinger::vrrDisplayIdle(PhysicalDisplayId displayId, bool idle) {
72707270
// Update the overlay on the main thread to avoid race conditions with
72717271
// RefreshRateSelector::getActiveMode
72727272
static_cast<void>(mScheduler->schedule([=, this] {
7273-
const auto display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked());
7274-
if (!display) {
7275-
ALOGW("%s: default display is null", __func__);
7276-
return;
7273+
if (const auto display = FTL_FAKE_GUARD(mStateLock, getDisplayDeviceLocked(displayId))) {
7274+
if (display->isRefreshRateOverlayEnabled()) {
7275+
display->onVrrIdle(idle);
7276+
mScheduler->scheduleFrame();
7277+
}
72777278
}
7278-
if (!display->isRefreshRateOverlayEnabled()) return;
7279-
7280-
display->onVrrIdle(idle);
7281-
mScheduler->scheduleFrame();
72827279
}));
72837280
}
72847281

services/surfaceflinger/SurfaceFlinger.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ class SurfaceFlinger : public BnSurfaceComposer,
701701
Fps renderRate) override;
702702
void onCommitNotComposited() override
703703
REQUIRES(kMainThreadContext);
704-
void vrrDisplayIdle(bool idle) override;
704+
void vrrDisplayIdle(PhysicalDisplayId displayId, bool idle) override;
705705

706706
// ICEPowerCallback overrides:
707707
void notifyCpuLoadUp() override;

services/surfaceflinger/tests/unittests/mock/MockSchedulerCallback.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct SchedulerCallback final : ISchedulerCallback {
3030
MOCK_METHOD(void, onExpectedPresentTimePosted, (TimePoint, ftl::NonNull<DisplayModePtr>, Fps),
3131
(override));
3232
MOCK_METHOD(void, onCommitNotComposited, (), (override));
33-
MOCK_METHOD(void, vrrDisplayIdle, (bool), (override));
33+
MOCK_METHOD(void, vrrDisplayIdle, (PhysicalDisplayId, bool), (override));
3434
};
3535

3636
struct NoOpSchedulerCallback final : ISchedulerCallback {
@@ -40,7 +40,7 @@ struct NoOpSchedulerCallback final : ISchedulerCallback {
4040
void onChoreographerAttached() override {}
4141
void onExpectedPresentTimePosted(TimePoint, ftl::NonNull<DisplayModePtr>, Fps) override {}
4242
void onCommitNotComposited() override {}
43-
void vrrDisplayIdle(bool) override {}
43+
void vrrDisplayIdle(PhysicalDisplayId, bool) override {}
4444
};
4545

4646
} // namespace android::scheduler::mock

0 commit comments

Comments
 (0)