Loading services/surfaceflinger/BufferQueueLayer.cpp +8 −19 Original line number Diff line number Diff line Loading @@ -282,8 +282,7 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t mConsumer->mergeSurfaceDamage(mQueueItems[0].item.mSurfaceDamage); mFlinger->mTimeStats->removeTimeRecord(layerId, mQueueItems[0].item.mFrameNumber); if (mQueueItems[0].surfaceFrame) { mQueueItems[0].surfaceFrame->setPresentState(PresentState::Dropped); mFlinger->mFrameTimeline->addSurfaceFrame(mQueueItems[0].surfaceFrame); addSurfaceFrameDroppedForBuffer(mQueueItems[0].surfaceFrame); } mQueueItems.erase(mQueueItems.begin()); mQueuedFrames--; Loading @@ -298,8 +297,7 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t Mutex::Autolock lock(mQueueItemLock); for (auto& [item, surfaceFrame] : mQueueItems) { if (surfaceFrame) { surfaceFrame->setPresentState(PresentState::Dropped); mFlinger->mFrameTimeline->addSurfaceFrame(surfaceFrame); addSurfaceFrameDroppedForBuffer(surfaceFrame); } } mQueueItems.clear(); Loading Loading @@ -329,8 +327,7 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t mConsumer->mergeSurfaceDamage(mQueueItems[0].item.mSurfaceDamage); mFlinger->mTimeStats->removeTimeRecord(layerId, mQueueItems[0].item.mFrameNumber); if (mQueueItems[0].surfaceFrame) { mQueueItems[0].surfaceFrame->setPresentState(PresentState::Dropped); mFlinger->mFrameTimeline->addSurfaceFrame(mQueueItems[0].surfaceFrame); addSurfaceFrameDroppedForBuffer(mQueueItems[0].surfaceFrame); } mQueueItems.erase(mQueueItems.begin()); mQueuedFrames--; Loading @@ -342,11 +339,9 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t FrameTracer::FrameEvent::LATCH); if (mQueueItems[0].surfaceFrame) { mQueueItems[0].surfaceFrame->setAcquireFenceTime( mQueueItems[0].item.mFenceTime->getSignalTime()); mQueueItems[0].surfaceFrame->setPresentState(PresentState::Presented, mLastLatchTime); mFlinger->mFrameTimeline->addSurfaceFrame(mQueueItems[0].surfaceFrame); mLastLatchTime = latchTime; addSurfaceFramePresentedForBuffer(mQueueItems[0].surfaceFrame, mQueueItems[0].item.mFenceTime->getSignalTime(), latchTime); } mQueueItems.erase(mQueueItems.begin()); } Loading Loading @@ -444,10 +439,7 @@ void BufferQueueLayer::onFrameAvailable(const BufferItem& item) { } } auto surfaceFrame = mFlinger->mFrameTimeline->createSurfaceFrameForToken(mFrameTimelineInfo, mOwnerPid, mOwnerUid, mName, mName); surfaceFrame->setActualQueueTime(systemTime()); auto surfaceFrame = createSurfaceFrameForBuffer(mFrameTimelineInfo, systemTime(), mName); mQueueItems.push_back({item, surfaceFrame}); mQueuedFrames++; Loading Loading @@ -483,10 +475,7 @@ void BufferQueueLayer::onFrameReplaced(const BufferItem& item) { return; } auto surfaceFrame = mFlinger->mFrameTimeline->createSurfaceFrameForToken(mFrameTimelineInfo, mOwnerPid, mOwnerUid, mName, mName); surfaceFrame->setActualQueueTime(systemTime()); auto surfaceFrame = createSurfaceFrameForBuffer(mFrameTimelineInfo, systemTime(), mName); mQueueItems[mQueueItems.size() - 1].item = item; mQueueItems[mQueueItems.size() - 1].surfaceFrame = std::move(surfaceFrame); Loading services/surfaceflinger/BufferQueueLayer.h +0 −5 Original line number Diff line number Diff line Loading @@ -149,11 +149,6 @@ private: // a buffer to correlate the buffer with the vsync id. Can only be accessed // with the SF state lock held. FrameTimelineInfo mFrameTimelineInfo; // Keeps track of the time SF latched the last buffer from this layer. // Used in buffer stuffing analysis in FrameTimeline. // TODO(b/176106798): Find a way to do this for BLASTBufferQueue as well. nsecs_t mLastLatchTime = 0; }; } // namespace android services/surfaceflinger/BufferStateLayer.cpp +24 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include <limits> #include <FrameTimeline/FrameTimeline.h> #include <compositionengine/LayerFECompositionState.h> #include <gui/BufferQueue.h> #include <private/gui/SyncFeatures.h> Loading @@ -38,6 +39,7 @@ namespace android { using PresentState = frametimeline::SurfaceFrame::PresentState; // clang-format off const std::array<float, 16> BufferStateLayer::IDENTITY_MATRIX{ 1, 0, 0, 0, Loading Loading @@ -335,7 +337,8 @@ bool BufferStateLayer::addFrameEvent(const sp<Fence>& acquireFence, nsecs_t post bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence>& acquireFence, nsecs_t postTime, nsecs_t desiredPresentTime, bool isAutoTimestamp, const client_cache_t& clientCacheId, uint64_t frameNumber, std::optional<nsecs_t> /* dequeueTime */) { std::optional<nsecs_t> /* dequeueTime */, const FrameTimelineInfo& info) { ATRACE_CALL(); if (mCurrentState.buffer) { Loading @@ -345,6 +348,10 @@ bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence // before swapping to drawing state, then the first buffer will be // dropped and we should decrement the pending buffer count. decrementPendingBufferCount(); if (mCurrentState.bufferSurfaceFrameTX != nullptr) { addSurfaceFrameDroppedForBuffer(mCurrentState.bufferSurfaceFrameTX); mCurrentState.bufferSurfaceFrameTX.reset(); } } } Loading @@ -365,6 +372,11 @@ bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence LayerHistory::LayerUpdateType::Buffer); addFrameEvent(acquireFence, postTime, isAutoTimestamp ? 0 : desiredPresentTime); if (info.vsyncId != FrameTimelineInfo::INVALID_VSYNC_ID) { setFrameTimelineVsyncForBufferTransaction(info, postTime); } return true; } Loading Loading @@ -620,6 +632,17 @@ status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nse std::make_shared<FenceTime>(mDrawingState.acquireFence)); mFlinger->mTimeStats->setLatchTime(layerId, mDrawingState.frameNumber, latchTime); auto& bufferSurfaceFrame = mDrawingState.bufferSurfaceFrameTX; if (bufferSurfaceFrame != nullptr && bufferSurfaceFrame->getPresentState() != PresentState::Presented) { // Update only if the bufferSurfaceFrame wasn't already presented. A Presented // bufferSurfaceFrame could be seen here if a pending state was applied successfully and we // are processing the next state. addSurfaceFramePresentedForBuffer(bufferSurfaceFrame, mDrawingState.acquireFence->getSignalTime(), latchTime); bufferSurfaceFrame.reset(); } mCurrentStateModified = false; return NO_ERROR; Loading services/surfaceflinger/BufferStateLayer.h +3 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,7 @@ public: bool setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence>& acquireFence, nsecs_t postTime, nsecs_t desiredPresentTime, bool isAutoTimestamp, const client_cache_t& clientCacheId, uint64_t frameNumber, std::optional<nsecs_t> dequeueTime) override; std::optional<nsecs_t> dequeueTime, const FrameTimelineInfo& info) override; bool setAcquireFence(const sp<Fence>& fence) override; bool setDataspace(ui::Dataspace dataspace) override; bool setHdrMetadata(const HdrMetadata& hdrMetadata) override; Loading Loading @@ -124,6 +124,8 @@ protected: private: friend class SlotGenerationTest; friend class TransactionSurfaceFrameTest; inline void tracePendingBufferCount(); bool updateFrameEventHistory(const sp<Fence>& acquireFence, nsecs_t postedTime, Loading services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -312,6 +312,10 @@ void SurfaceFrame::setAcquireFenceTime(nsecs_t acquireFenceTime) { void SurfaceFrame::setPresentState(PresentState presentState, nsecs_t lastLatchTime) { std::scoped_lock lock(mMutex); LOG_ALWAYS_FATAL_IF(mPresentState != PresentState::Unknown, "setPresentState called on a SurfaceFrame from Layer - %s, that has a " "PresentState - %s set already.", mDebugName.c_str(), toString(mPresentState).c_str()); mPresentState = presentState; mLastLatchTime = lastLatchTime; } Loading Loading
services/surfaceflinger/BufferQueueLayer.cpp +8 −19 Original line number Diff line number Diff line Loading @@ -282,8 +282,7 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t mConsumer->mergeSurfaceDamage(mQueueItems[0].item.mSurfaceDamage); mFlinger->mTimeStats->removeTimeRecord(layerId, mQueueItems[0].item.mFrameNumber); if (mQueueItems[0].surfaceFrame) { mQueueItems[0].surfaceFrame->setPresentState(PresentState::Dropped); mFlinger->mFrameTimeline->addSurfaceFrame(mQueueItems[0].surfaceFrame); addSurfaceFrameDroppedForBuffer(mQueueItems[0].surfaceFrame); } mQueueItems.erase(mQueueItems.begin()); mQueuedFrames--; Loading @@ -298,8 +297,7 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t Mutex::Autolock lock(mQueueItemLock); for (auto& [item, surfaceFrame] : mQueueItems) { if (surfaceFrame) { surfaceFrame->setPresentState(PresentState::Dropped); mFlinger->mFrameTimeline->addSurfaceFrame(surfaceFrame); addSurfaceFrameDroppedForBuffer(surfaceFrame); } } mQueueItems.clear(); Loading Loading @@ -329,8 +327,7 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t mConsumer->mergeSurfaceDamage(mQueueItems[0].item.mSurfaceDamage); mFlinger->mTimeStats->removeTimeRecord(layerId, mQueueItems[0].item.mFrameNumber); if (mQueueItems[0].surfaceFrame) { mQueueItems[0].surfaceFrame->setPresentState(PresentState::Dropped); mFlinger->mFrameTimeline->addSurfaceFrame(mQueueItems[0].surfaceFrame); addSurfaceFrameDroppedForBuffer(mQueueItems[0].surfaceFrame); } mQueueItems.erase(mQueueItems.begin()); mQueuedFrames--; Loading @@ -342,11 +339,9 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t FrameTracer::FrameEvent::LATCH); if (mQueueItems[0].surfaceFrame) { mQueueItems[0].surfaceFrame->setAcquireFenceTime( mQueueItems[0].item.mFenceTime->getSignalTime()); mQueueItems[0].surfaceFrame->setPresentState(PresentState::Presented, mLastLatchTime); mFlinger->mFrameTimeline->addSurfaceFrame(mQueueItems[0].surfaceFrame); mLastLatchTime = latchTime; addSurfaceFramePresentedForBuffer(mQueueItems[0].surfaceFrame, mQueueItems[0].item.mFenceTime->getSignalTime(), latchTime); } mQueueItems.erase(mQueueItems.begin()); } Loading Loading @@ -444,10 +439,7 @@ void BufferQueueLayer::onFrameAvailable(const BufferItem& item) { } } auto surfaceFrame = mFlinger->mFrameTimeline->createSurfaceFrameForToken(mFrameTimelineInfo, mOwnerPid, mOwnerUid, mName, mName); surfaceFrame->setActualQueueTime(systemTime()); auto surfaceFrame = createSurfaceFrameForBuffer(mFrameTimelineInfo, systemTime(), mName); mQueueItems.push_back({item, surfaceFrame}); mQueuedFrames++; Loading Loading @@ -483,10 +475,7 @@ void BufferQueueLayer::onFrameReplaced(const BufferItem& item) { return; } auto surfaceFrame = mFlinger->mFrameTimeline->createSurfaceFrameForToken(mFrameTimelineInfo, mOwnerPid, mOwnerUid, mName, mName); surfaceFrame->setActualQueueTime(systemTime()); auto surfaceFrame = createSurfaceFrameForBuffer(mFrameTimelineInfo, systemTime(), mName); mQueueItems[mQueueItems.size() - 1].item = item; mQueueItems[mQueueItems.size() - 1].surfaceFrame = std::move(surfaceFrame); Loading
services/surfaceflinger/BufferQueueLayer.h +0 −5 Original line number Diff line number Diff line Loading @@ -149,11 +149,6 @@ private: // a buffer to correlate the buffer with the vsync id. Can only be accessed // with the SF state lock held. FrameTimelineInfo mFrameTimelineInfo; // Keeps track of the time SF latched the last buffer from this layer. // Used in buffer stuffing analysis in FrameTimeline. // TODO(b/176106798): Find a way to do this for BLASTBufferQueue as well. nsecs_t mLastLatchTime = 0; }; } // namespace android
services/surfaceflinger/BufferStateLayer.cpp +24 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include <limits> #include <FrameTimeline/FrameTimeline.h> #include <compositionengine/LayerFECompositionState.h> #include <gui/BufferQueue.h> #include <private/gui/SyncFeatures.h> Loading @@ -38,6 +39,7 @@ namespace android { using PresentState = frametimeline::SurfaceFrame::PresentState; // clang-format off const std::array<float, 16> BufferStateLayer::IDENTITY_MATRIX{ 1, 0, 0, 0, Loading Loading @@ -335,7 +337,8 @@ bool BufferStateLayer::addFrameEvent(const sp<Fence>& acquireFence, nsecs_t post bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence>& acquireFence, nsecs_t postTime, nsecs_t desiredPresentTime, bool isAutoTimestamp, const client_cache_t& clientCacheId, uint64_t frameNumber, std::optional<nsecs_t> /* dequeueTime */) { std::optional<nsecs_t> /* dequeueTime */, const FrameTimelineInfo& info) { ATRACE_CALL(); if (mCurrentState.buffer) { Loading @@ -345,6 +348,10 @@ bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence // before swapping to drawing state, then the first buffer will be // dropped and we should decrement the pending buffer count. decrementPendingBufferCount(); if (mCurrentState.bufferSurfaceFrameTX != nullptr) { addSurfaceFrameDroppedForBuffer(mCurrentState.bufferSurfaceFrameTX); mCurrentState.bufferSurfaceFrameTX.reset(); } } } Loading @@ -365,6 +372,11 @@ bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence LayerHistory::LayerUpdateType::Buffer); addFrameEvent(acquireFence, postTime, isAutoTimestamp ? 0 : desiredPresentTime); if (info.vsyncId != FrameTimelineInfo::INVALID_VSYNC_ID) { setFrameTimelineVsyncForBufferTransaction(info, postTime); } return true; } Loading Loading @@ -620,6 +632,17 @@ status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nse std::make_shared<FenceTime>(mDrawingState.acquireFence)); mFlinger->mTimeStats->setLatchTime(layerId, mDrawingState.frameNumber, latchTime); auto& bufferSurfaceFrame = mDrawingState.bufferSurfaceFrameTX; if (bufferSurfaceFrame != nullptr && bufferSurfaceFrame->getPresentState() != PresentState::Presented) { // Update only if the bufferSurfaceFrame wasn't already presented. A Presented // bufferSurfaceFrame could be seen here if a pending state was applied successfully and we // are processing the next state. addSurfaceFramePresentedForBuffer(bufferSurfaceFrame, mDrawingState.acquireFence->getSignalTime(), latchTime); bufferSurfaceFrame.reset(); } mCurrentStateModified = false; return NO_ERROR; Loading
services/surfaceflinger/BufferStateLayer.h +3 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,7 @@ public: bool setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence>& acquireFence, nsecs_t postTime, nsecs_t desiredPresentTime, bool isAutoTimestamp, const client_cache_t& clientCacheId, uint64_t frameNumber, std::optional<nsecs_t> dequeueTime) override; std::optional<nsecs_t> dequeueTime, const FrameTimelineInfo& info) override; bool setAcquireFence(const sp<Fence>& fence) override; bool setDataspace(ui::Dataspace dataspace) override; bool setHdrMetadata(const HdrMetadata& hdrMetadata) override; Loading Loading @@ -124,6 +124,8 @@ protected: private: friend class SlotGenerationTest; friend class TransactionSurfaceFrameTest; inline void tracePendingBufferCount(); bool updateFrameEventHistory(const sp<Fence>& acquireFence, nsecs_t postedTime, Loading
services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -312,6 +312,10 @@ void SurfaceFrame::setAcquireFenceTime(nsecs_t acquireFenceTime) { void SurfaceFrame::setPresentState(PresentState presentState, nsecs_t lastLatchTime) { std::scoped_lock lock(mMutex); LOG_ALWAYS_FATAL_IF(mPresentState != PresentState::Unknown, "setPresentState called on a SurfaceFrame from Layer - %s, that has a " "PresentState - %s set already.", mDebugName.c_str(), toString(mPresentState).c_str()); mPresentState = presentState; mLastLatchTime = lastLatchTime; } Loading