diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-09-20 04:44:59 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-09-20 04:44:59 +0000 |
commit | 3c08ac0128dfc3610ed955f2034ba0b4a2ebd5fd (patch) | |
tree | 696b345d3f64b408e688eb84e7f33a61ac73e34c | |
parent | 2ecc49bcc462310d2adb7c885688e82a7f21c7c1 (diff) | |
parent | db3c96003d465b2d32e690dfac340729d02c6039 (diff) | |
download | native-android10-c2f2-s1-release.tar.gz |
Merge cherrypicks of [9428684, 9428685, 9428686, 9428687, 9428607, 9428608, 9428514, 9428272, 9428273, 9428275, 9428276, 9428277, 9428278, 9428689, 9428690, 9428691, 9428478, 9428702, 9428692, 9428479, 9428720, 9428721, 9428722, 9428723, 9428703, 9426151, 9428693, 9428724, 9428725, 9428726, 9428727, 9428728, 9428729, 9428730, 9428731, 9428732, 9428733, 9428734, 9428704, 9428609, 9428610, 9428611, 9428612, 9428613, 9428614, 9428615, 9426152, 9426153, 9426154, 9426155, 9426156, 9426157, 9426158, 9426159, 9428740, 9428409, 9428694, 9428695, 9428735] into sparse-5888870-L93800000368094851android-10.0.0_r12android10-c2f2-s1-release
Change-Id: I76ea51b3f5022c6f44d291a3c829a31c09d2532c
-rw-r--r-- | services/surfaceflinger/Scheduler/Scheduler.cpp | 8 | ||||
-rw-r--r-- | services/surfaceflinger/Scheduler/Scheduler.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 46 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 3 |
4 files changed, 47 insertions, 13 deletions
diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp index a194106112..5a98232e97 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.cpp +++ b/services/surfaceflinger/Scheduler/Scheduler.cpp @@ -274,7 +274,7 @@ ResyncCallback Scheduler::makeResyncCallback(GetVsyncPeriod&& getVsyncPeriod) { } void Scheduler::VsyncState::resync(const GetVsyncPeriod& getVsyncPeriod) { - static constexpr nsecs_t kIgnoreDelay = ms2ns(500); + static constexpr nsecs_t kIgnoreDelay = ms2ns(750); const nsecs_t now = systemTime(); const nsecs_t last = lastResyncTime.exchange(now); @@ -567,6 +567,7 @@ Scheduler::RefreshRateType Scheduler::calculateRefreshRateType() { } // Content detection is on, find the appropriate refresh rate with minimal error + // TODO(b/139751853): Scan allowed refresh rates only (SurfaceFlinger::mAllowedDisplayConfigs) auto iter = min_element(mRefreshRateConfigs.getRefreshRates().cbegin(), mRefreshRateConfigs.getRefreshRates().cend(), [rate = mContentRefreshRate](const auto& l, const auto& r) -> bool { @@ -596,6 +597,11 @@ Scheduler::RefreshRateType Scheduler::calculateRefreshRateType() { return currRefreshRateType; } +Scheduler::RefreshRateType Scheduler::getPreferredRefreshRateType() { + std::lock_guard<std::mutex> lock(mFeatureStateLock); + return mRefreshRateType; +} + void Scheduler::changeRefreshRate(RefreshRateType refreshRateType, ConfigEvent configEvent) { std::lock_guard<std::mutex> lock(mCallbackLock); if (mChangeRefreshRateCallback) { diff --git a/services/surfaceflinger/Scheduler/Scheduler.h b/services/surfaceflinger/Scheduler/Scheduler.h index 5d8bb4cd2f..38184570c1 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.h +++ b/services/surfaceflinger/Scheduler/Scheduler.h @@ -189,6 +189,9 @@ public: // calls DispSync::dump() on primary disp sync void dumpPrimaryDispSync(std::string& result) const; + // Get the appropriate refresh type for current conditions. + RefreshRateType getPreferredRefreshRateType(); + protected: virtual std::unique_ptr<EventThread> makeEventThread( const char* connectionName, DispSync* dispSync, nsecs_t phaseOffsetNs, diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index b31bc3813a..ffb7012bb3 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -6169,25 +6169,47 @@ void SurfaceFlinger::traverseLayersInDisplay(const sp<const DisplayDevice>& disp } } +void SurfaceFlinger::setPreferredDisplayConfig() { + const auto& type = mScheduler->getPreferredRefreshRateType(); + const auto& config = mRefreshRateConfigs.getRefreshRate(type); + if (config && isDisplayConfigAllowed(config->configId)) { + ALOGV("switching to Scheduler preferred config %d", config->configId); + setDesiredActiveConfig({type, config->configId, Scheduler::ConfigEvent::Changed}); + } else { + // Set the highest allowed config by iterating backwards on available refresh rates + const auto& refreshRates = mRefreshRateConfigs.getRefreshRates(); + for (auto iter = refreshRates.crbegin(); iter != refreshRates.crend(); ++iter) { + if (iter->second && isDisplayConfigAllowed(iter->second->configId)) { + ALOGV("switching to allowed config %d", iter->second->configId); + setDesiredActiveConfig({iter->first, iter->second->configId, + Scheduler::ConfigEvent::Changed}); + } + } + } +} + void SurfaceFlinger::setAllowedDisplayConfigsInternal(const sp<DisplayDevice>& display, const std::vector<int32_t>& allowedConfigs) { if (!display->isPrimary()) { return; } - ALOGV("Updating allowed configs"); - mAllowedDisplayConfigs = DisplayConfigs(allowedConfigs.begin(), allowedConfigs.end()); - - // Set the highest allowed config by iterating backwards on available refresh rates - const auto& refreshRates = mRefreshRateConfigs.getRefreshRates(); - for (auto iter = refreshRates.crbegin(); iter != refreshRates.crend(); ++iter) { - if (iter->second && isDisplayConfigAllowed(iter->second->configId)) { - ALOGV("switching to config %d", iter->second->configId); - setDesiredActiveConfig( - {iter->first, iter->second->configId, Scheduler::ConfigEvent::Changed}); - break; - } + const auto allowedDisplayConfigs = DisplayConfigs(allowedConfigs.begin(), + allowedConfigs.end()); + if (allowedDisplayConfigs == mAllowedDisplayConfigs) { + return; } + + ALOGV("Updating allowed configs"); + mAllowedDisplayConfigs = std::move(allowedDisplayConfigs); + + // TODO(b/140204874): This hack triggers a notification that something has changed, so + // that listeners that care about a change in allowed configs can get the notification. + // Giving current ActiveConfig so that most other listeners would just drop the event + mScheduler->onConfigChanged(mAppConnectionHandle, display->getId()->value, + display->getActiveConfig()); + + setPreferredDisplayConfig(); } status_t SurfaceFlinger::setAllowedDisplayConfigs(const sp<IBinder>& displayToken, diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 0c6da0077f..a59a1e0086 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -534,6 +534,9 @@ private: // called on the main thread in response to setPowerMode() void setPowerModeInternal(const sp<DisplayDevice>& display, int mode) REQUIRES(mStateLock); + // Query the Scheduler or allowed display configs list for a matching config, and set it + void setPreferredDisplayConfig() REQUIRES(mStateLock); + // called on the main thread in response to setAllowedDisplayConfigs() void setAllowedDisplayConfigsInternal(const sp<DisplayDevice>& display, const std::vector<int32_t>& allowedConfigs) |