SurfaceFlinger: override frame rate for applications that use setFrameRate
(Uploaded again with a fix for b/176299745)
When possible, override the frame rate of an app if it explicitly
set a preferred frame rate.
Test: atest FrameRateOverrideHostTest
Test: SF unit tests
Bug: 170502573
Change-Id: I84a5a99f439ec7a8a808a0b26c630d4344acca4f
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index f1306e7..5d08328 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2890,12 +2890,21 @@
Scheduler::ConfigEvent event) {
// If this is called from the main thread mStateLock must be locked before
// Currently the only way to call this function from the main thread is from
- // Sheduler::chooseRefreshRateForContent
+ // Scheduler::chooseRefreshRateForContent
ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
changeRefreshRateLocked(refreshRate, event);
}
+void SurfaceFlinger::triggerOnFrameRateOverridesChanged() {
+ PhysicalDisplayId displayId = [&]() {
+ ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
+ return getDefaultDisplayDeviceLocked()->getPhysicalId();
+ }();
+
+ mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId);
+}
+
void SurfaceFlinger::initScheduler(PhysicalDisplayId primaryDisplayId) {
if (mScheduler) {
// In practice it's not allowed to hotplug in/out the primary display once it's been
@@ -5364,11 +5373,8 @@
auto inUid = static_cast<uid_t>(data.readInt32());
const auto refreshRate = data.readFloat();
- mRefreshRateConfigs->setPreferredRefreshRateForUid(
- FrameRateOverride{inUid, refreshRate});
- const auto mappings = mRefreshRateConfigs->getFrameRateOverrides();
- mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId,
- std::move(mappings));
+ mScheduler->setPreferredRefreshRateForUid(FrameRateOverride{inUid, refreshRate});
+ mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId);
return NO_ERROR;
}
}