Loading libs/gui/BufferQueueConsumer.cpp +0 −2 Original line number Diff line number Diff line Loading @@ -94,8 +94,6 @@ status_t BufferQueueConsumer::acquireBuffer(BufferItem* outBuffer, // Skip this if we're in shared buffer mode and the queue is empty, // since in that case we'll just return the shared buffer. if (expectedPresent != 0 && !mCore->mQueue.empty()) { const int MAX_REASONABLE_NSEC = 1000000000ULL; // 1 second // The 'expectedPresent' argument indicates when the buffer is expected // to be presented on-screen. If the buffer's desired present time is // earlier (less) than expectedPresent -- meaning it will be displayed Loading libs/gui/include/gui/BufferQueueConsumer.h +3 −0 Original line number Diff line number Diff line Loading @@ -171,6 +171,9 @@ public: // End functions required for backwards compatibility // Value used to determine if present time is valid. constexpr static int MAX_REASONABLE_NSEC = 1'000'000'000ULL; // 1 second private: sp<BufferQueueCore> mCore; Loading services/surfaceflinger/BufferLayer.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -534,11 +534,13 @@ bool BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) // transaction void BufferLayer::notifyAvailableFrames() { auto headFrameNumber = getHeadFrameNumber(); bool headFenceSignaled = fenceHasSignaled(); const auto headFrameNumber = getHeadFrameNumber(); const bool headFenceSignaled = fenceHasSignaled(); const bool presentTimeIsCurrent = framePresentTimeIsCurrent(); Mutex::Autolock lock(mLocalSyncPointMutex); for (auto& point : mLocalSyncPoints) { if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) { if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled && presentTimeIsCurrent) { point->setFrameAvailable(); } } Loading services/surfaceflinger/BufferLayer.h +1 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ public: // ----------------------------------------------------------------------- private: virtual bool fenceHasSignaled() const = 0; virtual bool framePresentTimeIsCurrent() const = 0; virtual nsecs_t getDesiredPresentTime() = 0; virtual std::shared_ptr<FenceTime> getCurrentFenceTime() const = 0; Loading services/surfaceflinger/BufferQueueLayer.cpp +41 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <compositionengine/OutputLayer.h> #include <compositionengine/impl/LayerCompositionState.h> #include <compositionengine/impl/OutputLayerCompositionState.h> #include <gui/BufferQueueConsumer.h> #include <system/window.h> #include "BufferQueueLayer.h" Loading Loading @@ -133,6 +134,15 @@ bool BufferQueueLayer::fenceHasSignaled() const { return mQueueItems[0].mFenceTime->getSignalTime() != Fence::SIGNAL_TIME_PENDING; } bool BufferQueueLayer::framePresentTimeIsCurrent() const { if (!hasFrameUpdate() || isRemovedFromCurrentState()) { return true; } Mutex::Autolock lock(mQueueItemLock); return mQueueItems[0].mTimestamp <= mFlinger->mScheduler->expectedPresentTime(); } nsecs_t BufferQueueLayer::getDesiredPresentTime() { return mConsumer->getTimestamp(); } Loading Loading @@ -185,7 +195,37 @@ PixelFormat BufferQueueLayer::getPixelFormat() const { uint64_t BufferQueueLayer::getFrameNumber() const { Mutex::Autolock lock(mQueueItemLock); return mQueueItems[0].mFrameNumber; uint64_t frameNumber = mQueueItems[0].mFrameNumber; // The head of the queue will be dropped if there are signaled and timely frames behind it nsecs_t expectedPresentTime = mFlinger->mScheduler->expectedPresentTime(); if (isRemovedFromCurrentState()) { expectedPresentTime = 0; } for (int i = 1; i < mQueueItems.size(); i++) { const bool fenceSignaled = mQueueItems[i].mFenceTime->getSignalTime() != Fence::SIGNAL_TIME_PENDING; if (!fenceSignaled) { break; } // We don't drop frames without explicit timestamps if (mQueueItems[i].mIsAutoTimestamp) { break; } const nsecs_t desiredPresent = mQueueItems[i].mTimestamp; if (desiredPresent < expectedPresentTime - BufferQueueConsumer::MAX_REASONABLE_NSEC || desiredPresent > expectedPresentTime) { break; } frameNumber = mQueueItems[i].mFrameNumber; } return frameNumber; } bool BufferQueueLayer::getAutoRefresh() const { Loading Loading
libs/gui/BufferQueueConsumer.cpp +0 −2 Original line number Diff line number Diff line Loading @@ -94,8 +94,6 @@ status_t BufferQueueConsumer::acquireBuffer(BufferItem* outBuffer, // Skip this if we're in shared buffer mode and the queue is empty, // since in that case we'll just return the shared buffer. if (expectedPresent != 0 && !mCore->mQueue.empty()) { const int MAX_REASONABLE_NSEC = 1000000000ULL; // 1 second // The 'expectedPresent' argument indicates when the buffer is expected // to be presented on-screen. If the buffer's desired present time is // earlier (less) than expectedPresent -- meaning it will be displayed Loading
libs/gui/include/gui/BufferQueueConsumer.h +3 −0 Original line number Diff line number Diff line Loading @@ -171,6 +171,9 @@ public: // End functions required for backwards compatibility // Value used to determine if present time is valid. constexpr static int MAX_REASONABLE_NSEC = 1'000'000'000ULL; // 1 second private: sp<BufferQueueCore> mCore; Loading
services/surfaceflinger/BufferLayer.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -534,11 +534,13 @@ bool BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) // transaction void BufferLayer::notifyAvailableFrames() { auto headFrameNumber = getHeadFrameNumber(); bool headFenceSignaled = fenceHasSignaled(); const auto headFrameNumber = getHeadFrameNumber(); const bool headFenceSignaled = fenceHasSignaled(); const bool presentTimeIsCurrent = framePresentTimeIsCurrent(); Mutex::Autolock lock(mLocalSyncPointMutex); for (auto& point : mLocalSyncPoints) { if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) { if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled && presentTimeIsCurrent) { point->setFrameAvailable(); } } Loading
services/surfaceflinger/BufferLayer.h +1 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ public: // ----------------------------------------------------------------------- private: virtual bool fenceHasSignaled() const = 0; virtual bool framePresentTimeIsCurrent() const = 0; virtual nsecs_t getDesiredPresentTime() = 0; virtual std::shared_ptr<FenceTime> getCurrentFenceTime() const = 0; Loading
services/surfaceflinger/BufferQueueLayer.cpp +41 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <compositionengine/OutputLayer.h> #include <compositionengine/impl/LayerCompositionState.h> #include <compositionengine/impl/OutputLayerCompositionState.h> #include <gui/BufferQueueConsumer.h> #include <system/window.h> #include "BufferQueueLayer.h" Loading Loading @@ -133,6 +134,15 @@ bool BufferQueueLayer::fenceHasSignaled() const { return mQueueItems[0].mFenceTime->getSignalTime() != Fence::SIGNAL_TIME_PENDING; } bool BufferQueueLayer::framePresentTimeIsCurrent() const { if (!hasFrameUpdate() || isRemovedFromCurrentState()) { return true; } Mutex::Autolock lock(mQueueItemLock); return mQueueItems[0].mTimestamp <= mFlinger->mScheduler->expectedPresentTime(); } nsecs_t BufferQueueLayer::getDesiredPresentTime() { return mConsumer->getTimestamp(); } Loading Loading @@ -185,7 +195,37 @@ PixelFormat BufferQueueLayer::getPixelFormat() const { uint64_t BufferQueueLayer::getFrameNumber() const { Mutex::Autolock lock(mQueueItemLock); return mQueueItems[0].mFrameNumber; uint64_t frameNumber = mQueueItems[0].mFrameNumber; // The head of the queue will be dropped if there are signaled and timely frames behind it nsecs_t expectedPresentTime = mFlinger->mScheduler->expectedPresentTime(); if (isRemovedFromCurrentState()) { expectedPresentTime = 0; } for (int i = 1; i < mQueueItems.size(); i++) { const bool fenceSignaled = mQueueItems[i].mFenceTime->getSignalTime() != Fence::SIGNAL_TIME_PENDING; if (!fenceSignaled) { break; } // We don't drop frames without explicit timestamps if (mQueueItems[i].mIsAutoTimestamp) { break; } const nsecs_t desiredPresent = mQueueItems[i].mTimestamp; if (desiredPresent < expectedPresentTime - BufferQueueConsumer::MAX_REASONABLE_NSEC || desiredPresent > expectedPresentTime) { break; } frameNumber = mQueueItems[i].mFrameNumber; } return frameNumber; } bool BufferQueueLayer::getAutoRefresh() const { Loading