Loading libs/gui/BLASTBufferQueue.cpp +26 −7 Original line number Original line Diff line number Diff line Loading @@ -587,9 +587,23 @@ status_t BLASTBufferQueue::acquireNextBufferLocked( t->setDesiredPresentTime(bufferItem.mTimestamp); t->setDesiredPresentTime(bufferItem.mTimestamp); } } if (!mNextFrameTimelineInfoQueue.empty()) { // Drop stale frame timeline infos t->setFrameTimelineInfo(mNextFrameTimelineInfoQueue.front()); while (!mPendingFrameTimelines.empty() && mNextFrameTimelineInfoQueue.pop(); mPendingFrameTimelines.front().first < bufferItem.mFrameNumber) { ATRACE_FORMAT_INSTANT("dropping stale frameNumber: %" PRIu64 " vsyncId: %" PRId64, mPendingFrameTimelines.front().first, mPendingFrameTimelines.front().second.vsyncId); mPendingFrameTimelines.pop(); } if (!mPendingFrameTimelines.empty() && mPendingFrameTimelines.front().first == bufferItem.mFrameNumber) { ATRACE_FORMAT_INSTANT("Transaction::setFrameTimelineInfo frameNumber: %" PRIu64 " vsyncId: %" PRId64, bufferItem.mFrameNumber, mPendingFrameTimelines.front().second.vsyncId); t->setFrameTimelineInfo(mPendingFrameTimelines.front().second); mPendingFrameTimelines.pop(); } } { { Loading Loading @@ -653,6 +667,7 @@ void BLASTBufferQueue::onFrameAvailable(const BufferItem& item) { { { std::unique_lock _lock{mMutex}; std::unique_lock _lock{mMutex}; BBQ_TRACE(); BBQ_TRACE(); const bool syncTransactionSet = mTransactionReadyCallback != nullptr; const bool syncTransactionSet = mTransactionReadyCallback != nullptr; BQA_LOGV("onFrameAvailable-start syncTransactionSet=%s", boolToString(syncTransactionSet)); BQA_LOGV("onFrameAvailable-start syncTransactionSet=%s", boolToString(syncTransactionSet)); Loading Loading @@ -847,12 +862,13 @@ public: return mBbq->setFrameRate(frameRate, compatibility, changeFrameRateStrategy); return mBbq->setFrameRate(frameRate, compatibility, changeFrameRateStrategy); } } status_t setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) override { status_t setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& frameTimelineInfo) override { std::unique_lock _lock{mMutex}; std::unique_lock _lock{mMutex}; if (mDestroyed) { if (mDestroyed) { return DEAD_OBJECT; return DEAD_OBJECT; } } return mBbq->setFrameTimelineInfo(frameTimelineInfo); return mBbq->setFrameTimelineInfo(frameNumber, frameTimelineInfo); } } void destroy() override { void destroy() override { Loading @@ -874,9 +890,12 @@ status_t BLASTBufferQueue::setFrameRate(float frameRate, int8_t compatibility, return t.setFrameRate(mSurfaceControl, frameRate, compatibility, shouldBeSeamless).apply(); return t.setFrameRate(mSurfaceControl, frameRate, compatibility, shouldBeSeamless).apply(); } } status_t BLASTBufferQueue::setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) { status_t BLASTBufferQueue::setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& frameTimelineInfo) { ATRACE_FORMAT("%s(%s) frameNumber: %" PRIu64 " vsyncId: %" PRId64, __func__, mName.c_str(), frameNumber, frameTimelineInfo.vsyncId); std::unique_lock _lock{mMutex}; std::unique_lock _lock{mMutex}; mNextFrameTimelineInfoQueue.push(frameTimelineInfo); mPendingFrameTimelines.push({frameNumber, frameTimelineInfo}); return OK; return OK; } } Loading libs/gui/Surface.cpp +4 −2 Original line number Original line Diff line number Diff line Loading @@ -1863,6 +1863,7 @@ int Surface::dispatchGetLastQueuedBuffer2(va_list args) { int Surface::dispatchSetFrameTimelineInfo(va_list args) { int Surface::dispatchSetFrameTimelineInfo(va_list args) { ATRACE_CALL(); ATRACE_CALL(); auto frameNumber = static_cast<uint64_t>(va_arg(args, uint64_t)); auto frameTimelineVsyncId = static_cast<int64_t>(va_arg(args, int64_t)); auto frameTimelineVsyncId = static_cast<int64_t>(va_arg(args, int64_t)); auto inputEventId = static_cast<int32_t>(va_arg(args, int32_t)); auto inputEventId = static_cast<int32_t>(va_arg(args, int32_t)); auto startTimeNanos = static_cast<int64_t>(va_arg(args, int64_t)); auto startTimeNanos = static_cast<int64_t>(va_arg(args, int64_t)); Loading @@ -1872,7 +1873,7 @@ int Surface::dispatchSetFrameTimelineInfo(va_list args) { ftlInfo.vsyncId = frameTimelineVsyncId; ftlInfo.vsyncId = frameTimelineVsyncId; ftlInfo.inputEventId = inputEventId; ftlInfo.inputEventId = inputEventId; ftlInfo.startTimeNanos = startTimeNanos; ftlInfo.startTimeNanos = startTimeNanos; return setFrameTimelineInfo(ftlInfo); return setFrameTimelineInfo(frameNumber, ftlInfo); } } bool Surface::transformToDisplayInverse() const { bool Surface::transformToDisplayInverse() const { Loading Loading @@ -2641,7 +2642,8 @@ void Surface::ProducerListenerProxy::onBuffersDiscarded(const std::vector<int32_ return NO_ERROR; return NO_ERROR; } } status_t Surface::setFrameTimelineInfo(const FrameTimelineInfo& /*frameTimelineInfo*/) { status_t Surface::setFrameTimelineInfo(uint64_t /*frameNumber*/, const FrameTimelineInfo& /*frameTimelineInfo*/) { // ISurfaceComposer no longer supports setFrameTimelineInfo // ISurfaceComposer no longer supports setFrameTimelineInfo return BAD_VALUE; return BAD_VALUE; } } Loading libs/gui/fuzzer/libgui_bufferQueue_fuzzer.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -130,7 +130,7 @@ void BufferQueueFuzzer::invokeBlastBufferQueue() { queue->setFrameRate(mFdp.ConsumeFloatingPoint<float>(), mFdp.ConsumeIntegral<int8_t>(), queue->setFrameRate(mFdp.ConsumeFloatingPoint<float>(), mFdp.ConsumeIntegral<int8_t>(), mFdp.ConsumeBool() /*shouldBeSeamless*/); mFdp.ConsumeBool() /*shouldBeSeamless*/); FrameTimelineInfo info; FrameTimelineInfo info; queue->setFrameTimelineInfo(info); queue->setFrameTimelineInfo(mFdp.ConsumeIntegral<uint64_t>(), info); ManageResourceHandle handle(&mFdp); ManageResourceHandle handle(&mFdp); queue->setSidebandStream(handle.getStream()); queue->setSidebandStream(handle.getStream()); Loading libs/gui/include/gui/BLASTBufferQueue.h +2 −2 Original line number Original line Diff line number Diff line Loading @@ -106,7 +106,7 @@ public: void update(const sp<SurfaceControl>& surface, uint32_t width, uint32_t height, int32_t format); void update(const sp<SurfaceControl>& surface, uint32_t width, uint32_t height, int32_t format); status_t setFrameRate(float frameRate, int8_t compatibility, bool shouldBeSeamless); status_t setFrameRate(float frameRate, int8_t compatibility, bool shouldBeSeamless); status_t setFrameTimelineInfo(const FrameTimelineInfo& info); status_t setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& info); void setSidebandStream(const sp<NativeHandle>& stream); void setSidebandStream(const sp<NativeHandle>& stream); Loading Loading @@ -231,7 +231,7 @@ private: std::vector<std::tuple<uint64_t /* framenumber */, SurfaceComposerClient::Transaction>> std::vector<std::tuple<uint64_t /* framenumber */, SurfaceComposerClient::Transaction>> mPendingTransactions GUARDED_BY(mMutex); mPendingTransactions GUARDED_BY(mMutex); std::queue<FrameTimelineInfo> mNextFrameTimelineInfoQueue GUARDED_BY(mMutex); std::queue<std::pair<uint64_t, FrameTimelineInfo>> mPendingFrameTimelines GUARDED_BY(mMutex); // Tracks the last acquired frame number // Tracks the last acquired frame number uint64_t mLastAcquiredFrameNumber GUARDED_BY(mMutex) = 0; uint64_t mLastAcquiredFrameNumber GUARDED_BY(mMutex) = 0; Loading libs/gui/include/gui/Surface.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -213,7 +213,7 @@ public: virtual status_t setFrameRate(float frameRate, int8_t compatibility, virtual status_t setFrameRate(float frameRate, int8_t compatibility, int8_t changeFrameRateStrategy); int8_t changeFrameRateStrategy); virtual status_t setFrameTimelineInfo(const FrameTimelineInfo& info); virtual status_t setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& info); protected: protected: virtual ~Surface(); virtual ~Surface(); Loading Loading
libs/gui/BLASTBufferQueue.cpp +26 −7 Original line number Original line Diff line number Diff line Loading @@ -587,9 +587,23 @@ status_t BLASTBufferQueue::acquireNextBufferLocked( t->setDesiredPresentTime(bufferItem.mTimestamp); t->setDesiredPresentTime(bufferItem.mTimestamp); } } if (!mNextFrameTimelineInfoQueue.empty()) { // Drop stale frame timeline infos t->setFrameTimelineInfo(mNextFrameTimelineInfoQueue.front()); while (!mPendingFrameTimelines.empty() && mNextFrameTimelineInfoQueue.pop(); mPendingFrameTimelines.front().first < bufferItem.mFrameNumber) { ATRACE_FORMAT_INSTANT("dropping stale frameNumber: %" PRIu64 " vsyncId: %" PRId64, mPendingFrameTimelines.front().first, mPendingFrameTimelines.front().second.vsyncId); mPendingFrameTimelines.pop(); } if (!mPendingFrameTimelines.empty() && mPendingFrameTimelines.front().first == bufferItem.mFrameNumber) { ATRACE_FORMAT_INSTANT("Transaction::setFrameTimelineInfo frameNumber: %" PRIu64 " vsyncId: %" PRId64, bufferItem.mFrameNumber, mPendingFrameTimelines.front().second.vsyncId); t->setFrameTimelineInfo(mPendingFrameTimelines.front().second); mPendingFrameTimelines.pop(); } } { { Loading Loading @@ -653,6 +667,7 @@ void BLASTBufferQueue::onFrameAvailable(const BufferItem& item) { { { std::unique_lock _lock{mMutex}; std::unique_lock _lock{mMutex}; BBQ_TRACE(); BBQ_TRACE(); const bool syncTransactionSet = mTransactionReadyCallback != nullptr; const bool syncTransactionSet = mTransactionReadyCallback != nullptr; BQA_LOGV("onFrameAvailable-start syncTransactionSet=%s", boolToString(syncTransactionSet)); BQA_LOGV("onFrameAvailable-start syncTransactionSet=%s", boolToString(syncTransactionSet)); Loading Loading @@ -847,12 +862,13 @@ public: return mBbq->setFrameRate(frameRate, compatibility, changeFrameRateStrategy); return mBbq->setFrameRate(frameRate, compatibility, changeFrameRateStrategy); } } status_t setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) override { status_t setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& frameTimelineInfo) override { std::unique_lock _lock{mMutex}; std::unique_lock _lock{mMutex}; if (mDestroyed) { if (mDestroyed) { return DEAD_OBJECT; return DEAD_OBJECT; } } return mBbq->setFrameTimelineInfo(frameTimelineInfo); return mBbq->setFrameTimelineInfo(frameNumber, frameTimelineInfo); } } void destroy() override { void destroy() override { Loading @@ -874,9 +890,12 @@ status_t BLASTBufferQueue::setFrameRate(float frameRate, int8_t compatibility, return t.setFrameRate(mSurfaceControl, frameRate, compatibility, shouldBeSeamless).apply(); return t.setFrameRate(mSurfaceControl, frameRate, compatibility, shouldBeSeamless).apply(); } } status_t BLASTBufferQueue::setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) { status_t BLASTBufferQueue::setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& frameTimelineInfo) { ATRACE_FORMAT("%s(%s) frameNumber: %" PRIu64 " vsyncId: %" PRId64, __func__, mName.c_str(), frameNumber, frameTimelineInfo.vsyncId); std::unique_lock _lock{mMutex}; std::unique_lock _lock{mMutex}; mNextFrameTimelineInfoQueue.push(frameTimelineInfo); mPendingFrameTimelines.push({frameNumber, frameTimelineInfo}); return OK; return OK; } } Loading
libs/gui/Surface.cpp +4 −2 Original line number Original line Diff line number Diff line Loading @@ -1863,6 +1863,7 @@ int Surface::dispatchGetLastQueuedBuffer2(va_list args) { int Surface::dispatchSetFrameTimelineInfo(va_list args) { int Surface::dispatchSetFrameTimelineInfo(va_list args) { ATRACE_CALL(); ATRACE_CALL(); auto frameNumber = static_cast<uint64_t>(va_arg(args, uint64_t)); auto frameTimelineVsyncId = static_cast<int64_t>(va_arg(args, int64_t)); auto frameTimelineVsyncId = static_cast<int64_t>(va_arg(args, int64_t)); auto inputEventId = static_cast<int32_t>(va_arg(args, int32_t)); auto inputEventId = static_cast<int32_t>(va_arg(args, int32_t)); auto startTimeNanos = static_cast<int64_t>(va_arg(args, int64_t)); auto startTimeNanos = static_cast<int64_t>(va_arg(args, int64_t)); Loading @@ -1872,7 +1873,7 @@ int Surface::dispatchSetFrameTimelineInfo(va_list args) { ftlInfo.vsyncId = frameTimelineVsyncId; ftlInfo.vsyncId = frameTimelineVsyncId; ftlInfo.inputEventId = inputEventId; ftlInfo.inputEventId = inputEventId; ftlInfo.startTimeNanos = startTimeNanos; ftlInfo.startTimeNanos = startTimeNanos; return setFrameTimelineInfo(ftlInfo); return setFrameTimelineInfo(frameNumber, ftlInfo); } } bool Surface::transformToDisplayInverse() const { bool Surface::transformToDisplayInverse() const { Loading Loading @@ -2641,7 +2642,8 @@ void Surface::ProducerListenerProxy::onBuffersDiscarded(const std::vector<int32_ return NO_ERROR; return NO_ERROR; } } status_t Surface::setFrameTimelineInfo(const FrameTimelineInfo& /*frameTimelineInfo*/) { status_t Surface::setFrameTimelineInfo(uint64_t /*frameNumber*/, const FrameTimelineInfo& /*frameTimelineInfo*/) { // ISurfaceComposer no longer supports setFrameTimelineInfo // ISurfaceComposer no longer supports setFrameTimelineInfo return BAD_VALUE; return BAD_VALUE; } } Loading
libs/gui/fuzzer/libgui_bufferQueue_fuzzer.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -130,7 +130,7 @@ void BufferQueueFuzzer::invokeBlastBufferQueue() { queue->setFrameRate(mFdp.ConsumeFloatingPoint<float>(), mFdp.ConsumeIntegral<int8_t>(), queue->setFrameRate(mFdp.ConsumeFloatingPoint<float>(), mFdp.ConsumeIntegral<int8_t>(), mFdp.ConsumeBool() /*shouldBeSeamless*/); mFdp.ConsumeBool() /*shouldBeSeamless*/); FrameTimelineInfo info; FrameTimelineInfo info; queue->setFrameTimelineInfo(info); queue->setFrameTimelineInfo(mFdp.ConsumeIntegral<uint64_t>(), info); ManageResourceHandle handle(&mFdp); ManageResourceHandle handle(&mFdp); queue->setSidebandStream(handle.getStream()); queue->setSidebandStream(handle.getStream()); Loading
libs/gui/include/gui/BLASTBufferQueue.h +2 −2 Original line number Original line Diff line number Diff line Loading @@ -106,7 +106,7 @@ public: void update(const sp<SurfaceControl>& surface, uint32_t width, uint32_t height, int32_t format); void update(const sp<SurfaceControl>& surface, uint32_t width, uint32_t height, int32_t format); status_t setFrameRate(float frameRate, int8_t compatibility, bool shouldBeSeamless); status_t setFrameRate(float frameRate, int8_t compatibility, bool shouldBeSeamless); status_t setFrameTimelineInfo(const FrameTimelineInfo& info); status_t setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& info); void setSidebandStream(const sp<NativeHandle>& stream); void setSidebandStream(const sp<NativeHandle>& stream); Loading Loading @@ -231,7 +231,7 @@ private: std::vector<std::tuple<uint64_t /* framenumber */, SurfaceComposerClient::Transaction>> std::vector<std::tuple<uint64_t /* framenumber */, SurfaceComposerClient::Transaction>> mPendingTransactions GUARDED_BY(mMutex); mPendingTransactions GUARDED_BY(mMutex); std::queue<FrameTimelineInfo> mNextFrameTimelineInfoQueue GUARDED_BY(mMutex); std::queue<std::pair<uint64_t, FrameTimelineInfo>> mPendingFrameTimelines GUARDED_BY(mMutex); // Tracks the last acquired frame number // Tracks the last acquired frame number uint64_t mLastAcquiredFrameNumber GUARDED_BY(mMutex) = 0; uint64_t mLastAcquiredFrameNumber GUARDED_BY(mMutex) = 0; Loading
libs/gui/include/gui/Surface.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -213,7 +213,7 @@ public: virtual status_t setFrameRate(float frameRate, int8_t compatibility, virtual status_t setFrameRate(float frameRate, int8_t compatibility, int8_t changeFrameRateStrategy); int8_t changeFrameRateStrategy); virtual status_t setFrameTimelineInfo(const FrameTimelineInfo& info); virtual status_t setFrameTimelineInfo(uint64_t frameNumber, const FrameTimelineInfo& info); protected: protected: virtual ~Surface(); virtual ~Surface(); Loading