diff options
Diffstat (limited to 'services/surfaceflinger/ClientCache.cpp')
-rw-r--r-- | services/surfaceflinger/ClientCache.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/services/surfaceflinger/ClientCache.cpp b/services/surfaceflinger/ClientCache.cpp index a5be01c75c..f310738423 100644 --- a/services/surfaceflinger/ClientCache.cpp +++ b/services/surfaceflinger/ClientCache.cpp @@ -25,6 +25,8 @@ namespace android { +using base::StringAppendF; + ANDROID_SINGLETON_STATIC_INSTANCE(ClientCache); ClientCache::ClientCache() : mDeathRecipient(new CacheDeathRecipient) {} @@ -46,7 +48,7 @@ bool ClientCache::getBuffer(const client_cache_t& cacheId, auto bufItr = processBuffers.find(id); if (bufItr == processBuffers.end()) { - ALOGE("failed to get buffer, invalid buffer id"); + ALOGV("failed to get buffer, invalid buffer id"); return false; } @@ -100,7 +102,12 @@ bool ClientCache::add(const client_cache_t& cacheId, const sp<GraphicBuffer>& bu return false; } - processBuffers[id].buffer = buffer; + LOG_ALWAYS_FATAL_IF(mRenderEngine == nullptr, + "Attempted to build the ClientCache before a RenderEngine instance was " + "ready!"); + processBuffers[id].buffer = std::make_shared< + renderengine::ExternalTexture>(buffer, *mRenderEngine, + renderengine::ExternalTexture::Usage::READABLE); return true; } @@ -130,7 +137,7 @@ void ClientCache::erase(const client_cache_t& cacheId) { } } -sp<GraphicBuffer> ClientCache::get(const client_cache_t& cacheId) { +std::shared_ptr<renderengine::ExternalTexture> ClientCache::get(const client_cache_t& cacheId) { std::lock_guard lock(mMutex); ClientCacheBuffer* buf = nullptr; @@ -148,7 +155,7 @@ bool ClientCache::registerErasedRecipient(const client_cache_t& cacheId, ClientCacheBuffer* buf = nullptr; if (!getBuffer(cacheId, &buf)) { - ALOGE("failed to register erased recipient, could not retrieve buffer"); + ALOGV("failed to register erased recipient, could not retrieve buffer"); return false; } buf->recipients.insert(recipient); @@ -203,4 +210,18 @@ void ClientCache::CacheDeathRecipient::binderDied(const wp<IBinder>& who) { ClientCache::getInstance().removeProcess(who); } +void ClientCache::dump(std::string& result) { + std::lock_guard lock(mMutex); + for (auto i : mBuffers) { + const sp<IBinder>& cacheOwner = i.second.first; + StringAppendF(&result," Cache owner: %p\n", cacheOwner.get()); + auto &buffers = i.second.second; + for (auto& [id, clientCacheBuffer] : buffers) { + StringAppendF(&result, "\t ID: %d, Width/Height: %d,%d\n", (int)id, + (int)clientCacheBuffer.buffer->getBuffer()->getWidth(), + (int)clientCacheBuffer.buffer->getBuffer()->getHeight()); + } + } +} + }; // namespace android |