summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/Layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/surfaceflinger/Layer.cpp')
-rw-r--r--services/surfaceflinger/Layer.cpp66
1 files changed, 31 insertions, 35 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 9ae9752235..395757bfe3 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -1740,41 +1740,23 @@ bool Layer::onPreComposition(nsecs_t refreshStartTime) {
return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh;
}
-bool Layer::onPostComposition(sp<Fence> glDoneFence) {
+bool Layer::onPostComposition(
+ const std::shared_ptr<FenceTime>& glDoneFence,
+ const std::shared_ptr<FenceTime>& presentFence,
+ const std::shared_ptr<FenceTime>& retireFence) {
+ mAcquireTimeline.updateSignalTimes();
+ mReleaseTimeline.updateSignalTimes();
+
// mFrameLatencyNeeded is true when a new frame was latched for the
// composition.
-
if (!mFrameLatencyNeeded)
return false;
- const HWComposer& hwc = mFlinger->getHwComposer();
-#ifdef USE_HWC2
- sp<Fence> retireFence = Fence::NO_FENCE;
- sp<Fence> presentFence = Fence::NO_FENCE;
- sp<Fence> presentOrRetireFence = Fence::NO_FENCE;
- if (hwc.retireFenceRepresentsStartOfScanout()) {
- presentFence = hwc.getPresentFence(HWC_DISPLAY_PRIMARY);
- presentOrRetireFence = presentFence;
- } else {
- retireFence = hwc.getPresentFence(HWC_DISPLAY_PRIMARY);
- presentOrRetireFence = retireFence;
- }
- bool wasGpuComposited = mHwcLayers.count(HWC_DISPLAY_PRIMARY) ?
- mHwcLayers.at(HWC_DISPLAY_PRIMARY).compositionType ==
- HWC2::Composition::Client : true;
-#else
- sp<Fence> retireFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY);
- sp<Fence> presentFence = Fence::NO_FENCE;
- sp<Fence> presentOrRetireFence = retireFence;
- bool wasGpuComposited = mIsGlesComposition;
-#endif
-
// Update mFrameEventHistory.
{
Mutex::Autolock lock(mFrameEventHistoryMutex);
mFrameEventHistory.addPostComposition(mCurrentFrameNumber,
- wasGpuComposited ? glDoneFence : Fence::NO_FENCE,
- presentFence);
+ glDoneFence, presentFence);
mFrameEventHistory.addRetire(mPreviousFrameNumber,
retireFence);
}
@@ -1783,22 +1765,28 @@ bool Layer::onPostComposition(sp<Fence> glDoneFence) {
nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
mFrameTracker.setDesiredPresentTime(desiredPresentTime);
- sp<Fence> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFence();
+ std::shared_ptr<FenceTime> frameReadyFence =
+ mSurfaceFlingerConsumer->getCurrentFenceTime();
if (frameReadyFence->isValid()) {
- mFrameTracker.setFrameReadyFence(frameReadyFence);
+ mFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
} else {
// There was no fence for this frame, so assume that it was ready
// to be presented at the desired present time.
mFrameTracker.setFrameReadyTime(desiredPresentTime);
}
- if (presentOrRetireFence->isValid()) {
- mFrameTracker.setActualPresentFence(presentOrRetireFence);
+ if (presentFence->isValid()) {
+ mFrameTracker.setActualPresentFence(
+ std::shared_ptr<FenceTime>(presentFence));
+ } else if (retireFence->isValid()) {
+ mFrameTracker.setActualPresentFence(
+ std::shared_ptr<FenceTime>(retireFence));
} else {
// The HWC doesn't support present fences, so use the refresh
// timestamp instead.
- nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
- mFrameTracker.setActualPresentTime(presentTime);
+ mFrameTracker.setActualPresentTime(
+ mFlinger->getHwComposer().getRefreshTimestamp(
+ HWC_DISPLAY_PRIMARY));
}
mFrameTracker.advanceFrame();
@@ -1809,9 +1797,13 @@ bool Layer::onPostComposition(sp<Fence> glDoneFence) {
#ifdef USE_HWC2
void Layer::releasePendingBuffer() {
mSurfaceFlingerConsumer->releasePendingBuffer();
- Mutex::Autolock lock(mFrameEventHistoryMutex);
- mFrameEventHistory.addRelease(mPreviousFrameNumber,
+ auto releaseFenceTime = std::make_shared<FenceTime>(
mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
+ mReleaseTimeline.push(releaseFenceTime);
+
+ Mutex::Autolock lock(mFrameEventHistoryMutex);
+ mFrameEventHistory.addRelease(
+ mPreviousFrameNumber, std::move(releaseFenceTime));
}
#endif
@@ -1984,8 +1976,11 @@ Region Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime)
Mutex::Autolock lock(mFrameEventHistoryMutex);
mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime);
#ifndef USE_HWC2
- mFrameEventHistory.addRelease(mPreviousFrameNumber,
+ auto releaseFenceTime = std::make_shared<FenceTime>(
mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
+ mReleaseTimeline.push(releaseFenceTime);
+ mFrameEventHistory.addRelease(
+ mPreviousFrameNumber, std::move(releaseFenceTime));
#endif
}
@@ -2220,6 +2215,7 @@ void Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
FrameEventHistoryDelta *outDelta) {
Mutex::Autolock lock(mFrameEventHistoryMutex);
if (newTimestamps) {
+ mAcquireTimeline.push(newTimestamps->acquireFence);
mFrameEventHistory.addQueue(*newTimestamps);
}