[SF] Kernel idle timer configuration
This change configures the kernel idle timer using the composer3 HAL APIs.
BUG: 198808492
Test: atest libsurfaceflinger_unittest
Change-Id: I7de140c3094cb84c8efe782c19c98e126cb4c60b
diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp
index 15e30b3..65c8613 100644
--- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp
+++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp
@@ -670,9 +670,9 @@
}
void RefreshRateConfigs::initializeIdleTimer() {
- if (mConfig.idleTimerTimeoutMs > 0) {
+ if (mConfig.idleTimerTimeout > 0ms) {
mIdleTimer.emplace(
- "IdleTimer", std::chrono::milliseconds(mConfig.idleTimerTimeoutMs),
+ "IdleTimer", mConfig.idleTimerTimeout,
[this] {
std::scoped_lock lock(mIdleTimerCallbacksMutex);
if (const auto callbacks = getIdleTimerCallbacks()) {
@@ -963,12 +963,24 @@
base::StringAppendF(&result, "Supports Frame Rate Override By Content: %s\n",
mSupportsFrameRateOverrideByContent ? "yes" : "no");
- base::StringAppendF(&result, "Idle timer: (%s) %s\n",
- mConfig.supportKernelIdleTimer ? "kernel" : "platform",
- mIdleTimer ? mIdleTimer->dump().c_str() : "off");
+ base::StringAppendF(&result, "Idle timer: ");
+ if (mConfig.kernelIdleTimerController.has_value()) {
+ if (mConfig.kernelIdleTimerController == KernelIdleTimerController::Sysprop) {
+ base::StringAppendF(&result, "(kernel(sysprop))");
+ } else {
+ base::StringAppendF(&result, "(kernel(hwc))");
+ }
+ } else {
+ base::StringAppendF(&result, "(platform)");
+ }
+ base::StringAppendF(&result, " %s\n", mIdleTimer ? mIdleTimer->dump().c_str() : "off");
result.append("\n");
}
+std::chrono::milliseconds RefreshRateConfigs::getIdleTimerTimeout() {
+ return mConfig.idleTimerTimeout;
+}
+
} // namespace android::scheduler
// TODO(b/129481165): remove the #pragma below and fix conversion issues
diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.h b/services/surfaceflinger/Scheduler/RefreshRateConfigs.h
index 14583e3..30d3edd 100644
--- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.h
+++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.h
@@ -272,6 +272,8 @@
// Returns a known frame rate that is the closest to frameRate
Fps findClosestKnownFrameRate(Fps frameRate) const;
+ enum class KernelIdleTimerController { Sysprop, HwcApi };
+
// Configuration flags.
struct Config {
bool enableFrameRateOverride = false;
@@ -282,17 +284,18 @@
int frameRateMultipleThreshold = 0;
// The Idle Timer timeout. 0 timeout means no idle timer.
- int32_t idleTimerTimeoutMs = 0;
+ std::chrono::milliseconds idleTimerTimeout = 0ms;
- // Whether to use idle timer callbacks that support the kernel timer.
- bool supportKernelIdleTimer = false;
+ // The controller representing how the kernel idle timer will be configured
+ // either on the HWC api or sysprop.
+ std::optional<KernelIdleTimerController> kernelIdleTimerController;
};
RefreshRateConfigs(const DisplayModes&, DisplayModeId,
Config config = {.enableFrameRateOverride = false,
.frameRateMultipleThreshold = 0,
- .idleTimerTimeoutMs = 0,
- .supportKernelIdleTimer = false});
+ .idleTimerTimeout = 0ms,
+ .kernelIdleTimerController = {}});
RefreshRateConfigs(const RefreshRateConfigs&) = delete;
RefreshRateConfigs& operator=(const RefreshRateConfigs&) = delete;
@@ -310,6 +313,7 @@
TurnOff, // Turn off the idle timer.
TurnOn // Turn on the idle timer.
};
+
// Checks whether kernel idle timer should be active depending the policy decisions around
// refresh rates.
KernelIdleTimerAction getIdleTimerAction() const;
@@ -332,7 +336,9 @@
Fps displayFrameRate, GlobalSignals) const
EXCLUDES(mLock);
- bool supportsKernelIdleTimer() const { return mConfig.supportKernelIdleTimer; }
+ std::optional<KernelIdleTimerController> kernelIdleTimerController() {
+ return mConfig.kernelIdleTimerController;
+ }
struct IdleTimerCallbacks {
struct Callbacks {
@@ -370,7 +376,7 @@
if (!mIdleTimer) {
return;
}
- if (kernelOnly && !mConfig.supportKernelIdleTimer) {
+ if (kernelOnly && !mConfig.kernelIdleTimerController.has_value()) {
return;
}
mIdleTimer->reset();
@@ -378,6 +384,8 @@
void dump(std::string& result) const EXCLUDES(mLock);
+ std::chrono::milliseconds getIdleTimerTimeout();
+
private:
friend struct TestableRefreshRateConfigs;
@@ -437,8 +445,8 @@
std::optional<IdleTimerCallbacks::Callbacks> getIdleTimerCallbacks() const
REQUIRES(mIdleTimerCallbacksMutex) {
if (!mIdleTimerCallbacks) return {};
- return mConfig.supportKernelIdleTimer ? mIdleTimerCallbacks->kernel
- : mIdleTimerCallbacks->platform;
+ return mConfig.kernelIdleTimerController.has_value() ? mIdleTimerCallbacks->kernel
+ : mIdleTimerCallbacks->platform;
}
// The list of refresh rates, indexed by display modes ID. This may change after this