SurfaceFlinger: add win anim frame time tracking
This change makes the 'dumpsys SurfaceFlinger --latency' command with no extra
args dump the frame timestamp data for the most recent frames that
SurfaceFlinger generated that included window animation transaction changes.
Change-Id: I8bded1ea08a4cddefef0aa955401052bb9107c90
diff --git a/services/surfaceflinger/FrameTracker.cpp b/services/surfaceflinger/FrameTracker.cpp
index 5c66ff9..9b55d44 100644
--- a/services/surfaceflinger/FrameTracker.cpp
+++ b/services/surfaceflinger/FrameTracker.cpp
@@ -31,28 +31,34 @@
}
void FrameTracker::setDesiredPresentTime(nsecs_t presentTime) {
+ Mutex::Autolock lock(mMutex);
mFrameRecords[mOffset].desiredPresentTime = presentTime;
}
void FrameTracker::setFrameReadyTime(nsecs_t readyTime) {
+ Mutex::Autolock lock(mMutex);
mFrameRecords[mOffset].frameReadyTime = readyTime;
}
void FrameTracker::setFrameReadyFence(const sp<Fence>& readyFence) {
+ Mutex::Autolock lock(mMutex);
mFrameRecords[mOffset].frameReadyFence = readyFence;
mNumFences++;
}
void FrameTracker::setActualPresentTime(nsecs_t presentTime) {
+ Mutex::Autolock lock(mMutex);
mFrameRecords[mOffset].actualPresentTime = presentTime;
}
void FrameTracker::setActualPresentFence(const sp<Fence>& readyFence) {
+ Mutex::Autolock lock(mMutex);
mFrameRecords[mOffset].actualPresentFence = readyFence;
mNumFences++;
}
void FrameTracker::advanceFrame() {
+ Mutex::Autolock lock(mMutex);
mOffset = (mOffset+1) % NUM_FRAME_RECORDS;
mFrameRecords[mOffset].desiredPresentTime = INT64_MAX;
mFrameRecords[mOffset].frameReadyTime = INT64_MAX;
@@ -74,10 +80,11 @@
// Clean up the signaled fences to keep the number of open fence FDs in
// this process reasonable.
- processFences();
+ processFencesLocked();
}
void FrameTracker::clear() {
+ Mutex::Autolock lock(mMutex);
for (size_t i = 0; i < NUM_FRAME_RECORDS; i++) {
mFrameRecords[i].desiredPresentTime = 0;
mFrameRecords[i].frameReadyTime = 0;
@@ -86,9 +93,12 @@
mFrameRecords[i].actualPresentFence.clear();
}
mNumFences = 0;
+ mFrameRecords[mOffset].desiredPresentTime = INT64_MAX;
+ mFrameRecords[mOffset].frameReadyTime = INT64_MAX;
+ mFrameRecords[mOffset].actualPresentTime = INT64_MAX;
}
-void FrameTracker::processFences() const {
+void FrameTracker::processFencesLocked() const {
FrameRecord* records = const_cast<FrameRecord*>(mFrameRecords);
int& numFences = const_cast<int&>(mNumFences);
@@ -116,7 +126,8 @@
}
void FrameTracker::dump(String8& result) const {
- processFences();
+ Mutex::Autolock lock(mMutex);
+ processFencesLocked();
const size_t o = mOffset;
for (size_t i = 1; i < NUM_FRAME_RECORDS; i++) {