SF: Add FenceTracker
FenceTracker tracks all fences in SurfaceFlinger. These timestamps
could be used for debugging, profiling, or be exposed to the
application.
Change-Id: I4297a661c0a7530e744168ac7a2a66c4bca92fd5
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 3a0e21f..d1cb1be 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -910,6 +910,7 @@
void SurfaceFlinger::handleMessageRefresh() {
ATRACE_CALL();
+ nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
static nsecs_t previousExpectedPresent = 0;
nsecs_t expectedPresent = mPrimaryDispSync.computeNextRefresh(0);
static bool previousFrameMissed = false;
@@ -930,7 +931,7 @@
setUpHWComposer();
doDebugFlashRegions();
doComposition();
- postComposition();
+ postComposition(refreshStartTime);
}
// Release any buffers which were replaced this frame
@@ -999,7 +1000,7 @@
}
}
-void SurfaceFlinger::postComposition()
+void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
{
ATRACE_CALL();
ALOGV("postComposition");
@@ -1027,6 +1028,9 @@
}
}
+ mFenceTracker.addFrame(refreshStartTime, presentFence,
+ hw->getVisibleLayersSortedByZ(), hw->getClientTargetAcquireFence());
+
if (mAnimCompositionPending) {
mAnimCompositionPending = false;
@@ -2539,6 +2543,13 @@
dumpStaticScreenStats(result);
dumpAll = false;
}
+
+ if ((index < numArgs) &&
+ (args[index] == String16("--fences"))) {
+ index++;
+ mFenceTracker.dump(&result);
+ dumpAll = false;
+ }
}
if (dumpAll) {