Loading libs/gui/ITransactionCompletedListener.cpp +18 −2 Original line number Diff line number Diff line Loading @@ -59,7 +59,15 @@ status_t TransactionStats::writeToParcel(Parcel* output) const { if (err != NO_ERROR) { return err; } err = output->writeInt64(presentTime); if (presentFence) { err = output->writeBool(true); if (err != NO_ERROR) { return err; } err = output->write(*presentFence); } else { err = output->writeBool(false); } if (err != NO_ERROR) { return err; } Loading @@ -71,10 +79,18 @@ status_t TransactionStats::readFromParcel(const Parcel* input) { if (err != NO_ERROR) { return err; } err = input->readInt64(&presentTime); bool hasFence = false; err = input->readBool(&hasFence); if (err != NO_ERROR) { return err; } if (hasFence) { presentFence = new Fence(); err = input->read(*presentFence); if (err != NO_ERROR) { return err; } } return input->readParcelableVector(&surfaceStats); } Loading libs/gui/include/gui/ITransactionCompletedListener.h +2 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <binder/Parcelable.h> #include <binder/SafeInterface.h> #include <ui/Fence.h> #include <utils/Timers.h> #include <cstdint> Loading Loading @@ -65,7 +66,7 @@ public: status_t readFromParcel(const Parcel* input) override; nsecs_t latchTime = -1; nsecs_t presentTime = -1; sp<Fence> presentFence = nullptr; std::vector<SurfaceStats> surfaceStats; }; Loading services/surfaceflinger/TransactionCompletedThread.cpp +2 −20 Original line number Diff line number Diff line Loading @@ -151,18 +151,6 @@ void TransactionCompletedThread::threadMain() { while (mKeepRunning) { mConditionVariable.wait(mMutex); // Present fence should fire almost immediately. If the fence has not signaled in 100ms, // there is a major problem and it will probably never fire. nsecs_t presentTime = -1; if (mPresentFence) { status_t status = mPresentFence->wait(100); if (status == NO_ERROR) { presentTime = mPresentFence->getSignalTime(); } else { ALOGE("present fence has not signaled, err %d", status); } } // We should never hit this case. The release fences from the previous frame should have // signaled long before the current frame is presented. for (const auto& fence : mPreviousReleaseFences) { Loading @@ -188,17 +176,11 @@ void TransactionCompletedThread::threadMain() { // If the transaction has been latched if (transactionStats.latchTime >= 0) { // If the present time is < 0, this transaction has been latched but not // presented. Skip it for now. This can happen when a new transaction comes // in between the latch and present steps. sendCallbacks is called by // SurfaceFlinger when the transaction is received to ensure that if the // transaction that didn't update state it still got a callback. if (presentTime < 0) { if (!mPresentFence) { sendCallback = false; break; } transactionStats.presentTime = presentTime; transactionStats.presentFence = mPresentFence; } } // If the listener has no pending transactions and all latched transactions have been Loading services/surfaceflinger/tests/Transaction_test.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -2502,12 +2502,12 @@ public: } void verifyTransactionStats(const TransactionStats& transactionStats) const { const auto& [latchTime, presentTime, surfaceStats] = transactionStats; const auto& [latchTime, presentFence, surfaceStats] = transactionStats; if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) { ASSERT_GE(latchTime, 0) << "bad latch time"; ASSERT_GE(presentTime, 0) << "bad present time"; ASSERT_NE(presentFence, nullptr); } else { ASSERT_EQ(presentTime, -1) << "transaction shouldn't have been presented"; ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented"; ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched"; } Loading Loading
libs/gui/ITransactionCompletedListener.cpp +18 −2 Original line number Diff line number Diff line Loading @@ -59,7 +59,15 @@ status_t TransactionStats::writeToParcel(Parcel* output) const { if (err != NO_ERROR) { return err; } err = output->writeInt64(presentTime); if (presentFence) { err = output->writeBool(true); if (err != NO_ERROR) { return err; } err = output->write(*presentFence); } else { err = output->writeBool(false); } if (err != NO_ERROR) { return err; } Loading @@ -71,10 +79,18 @@ status_t TransactionStats::readFromParcel(const Parcel* input) { if (err != NO_ERROR) { return err; } err = input->readInt64(&presentTime); bool hasFence = false; err = input->readBool(&hasFence); if (err != NO_ERROR) { return err; } if (hasFence) { presentFence = new Fence(); err = input->read(*presentFence); if (err != NO_ERROR) { return err; } } return input->readParcelableVector(&surfaceStats); } Loading
libs/gui/include/gui/ITransactionCompletedListener.h +2 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <binder/Parcelable.h> #include <binder/SafeInterface.h> #include <ui/Fence.h> #include <utils/Timers.h> #include <cstdint> Loading Loading @@ -65,7 +66,7 @@ public: status_t readFromParcel(const Parcel* input) override; nsecs_t latchTime = -1; nsecs_t presentTime = -1; sp<Fence> presentFence = nullptr; std::vector<SurfaceStats> surfaceStats; }; Loading
services/surfaceflinger/TransactionCompletedThread.cpp +2 −20 Original line number Diff line number Diff line Loading @@ -151,18 +151,6 @@ void TransactionCompletedThread::threadMain() { while (mKeepRunning) { mConditionVariable.wait(mMutex); // Present fence should fire almost immediately. If the fence has not signaled in 100ms, // there is a major problem and it will probably never fire. nsecs_t presentTime = -1; if (mPresentFence) { status_t status = mPresentFence->wait(100); if (status == NO_ERROR) { presentTime = mPresentFence->getSignalTime(); } else { ALOGE("present fence has not signaled, err %d", status); } } // We should never hit this case. The release fences from the previous frame should have // signaled long before the current frame is presented. for (const auto& fence : mPreviousReleaseFences) { Loading @@ -188,17 +176,11 @@ void TransactionCompletedThread::threadMain() { // If the transaction has been latched if (transactionStats.latchTime >= 0) { // If the present time is < 0, this transaction has been latched but not // presented. Skip it for now. This can happen when a new transaction comes // in between the latch and present steps. sendCallbacks is called by // SurfaceFlinger when the transaction is received to ensure that if the // transaction that didn't update state it still got a callback. if (presentTime < 0) { if (!mPresentFence) { sendCallback = false; break; } transactionStats.presentTime = presentTime; transactionStats.presentFence = mPresentFence; } } // If the listener has no pending transactions and all latched transactions have been Loading
services/surfaceflinger/tests/Transaction_test.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -2502,12 +2502,12 @@ public: } void verifyTransactionStats(const TransactionStats& transactionStats) const { const auto& [latchTime, presentTime, surfaceStats] = transactionStats; const auto& [latchTime, presentFence, surfaceStats] = transactionStats; if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) { ASSERT_GE(latchTime, 0) << "bad latch time"; ASSERT_GE(presentTime, 0) << "bad present time"; ASSERT_NE(presentFence, nullptr); } else { ASSERT_EQ(presentTime, -1) << "transaction shouldn't have been presented"; ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented"; ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched"; } Loading