diff options
| author | 2021-02-17 17:38:20 +0000 | |
|---|---|---|
| committer | 2021-02-17 17:38:20 +0000 | |
| commit | efc92f464e183c08f80267db94ac0dddcd6e2a48 (patch) | |
| tree | c8f1b2854b8267db9e7db3c1de957dc84fef4068 /libs/gui | |
| parent | 93be444a3d8e6e2d0ef73f82b0e42104ad4462bc (diff) | |
| parent | f51775dbb66ff8ee2254ec06d5d5668d8791d8dc (diff) | |
Merge "Add GPU completion to FrameMetrics (2/3)" into sc-dev
Diffstat (limited to 'libs/gui')
| -rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 32 | ||||
| -rw-r--r-- | libs/gui/include/gui/SurfaceComposerClient.h | 21 |
2 files changed, 51 insertions, 2 deletions
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 27fb2a8cd7..d41da9b308 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -194,6 +194,25 @@ void TransactionCompletedListener::removeJankListener(const sp<JankDataListener> } } +void TransactionCompletedListener::addSurfaceStatsListener(void* context, void* cookie, + sp<SurfaceControl> surfaceControl, SurfaceStatsCallback listener) { + std::lock_guard<std::mutex> lock(mMutex); + mSurfaceStatsListeners.insert({surfaceControl->getHandle(), + SurfaceStatsCallbackEntry(context, cookie, listener)}); +} + +void TransactionCompletedListener::removeSurfaceStatsListener(void* context, void* cookie) { + std::lock_guard<std::mutex> lock(mMutex); + for (auto it = mSurfaceStatsListeners.begin(); it != mSurfaceStatsListeners.end();) { + auto [itContext, itCookie, itListener] = it->second; + if (itContext == context && itCookie == cookie) { + it = mSurfaceStatsListeners.erase(it); + } else { + it++; + } + } +} + void TransactionCompletedListener::addSurfaceControlToCallbacks( const sp<SurfaceControl>& surfaceControl, const std::unordered_set<CallbackId>& callbackIds) { @@ -210,6 +229,7 @@ void TransactionCompletedListener::addSurfaceControlToCallbacks( void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) { std::unordered_map<CallbackId, CallbackTranslation> callbacksMap; std::multimap<sp<IBinder>, sp<JankDataListener>> jankListenersMap; + std::multimap<sp<IBinder>, SurfaceStatsCallbackEntry> surfaceListeners; { std::lock_guard<std::mutex> lock(mMutex); @@ -226,6 +246,7 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener */ callbacksMap = mCallbacks; jankListenersMap = mJankListeners; + surfaceListeners = mSurfaceStatsListeners; for (const auto& transactionStats : listenerStats.transactionStats) { for (auto& callbackId : transactionStats.callbackIds) { mCallbacks.erase(callbackId); @@ -259,9 +280,16 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener surfaceControlStats); } for (const auto& surfaceStats : transactionStats.surfaceStats) { + auto listenerRange = surfaceListeners.equal_range(surfaceStats.surfaceControl); + for (auto it = listenerRange.first; it != listenerRange.second; it++) { + auto entry = it->second; + entry.callback(entry.context, transactionStats.latchTime, + transactionStats.presentFence, surfaceStats); + } + if (surfaceStats.jankData.empty()) continue; - for (auto it = jankListenersMap.find(surfaceStats.surfaceControl); - it != jankListenersMap.end(); it++) { + auto jankRange = jankListenersMap.equal_range(surfaceStats.surfaceControl); + for (auto it = jankRange.first; it != jankRange.second; it++) { it->second->onJankDataAvailable(surfaceStats.jankData); } } diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index e89f3a7b44..8de7574fa7 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -80,6 +80,10 @@ using TransactionCompletedCallbackTakesContext = using TransactionCompletedCallback = std::function<void(nsecs_t /*latchTime*/, const sp<Fence>& /*presentFence*/, const std::vector<SurfaceControlStats>& /*stats*/)>; +using SurfaceStatsCallback = + std::function<void(void* /*context*/, nsecs_t /*latchTime*/, + const sp<Fence>& /*presentFence*/, + const SurfaceStats& /*stats*/)>; // --------------------------------------------------------------------------- @@ -650,8 +654,21 @@ class TransactionCompletedListener : public BnTransactionCompletedListener { surfaceControls; }; + struct SurfaceStatsCallbackEntry { + SurfaceStatsCallbackEntry(void* context, void* cookie, SurfaceStatsCallback callback) + : context(context), + cookie(cookie), + callback(callback) {} + + void* context; + void* cookie; + SurfaceStatsCallback callback; + }; + std::unordered_map<CallbackId, CallbackTranslation> mCallbacks GUARDED_BY(mMutex); std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners GUARDED_BY(mMutex); + std::multimap<sp<IBinder>, SurfaceStatsCallbackEntry> + mSurfaceStatsListeners GUARDED_BY(mMutex); public: static sp<TransactionCompletedListener> getInstance(); @@ -679,6 +696,10 @@ public: */ void removeJankListener(const sp<JankDataListener>& listener); + void addSurfaceStatsListener(void* context, void* cookie, sp<SurfaceControl> surfaceControl, + SurfaceStatsCallback listener); + void removeSurfaceStatsListener(void* context, void* cookie); + // Overrides BnTransactionCompletedListener's onTransactionCompleted void onTransactionCompleted(ListenerStats stats) override; }; |