Add displayPresentTime to getFrameTimestamps
Makes HWC1 use displayRetireTime and HWC2 use
displayPresentTime.
Properly takes into account if HWC2On1Adapter is used.
Returns whether present or retire is supported via
eglQueryTimestampSupportedANDROID, which uses a
cached answer in Surface.
Surface::getFrameTimestamps returns with an error
if the caller requests an unsupported timestamp.
Test: adb shell /data/nativetest/libgui_test/libgui_test
--gtest_filter=*GetFrameTimestamps*
Change-Id: Ib91c2d05d7fb5cbf307e2dec1e20e79bcc19d90b
diff --git a/services/surfaceflinger/FenceTracker.cpp b/services/surfaceflinger/FenceTracker.cpp
index 276890d..742c00d 100644
--- a/services/surfaceflinger/FenceTracker.cpp
+++ b/services/surfaceflinger/FenceTracker.cpp
@@ -48,12 +48,21 @@
} else if (frame.glesCompositionDoneFence != Fence::NO_FENCE) {
outString->append("- GLES done\tNot signaled\n");
}
+
+ if (frame.presentTime) {
+ outString->appendFormat("- Present\t%" PRId64 "\n",
+ frame.presentTime);
+ } else if (frame.presentFence != Fence::NO_FENCE) {
+ outString->append("- Present\tNot signaled\n");
+ }
+
if (frame.retireTime) {
outString->appendFormat("- Retire\t%" PRId64 "\n",
frame.retireTime);
- } else {
+ } else if (frame.retireFence != Fence::NO_FENCE) {
outString->append("- Retire\tNot signaled\n");
}
+
for (const auto& kv : frame.layers) {
const LayerRecord& layer = kv.second;
outString->appendFormat("-- %s\n", layer.name.string());
@@ -85,6 +94,13 @@
void FenceTracker::checkFencesForCompletion() {
ATRACE_CALL();
for (auto& frame : mFrames) {
+ if (frame.presentFence != Fence::NO_FENCE) {
+ nsecs_t time = frame.presentFence->getSignalTime();
+ if (isValidTimestamp(time)) {
+ frame.presentTime = time;
+ frame.presentFence = Fence::NO_FENCE;
+ }
+ }
if (frame.retireFence != Fence::NO_FENCE) {
nsecs_t time = frame.retireFence->getSignalTime();
if (isValidTimestamp(time)) {
@@ -119,8 +135,9 @@
}
}
-void FenceTracker::addFrame(nsecs_t refreshStartTime, sp<Fence> retireFence,
- const Vector<sp<Layer>>& layers, sp<Fence> glDoneFence) {
+void FenceTracker::addFrame(nsecs_t refreshStartTime, sp<Fence> presentFence,
+ sp<Fence> retireFence, const Vector<sp<Layer>>& layers,
+ sp<Fence> glDoneFence) {
ATRACE_CALL();
Mutex::Autolock lock(mMutex);
FrameRecord& frame = mFrames[mOffset];
@@ -177,8 +194,10 @@
frame.frameId = mFrameCounter;
frame.refreshStartTime = refreshStartTime;
+ frame.presentTime = 0;
frame.retireTime = 0;
frame.glesCompositionDoneTime = 0;
+ frame.presentFence = presentFence;
prevFrame.retireFence = retireFence;
frame.retireFence = Fence::NO_FENCE;
frame.glesCompositionDoneFence = wasGlesCompositionDone ? glDoneFence :
@@ -212,6 +231,7 @@
outTimestamps->acquireTime = layerRecord.acquireTime;
outTimestamps->refreshStartTime = frameRecord.refreshStartTime;
outTimestamps->glCompositionDoneTime = frameRecord.glesCompositionDoneTime;
+ outTimestamps->displayPresentTime = frameRecord.presentTime;
outTimestamps->displayRetireTime = frameRecord.retireTime;
outTimestamps->releaseTime = layerRecord.releaseTime;
return true;