Skip to content

Commit 73e9ae3

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: Id44127cb9391799b17834cff0b2e637f273ee2d1
1 parent 7e84455 commit 73e9ae3

2 files changed

Lines changed: 24 additions & 5 deletions

File tree

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

Lines changed: 2 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;

services/surfaceflinger/Scheduler/src/FrameTargeter.cpp

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@
2020
#include <scheduler/FrameTargeter.h>
2121
#include <scheduler/IVsyncSource.h>
2222

23+
namespace {
24+
size_t getPresentFenceShift(Period minFramePeriod) {
25+
const bool isTwoVsyncsAhead = targetsVsyncsAhead<2>(minFramePeriod);
26+
size_t shift = 0;
27+
if (isTwoVsyncsAhead) {
28+
shift = static_cast<size_t>(expectedFrameDuration.ns() / minFramePeriod.ns());
29+
if (shift >= mPresentFences.size()) {
30+
shift = mPresentFences.size() - 1;
31+
}
32+
}
33+
return shift;
34+
}
35+
} // namespace
36+
2337
namespace android::scheduler {
2438

2539
FrameTarget::FrameTarget(const std::string& displayLabel)
@@ -30,16 +44,18 @@ FrameTarget::FrameTarget(const std::string& displayLabel)
3044

3145
TimePoint FrameTarget::pastVsyncTime(Period minFramePeriod) const {
3246
// TODO(b/267315508): Generalize to N VSYNCs.
33-
const int shift = static_cast<int>(targetsVsyncsAhead<2>(minFramePeriod));
47+
const size_t shift = getPresentFenceShift(minFramePeriod);
3448
return mExpectedPresentTime - Period::fromNs(minFramePeriod.ns() << shift);
3549
}
3650

3751
FenceTimePtr FrameTarget::presentFenceForPastVsync(Period minFramePeriod) const {
3852
if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) {
3953
return pastVsyncTimePtr();
4054
}
41-
const size_t i = static_cast<size_t>(targetsVsyncsAhead<2>(minFramePeriod));
42-
return mPresentFences[i].fenceTime;
55+
56+
const size_t shift = getPresentFenceShift(minFramePeriod);
57+
ATRACE_FORMAT("mPresentFences shift=%zu", shift);
58+
return mPresentFences[shift].fenceTime;
4359
}
4460

4561
bool FrameTarget::wouldPresentEarly(Period minFramePeriod) const {
@@ -151,7 +167,9 @@ FenceTimePtr FrameTargeter::setPresentFence(sp<Fence> presentFence, FenceTimePtr
151167
if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) {
152168
addFence(std::move(presentFence), presentFenceTime, mExpectedPresentTime);
153169
} else {
154-
mPresentFences[1] = mPresentFences[0];
170+
for (size_t i = mPreviousPresentFences.size()-1; i >= 1; i--) {
171+
mPresentFences[i] = mPresentFences[i-1];
172+
}
155173
mPresentFences[0] = {std::move(presentFence), presentFenceTime, mExpectedPresentTime};
156174
}
157175
return presentFenceTime;

0 commit comments

Comments
 (0)