diff options
| author | 2024-09-24 23:46:53 +0000 | |
|---|---|---|
| committer | 2024-09-25 04:54:11 +0000 | |
| commit | cd391bc3902968363e68ccf7cd6a23a2411362e6 (patch) | |
| tree | 5d1bfa78fceb86d29b1a5c0e7244e2c0a743b0d8 | |
| parent | c420be83a8853b3bfffb3f5f2790fb1dec9460c8 (diff) | |
Use Layer IDs instead of handles in BufferCountTracker
Allows more versatility in looking up buffer counts by
layer ID. Layer handles will not always be available for
lookup.
Test: presubmit
Bug: b/294922229
Flag: EXEMPT pure refactoring
Change-Id: Ifba8b19f24f3f3cf35d247490a17fe3b8c4920e0
| -rw-r--r-- | services/surfaceflinger/FrontEnd/LayerHandle.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 10 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 22 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h | 2 |
4 files changed, 18 insertions, 18 deletions
diff --git a/services/surfaceflinger/FrontEnd/LayerHandle.cpp b/services/surfaceflinger/FrontEnd/LayerHandle.cpp index 75e4e3ae11..ffd51a40bb 100644 --- a/services/surfaceflinger/FrontEnd/LayerHandle.cpp +++ b/services/surfaceflinger/FrontEnd/LayerHandle.cpp @@ -28,7 +28,7 @@ LayerHandle::LayerHandle(const sp<android::SurfaceFlinger>& flinger, LayerHandle::~LayerHandle() { if (mFlinger) { - mFlinger->onHandleDestroyed(this, mLayer, mLayerId); + mFlinger->onHandleDestroyed(mLayer, mLayerId); } } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 65a0ed3065..49b0c8c177 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -4719,6 +4719,7 @@ status_t SurfaceFlinger::setTransactionState( for (auto& state : states) { resolvedStates.emplace_back(std::move(state)); auto& resolvedState = resolvedStates.back(); + resolvedState.layerId = LayerHandle::getLayerId(resolvedState.state.surface); if (resolvedState.state.hasBufferChanges() && resolvedState.state.hasValidBuffer() && resolvedState.state.surface) { sp<Layer> layer = LayerHandle::getLayer(resolvedState.state.surface); @@ -4730,9 +4731,8 @@ status_t SurfaceFlinger::setTransactionState( if (resolvedState.externalTexture) { resolvedState.state.bufferData->buffer = resolvedState.externalTexture->getBuffer(); } - mBufferCountTracker.increment(resolvedState.state.surface->localBinder()); + mBufferCountTracker.increment(resolvedState.layerId); } - resolvedState.layerId = LayerHandle::getLayerId(resolvedState.state.surface); if (resolvedState.state.what & layer_state_t::eReparent) { resolvedState.parentId = getLayerIdFromSurfaceControl(resolvedState.state.parentSurfaceControlForChild); @@ -5175,7 +5175,7 @@ status_t SurfaceFlinger::createLayer(LayerCreationArgs& args, gui::CreateSurface std::atomic<int32_t>* pendingBufferCounter = layer->getPendingBufferCounter(); if (pendingBufferCounter) { std::string counterName = layer->getPendingBufferCounterName(); - mBufferCountTracker.add(outResult.handle->localBinder(), counterName, + mBufferCountTracker.add(LayerHandle::getLayerId(outResult.handle), counterName, pendingBufferCounter); } } break; @@ -5223,7 +5223,7 @@ status_t SurfaceFlinger::createEffectLayer(const LayerCreationArgs& args, sp<IBi return NO_ERROR; } -void SurfaceFlinger::onHandleDestroyed(BBinder* handle, sp<Layer>& layer, uint32_t layerId) { +void SurfaceFlinger::onHandleDestroyed(sp<Layer>& layer, uint32_t layerId) { { // Used to remove stalled transactions which uses an internal lock. ftl::FakeGuard guard(kMainThreadContext); @@ -5236,7 +5236,7 @@ void SurfaceFlinger::onHandleDestroyed(BBinder* handle, sp<Layer>& layer, uint32 Mutex::Autolock stateLock(mStateLock); layer->onHandleDestroyed(); - mBufferCountTracker.remove(handle); + mBufferCountTracker.remove(layerId); layer.clear(); setTransactionFlags(eTransactionFlushNeeded | eTransactionNeeded); } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 3eb72cc4c0..db0e15e6c2 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -296,7 +296,7 @@ public: // Called when all clients have released all their references to // this layer. The layer may still be kept alive by its parents but // the client can no longer modify this layer directly. - void onHandleDestroyed(BBinder* handle, sp<Layer>& layer, uint32_t layerId); + void onHandleDestroyed(sp<Layer>& layer, uint32_t layerId); TransactionCallbackInvoker& getTransactionCallbackInvoker() { return mTransactionCallbackInvoker; @@ -433,32 +433,32 @@ private: // This is done to avoid lock contention with the main thread. class BufferCountTracker { public: - void increment(BBinder* layerHandle) { + void increment(uint32_t layerId) { std::lock_guard<std::mutex> lock(mLock); - auto it = mCounterByLayerHandle.find(layerHandle); - if (it != mCounterByLayerHandle.end()) { + auto it = mCounterByLayerId.find(layerId); + if (it != mCounterByLayerId.end()) { auto [name, pendingBuffers] = it->second; int32_t count = ++(*pendingBuffers); SFTRACE_INT(name.c_str(), count); } else { - ALOGW("Handle not found! %p", layerHandle); + ALOGW("Layer ID not found! %d", layerId); } } - void add(BBinder* layerHandle, const std::string& name, std::atomic<int32_t>* counter) { + void add(uint32_t layerId, const std::string& name, std::atomic<int32_t>* counter) { std::lock_guard<std::mutex> lock(mLock); - mCounterByLayerHandle[layerHandle] = std::make_pair(name, counter); + mCounterByLayerId[layerId] = std::make_pair(name, counter); } - void remove(BBinder* layerHandle) { + void remove(uint32_t layerId) { std::lock_guard<std::mutex> lock(mLock); - mCounterByLayerHandle.erase(layerHandle); + mCounterByLayerId.erase(layerId); } private: std::mutex mLock; - std::unordered_map<BBinder*, std::pair<std::string, std::atomic<int32_t>*>> - mCounterByLayerHandle GUARDED_BY(mLock); + std::unordered_map<uint32_t, std::pair<std::string, std::atomic<int32_t>*>> + mCounterByLayerId GUARDED_BY(mLock); }; enum class BootStage { diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h index 9dae06aa1d..7a12f656ab 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -635,7 +635,7 @@ public: void destroyAllLayerHandles() { ftl::FakeGuard guard(kMainThreadContext); for (auto [layerId, legacyLayer] : mFlinger->mLegacyLayers) { - mFlinger->onHandleDestroyed(nullptr, legacyLayer, layerId); + mFlinger->onHandleDestroyed(legacyLayer, layerId); } } |