diff options
author | Romain Guy <romainguy@google.com> | 2011-06-22 16:14:36 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2011-06-22 17:10:00 -0700 |
commit | d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868 (patch) | |
tree | 285a0e4d4d7b471a8a3c8e41957283dcb9f09f43 /libs/hwui | |
parent | 83c033de06cd2af243ecf8e2c4b87cd2de2b786e (diff) | |
download | frameworks_base-d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868.zip frameworks_base-d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868.tar.gz frameworks_base-d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868.tar.bz2 |
Fix another memory leak in OpenGLRenderer
Change-Id: I23ed56891452a05cf3ca13f6919c4fef90d5ff4e
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/DisplayListRenderer.cpp | 31 | ||||
-rw-r--r-- | libs/hwui/DisplayListRenderer.h | 14 | ||||
-rw-r--r-- | libs/hwui/ResourceCache.cpp | 27 | ||||
-rw-r--r-- | libs/hwui/SkiaColorFilter.h | 2 |
4 files changed, 40 insertions, 34 deletions
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index afab26a..e43f6e5 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -101,8 +101,14 @@ void DisplayList::clearResources() { } mBitmapResources.clear(); + for (size_t i = 0; i < mFilterResources.size(); i++) { + caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i)); + } + mFilterResources.clear(); + for (size_t i = 0; i < mShaders.size(); i++) { caches.resourceCache.decrementRefcount(mShaders.itemAt(i)); + caches.resourceCache.destructor(mShaders.itemAt(i)); } mShaders.clear(); @@ -151,11 +157,18 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde caches.resourceCache.incrementRefcount(resource); } + const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources(); + for (size_t i = 0; i < filterResources.size(); i++) { + SkiaColorFilter* resource = filterResources.itemAt(i); + mFilterResources.add(resource); + caches.resourceCache.incrementRefcount(resource); + } + const Vector<SkiaShader*> &shaders = recorder.getShaders(); for (size_t i = 0; i < shaders.size(); i++) { - SkiaShader* shader = shaders.itemAt(i); - mShaders.add(shader); - caches.resourceCache.incrementRefcount(shader); + SkiaShader* resource = shaders.itemAt(i); + mShaders.add(resource); + caches.resourceCache.incrementRefcount(resource); } const Vector<SkPaint*> &paints = recorder.getPaints(); @@ -873,21 +886,27 @@ void DisplayListRenderer::reset() { Caches& caches = Caches::getInstance(); for (size_t i = 0; i < mBitmapResources.size(); i++) { - SkBitmap* resource = mBitmapResources.itemAt(i); - caches.resourceCache.decrementRefcount(resource); + caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i)); } mBitmapResources.clear(); + for (size_t i = 0; i < mFilterResources.size(); i++) { + caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i)); + } + mFilterResources.clear(); + for (size_t i = 0; i < mShaders.size(); i++) { - caches.resourceCache.decrementRefcount(mShaders.itemAt(i)); + caches.resourceCache.decrementRefcount(mShaders.itemAt(i)); } mShaders.clear(); mShaderMap.clear(); mPaints.clear(); mPaintMap.clear(); + mPaths.clear(); mPathMap.clear(); + mMatrices.clear(); } diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h index 98c341f..b83259f 100644 --- a/libs/hwui/DisplayListRenderer.h +++ b/libs/hwui/DisplayListRenderer.h @@ -292,6 +292,10 @@ public: return mBitmapResources; } + const Vector<SkiaColorFilter*>& getFilterResources() const { + return mFilterResources; + } + const Vector<SkiaShader*>& getShaders() const { return mShaders; } @@ -308,10 +312,6 @@ public: return mMatrices; } - const Vector<SkiaColorFilter*>& getFilterResources() const { - return mFilterResources; - } - private: void insertRestoreToCount() { if (mRestoreSaveCount >= 0) { @@ -431,8 +431,7 @@ private: // which doesn't seem worth the extra cycles for this unlikely case. addInt((int) bitmap); mBitmapResources.add(bitmap); - Caches& caches = Caches::getInstance(); - caches.resourceCache.incrementRefcount(bitmap); + Caches::getInstance().resourceCache.incrementRefcount(bitmap); } inline void addShader(SkiaShader* shader) { @@ -456,8 +455,7 @@ private: inline void addColorFilter(SkiaColorFilter* colorFilter) { addInt((int) colorFilter); mFilterResources.add(colorFilter); - Caches& caches = Caches::getInstance(); - caches.resourceCache.incrementRefcount(colorFilter); + Caches::getInstance().resourceCache.incrementRefcount(colorFilter); } Vector<SkBitmap*> mBitmapResources; diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp index 9aade51..cd2c405 100644 --- a/libs/hwui/ResourceCache.cpp +++ b/libs/hwui/ResourceCache.cpp @@ -48,9 +48,6 @@ ResourceCache::~ResourceCache() { void ResourceCache::incrementRefcount(void* resource, ResourceType resourceType) { Mutex::Autolock _l(mLock); - for (size_t i = 0; i < mCache->size(); ++i) { - void* ref = mCache->valueAt(i); - } ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL; if (ref == NULL || mCache->size() == 0) { ref = new ResourceReference(resourceType); @@ -144,7 +141,6 @@ void ResourceCache::destructor(SkPath* resource) { ref->destroyed = true; if (ref->refCount == 0) { deleteResourceReference(resource, ref); - return; } } @@ -162,7 +158,6 @@ void ResourceCache::destructor(SkBitmap* resource) { ref->destroyed = true; if (ref->refCount == 0) { deleteResourceReference(resource, ref); - return; } } @@ -180,7 +175,6 @@ void ResourceCache::destructor(SkiaShader* resource) { ref->destroyed = true; if (ref->refCount == 0) { deleteResourceReference(resource, ref); - return; } } @@ -195,7 +189,6 @@ void ResourceCache::destructor(SkiaColorFilter* resource) { ref->destroyed = true; if (ref->refCount == 0) { deleteResourceReference(resource, ref); - return; } } @@ -209,36 +202,32 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r } if (ref->destroyed) { switch (ref->resourceType) { - case kBitmap: - { - SkBitmap* bitmap = (SkBitmap*)resource; + case kBitmap: { + SkBitmap* bitmap = (SkBitmap*) resource; if (Caches::hasInstance()) { Caches::getInstance().textureCache.removeDeferred(bitmap); } delete bitmap; } break; - case kPath: - { - SkPath* path = (SkPath*)resource; + case kPath: { + SkPath* path = (SkPath*) resource; if (Caches::hasInstance()) { Caches::getInstance().pathCache.removeDeferred(path); } delete path; } break; - case kShader: - { - SkiaShader* shader = (SkiaShader*)resource; + case kShader: { + SkiaShader* shader = (SkiaShader*) resource; if (Caches::hasInstance()) { Caches::getInstance().gradientCache.removeDeferred(shader->getSkShader()); } delete shader; } break; - case kColorFilter: - { - SkiaColorFilter* filter = (SkiaColorFilter*)resource; + case kColorFilter: { + SkiaColorFilter* filter = (SkiaColorFilter*) resource; delete filter; } break; diff --git a/libs/hwui/SkiaColorFilter.h b/libs/hwui/SkiaColorFilter.h index bf45e13..1bf475c 100644 --- a/libs/hwui/SkiaColorFilter.h +++ b/libs/hwui/SkiaColorFilter.h @@ -59,7 +59,7 @@ struct SkiaColorFilter { return mType; } - SkColorFilter *getSkColorFilter() { + SkColorFilter* getSkColorFilter() { return mSkFilter; } |