SurfaceFlinger: Add DISPLAY_EVENT_FRAME_RATE_OVERRIDE
Add a new event to DisplayEventReceiver that conveys a list
of apps whose frame rates have been overriden.
This event is processed by the DisplayManager to advertise the
new frame rate to the overridden app.
Change-Id: I89fce8b5b4d9db65ec5db7dd2393c384c0fcfd82
Bug: 169271059
Bug: 169271062
Bug: 170503758
Test: manual test using SF backdoor
diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp
index b872d7a..8b4283c 100644
--- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp
+++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp
@@ -687,21 +687,20 @@
return RefreshRateConfigs::KernelIdleTimerAction::TurnOn;
}
-void RefreshRateConfigs::setPreferredRefreshRateForUid(uid_t uid, float refreshRateHz) {
- if (refreshRateHz > 0 && refreshRateHz < 1) {
+void RefreshRateConfigs::setPreferredRefreshRateForUid(FrameRateOverride frameRateOverride) {
+ if (frameRateOverride.frameRateHz > 0 && frameRateOverride.frameRateHz < 1) {
return;
}
std::lock_guard lock(mLock);
- if (refreshRateHz != 0) {
- mPreferredRefreshRateForUid[uid] = refreshRateHz;
+ if (frameRateOverride.frameRateHz != 0) {
+ mPreferredRefreshRateForUid[frameRateOverride.uid] = frameRateOverride.frameRateHz;
} else {
- mPreferredRefreshRateForUid.erase(uid);
+ mPreferredRefreshRateForUid.erase(frameRateOverride.uid);
}
}
int RefreshRateConfigs::getRefreshRateDividerForUid(uid_t uid) const {
- constexpr float kThreshold = 0.1f;
std::lock_guard lock(mLock);
const auto iter = mPreferredRefreshRateForUid.find(uid);
@@ -709,6 +708,9 @@
return 1;
}
+ // This calculation needs to be in sync with the java code
+ // in DisplayManagerService.getDisplayInfoForFrameRateOverride
+ constexpr float kThreshold = 0.1f;
const auto refreshRateHz = iter->second;
const auto numPeriods = mCurrentRefreshRate->getFps() / refreshRateHz;
const auto numPeriodsRounded = std::round(numPeriods);
@@ -716,7 +718,19 @@
return 1;
}
- return static_cast<int>(numPeriods);
+ return static_cast<int>(numPeriodsRounded);
+}
+
+std::vector<FrameRateOverride> RefreshRateConfigs::getFrameRateOverrides() {
+ std::lock_guard lock(mLock);
+ std::vector<FrameRateOverride> overrides;
+ overrides.reserve(mPreferredRefreshRateForUid.size());
+
+ for (const auto [uid, frameRate] : mPreferredRefreshRateForUid) {
+ overrides.emplace_back(FrameRateOverride{uid, frameRate});
+ }
+
+ return overrides;
}
void RefreshRateConfigs::dump(std::string& result) const {