SF: Move toggleKernelIdleTimer to DMC
Remove a special case for the default display by tracking the enabled
state per display.
Bug: 241285876
Bug: 355424160
Flag: EXEMPT refactor
Test: presubmit
Change-Id: Ife697e9f31bdf833910132fb0a71918b29c350eb
diff --git a/services/surfaceflinger/Display/DisplayModeController.cpp b/services/surfaceflinger/Display/DisplayModeController.cpp
index c43d585..0e9218c 100644
--- a/services/surfaceflinger/Display/DisplayModeController.cpp
+++ b/services/surfaceflinger/Display/DisplayModeController.cpp
@@ -22,7 +22,9 @@
#include "Display/DisplaySnapshot.h"
#include "DisplayHardware/HWComposer.h"
+#include <android-base/properties.h>
#include <common/FlagManager.h>
+#include <common/trace.h>
#include <ftl/concat.h>
#include <ftl/expected.h>
#include <log/log.h>
@@ -237,4 +239,63 @@
}
}
+void DisplayModeController::updateKernelIdleTimer(PhysicalDisplayId displayId) {
+ std::lock_guard lock(mDisplayLock);
+ const auto& displayPtr = FTL_TRY(mDisplays.get(displayId).ok_or(ftl::Unit())).get();
+
+ const auto controllerOpt = displayPtr->selectorPtr->kernelIdleTimerController();
+ if (!controllerOpt) return;
+
+ using KernelIdleTimerAction = scheduler::RefreshRateSelector::KernelIdleTimerAction;
+
+ switch (displayPtr->selectorPtr->getIdleTimerAction()) {
+ case KernelIdleTimerAction::TurnOff:
+ if (displayPtr->isKernelIdleTimerEnabled) {
+ SFTRACE_INT("KernelIdleTimer", 0);
+ updateKernelIdleTimer(displayId, std::chrono::milliseconds::zero(), *controllerOpt);
+ displayPtr->isKernelIdleTimerEnabled = false;
+ }
+ break;
+ case KernelIdleTimerAction::TurnOn:
+ if (!displayPtr->isKernelIdleTimerEnabled) {
+ SFTRACE_INT("KernelIdleTimer", 1);
+ const auto timeout = displayPtr->selectorPtr->getIdleTimerTimeout();
+ updateKernelIdleTimer(displayId, timeout, *controllerOpt);
+ displayPtr->isKernelIdleTimerEnabled = true;
+ }
+ break;
+ }
+}
+
+void DisplayModeController::updateKernelIdleTimer(PhysicalDisplayId displayId,
+ std::chrono::milliseconds timeout,
+ KernelIdleTimerController controller) {
+ switch (controller) {
+ case KernelIdleTimerController::HwcApi:
+ mComposerPtr->setIdleTimerEnabled(displayId, timeout);
+ break;
+
+ case KernelIdleTimerController::Sysprop:
+ using namespace std::string_literals;
+ base::SetProperty("graphics.display.kernel_idle_timer.enabled"s,
+ timeout > std::chrono::milliseconds::zero() ? "true"s : "false"s);
+ break;
+ }
+}
+
+auto DisplayModeController::getKernelIdleTimerState(PhysicalDisplayId displayId) const
+ -> KernelIdleTimerState {
+ std::lock_guard lock(mDisplayLock);
+ const auto& displayPtr =
+ FTL_EXPECT(mDisplays.get(displayId).ok_or(KernelIdleTimerState())).get();
+
+ const auto desiredModeIdOpt =
+ (std::scoped_lock(displayPtr->desiredModeLock), displayPtr->desiredModeOpt)
+ .transform([](const display::DisplayModeRequest& request) {
+ return request.mode.modePtr->getId();
+ });
+
+ return {desiredModeIdOpt, displayPtr->isKernelIdleTimerEnabled};
+}
+
} // namespace android::display