diff options
Diffstat (limited to 'services/surfaceflinger/BufferLayer.cpp')
-rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index fa75ffa403..6561707bcc 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -389,6 +389,20 @@ void BufferLayer::gatherBufferInfo() { mBufferInfo.mFrameLatencyNeeded = true; } +bool BufferLayer::frameIsEarly(nsecs_t expectedPresentTime) const { + // TODO(b/169901895): kEarlyLatchVsyncThreshold should be based on the + // vsync period. We can do this change as soon as ag/13100772 is merged. + constexpr static std::chrono::nanoseconds kEarlyLatchVsyncThreshold = 5ms; + + const auto presentTime = nextPredictedPresentTime(); + if (std::abs(presentTime - expectedPresentTime) >= kEarlyLatchMaxThreshold.count()) { + return false; + } + + return presentTime >= expectedPresentTime && + presentTime - expectedPresentTime >= kEarlyLatchVsyncThreshold.count(); +} + bool BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime, nsecs_t expectedPresentTime) { ATRACE_CALL(); @@ -421,6 +435,12 @@ bool BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime, return false; } + if (frameIsEarly(expectedPresentTime)) { + ATRACE_NAME("frameIsEarly()"); + mFlinger->signalLayerUpdate(); + return false; + } + // If the head buffer's acquire fence hasn't signaled yet, return and // try again later if (!fenceHasSignaled()) { |