diff options
author | 2017-05-22 15:04:21 -0700 | |
---|---|---|
committer | 2017-05-22 17:17:05 -0700 | |
commit | 9a814875c4e3a98fea99dae623f22268a9afa38a (patch) | |
tree | 5d9a07eb07cdacea805609a723f9b35537010420 | |
parent | 3915e25d41ce40f24fd41d8bcd6a058403d0bbc5 (diff) |
Improve time to texture destruction
Eliminate textureCache.mGarbage which is only cleared
in a trimMemory. Instead when we hit ~Bitmap post a
message to RenderThread to release the texture immediately
Bug: 38258699
Test: manual
Change-Id: I962ba275e89afb628ba02f74769287edbab9fed4
-rw-r--r-- | libs/hwui/Caches.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/TextureCache.cpp | 25 | ||||
-rw-r--r-- | libs/hwui/TextureCache.h | 12 | ||||
-rw-r--r-- | libs/hwui/hwui/Bitmap.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/renderstate/RenderState.cpp | 7 | ||||
-rw-r--r-- | libs/hwui/renderstate/RenderState.h | 1 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 15 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 2 |
8 files changed, 36 insertions, 31 deletions
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index a0366dee3218..2fdfcd42a1e1 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -223,7 +223,6 @@ void Caches::dumpMemoryUsage(String8 &log) { /////////////////////////////////////////////////////////////////////////////// void Caches::clearGarbage() { - textureCache.clearGarbage(); pathCache.clearGarbage(); patchCache.clearGarbage(); } diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp index 63a6a2c8c89c..710cdd9286e8 100644 --- a/libs/hwui/TextureCache.cpp +++ b/libs/hwui/TextureCache.cpp @@ -191,25 +191,14 @@ Texture* TextureCache::get(Bitmap* bitmap) { return texture; } -void TextureCache::releaseTexture(uint32_t pixelRefStableID) { - Mutex::Autolock _l(mLock); - mGarbage.push_back(pixelRefStableID); -} - -void TextureCache::clearGarbage() { - Mutex::Autolock _l(mLock); - size_t count = mGarbage.size(); - for (size_t i = 0; i < count; i++) { - uint32_t pixelRefId = mGarbage[i]; - auto hardwareIter = mHardwareTextures.find(pixelRefId); - if (hardwareIter == mHardwareTextures.end()) { - mCache.remove(pixelRefId); - } else { - hardwareIter->second->deleteTexture(); - mHardwareTextures.erase(hardwareIter); - } +bool TextureCache::destroyTexture(uint32_t pixelRefStableID) { + auto hardwareIter = mHardwareTextures.find(pixelRefStableID); + if (hardwareIter != mHardwareTextures.end()) { + hardwareIter->second->deleteTexture(); + mHardwareTextures.erase(hardwareIter); + return true; } - mGarbage.clear(); + return mCache.remove(pixelRefStableID); } void TextureCache::clear() { diff --git a/libs/hwui/TextureCache.h b/libs/hwui/TextureCache.h index db4ff39aed83..776ff8a03fd1 100644 --- a/libs/hwui/TextureCache.h +++ b/libs/hwui/TextureCache.h @@ -94,14 +94,10 @@ public: Texture* get(Bitmap* bitmap); /** - * Removes the texture associated with the specified pixelRef. This is meant - * to be called from threads that are not the EGL context thread. + * Removes the texture associated with the specified pixelRef. Must be called from RenderThread + * Returns true if a texture was destroyed, false if no texture with that id was found */ - ANDROID_API void releaseTexture(uint32_t pixelRefStableID); - /** - * Process deferred removals. - */ - void clearGarbage(); + bool destroyTexture(uint32_t pixelRefStableID); /** * Clears the cache. This causes all textures to be deleted. @@ -139,9 +135,7 @@ private: bool mDebugEnabled; - std::vector<uint32_t> mGarbage; std::unordered_map<uint32_t, std::unique_ptr<Texture>> mHardwareTextures; - mutable Mutex mLock; }; // class TextureCache }; // namespace uirenderer diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp index d765584a7530..72be564105b6 100644 --- a/libs/hwui/hwui/Bitmap.cpp +++ b/libs/hwui/hwui/Bitmap.cpp @@ -416,9 +416,7 @@ Bitmap::~Bitmap() { } - if (android::uirenderer::Caches::hasInstance()) { - android::uirenderer::Caches::getInstance().textureCache.releaseTexture(getStableID()); - } + android::uirenderer::renderthread::RenderProxy::onBitmapDestroyed(getStableID()); } bool Bitmap::hasHardwareMipMap() const { diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp index c8833d2a7489..b89272ebd486 100644 --- a/libs/hwui/renderstate/RenderState.cpp +++ b/libs/hwui/renderstate/RenderState.cpp @@ -122,6 +122,13 @@ void RenderState::flush(Caches::FlushMode mode) { mCaches->flush(mode); } +void RenderState::onBitmapDestroyed(uint32_t pixelRefId) { + if (mCaches->textureCache.destroyTexture(pixelRefId)) { + glFlush(); + GL_CHECKPOINT(MODERATE); + } +} + void RenderState::setViewport(GLsizei width, GLsizei height) { mViewportWidth = width; mViewportHeight = height; diff --git a/libs/hwui/renderstate/RenderState.h b/libs/hwui/renderstate/RenderState.h index f78bf7a4e088..787946f79f6b 100644 --- a/libs/hwui/renderstate/RenderState.h +++ b/libs/hwui/renderstate/RenderState.h @@ -63,6 +63,7 @@ public: void onVkContextDestroyed(); void flush(Caches::FlushMode flushMode); + void onBitmapDestroyed(uint32_t pixelRefId); void setViewport(GLsizei width, GLsizei height); void getViewport(GLsizei* outWidth, GLsizei* outHeight); diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index a1f1717e6b96..eed523810403 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -24,6 +24,7 @@ #include "renderthread/EglManager.h" #include "renderthread/RenderTask.h" #include "renderthread/RenderThread.h" +#include "renderstate/RenderState.h" #include "utils/Macros.h" #include "utils/TimeUtils.h" @@ -693,6 +694,20 @@ int RenderProxy::copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap) } } +CREATE_BRIDGE2(onBitmapDestroyed, RenderThread* thread, uint32_t pixelRefId) { + args->thread->renderState().onBitmapDestroyed(args->pixelRefId); + return nullptr; +} + +void RenderProxy::onBitmapDestroyed(uint32_t pixelRefId) { + if (!RenderThread::hasInstance()) return; + SETUP_TASK(onBitmapDestroyed); + RenderThread& thread = RenderThread::getInstance(); + args->thread = &thread; + args->pixelRefId = pixelRefId; + thread.queue(task); +} + void RenderProxy::post(RenderTask* task) { mRenderThread.queue(task); } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index a60ed55c70d2..b21772cd88de 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -135,6 +135,8 @@ public: static sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& bitmap); static int copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap); + + static void onBitmapDestroyed(uint32_t pixelRefId); private: RenderThread& mRenderThread; CanvasContext* mContext; |