diff options
| author | 2020-01-10 10:41:33 +0000 | |
|---|---|---|
| committer | 2020-01-10 10:41:33 +0000 | |
| commit | 828a3e2ba0b98992118e3039b30f535901731e8c (patch) | |
| tree | a87aa8fb6dd9b042dc8510bf84148ba06fdc41fe | |
| parent | 0d4d966e093bbd4cb64d18b4b4bc56ad74774024 (diff) | |
| parent | 090d42c752c3531ad69ec39bb876b1e1ba755a94 (diff) | |
Merge "SurfaceFlinger: use margin when comparing fps in PhaseOffsets"
| -rw-r--r-- | services/surfaceflinger/Scheduler/PhaseOffsets.cpp | 29 | ||||
| -rw-r--r-- | services/surfaceflinger/Scheduler/PhaseOffsets.h | 11 |
2 files changed, 25 insertions, 15 deletions
diff --git a/services/surfaceflinger/Scheduler/PhaseOffsets.cpp b/services/surfaceflinger/Scheduler/PhaseOffsets.cpp index 4330742bf1..13014c789b 100644 --- a/services/surfaceflinger/Scheduler/PhaseOffsets.cpp +++ b/services/surfaceflinger/Scheduler/PhaseOffsets.cpp @@ -31,6 +31,11 @@ std::optional<nsecs_t> getProperty(const char* name) { return std::nullopt; } +bool fpsEqualsWithMargin(float fpsA, float fpsB) { + static constexpr float MARGIN = 0.01f; + return std::abs(fpsA - fpsB) <= MARGIN; +} + } // namespace namespace android::scheduler { @@ -61,16 +66,15 @@ void PhaseOffsets::dump(std::string& result) const { mThresholdForNextVsync); } -std::unordered_map<float, PhaseDurations::Offsets> PhaseOffsets::initializeOffsets( +std::unordered_map<float, PhaseOffsets::Offsets> PhaseOffsets::initializeOffsets( const scheduler::RefreshRateConfigs& refreshRateConfigs) const { - std::unordered_map<float, PhaseDurations::Offsets> offsets; + std::unordered_map<float, Offsets> offsets; for (const auto& [ignored, refreshRate] : refreshRateConfigs.getAllRefreshRates()) { - const nsecs_t vsyncDuration = static_cast<nsecs_t>(1e9f / refreshRate.fps); if (refreshRate.fps > 65.0f) { - offsets.emplace(refreshRate.fps, getHighFpsOffsets(vsyncDuration)); + offsets.emplace(refreshRate.fps, getHighFpsOffsets(refreshRate.vsyncPeriod)); } else { - offsets.emplace(refreshRate.fps, getDefaultOffsets(vsyncDuration)); + offsets.emplace(refreshRate.fps, getDefaultOffsets(refreshRate.vsyncPeriod)); } } return offsets; @@ -150,6 +154,15 @@ PhaseOffsets::Offsets PhaseOffsets::getHighFpsOffsets(nsecs_t vsyncDuration) con }; } +PhaseOffsets::Offsets PhaseOffsets::getOffsetsForRefreshRate(float fps) const { + const auto iter = std::find_if(mOffsets.begin(), mOffsets.end(), + [&fps](const std::pair<float, Offsets>& candidateFps) { + return fpsEqualsWithMargin(fps, candidateFps.first); + }); + LOG_ALWAYS_FATAL_IF(iter == mOffsets.end()); + return iter->second; +} + static void validateSysprops() { const auto validatePropertyBool = [](const char* prop) { LOG_ALWAYS_FATAL_IF(!property_get_bool(prop, false), "%s is false", prop); @@ -207,7 +220,7 @@ static std::vector<float> getRefreshRatesFromConfigs( std::unordered_map<float, PhaseDurations::Offsets> PhaseDurations::initializeOffsets( const std::vector<float>& refreshRates) const { - std::unordered_map<float, PhaseDurations::Offsets> offsets; + std::unordered_map<float, Offsets> offsets; for (const auto fps : refreshRates) { const nsecs_t vsyncDuration = static_cast<nsecs_t>(1e9f / fps); @@ -275,7 +288,9 @@ PhaseDurations::PhaseDurations(const std::vector<float>& refreshRates, float cur mRefreshRateFps(currentFps) {} PhaseOffsets::Offsets PhaseDurations::getOffsetsForRefreshRate(float fps) const { - const auto iter = mOffsets.find(fps); + 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; } diff --git a/services/surfaceflinger/Scheduler/PhaseOffsets.h b/services/surfaceflinger/Scheduler/PhaseOffsets.h index c10efdee21..7b1bdfd36b 100644 --- a/services/surfaceflinger/Scheduler/PhaseOffsets.h +++ b/services/surfaceflinger/Scheduler/PhaseOffsets.h @@ -54,11 +54,7 @@ public: PhaseOffsets(const scheduler::RefreshRateConfigs&); // Returns early, early GL, and late offsets for Apps and SF for a given refresh rate. - Offsets getOffsetsForRefreshRate(float fps) const override { - const auto iter = mOffsets.find(fps); - LOG_ALWAYS_FATAL_IF(iter == mOffsets.end()); - return iter->second; - } + Offsets getOffsetsForRefreshRate(float fps) const override; // Returns early, early GL, and late offsets for Apps and SF. Offsets getCurrentOffsets() const override { return getOffsetsForRefreshRate(mRefreshRateFps); } @@ -71,7 +67,7 @@ public: void dump(std::string& result) const override; private: - std::unordered_map<float, PhaseOffsets::Offsets> initializeOffsets( + std::unordered_map<float, Offsets> initializeOffsets( const scheduler::RefreshRateConfigs&) const; Offsets getDefaultOffsets(nsecs_t vsyncDuration) const; Offsets getHighFpsOffsets(nsecs_t vsyncDuration) const; @@ -111,8 +107,7 @@ protected: nsecs_t sfEarlyGlDuration, nsecs_t appEarlyGlDuration); private: - std::unordered_map<float, PhaseDurations::Offsets> initializeOffsets( - const std::vector<float>&) const; + std::unordered_map<float, Offsets> initializeOffsets(const std::vector<float>&) const; const nsecs_t mSfDuration; const nsecs_t mAppDuration; |