From 7d9b1b3c02eb1ffd99742ecb7b69e3ab97d2ba18 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 28 May 2013 14:25:09 -0700 Subject: [PATCH] Re-initialize the 9patch cache if cleared with onTrimMemory The 9aptch cache was reinitialized after destroying/recreating the EGL context but not after clearing it during a normal memory trim. Change-Id: If6155bfc8a62439e9878bc742a4766b3bd6c6aec --- libs/hwui/PatchCache.cpp | 26 +++++++++++++++++++------- libs/hwui/PatchCache.h | 3 ++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/libs/hwui/PatchCache.cpp b/libs/hwui/PatchCache.cpp index c2b28d196f46b..c6ed275e3caee 100644 --- a/libs/hwui/PatchCache.cpp +++ b/libs/hwui/PatchCache.cpp @@ -40,6 +40,7 @@ PatchCache::PatchCache(): mCache(LruCache::kUnlimitedC mMaxSize = KB(DEFAULT_PATCH_CACHE_SIZE); } mSize = 0; + mMeshBuffer = 0; } PatchCache::~PatchCache() { @@ -47,11 +48,18 @@ PatchCache::~PatchCache() { } void PatchCache::init(Caches& caches) { - glGenBuffers(1, &mMeshBuffer); + bool created = false; + if (!mMeshBuffer) { + glGenBuffers(1, &mMeshBuffer); + created = true; + } + caches.bindMeshBuffer(mMeshBuffer); caches.resetVertexPointers(); - glBufferData(GL_ARRAY_BUFFER, mMaxSize, NULL, GL_DYNAMIC_DRAW); + if (created) { + glBufferData(GL_ARRAY_BUFFER, mMaxSize, NULL, GL_DYNAMIC_DRAW); + } } /////////////////////////////////////////////////////////////////////////////// @@ -73,9 +81,14 @@ int PatchCache::PatchDescription::compare(const PatchCache::PatchDescription& lh } void PatchCache::clear() { - glDeleteBuffers(1, &mMeshBuffer); clearCache(); - mSize = 0; + + if (mMeshBuffer) { + Caches::getInstance().unbindMeshBuffer(); + glDeleteBuffers(1, &mMeshBuffer); + mMeshBuffer = 0; + mSize = 0; + } } void PatchCache::clearCache() { @@ -106,9 +119,8 @@ const Patch* PatchCache::get(const AssetAtlas::Entry* entry, } if (vertices) { - Caches& caches = Caches::getInstance(); - caches.bindMeshBuffer(mMeshBuffer); - caches.resetVertexPointers(); + // This call ensures the VBO exists and that it is bound + init(Caches::getInstance()); // TODO: Simply remove the oldest items until we have enough room // This will require to keep a list of free blocks in the VBO diff --git a/libs/hwui/PatchCache.h b/libs/hwui/PatchCache.h index 129a0dcdb34d5..530dad05d72ce 100644 --- a/libs/hwui/PatchCache.h +++ b/libs/hwui/PatchCache.h @@ -121,9 +121,10 @@ private: uint32_t mMaxSize; uint32_t mSize; - LruCache mCache; GLuint mMeshBuffer; + + LruCache mCache; }; // class PatchCache }; // namespace uirenderer