Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d586ad9c authored by Romain Guy's avatar Romain Guy
Browse files

Fix another memory leak in OpenGLRenderer

Change-Id: I23ed56891452a05cf3ca13f6919c4fef90d5ff4e
parent 83c033de
Loading
Loading
Loading
Loading
+25 −6
Original line number Diff line number Diff line
@@ -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,11 +886,15 @@ 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));
    }
@@ -886,8 +903,10 @@ void DisplayListRenderer::reset() {

    mPaints.clear();
    mPaintMap.clear();

    mPaths.clear();
    mPathMap.clear();

    mMatrices.clear();
}

+6 −8
Original line number Diff line number Diff line
@@ -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;
+8 −19
Original line number Diff line number Diff line
@@ -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,8 +202,7 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r
    }
    if (ref->destroyed) {
        switch (ref->resourceType) {
            case kBitmap:
            {
            case kBitmap: {
                SkBitmap* bitmap = (SkBitmap*) resource;
                if (Caches::hasInstance()) {
                    Caches::getInstance().textureCache.removeDeferred(bitmap);
@@ -218,8 +210,7 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r
                delete bitmap;
            }
            break;
            case kPath:
            {
            case kPath: {
                SkPath* path = (SkPath*) resource;
                if (Caches::hasInstance()) {
                    Caches::getInstance().pathCache.removeDeferred(path);
@@ -227,8 +218,7 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r
                delete path;
            }
            break;
            case kShader:
            {
            case kShader: {
                SkiaShader* shader = (SkiaShader*) resource;
                if (Caches::hasInstance()) {
                    Caches::getInstance().gradientCache.removeDeferred(shader->getSkShader());
@@ -236,8 +226,7 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r
                delete shader;
            }
            break;
            case kColorFilter:
            {
            case kColorFilter: {
                SkiaColorFilter* filter = (SkiaColorFilter*) resource;
                delete filter;
            }
+1 −1

File changed.

Contains only whitespace changes.