summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2020-01-10 10:41:33 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-01-10 10:41:33 +0000
commit828a3e2ba0b98992118e3039b30f535901731e8c (patch)
treea87aa8fb6dd9b042dc8510bf84148ba06fdc41fe
parent0d4d966e093bbd4cb64d18b4b4bc56ad74774024 (diff)
parent090d42c752c3531ad69ec39bb876b1e1ba755a94 (diff)
Merge "SurfaceFlinger: use margin when comparing fps in PhaseOffsets"
-rw-r--r--services/surfaceflinger/Scheduler/PhaseOffsets.cpp29
-rw-r--r--services/surfaceflinger/Scheduler/PhaseOffsets.h11
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;