Loading services/surfaceflinger/Scheduler/PhaseOffsets.cpp +20 −9 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -159,10 +164,17 @@ 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()); 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() { const auto validatePropertyBool = [](const char* prop) { LOG_ALWAYS_FATAL_IF(!property_get_bool(prop, false), "%s is false", prop); Loading Loading @@ -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)); Loading services/surfaceflinger/Scheduler/PhaseOffsets.h +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
services/surfaceflinger/Scheduler/PhaseOffsets.cpp +20 −9 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -159,10 +164,17 @@ 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()); 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() { const auto validatePropertyBool = [](const char* prop) { LOG_ALWAYS_FATAL_IF(!property_get_bool(prop, false), "%s is false", prop); Loading Loading @@ -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)); Loading
services/surfaceflinger/Scheduler/PhaseOffsets.h +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading