SF TimeStats: remove timeRecord of dropped buffers
Prevent TimeStats from getting stuck waiting on a stale time record
after multiple setBuffer/setPostTime occurred for the same layer within
the same commit.
For example:
V TimeStats: [109]-[1]-[SurfaceView[...](BLAST)#109]-PostTime[...]
V TimeStats: [109]-[2]-[SurfaceView[...](BLAST)#109]-PostTime[...]
... 62 frames later ...
V TimeStats: [109]-[64]-PresentFenceTime[...]
V TimeStats: [109]-flushAvailableRecordsToStatsLocked
V TimeStats: [109]-[1]-presentFence is still not received
Bug: 351133405
Test: run TvtsJankHostTestCases and compare the presentToPresent
histograms between the UI and video layers (missing lots of video
frames), or watch for
logcat -s TimeStats | grep "timeRecords is at its maximum size"
Change-Id: I3de44250d5eb919f58d60976d7c33bd8394c0f0c
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 736fec6..9c8887d 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -3178,6 +3178,8 @@
callReleaseBufferCallback(mDrawingState.releaseBufferListener,
mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber,
mDrawingState.acquireFence);
+ const int32_t layerId = getSequence();
+ mFlinger->mTimeStats->removeTimeRecord(layerId, mDrawingState.frameNumber);
decrementPendingBufferCount();
if (mDrawingState.bufferSurfaceFrameTX != nullptr &&
mDrawingState.bufferSurfaceFrameTX->getPresentState() != PresentState::Presented) {