[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.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