Loading libs/gui/BLASTBufferQueue.cpp +27 −15 Original line number Diff line number Diff line Loading @@ -508,21 +508,7 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) { } } auto mergeTransaction = [&t, currentFrameNumber = bufferItem.mFrameNumber]( std::tuple<uint64_t, SurfaceComposerClient::Transaction> pendingTransaction) { auto& [targetFrameNumber, transaction] = pendingTransaction; if (currentFrameNumber < targetFrameNumber) { return false; } t->merge(std::move(transaction)); return true; }; mPendingTransactions.erase(std::remove_if(mPendingTransactions.begin(), mPendingTransactions.end(), mergeTransaction), mPendingTransactions.end()); mergePendingTransactions(t, bufferItem.mFrameNumber); if (applyTransaction) { t->setApplyToken(mApplyToken).apply(); } Loading Loading @@ -726,6 +712,32 @@ void BLASTBufferQueue::mergeWithNextTransaction(SurfaceComposerClient::Transacti } } void BLASTBufferQueue::applyPendingTransactions(uint64_t frameNumber) { std::lock_guard _lock{mMutex}; SurfaceComposerClient::Transaction t; mergePendingTransactions(&t, frameNumber); t.setApplyToken(mApplyToken).apply(); } void BLASTBufferQueue::mergePendingTransactions(SurfaceComposerClient::Transaction* t, uint64_t frameNumber) { auto mergeTransaction = [&t, currentFrameNumber = frameNumber]( std::tuple<uint64_t, SurfaceComposerClient::Transaction> pendingTransaction) { auto& [targetFrameNumber, transaction] = pendingTransaction; if (currentFrameNumber < targetFrameNumber) { return false; } t->merge(std::move(transaction)); return true; }; mPendingTransactions.erase(std::remove_if(mPendingTransactions.begin(), mPendingTransactions.end(), mergeTransaction), mPendingTransactions.end()); } // Maintains a single worker thread per process that services a list of runnables. class AsyncWorker : public Singleton<AsyncWorker> { private: Loading libs/gui/include/gui/BLASTBufferQueue.h +3 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,7 @@ public: uint32_t transformHint, uint32_t currentMaxAcquiredBufferCount); void setNextTransaction(SurfaceComposerClient::Transaction *t); void mergeWithNextTransaction(SurfaceComposerClient::Transaction* t, uint64_t frameNumber); void applyPendingTransactions(uint64_t frameNumber); void setTransactionCompleteCallback(uint64_t frameNumber, std::function<void(int64_t)>&& transactionCompleteCallback); Loading Loading @@ -125,6 +126,8 @@ private: bool rejectBuffer(const BufferItem& item) REQUIRES(mMutex); bool maxBuffersAcquired(bool includeExtraAcquire) const REQUIRES(mMutex); static PixelFormat convertBufferFormat(PixelFormat& format); void mergePendingTransactions(SurfaceComposerClient::Transaction* t, uint64_t frameNumber) REQUIRES(mMutex); std::string mName; // Represents the queued buffer count from buffer queue, Loading Loading
libs/gui/BLASTBufferQueue.cpp +27 −15 Original line number Diff line number Diff line Loading @@ -508,21 +508,7 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) { } } auto mergeTransaction = [&t, currentFrameNumber = bufferItem.mFrameNumber]( std::tuple<uint64_t, SurfaceComposerClient::Transaction> pendingTransaction) { auto& [targetFrameNumber, transaction] = pendingTransaction; if (currentFrameNumber < targetFrameNumber) { return false; } t->merge(std::move(transaction)); return true; }; mPendingTransactions.erase(std::remove_if(mPendingTransactions.begin(), mPendingTransactions.end(), mergeTransaction), mPendingTransactions.end()); mergePendingTransactions(t, bufferItem.mFrameNumber); if (applyTransaction) { t->setApplyToken(mApplyToken).apply(); } Loading Loading @@ -726,6 +712,32 @@ void BLASTBufferQueue::mergeWithNextTransaction(SurfaceComposerClient::Transacti } } void BLASTBufferQueue::applyPendingTransactions(uint64_t frameNumber) { std::lock_guard _lock{mMutex}; SurfaceComposerClient::Transaction t; mergePendingTransactions(&t, frameNumber); t.setApplyToken(mApplyToken).apply(); } void BLASTBufferQueue::mergePendingTransactions(SurfaceComposerClient::Transaction* t, uint64_t frameNumber) { auto mergeTransaction = [&t, currentFrameNumber = frameNumber]( std::tuple<uint64_t, SurfaceComposerClient::Transaction> pendingTransaction) { auto& [targetFrameNumber, transaction] = pendingTransaction; if (currentFrameNumber < targetFrameNumber) { return false; } t->merge(std::move(transaction)); return true; }; mPendingTransactions.erase(std::remove_if(mPendingTransactions.begin(), mPendingTransactions.end(), mergeTransaction), mPendingTransactions.end()); } // Maintains a single worker thread per process that services a list of runnables. class AsyncWorker : public Singleton<AsyncWorker> { private: Loading
libs/gui/include/gui/BLASTBufferQueue.h +3 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,7 @@ public: uint32_t transformHint, uint32_t currentMaxAcquiredBufferCount); void setNextTransaction(SurfaceComposerClient::Transaction *t); void mergeWithNextTransaction(SurfaceComposerClient::Transaction* t, uint64_t frameNumber); void applyPendingTransactions(uint64_t frameNumber); void setTransactionCompleteCallback(uint64_t frameNumber, std::function<void(int64_t)>&& transactionCompleteCallback); Loading Loading @@ -125,6 +126,8 @@ private: bool rejectBuffer(const BufferItem& item) REQUIRES(mMutex); bool maxBuffersAcquired(bool includeExtraAcquire) const REQUIRES(mMutex); static PixelFormat convertBufferFormat(PixelFormat& format); void mergePendingTransactions(SurfaceComposerClient::Transaction* t, uint64_t frameNumber) REQUIRES(mMutex); std::string mName; // Represents the queued buffer count from buffer queue, Loading