diff options
| author | 2020-12-15 18:45:12 -0800 | |
|---|---|---|
| committer | 2020-12-23 22:44:57 +0000 | |
| commit | ce4adf1b97be29a65f5b36c345f36651bff1e619 (patch) | |
| tree | 845518f3e4e278a6cc43307fdd8b3901bfe778c6 /services/surfaceflinger/BufferQueueLayer.cpp | |
| parent | f0c5649f2ed8ca5fba07389908b2491007d50b08 (diff) | |
SurfaceFlinger: fix early latching of buffers
Use the FrameTimeline::SurfaceFrame predicted present time
to avoid latching a buffer too early (i.e. before the time
SurfaceFlinger planned to latch this buffer when the app requested
a vsync callback).
Bug: 169901895
Test: expand notification shade and observe systrace
Change-Id: I823546992c89f88c0c29b839ce21c79ff1ffcfbd
Diffstat (limited to 'services/surfaceflinger/BufferQueueLayer.cpp')
| -rw-r--r-- | services/surfaceflinger/BufferQueueLayer.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp index 56d874258e..e8e31db236 100644 --- a/services/surfaceflinger/BufferQueueLayer.cpp +++ b/services/surfaceflinger/BufferQueueLayer.cpp @@ -222,6 +222,21 @@ bool BufferQueueLayer::hasFrameUpdate() const { return mQueuedFrames > 0; } +nsecs_t BufferQueueLayer::nextPredictedPresentTime() const { + Mutex::Autolock lock(mQueueItemLock); + if (mQueueItems.empty()) { + return 0; + } + + const auto& bufferData = mQueueItems[0]; + + if (!bufferData.item.mIsAutoTimestamp || !bufferData.surfaceFrame) { + return 0; + } + + return bufferData.surfaceFrame->getPredictions().presentTime; +} + status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t latchTime, nsecs_t expectedPresentTime) { // This boolean is used to make sure that SurfaceFlinger's shadow copy |