summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author John Reck <jreck@google.com> 2017-05-22 15:04:21 -0700
committer John Reck <jreck@google.com> 2017-05-22 17:17:05 -0700
commit9a814875c4e3a98fea99dae623f22268a9afa38a (patch)
tree5d9a07eb07cdacea805609a723f9b35537010420
parent3915e25d41ce40f24fd41d8bcd6a058403d0bbc5 (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.cpp1
-rw-r--r--libs/hwui/TextureCache.cpp25
-rw-r--r--libs/hwui/TextureCache.h12
-rw-r--r--libs/hwui/hwui/Bitmap.cpp4
-rw-r--r--libs/hwui/renderstate/RenderState.cpp7
-rw-r--r--libs/hwui/renderstate/RenderState.h1
-rw-r--r--libs/hwui/renderthread/RenderProxy.cpp15
-rw-r--r--libs/hwui/renderthread/RenderProxy.h2
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;