summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/SurfaceFlinger.cpp
diff options
context:
space:
mode:
author Andy Yu <chingtangyu@google.com> 2023-11-03 11:22:46 -0700
committer Andy Yu <chingtangyu@google.com> 2023-12-07 15:30:22 -0800
commit8c2703dfc85c911d28111f5b1e54ee8acb7fcbb2 (patch)
tree6c7477a49b2a721e8ab60c509e281c61bfec36be /services/surfaceflinger/SurfaceFlinger.cpp
parent926dbea7a7abef622dd3d5f73a3e07773450f073 (diff)
Refactor game-related frame rate override to LayerHistory
Previously game-related frame rate overrides are maintained in Scheduler only, which does not provide votes to the actual display refresh rate. This causes an issue that these overrides will only be viable when they are the divisors of the display refresh rate at the moment. This change moves the game intervention and newly-added game default frame rate overrides to LayerHistory, where overrides will be considered in layer frame rate votes. Scheduler will get this information and select the display frame rate accordingly Bug: 286084594 Test: SurfaceFlinger unit test atest LayerHistoryTest atest FrameRateOverrideMappingsTest atest CtsGraphicsTestCases --test-filter "SetFrameRateTest*" atest CtsFrameRateOverrideTestCases Change-Id: I9957af8e53fbdd44b8d70028572e6db8e779a1fe
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp30
1 files changed, 25 insertions, 5 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index c4de02fce9..8f26d16d45 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -8440,17 +8440,25 @@ const std::unordered_map<std::string, uint32_t>& SurfaceFlinger::getGenericLayer
return genericLayerMetadataKeyMap;
}
-status_t SurfaceFlinger::setOverrideFrameRate(uid_t uid, float frameRate) {
+status_t SurfaceFlinger::setGameModeFrameRateOverride(uid_t uid, float frameRate) {
PhysicalDisplayId displayId = [&]() {
Mutex::Autolock lock(mStateLock);
return getDefaultDisplayDeviceLocked()->getPhysicalId();
}();
- mScheduler->setGameModeRefreshRateForUid(FrameRateOverride{static_cast<uid_t>(uid), frameRate});
+ mScheduler->setGameModeFrameRateForUid(FrameRateOverride{static_cast<uid_t>(uid), frameRate});
mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId);
return NO_ERROR;
}
+status_t SurfaceFlinger::setGameDefaultFrameRateOverride(uid_t uid, float frameRate) {
+ if (FlagManager::getInstance().game_default_frame_rate()) {
+ mScheduler->setGameDefaultFrameRateForUid(
+ FrameRateOverride{static_cast<uid_t>(uid), frameRate});
+ }
+ return NO_ERROR;
+}
+
status_t SurfaceFlinger::updateSmallAreaDetection(
std::vector<std::pair<int32_t, float>>& appIdThresholdMappings) {
mScheduler->updateSmallAreaDetection(appIdThresholdMappings);
@@ -9800,13 +9808,25 @@ binder::Status SurfaceComposerAIDL::getDisplayDecorationSupport(
return binder::Status::ok();
}
-binder::Status SurfaceComposerAIDL::setOverrideFrameRate(int32_t uid, float frameRate) {
+binder::Status SurfaceComposerAIDL::setGameModeFrameRateOverride(int32_t uid, float frameRate) {
+ status_t status;
+ const int c_uid = IPCThreadState::self()->getCallingUid();
+ if (c_uid == AID_ROOT || c_uid == AID_SYSTEM) {
+ status = mFlinger->setGameModeFrameRateOverride(uid, frameRate);
+ } else {
+ ALOGE("setGameModeFrameRateOverride() permission denied for uid: %d", c_uid);
+ status = PERMISSION_DENIED;
+ }
+ return binderStatusFromStatusT(status);
+}
+
+binder::Status SurfaceComposerAIDL::setGameDefaultFrameRateOverride(int32_t uid, float frameRate) {
status_t status;
const int c_uid = IPCThreadState::self()->getCallingUid();
if (c_uid == AID_ROOT || c_uid == AID_SYSTEM) {
- status = mFlinger->setOverrideFrameRate(uid, frameRate);
+ status = mFlinger->setGameDefaultFrameRateOverride(uid, frameRate);
} else {
- ALOGE("setOverrideFrameRate() permission denied for uid: %d", c_uid);
+ ALOGE("setGameDefaultFrameRateOverride() permission denied for uid: %d", c_uid);
status = PERMISSION_DENIED;
}
return binderStatusFromStatusT(status);