diff options
Diffstat (limited to 'services/surfaceflinger/ClientCache.cpp')
-rw-r--r-- | services/surfaceflinger/ClientCache.cpp | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/services/surfaceflinger/ClientCache.cpp b/services/surfaceflinger/ClientCache.cpp index 3c7b9d93aa..09e41ffede 100644 --- a/services/surfaceflinger/ClientCache.cpp +++ b/services/surfaceflinger/ClientCache.cpp @@ -22,6 +22,7 @@ #include <cinttypes> #include <android-base/stringprintf.h> +#include <gui/TraceUtils.h> #include <renderengine/impl/ExternalTexture.h> #include "ClientCache.h" @@ -30,18 +31,18 @@ namespace android { ANDROID_SINGLETON_STATIC_INSTANCE(ClientCache); -ClientCache::ClientCache() : mDeathRecipient(new CacheDeathRecipient) {} +ClientCache::ClientCache() : mDeathRecipient(sp<CacheDeathRecipient>::make()) {} bool ClientCache::getBuffer(const client_cache_t& cacheId, ClientCacheBuffer** outClientCacheBuffer) { auto& [processToken, id] = cacheId; if (processToken == nullptr) { - ALOGE("failed to get buffer, invalid (nullptr) process token"); + ALOGE_AND_TRACE("ClientCache::getBuffer - invalid (nullptr) process token"); return false; } auto it = mBuffers.find(processToken); if (it == mBuffers.end()) { - ALOGE("failed to get buffer, invalid process token"); + ALOGE_AND_TRACE("ClientCache::getBuffer - invalid process token"); return false; } @@ -49,7 +50,7 @@ bool ClientCache::getBuffer(const client_cache_t& cacheId, auto bufItr = processBuffers.find(id); if (bufItr == processBuffers.end()) { - ALOGV("failed to get buffer, invalid buffer id"); + ALOGE_AND_TRACE("ClientCache::getBuffer - invalid buffer id"); return false; } @@ -58,16 +59,17 @@ bool ClientCache::getBuffer(const client_cache_t& cacheId, return true; } -bool ClientCache::add(const client_cache_t& cacheId, const sp<GraphicBuffer>& buffer) { +base::expected<std::shared_ptr<renderengine::ExternalTexture>, ClientCache::AddError> +ClientCache::add(const client_cache_t& cacheId, const sp<GraphicBuffer>& buffer) { auto& [processToken, id] = cacheId; if (processToken == nullptr) { - ALOGE("failed to cache buffer: invalid process token"); - return false; + ALOGE_AND_TRACE("ClientCache::add - invalid (nullptr) process token"); + return base::unexpected(AddError::Unspecified); } if (!buffer) { - ALOGE("failed to cache buffer: invalid buffer"); - return false; + ALOGE_AND_TRACE("ClientCache::add - invalid (nullptr) buffer"); + return base::unexpected(AddError::Unspecified); } std::lock_guard lock(mMutex); @@ -79,16 +81,16 @@ bool ClientCache::add(const client_cache_t& cacheId, const sp<GraphicBuffer>& bu if (it == mBuffers.end()) { token = processToken.promote(); if (!token) { - ALOGE("failed to cache buffer: invalid token"); - return false; + ALOGE_AND_TRACE("ClientCache::add - invalid token"); + return base::unexpected(AddError::Unspecified); } // Only call linkToDeath if not a local binder if (token->localBinder() == nullptr) { status_t err = token->linkToDeath(mDeathRecipient); if (err != NO_ERROR) { - ALOGE("failed to cache buffer: could not link to death"); - return false; + ALOGE_AND_TRACE("ClientCache::add - could not link to death"); + return base::unexpected(AddError::Unspecified); } } auto [itr, success] = @@ -102,21 +104,22 @@ bool ClientCache::add(const client_cache_t& cacheId, const sp<GraphicBuffer>& bu auto& processBuffers = it->second.second; if (processBuffers.size() > BUFFER_CACHE_MAX_SIZE) { - ALOGE("failed to cache buffer: cache is full"); - return false; + ALOGE_AND_TRACE("ClientCache::add - cache is full"); + return base::unexpected(AddError::CacheFull); } LOG_ALWAYS_FATAL_IF(mRenderEngine == nullptr, "Attempted to build the ClientCache before a RenderEngine instance was " "ready!"); - processBuffers[id].buffer = std::make_shared< - renderengine::impl::ExternalTexture>(buffer, *mRenderEngine, - renderengine::impl::ExternalTexture::Usage:: - READABLE); - return true; + + return (processBuffers[id].buffer = std::make_shared< + renderengine::impl::ExternalTexture>(buffer, *mRenderEngine, + renderengine::impl::ExternalTexture:: + Usage::READABLE)); } -void ClientCache::erase(const client_cache_t& cacheId) { +sp<GraphicBuffer> ClientCache::erase(const client_cache_t& cacheId) { + sp<GraphicBuffer> buffer; auto& [processToken, id] = cacheId; std::vector<sp<ErasedRecipient>> pendingErase; { @@ -124,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> erasedRecipient = recipient.promote(); if (erasedRecipient) { @@ -140,6 +145,7 @@ void ClientCache::erase(const client_cache_t& cacheId) { for (auto& recipient : pendingErase) { recipient->bufferErased(cacheId); } + return buffer; } std::shared_ptr<renderengine::ExternalTexture> ClientCache::get(const client_cache_t& cacheId) { |