ResourceCache.cpp revision d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868
15c13d89c1332fcc499379b9064b891187b75ca32Chet Haase/*
25c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * Copyright (C) 2010 The Android Open Source Project
35c13d89c1332fcc499379b9064b891187b75ca32Chet Haase *
45c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * Licensed under the Apache License, Version 2.0 (the "License");
55c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * you may not use this file except in compliance with the License.
65c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * You may obtain a copy of the License at
75c13d89c1332fcc499379b9064b891187b75ca32Chet Haase *
85c13d89c1332fcc499379b9064b891187b75ca32Chet Haase *      http://www.apache.org/licenses/LICENSE-2.0
95c13d89c1332fcc499379b9064b891187b75ca32Chet Haase *
105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * Unless required by applicable law or agreed to in writing, software
115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * distributed under the License is distributed on an "AS IS" BASIS,
125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * See the License for the specific language governing permissions and
145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * limitations under the License.
155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase */
165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include <SkPixelRef.h>
185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include "ResourceCache.h"
195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include "Caches.h"
205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
215c13d89c1332fcc499379b9064b891187b75ca32Chet Haasenamespace android {
225c13d89c1332fcc499379b9064b891187b75ca32Chet Haasenamespace uirenderer {
235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase///////////////////////////////////////////////////////////////////////////////
255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase// Resource cache
265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase///////////////////////////////////////////////////////////////////////////////
275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
285c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::logCache() {
295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    LOGD("ResourceCache: cacheReport:");
305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mCache->size(); ++i) {
315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        ResourceReference* ref = mCache->valueAt(i);
325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        LOGD("  ResourceCache: mCache(%d): resource, ref = 0x%p, 0x%p",
335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                i, mCache->keyAt(i), mCache->valueAt(i));
345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        LOGD("  ResourceCache: mCache(%d): refCount, recycled, destroyed, type = %d, %d, %d, %d",
355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                i, ref->refCount, ref->recycled, ref->destroyed, ref->resourceType);
365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
395c13d89c1332fcc499379b9064b891187b75ca32Chet HaaseResourceCache::ResourceCache() {
40e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase    Mutex::Autolock _l(mLock);
415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mCache = new KeyedVector<void *, ResourceReference *>();
425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
445c13d89c1332fcc499379b9064b891187b75ca32Chet HaaseResourceCache::~ResourceCache() {
45e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase    Mutex::Autolock _l(mLock);
465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    delete mCache;
475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
495c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::incrementRefcount(void* resource, ResourceType resourceType) {
50e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase    Mutex::Autolock _l(mLock);
515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref == NULL || mCache->size() == 0) {
535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        ref = new ResourceReference(resourceType);
545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mCache->add(resource, ref);
555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ref->refCount++;
575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
595c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::incrementRefcount(SkBitmap* bitmapResource) {
606062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger    SkSafeRef(bitmapResource->pixelRef());
616062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger    SkSafeRef(bitmapResource->getColorTable());
625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    incrementRefcount((void*)bitmapResource, kBitmap);
635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
645c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
655a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haasevoid ResourceCache::incrementRefcount(SkPath* pathResource) {
665a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    incrementRefcount((void*)pathResource, kPath);
675a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase}
685a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase
695c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::incrementRefcount(SkiaShader* shaderResource) {
706062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger    SkSafeRef(shaderResource->getSkShader());
7143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    incrementRefcount((void*) shaderResource, kShader);
725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
74ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haasevoid ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) {
756062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger    SkSafeRef(filterResource->getSkColorFilter());
7643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    incrementRefcount((void*) filterResource, kColorFilter);
77ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase}
78ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
795c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::decrementRefcount(void* resource) {
80e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase    Mutex::Autolock _l(mLock);
815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref == NULL) {
835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        // Should not get here - shouldn't get a call to decrement if we're not yet tracking it
845c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return;
855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
865c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ref->refCount--;
875c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref->refCount == 0) {
885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        deleteResourceReference(resource, ref);
895c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
905c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
915c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
925c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::decrementRefcount(SkBitmap* bitmapResource) {
936062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger    SkSafeUnref(bitmapResource->pixelRef());
946062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger    SkSafeUnref(bitmapResource->getColorTable());
9543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    decrementRefcount((void*) bitmapResource);
965c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
975c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
985a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haasevoid ResourceCache::decrementRefcount(SkPath* pathResource) {
995a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    decrementRefcount((void*) pathResource);
1005a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase}
1015a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase
1025c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::decrementRefcount(SkiaShader* shaderResource) {
1036062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger    SkSafeUnref(shaderResource->getSkShader());
10443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    decrementRefcount((void*) shaderResource);
1055c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
1065c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
107ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haasevoid ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) {
1086062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger    SkSafeUnref(filterResource->getSkColorFilter());
10943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    decrementRefcount((void*) filterResource);
110ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase}
111ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
1125c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::recycle(SkBitmap* resource) {
113e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase    Mutex::Autolock _l(mLock);
1145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (mCache->indexOfKey(resource) < 0) {
1155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        // not tracking this resource; just recycle the pixel data
1165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        resource->setPixels(NULL, NULL);
1175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return;
1185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
1205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref == NULL) {
1215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        // Should not get here - shouldn't get a call to recycle if we're not yet tracking it
1225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return;
1235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ref->recycled = true;
1255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref->refCount == 0) {
1265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        deleteResourceReference(resource, ref);
1275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
1295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1305a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haasevoid ResourceCache::destructor(SkPath* resource) {
1315a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    Mutex::Autolock _l(mLock);
1325a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
1335a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    if (ref == NULL) {
1345a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase        // If we're not tracking this resource, just delete it
1355a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase        if (Caches::hasInstance()) {
1365a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase            Caches::getInstance().pathCache.removeDeferred(resource);
1375a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase        }
1385a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase        delete resource;
1395a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase        return;
1405a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    }
1415a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    ref->destroyed = true;
1425a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    if (ref->refCount == 0) {
1435a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase        deleteResourceReference(resource, ref);
1445a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    }
1455a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase}
1465a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase
1475c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::destructor(SkBitmap* resource) {
148e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase    Mutex::Autolock _l(mLock);
1495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
1505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref == NULL) {
1515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        // If we're not tracking this resource, just delete it
1525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        if (Caches::hasInstance()) {
153fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy            Caches::getInstance().textureCache.removeDeferred(resource);
1545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        }
1555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        delete resource;
1565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return;
1575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ref->destroyed = true;
1595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref->refCount == 0) {
1605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        deleteResourceReference(resource, ref);
1615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
1635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1645c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::destructor(SkiaShader* resource) {
165e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase    Mutex::Autolock _l(mLock);
1665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
1675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref == NULL) {
1685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        // If we're not tracking this resource, just delete it
1695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        if (Caches::hasInstance()) {
170fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy            Caches::getInstance().gradientCache.removeDeferred(resource->getSkShader());
1715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        }
1725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        delete resource;
1735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return;
1745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ref->destroyed = true;
1765c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref->refCount == 0) {
1775c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        deleteResourceReference(resource, ref);
1785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
1805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
181ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haasevoid ResourceCache::destructor(SkiaColorFilter* resource) {
182e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase    Mutex::Autolock _l(mLock);
183ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
184ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    if (ref == NULL) {
185ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        // If we're not tracking this resource, just delete it
186ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        delete resource;
187ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return;
188ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
189ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    ref->destroyed = true;
190ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    if (ref->refCount == 0) {
191ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        deleteResourceReference(resource, ref);
192ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
193ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase}
194ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
195e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase/**
196e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase * This method should only be called while the mLock mutex is held (that mutex is grabbed
197e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase * by the various destructor() and recycle() methods which call this method).
198e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase */
1995c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::deleteResourceReference(void* resource, ResourceReference* ref) {
2005c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref->recycled && ref->resourceType == kBitmap) {
2015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        ((SkBitmap*) resource)->setPixels(NULL, NULL);
2025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
2035c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    if (ref->destroyed) {
2045c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        switch (ref->resourceType) {
205d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy            case kBitmap: {
206d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy                SkBitmap* bitmap = (SkBitmap*) resource;
2075c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                if (Caches::hasInstance()) {
208fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy                    Caches::getInstance().textureCache.removeDeferred(bitmap);
2095c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                }
2105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                delete bitmap;
2115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            }
2125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            break;
213d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy            case kPath: {
214d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy                SkPath* path = (SkPath*) resource;
2155a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase                if (Caches::hasInstance()) {
2165a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase                    Caches::getInstance().pathCache.removeDeferred(path);
2175a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase                }
2185a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase                delete path;
2195a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase            }
2205a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase            break;
221d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy            case kShader: {
222d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy                SkiaShader* shader = (SkiaShader*) resource;
2235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                if (Caches::hasInstance()) {
224fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy                    Caches::getInstance().gradientCache.removeDeferred(shader->getSkShader());
2255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                }
2265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                delete shader;
227ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase            }
228ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase            break;
229d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy            case kColorFilter: {
230d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy                SkiaColorFilter* filter = (SkiaColorFilter*) resource;
231ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase                delete filter;
232ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase            }
233ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase            break;
2345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        }
2355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
2365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mCache->removeItem(resource);
2375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    delete ref;
2385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}
2395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
2405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; // namespace uirenderer
2415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; // namespace android
242