diff options
| -rw-r--r-- | services/surfaceflinger/Scheduler/PhaseOffsets.cpp | 74 | ||||
| -rw-r--r-- | services/surfaceflinger/Scheduler/PhaseOffsets.h | 1 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 7 |
3 files changed, 41 insertions, 41 deletions
diff --git a/services/surfaceflinger/Scheduler/PhaseOffsets.cpp b/services/surfaceflinger/Scheduler/PhaseOffsets.cpp index 106aa9bccb..896c2a55ac 100644 --- a/services/surfaceflinger/Scheduler/PhaseOffsets.cpp +++ b/services/surfaceflinger/Scheduler/PhaseOffsets.cpp @@ -209,6 +209,32 @@ static nsecs_t appDurationToOffset(nsecs_t appDuration, nsecs_t sfDuration, nsec : vsyncDuration - (appDuration + sfDuration) % vsyncDuration; } +PhaseDurations::Offsets PhaseDurations::constructOffsets(nsecs_t vsyncDuration) const { + return Offsets{ + { + mSfEarlyDuration < vsyncDuration + ? sfDurationToOffset(mSfEarlyDuration, vsyncDuration) + : sfDurationToOffset(mSfEarlyDuration, vsyncDuration) - vsyncDuration, + + appDurationToOffset(mAppEarlyDuration, mSfEarlyDuration, vsyncDuration), + }, + { + mSfEarlyGlDuration < vsyncDuration + ? sfDurationToOffset(mSfEarlyGlDuration, vsyncDuration) + : sfDurationToOffset(mSfEarlyGlDuration, vsyncDuration) - vsyncDuration, + + appDurationToOffset(mAppEarlyGlDuration, mSfEarlyGlDuration, vsyncDuration), + }, + { + mSfDuration < vsyncDuration + ? sfDurationToOffset(mSfDuration, vsyncDuration) + : sfDurationToOffset(mSfDuration, vsyncDuration) - vsyncDuration, + + appDurationToOffset(mAppDuration, mSfDuration, vsyncDuration), + }, + }; +} + static std::vector<float> getRefreshRatesFromConfigs( const android::scheduler::RefreshRateConfigs& refreshRateConfigs) { const auto& allRefreshRates = refreshRateConfigs.getAllRefreshRates(); @@ -227,41 +253,7 @@ std::unordered_map<float, PhaseDurations::Offsets> PhaseDurations::initializeOff std::unordered_map<float, Offsets> offsets; for (const auto fps : refreshRates) { - const nsecs_t vsyncDuration = static_cast<nsecs_t>(1e9f / fps); - offsets.emplace(fps, - Offsets{ - { - mSfEarlyDuration < vsyncDuration - ? sfDurationToOffset(mSfEarlyDuration, - vsyncDuration) - : sfDurationToOffset(mSfEarlyDuration, - vsyncDuration) - - vsyncDuration, - - appDurationToOffset(mAppEarlyDuration, mSfEarlyDuration, - vsyncDuration), - }, - { - mSfEarlyGlDuration < vsyncDuration - ? sfDurationToOffset(mSfEarlyGlDuration, - vsyncDuration) - : sfDurationToOffset(mSfEarlyGlDuration, - vsyncDuration) - - vsyncDuration, - - appDurationToOffset(mAppEarlyGlDuration, mSfEarlyGlDuration, - vsyncDuration), - }, - { - mSfDuration < vsyncDuration - ? sfDurationToOffset(mSfDuration, vsyncDuration) - : sfDurationToOffset(mSfDuration, vsyncDuration) - - vsyncDuration, - - appDurationToOffset(mAppDuration, mSfDuration, - vsyncDuration), - }, - }); + offsets.emplace(fps, constructOffsets(static_cast<nsecs_t>(1e9f / fps))); } return offsets; } @@ -295,8 +287,16 @@ PhaseOffsets::Offsets PhaseDurations::getOffsetsForRefreshRate(float fps) const const auto iter = std::find_if(mOffsets.begin(), mOffsets.end(), [=](const auto& candidateFps) { return fpsEqualsWithMargin(fps, candidateFps.first); }); - LOG_ALWAYS_FATAL_IF(iter == mOffsets.end()); - return iter->second; + + if (iter != mOffsets.end()) { + return iter->second; + } + + // Unknown refresh rate. This might happen if we get a hotplug event for the default display. + // This happens only during tests and not during regular device operation. + // In this case just construct the offset. + ALOGW("Can't find offset for %.2f fps", fps); + return constructOffsets(static_cast<nsecs_t>(1e9f / fps)); } void PhaseDurations::dump(std::string& result) const { diff --git a/services/surfaceflinger/Scheduler/PhaseOffsets.h b/services/surfaceflinger/Scheduler/PhaseOffsets.h index 7b1bdfd36b..b7d4eae5b6 100644 --- a/services/surfaceflinger/Scheduler/PhaseOffsets.h +++ b/services/surfaceflinger/Scheduler/PhaseOffsets.h @@ -108,6 +108,7 @@ protected: private: std::unordered_map<float, Offsets> initializeOffsets(const std::vector<float>&) const; + PhaseDurations::Offsets constructOffsets(nsecs_t vsyncDuration) const; const nsecs_t mSfDuration; const nsecs_t mAppDuration; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 6d18922a78..b9c95257ba 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -5600,11 +5600,10 @@ status_t SurfaceFlinger::setDesiredDisplayConfigSpecsInternal(const sp<DisplayDe repaintEverythingForHWC(); } - auto configId = HwcConfigIndexType(defaultConfig); - display->setActiveConfig(configId); + display->setActiveConfig(defaultConfig); const nsecs_t vsyncPeriod = - mRefreshRateConfigs->getRefreshRateFromConfigId(configId).vsyncPeriod; - mScheduler->onConfigChanged(mAppConnectionHandle, display->getId()->value, configId, + getHwComposer().getConfigs(*displayId)[defaultConfig.value()]->getVsyncPeriod(); + mScheduler->onConfigChanged(mAppConnectionHandle, display->getId()->value, defaultConfig, vsyncPeriod); return NO_ERROR; } |