Merge "Fix another memory leak in OpenGLRenderer"
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -59,7 +59,7 @@ struct SkiaColorFilter {
|
||||
return mType;
|
||||
}
|
||||
|
||||
SkColorFilter *getSkColorFilter() {
|
||||
SkColorFilter* getSkColorFilter() {
|
||||
return mSkFilter;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user