diff options
| -rw-r--r-- | services/surfaceflinger/Scheduler/PhaseOffsets.cpp | 29 | ||||
| -rw-r--r-- | services/surfaceflinger/Scheduler/PhaseOffsets.h | 5 |
2 files changed, 23 insertions, 11 deletions
diff --git a/services/surfaceflinger/Scheduler/PhaseOffsets.cpp b/services/surfaceflinger/Scheduler/PhaseOffsets.cpp index c04447d106..7941cda6ef 100644 --- a/services/surfaceflinger/Scheduler/PhaseOffsets.cpp +++ b/services/surfaceflinger/Scheduler/PhaseOffsets.cpp @@ -71,15 +71,20 @@ std::unordered_map<float, PhaseOffsets::Offsets> PhaseOffsets::initializeOffsets std::unordered_map<float, Offsets> offsets; for (const auto& [ignored, refreshRate] : refreshRateConfigs.getAllRefreshRates()) { - if (refreshRate->fps > 65.0f) { - offsets.emplace(refreshRate->fps, getHighFpsOffsets(refreshRate->vsyncPeriod)); - } else { - offsets.emplace(refreshRate->fps, getDefaultOffsets(refreshRate->vsyncPeriod)); - } + const float fps = refreshRate->fps; + offsets.emplace(fps, getPhaseOffsets(fps, refreshRate->vsyncPeriod)); } return offsets; } +PhaseOffsets::Offsets PhaseOffsets::getPhaseOffsets(float fps, nsecs_t vsyncPeriod) const { + if (fps > 65.0f) { + return getHighFpsOffsets(vsyncPeriod); + } else { + return getDefaultOffsets(vsyncPeriod); + } +} + PhaseOffsets::Offsets PhaseOffsets::getDefaultOffsets(nsecs_t vsyncDuration) const { const int64_t vsyncPhaseOffsetNs = sysprop::vsync_event_phase_offset_ns(1000000); const int64_t sfVsyncPhaseOffsetNs = sysprop::vsync_sf_event_phase_offset_ns(1000000); @@ -159,8 +164,15 @@ PhaseOffsets::Offsets PhaseOffsets::getOffsetsForRefreshRate(float fps) const { [&fps](const std::pair<float, Offsets>& 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 an external display. + // In this case just construct the offset. + ALOGW("Can't find offset for %.2f fps", fps); + return getPhaseOffsets(fps, static_cast<nsecs_t>(1e9f / fps)); } static void validateSysprops() { @@ -288,8 +300,7 @@ PhaseOffsets::Offsets PhaseDurations::getOffsetsForRefreshRate(float fps) const 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. + // Unknown refresh rate. This might happen if we get a hotplug event for an external display. // In this case just construct the offset. ALOGW("Can't find offset for %.2f fps", fps); return constructOffsets(static_cast<nsecs_t>(1e9f / fps)); diff --git a/services/surfaceflinger/Scheduler/PhaseOffsets.h b/services/surfaceflinger/Scheduler/PhaseOffsets.h index b7d4eae5b6..208f06b185 100644 --- a/services/surfaceflinger/Scheduler/PhaseOffsets.h +++ b/services/surfaceflinger/Scheduler/PhaseOffsets.h @@ -69,8 +69,9 @@ public: private: std::unordered_map<float, Offsets> initializeOffsets( const scheduler::RefreshRateConfigs&) const; - Offsets getDefaultOffsets(nsecs_t vsyncDuration) const; - Offsets getHighFpsOffsets(nsecs_t vsyncDuration) const; + Offsets getDefaultOffsets(nsecs_t vsyncPeriod) const; + Offsets getHighFpsOffsets(nsecs_t vsyncPeriod) const; + Offsets getPhaseOffsets(float fps, nsecs_t vsyncPeriod) const; const nsecs_t mThresholdForNextVsync; const std::unordered_map<float, Offsets> mOffsets; |