Loading services/surfaceflinger/Layer.cpp +28 −1 Original line number Diff line number Diff line Loading @@ -1098,6 +1098,25 @@ uint64_t Layer::getHeadFrameNumber() const { } } bool Layer::headFenceHasSignaled() const { #ifdef USE_HWC2 Mutex::Autolock lock(mQueueItemLock); if (mQueueItems.empty()) { return true; } if (mQueueItems[0].mIsDroppable) { // Even though this buffer's fence may not have signaled yet, it could // be replaced by another buffer before it has a chance to, which means // that it's possible to get into a situation where a buffer is never // able to be latched. To avoid this, grab this buffer anyway. return true; } return mQueueItems[0].mFence->getSignalTime() != INT64_MAX; #else return true; #endif } bool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { if (point->getFrameNumber() <= mCurrentFrameNumber) { // Don't bother with a SyncPoint, since we've already latched the Loading Loading @@ -1355,9 +1374,10 @@ bool Layer::applyPendingStates(State* stateToCommit) { void Layer::notifyAvailableFrames() { auto headFrameNumber = getHeadFrameNumber(); bool headFenceSignaled = headFenceHasSignaled(); Mutex::Autolock lock(mLocalSyncPointMutex); for (auto& point : mLocalSyncPoints) { if (headFrameNumber >= point->getFrameNumber()) { if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) { point->setFrameAvailable(); } } Loading Loading @@ -1754,6 +1774,13 @@ Region Layer::latchBuffer(bool& recomputeVisibleRegions) return outDirtyRegion; } // If the head buffer's acquire fence hasn't signaled yet, return and // try again later if (!headFenceHasSignaled()) { mFlinger->signalLayerUpdate(); return outDirtyRegion; } // Capture the old state of the layer for comparisons later const State& s(getDrawingState()); const bool oldOpacity = isOpaque(s); Loading services/surfaceflinger/Layer.h +1 −0 Original line number Diff line number Diff line Loading @@ -510,6 +510,7 @@ private: std::list<std::shared_ptr<SyncPoint>> mRemoteSyncPoints; uint64_t getHeadFrameNumber() const; bool headFenceHasSignaled() const; // Returns false if the relevant frame has already been latched bool addSyncPoint(const std::shared_ptr<SyncPoint>& point); Loading Loading
services/surfaceflinger/Layer.cpp +28 −1 Original line number Diff line number Diff line Loading @@ -1098,6 +1098,25 @@ uint64_t Layer::getHeadFrameNumber() const { } } bool Layer::headFenceHasSignaled() const { #ifdef USE_HWC2 Mutex::Autolock lock(mQueueItemLock); if (mQueueItems.empty()) { return true; } if (mQueueItems[0].mIsDroppable) { // Even though this buffer's fence may not have signaled yet, it could // be replaced by another buffer before it has a chance to, which means // that it's possible to get into a situation where a buffer is never // able to be latched. To avoid this, grab this buffer anyway. return true; } return mQueueItems[0].mFence->getSignalTime() != INT64_MAX; #else return true; #endif } bool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { if (point->getFrameNumber() <= mCurrentFrameNumber) { // Don't bother with a SyncPoint, since we've already latched the Loading Loading @@ -1355,9 +1374,10 @@ bool Layer::applyPendingStates(State* stateToCommit) { void Layer::notifyAvailableFrames() { auto headFrameNumber = getHeadFrameNumber(); bool headFenceSignaled = headFenceHasSignaled(); Mutex::Autolock lock(mLocalSyncPointMutex); for (auto& point : mLocalSyncPoints) { if (headFrameNumber >= point->getFrameNumber()) { if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) { point->setFrameAvailable(); } } Loading Loading @@ -1754,6 +1774,13 @@ Region Layer::latchBuffer(bool& recomputeVisibleRegions) return outDirtyRegion; } // If the head buffer's acquire fence hasn't signaled yet, return and // try again later if (!headFenceHasSignaled()) { mFlinger->signalLayerUpdate(); return outDirtyRegion; } // Capture the old state of the layer for comparisons later const State& s(getDrawingState()); const bool oldOpacity = isOpaque(s); Loading
services/surfaceflinger/Layer.h +1 −0 Original line number Diff line number Diff line Loading @@ -510,6 +510,7 @@ private: std::list<std::shared_ptr<SyncPoint>> mRemoteSyncPoints; uint64_t getHeadFrameNumber() const; bool headFenceHasSignaled() const; // Returns false if the relevant frame has already been latched bool addSyncPoint(const std::shared_ptr<SyncPoint>& point); Loading