diff options
author | 2020-11-24 23:51:31 +0100 | |
---|---|---|
committer | 2020-12-10 16:17:14 +0100 | |
commit | 9c03b50a30c163ad4cee13455311812ef563db40 (patch) | |
tree | 380089958aada0c2e68d86a690b717c97547fe1e /libs/gui/SurfaceComposerClient.cpp | |
parent | 5814ab8b847af326de5c46a1b5f2409ff404fc3a (diff) |
Add Shared timeline jank classification listener (1/2)
Adds the ability to register a listener that gets informed about
SF' jank classifications via the TransactionCompleted interface
Bug: 17475548
Test: FrameTimelineTest
Test: Register listener, ensure data flows back
Change-Id: Ie42c508da605c03569eadab6ab18b7315b35d247
Diffstat (limited to 'libs/gui/SurfaceComposerClient.cpp')
-rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 47a08ab500..9ed7d1cc19 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -125,6 +125,9 @@ sp<SurfaceComposerClient> SurfaceComposerClient::getDefault() { return DefaultComposerClient::getComposerClient(); } +JankDataListener::~JankDataListener() { +} + // --------------------------------------------------------------------------- // TransactionCompletedListener does not use ANDROID_SINGLETON_STATIC_INSTANCE because it needs @@ -174,6 +177,23 @@ CallbackId TransactionCompletedListener::addCallbackFunction( return callbackId; } +void TransactionCompletedListener::addJankListener(const sp<JankDataListener>& listener, + sp<SurfaceControl> surfaceControl) { + std::lock_guard<std::mutex> lock(mMutex); + mJankListeners.insert({surfaceControl->getHandle(), listener}); +} + +void TransactionCompletedListener::removeJankListener(const sp<JankDataListener>& listener) { + std::lock_guard<std::mutex> lock(mMutex); + for (auto it = mJankListeners.begin(); it != mJankListeners.end();) { + if (it->second == listener) { + it = mJankListeners.erase(it); + } else { + it++; + } + } +} + void TransactionCompletedListener::addSurfaceControlToCallbacks( const sp<SurfaceControl>& surfaceControl, const std::unordered_set<CallbackId>& callbackIds) { @@ -189,6 +209,7 @@ void TransactionCompletedListener::addSurfaceControlToCallbacks( void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) { std::unordered_map<CallbackId, CallbackTranslation> callbacksMap; + std::multimap<sp<IBinder>, sp<JankDataListener>> jankListenersMap; { std::lock_guard<std::mutex> lock(mMutex); @@ -204,6 +225,7 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener * sp<SurfaceControl> that could possibly exist for the callbacks. */ callbacksMap = mCallbacks; + jankListenersMap = mJankListeners; for (const auto& transactionStats : listenerStats.transactionStats) { for (auto& callbackId : transactionStats.callbackIds) { mCallbacks.erase(callbackId); @@ -236,6 +258,13 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener callbackFunction(transactionStats.latchTime, transactionStats.presentFence, surfaceControlStats); } + for (const auto& surfaceStats : transactionStats.surfaceStats) { + if (surfaceStats.jankData.empty()) continue; + for (auto it = jankListenersMap.find(surfaceStats.surfaceControl); + it != jankListenersMap.end(); it++) { + it->second->onJankDataAvailable(surfaceStats.jankData); + } + } } } |