Skip to content

Commit 68e90f1

Browse files
committed
DO NOT MERGE Extend mPreviousPresentFences for high refresh rate
To provide hardware enough time to display a frame under high refresh rate with long sf-duration, we extend mPreviousPresentFences by storing extra slots. We check proper present fence at different moment according to vsync period and sf-duration. Bug: 241193992 Bug: 361005063 Change-Id: Ibe9b06e590ed420f29c790188dee11674fca5a2e Merged-In: Ib603c0fd29a3e4cb2fcd99dca59bbd5bfb55a787
1 parent 0ba3f3e commit 68e90f1

2 files changed

Lines changed: 22 additions & 5 deletions

File tree

services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ class FrameTarget {
106106
FenceTimePtr fenceTime = FenceTime::NO_FENCE;
107107
TimePoint expectedPresentTime = TimePoint();
108108
};
109-
std::array<FenceWithFenceTime, 2> mPresentFences;
109+
// size should be longest sf-duration / shortest vsync period and round up
110+
std::array<FenceWithFenceTime, 5> mPresentFences; // currently consider 166hz.
110111
utils::RingBuffer<FenceWithFenceTime, 5> mFenceWithFenceTimes;
111112

112113
TimePoint mLastSignaledFrameTime;
@@ -131,6 +132,18 @@ class FrameTarget {
131132
}
132133
return pastFenceTimePtr;
133134
}
135+
136+
size_t getPresentFenceShift(Period minFramePeriod) const {
137+
const bool isTwoVsyncsAhead = targetsVsyncsAhead<2>(minFramePeriod);
138+
size_t shift = 0;
139+
if (isTwoVsyncsAhead) {
140+
shift = static_cast<size_t>(expectedFrameDuration().ns() / minFramePeriod.ns());
141+
if (shift >= mPresentFences.size()) {
142+
shift = mPresentFences.size() - 1;
143+
}
144+
}
145+
return shift;
146+
}
134147
};
135148

136149
// Computes a display's per-frame metrics about past/upcoming targeting of present deadlines.

services/surfaceflinger/Scheduler/src/FrameTargeter.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,18 @@ FrameTarget::FrameTarget(const std::string& displayLabel)
3030

3131
TimePoint FrameTarget::pastVsyncTime(Period minFramePeriod) const {
3232
// TODO(b/267315508): Generalize to N VSYNCs.
33-
const int shift = static_cast<int>(targetsVsyncsAhead<2>(minFramePeriod));
33+
const size_t shift = getPresentFenceShift(minFramePeriod);
3434
return mExpectedPresentTime - Period::fromNs(minFramePeriod.ns() << shift);
3535
}
3636

3737
FenceTimePtr FrameTarget::presentFenceForPastVsync(Period minFramePeriod) const {
3838
if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) {
3939
return pastVsyncTimePtr();
4040
}
41-
const size_t i = static_cast<size_t>(targetsVsyncsAhead<2>(minFramePeriod));
42-
return mPresentFences[i].fenceTime;
41+
42+
const size_t shift = getPresentFenceShift(minFramePeriod);
43+
ATRACE_FORMAT("mPresentFences shift=%zu", shift);
44+
return mPresentFences[shift].fenceTime;
4345
}
4446

4547
bool FrameTarget::wouldPresentEarly(Period minFramePeriod) const {
@@ -151,7 +153,9 @@ FenceTimePtr FrameTargeter::setPresentFence(sp<Fence> presentFence, FenceTimePtr
151153
if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) {
152154
addFence(std::move(presentFence), presentFenceTime, mExpectedPresentTime);
153155
} else {
154-
mPresentFences[1] = mPresentFences[0];
156+
for (size_t i = mPresentFences.size()-1; i >= 1; i--) {
157+
mPresentFences[i] = mPresentFences[i-1];
158+
}
155159
mPresentFences[0] = {std::move(presentFence), presentFenceTime, mExpectedPresentTime};
156160
}
157161
return presentFenceTime;

0 commit comments

Comments
 (0)