From 439afadf859e15f01cb2781949d2402e69e4b4b7 Mon Sep 17 00:00:00 2001 From: Brian Lindahl Date: Mon, 14 Nov 2022 11:16:55 -0700 Subject: Push HWC cache slot generation down into CompositionEngine Stop caching buffers inside SurfaceFlinger and remove the tight coupling between SurfaceFlinger's ClientCache and the Hardware Composer cache. This allows a better seperation of responsibility, where buffer cache management is not split between HwcSlotGenerator and HwcBufferCache, but is instead solely handled by HwcBufferCache. Note that FramebufferSurface and VirtualDisplaySurface no longer use HwcBufferCache, but instead use their own cache slot management that is solely based on BufferQueue slot numbers. Also do minor refactoring in FramebufferSurface to simplify code. Bug: 258196272 Test: started and stopped multiple YouTube videos on adt4 and verified no change in graphic buffer usage Test: atest HwcBufferCacheTest Test: atest OutputPrepareTest Change-Id: Ica7955ab4bc70e3c70207390e36dff73a2fc4949 --- services/surfaceflinger/ClientCache.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'services/surfaceflinger/ClientCache.cpp') diff --git a/services/surfaceflinger/ClientCache.cpp b/services/surfaceflinger/ClientCache.cpp index 2bd8f324e1..09e41ffede 100644 --- a/services/surfaceflinger/ClientCache.cpp +++ b/services/surfaceflinger/ClientCache.cpp @@ -118,7 +118,8 @@ ClientCache::add(const client_cache_t& cacheId, const sp& buffer) Usage::READABLE)); } -void ClientCache::erase(const client_cache_t& cacheId) { +sp ClientCache::erase(const client_cache_t& cacheId) { + sp buffer; auto& [processToken, id] = cacheId; std::vector> pendingErase; { @@ -126,9 +127,11 @@ void ClientCache::erase(const client_cache_t& cacheId) { ClientCacheBuffer* buf = nullptr; if (!getBuffer(cacheId, &buf)) { ALOGE("failed to erase buffer, could not retrieve buffer"); - return; + return nullptr; } + buffer = buf->buffer->getBuffer(); + for (auto& recipient : buf->recipients) { sp erasedRecipient = recipient.promote(); if (erasedRecipient) { @@ -142,6 +145,7 @@ void ClientCache::erase(const client_cache_t& cacheId) { for (auto& recipient : pendingErase) { recipient->bufferErased(cacheId); } + return buffer; } std::shared_ptr ClientCache::get(const client_cache_t& cacheId) { -- cgit v1.2.3-59-g8ed1b