diff options
Diffstat (limited to 'services')
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 30 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 1 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlingerConsumer.cpp | 12 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlingerConsumer.h | 5 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger_hwc1.cpp | 2 |
6 files changed, 38 insertions, 14 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 46a7338b10..4ea029f5b1 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -82,7 +82,7 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, mCurrentOpacity(true), mBufferLatched(false), mCurrentFrameNumber(0), - mPreviousFrameNumber(-1U), + mPreviousFrameNumber(0), mRefreshPending(false), mFrameLatencyNeeded(false), mFiltering(false), @@ -1904,8 +1904,10 @@ bool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence, Mutex::Autolock lock(mFrameEventHistoryMutex); mFrameEventHistory.addPostComposition(mCurrentFrameNumber, glDoneFence, presentFence, compositorTiming); - mFrameEventHistory.addRetire(mPreviousFrameNumber, - retireFence); + if (mPreviousFrameNumber != 0) { + mFrameEventHistory.addRetire(mPreviousFrameNumber, + retireFence); + } } // Update mFrameTracker. @@ -1943,14 +1945,19 @@ bool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence, #ifdef USE_HWC2 void Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) { - mSurfaceFlingerConsumer->releasePendingBuffer(); + if (!mSurfaceFlingerConsumer->releasePendingBuffer()) { + return; + } + auto releaseFenceTime = std::make_shared<FenceTime>( mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); mReleaseTimeline.push(releaseFenceTime); Mutex::Autolock lock(mFrameEventHistoryMutex); - mFrameEventHistory.addRelease( - mPreviousFrameNumber, dequeueReadyTime, std::move(releaseFenceTime)); + if (mPreviousFrameNumber != 0) { + mFrameEventHistory.addRelease(mPreviousFrameNumber, + dequeueReadyTime, std::move(releaseFenceTime)); + } } #endif @@ -2136,8 +2143,10 @@ Region Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) auto releaseFenceTime = std::make_shared<FenceTime>( mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); mReleaseTimeline.push(releaseFenceTime); - mFrameEventHistory.addRelease( - mPreviousFrameNumber, latchTime, std::move(releaseFenceTime)); + if (mPreviousFrameNumber != 0) { + mFrameEventHistory.addRelease(mPreviousFrameNumber, + latchTime, std::move(releaseFenceTime)); + } #endif } @@ -2372,6 +2381,11 @@ void Layer::dumpFrameEvents(String8& result) { mFrameEventHistory.dump(result); } +void Layer::onDisconnect() { + Mutex::Autolock lock(mFrameEventHistoryMutex); + mFrameEventHistory.onDisconnect(); +} + void Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, FrameEventHistoryDelta *outDelta) { Mutex::Autolock lock(mFrameEventHistoryMutex); diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index c578e077fe..ae2c962588 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -444,6 +444,7 @@ public: std::vector<OccupancyTracker::Segment> getOccupancyHistory(bool forceFlush); + void onDisconnect(); void addAndGetFrameTimestamps(const NewFrameEventsEntry* newEntry, FrameEventHistoryDelta* outDelta); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 462e5a6758..215628de0f 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -639,7 +639,7 @@ status_t SurfaceFlinger::getSupportedFrameTimestamps( FrameEvent::LATCH, FrameEvent::FIRST_REFRESH_START, FrameEvent::LAST_REFRESH_START, - FrameEvent::GL_COMPOSITION_DONE, + FrameEvent::GPU_COMPOSITION_DONE, getHwComposer().presentFenceRepresentsStartOfScanout() ? FrameEvent::DISPLAY_PRESENT : FrameEvent::DISPLAY_RETIRE, FrameEvent::DEQUEUE_READY, diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.cpp b/services/surfaceflinger/SurfaceFlingerConsumer.cpp index 942af139ec..bb1ff06065 100644 --- a/services/surfaceflinger/SurfaceFlingerConsumer.cpp +++ b/services/surfaceflinger/SurfaceFlingerConsumer.cpp @@ -211,11 +211,11 @@ void SurfaceFlingerConsumer::setReleaseFence(const sp<Fence>& fence) } } -void SurfaceFlingerConsumer::releasePendingBuffer() +bool SurfaceFlingerConsumer::releasePendingBuffer() { if (!mPendingRelease.isPending) { ALOGV("Pending buffer already released"); - return; + return false; } ALOGV("Releasing pending buffer"); Mutex::Autolock lock(mMutex); @@ -225,6 +225,7 @@ void SurfaceFlingerConsumer::releasePendingBuffer() ALOGE_IF(result != NO_ERROR, "releasePendingBuffer failed: %s (%d)", strerror(-result), result); mPendingRelease = PendingRelease(); + return true; } #endif @@ -261,6 +262,13 @@ void SurfaceFlingerConsumer::onSidebandStreamChanged() { } } +void SurfaceFlingerConsumer::onDisconnect() { + sp<Layer> l = mLayer.promote(); + if (l.get()) { + l->onDisconnect(); + } +} + void SurfaceFlingerConsumer::addAndGetFrameTimestamps( const NewFrameEventsEntry* newTimestamps, FrameEventHistoryDelta *outDelta) { diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.h b/services/surfaceflinger/SurfaceFlingerConsumer.h index 7713ed2408..1531e2c5ca 100644 --- a/services/surfaceflinger/SurfaceFlingerConsumer.h +++ b/services/surfaceflinger/SurfaceFlingerConsumer.h @@ -82,10 +82,11 @@ public: sp<Fence> getPrevFinalReleaseFence() const; #ifdef USE_HWC2 virtual void setReleaseFence(const sp<Fence>& fence) override; - void releasePendingBuffer(); + bool releasePendingBuffer(); #endif - virtual void addAndGetFrameTimestamps( + void onDisconnect() override; + void addAndGetFrameTimestamps( const NewFrameEventsEntry* newTimestamps, FrameEventHistoryDelta* outDelta) override; diff --git a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp index 477eb27063..e6ab29a4fb 100644 --- a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp +++ b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp @@ -640,7 +640,7 @@ status_t SurfaceFlinger::getSupportedFrameTimestamps( FrameEvent::LATCH, FrameEvent::FIRST_REFRESH_START, FrameEvent::LAST_REFRESH_START, - FrameEvent::GL_COMPOSITION_DONE, + FrameEvent::GPU_COMPOSITION_DONE, FrameEvent::DISPLAY_RETIRE, FrameEvent::DEQUEUE_READY, FrameEvent::RELEASE, |