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 17e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy#define LOG_TAG "OpenGLRenderer" 18e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include <SkPixelRef.h> 205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include "ResourceCache.h" 215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include "Caches.h" 225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 235c13d89c1332fcc499379b9064b891187b75ca32Chet Haasenamespace android { 24a35778c799e8073a42b9e22191bde9d838327ab7John Reck 25a35778c799e8073a42b9e22191bde9d838327ab7John Reck#ifdef USE_OPENGL_RENDERER 26a35778c799e8073a42b9e22191bde9d838327ab7John Reckusing namespace uirenderer; 27a35778c799e8073a42b9e22191bde9d838327ab7John ReckANDROID_SINGLETON_STATIC_INSTANCE(ResourceCache); 28a35778c799e8073a42b9e22191bde9d838327ab7John Reck#endif 29a35778c799e8073a42b9e22191bde9d838327ab7John Reck 305c13d89c1332fcc499379b9064b891187b75ca32Chet Haasenamespace uirenderer { 315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase/////////////////////////////////////////////////////////////////////////////// 335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase// Resource cache 345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase/////////////////////////////////////////////////////////////////////////////// 355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 365c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::logCache() { 375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("ResourceCache: cacheReport:"); 385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < mCache->size(); ++i) { 395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ResourceReference* ref = mCache->valueAt(i); 40f5df700e6ce056ebfa322314d970e52d6facc35aAshok Bhat ALOGD(" ResourceCache: mCache(%zu): resource, ref = 0x%p, 0x%p", 415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase i, mCache->keyAt(i), mCache->valueAt(i)); 42f5df700e6ce056ebfa322314d970e52d6facc35aAshok Bhat ALOGD(" ResourceCache: mCache(%zu): refCount, recycled, destroyed, type = %d, %d, %d, %d", 435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase i, ref->refCount, ref->recycled, ref->destroyed, ref->resourceType); 445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase} 465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 475c13d89c1332fcc499379b9064b891187b75ca32Chet HaaseResourceCache::ResourceCache() { 48e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase Mutex::Autolock _l(mLock); 49d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik mCache = new KeyedVector<const void*, ResourceReference*>(); 505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase} 515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 525c13d89c1332fcc499379b9064b891187b75ca32Chet HaaseResourceCache::~ResourceCache() { 53e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase Mutex::Autolock _l(mLock); 545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase delete mCache; 555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase} 565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 5758ecc204fbcacef34806290492384677a330d4d4Romain Guyvoid ResourceCache::lock() { 5858ecc204fbcacef34806290492384677a330d4d4Romain Guy mLock.lock(); 5958ecc204fbcacef34806290492384677a330d4d4Romain Guy} 6058ecc204fbcacef34806290492384677a330d4d4Romain Guy 6158ecc204fbcacef34806290492384677a330d4d4Romain Guyvoid ResourceCache::unlock() { 6258ecc204fbcacef34806290492384677a330d4d4Romain Guy mLock.unlock(); 6358ecc204fbcacef34806290492384677a330d4d4Romain Guy} 6458ecc204fbcacef34806290492384677a330d4d4Romain Guy 655c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid ResourceCache::incrementRefcount(void* resource, ResourceType resourceType) { 66e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase Mutex::Autolock _l(mLock); 6758ecc204fbcacef34806290492384677a330d4d4Romain Guy incrementRefcountLocked(resource, resourceType); 685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase} 695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 70d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::incrementRefcount(const SkBitmap* bitmapResource) { 7149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy incrementRefcount((void*) bitmapResource, kBitmap); 725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase} 735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 74d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::incrementRefcount(const SkPath* pathResource) { 7549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy incrementRefcount((void*) pathResource, kPath); 765a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase} 775a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase 78d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::incrementRefcount(const Res_png_9patch* patchResource) { 79e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy incrementRefcount((void*) patchResource, kNinePatch); 80e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy} 81e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 8258ecc204fbcacef34806290492384677a330d4d4Romain Guyvoid ResourceCache::incrementRefcountLocked(void* resource, ResourceType resourceType) { 838dcfd5e836341b4a803b04d104a930bb312182d3Romain Guy ssize_t index = mCache->indexOfKey(resource); 848dcfd5e836341b4a803b04d104a930bb312182d3Romain Guy ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL; 8558ecc204fbcacef34806290492384677a330d4d4Romain Guy if (ref == NULL || mCache->size() == 0) { 8658ecc204fbcacef34806290492384677a330d4d4Romain Guy ref = new ResourceReference(resourceType); 8758ecc204fbcacef34806290492384677a330d4d4Romain Guy mCache->add(resource, ref); 885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 8958ecc204fbcacef34806290492384677a330d4d4Romain Guy ref->refCount++; 9058ecc204fbcacef34806290492384677a330d4d4Romain Guy} 9158ecc204fbcacef34806290492384677a330d4d4Romain Guy 92d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::incrementRefcountLocked(const SkBitmap* bitmapResource) { 9358ecc204fbcacef34806290492384677a330d4d4Romain Guy incrementRefcountLocked((void*) bitmapResource, kBitmap); 9458ecc204fbcacef34806290492384677a330d4d4Romain Guy} 9558ecc204fbcacef34806290492384677a330d4d4Romain Guy 96d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::incrementRefcountLocked(const SkPath* pathResource) { 9758ecc204fbcacef34806290492384677a330d4d4Romain Guy incrementRefcountLocked((void*) pathResource, kPath); 9858ecc204fbcacef34806290492384677a330d4d4Romain Guy} 9958ecc204fbcacef34806290492384677a330d4d4Romain Guy 100d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::incrementRefcountLocked(const Res_png_9patch* patchResource) { 101e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy incrementRefcountLocked((void*) patchResource, kNinePatch); 102e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy} 103e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 10458ecc204fbcacef34806290492384677a330d4d4Romain Guyvoid ResourceCache::decrementRefcount(void* resource) { 10558ecc204fbcacef34806290492384677a330d4d4Romain Guy Mutex::Autolock _l(mLock); 10658ecc204fbcacef34806290492384677a330d4d4Romain Guy decrementRefcountLocked(resource); 1075c13d89c1332fcc499379b9064b891187b75ca32Chet Haase} 1085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 109d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::decrementRefcount(const SkBitmap* bitmapResource) { 11043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy decrementRefcount((void*) bitmapResource); 1115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase} 1125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 113d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::decrementRefcount(const SkPath* pathResource) { 1145a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase decrementRefcount((void*) pathResource); 1155a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase} 1165a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase 117d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::decrementRefcount(const Res_png_9patch* patchResource) { 118e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy decrementRefcount((void*) patchResource); 119e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy} 120e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 12158ecc204fbcacef34806290492384677a330d4d4Romain Guyvoid ResourceCache::decrementRefcountLocked(void* resource) { 1228dcfd5e836341b4a803b04d104a930bb312182d3Romain Guy ssize_t index = mCache->indexOfKey(resource); 12358ecc204fbcacef34806290492384677a330d4d4Romain Guy ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL; 1245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase if (ref == NULL) { 12558ecc204fbcacef34806290492384677a330d4d4Romain Guy // Should not get here - shouldn't get a call to decrement if we're not yet tracking it 1265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return; 1275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 12858ecc204fbcacef34806290492384677a330d4d4Romain Guy ref->refCount--; 1295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase if (ref->refCount == 0) { 13097dc9172b0e58979c63de0dedbab656399a62281Romain Guy deleteResourceReferenceLocked(resource, ref); 1315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 1325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase} 1335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 134d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::decrementRefcountLocked(const SkBitmap* bitmapResource) { 13558ecc204fbcacef34806290492384677a330d4d4Romain Guy decrementRefcountLocked((void*) bitmapResource); 13658ecc204fbcacef34806290492384677a330d4d4Romain Guy} 13758ecc204fbcacef34806290492384677a330d4d4Romain Guy 138d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::decrementRefcountLocked(const SkPath* pathResource) { 13958ecc204fbcacef34806290492384677a330d4d4Romain Guy decrementRefcountLocked((void*) pathResource); 14058ecc204fbcacef34806290492384677a330d4d4Romain Guy} 14158ecc204fbcacef34806290492384677a330d4d4Romain Guy 142d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::decrementRefcountLocked(const Res_png_9patch* patchResource) { 143e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy decrementRefcountLocked((void*) patchResource); 144e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy} 145e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 1465a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haasevoid ResourceCache::destructor(SkPath* resource) { 1475a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase Mutex::Autolock _l(mLock); 14858ecc204fbcacef34806290492384677a330d4d4Romain Guy destructorLocked(resource); 14958ecc204fbcacef34806290492384677a330d4d4Romain Guy} 15058ecc204fbcacef34806290492384677a330d4d4Romain Guy 15158ecc204fbcacef34806290492384677a330d4d4Romain Guyvoid ResourceCache::destructorLocked(SkPath* resource) { 1528dcfd5e836341b4a803b04d104a930bb312182d3Romain Guy ssize_t index = mCache->indexOfKey(resource); 1538dcfd5e836341b4a803b04d104a930bb312182d3Romain Guy ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL; 1545a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase if (ref == NULL) { 1555a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase // If we're not tracking this resource, just delete it 1565a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase if (Caches::hasInstance()) { 1575a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase Caches::getInstance().pathCache.removeDeferred(resource); 15836fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee } else { 15936fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee delete resource; 1605a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase } 1615a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase return; 1625a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase } 1635a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase ref->destroyed = true; 1645a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase if (ref->refCount == 0) { 16597dc9172b0e58979c63de0dedbab656399a62281Romain Guy deleteResourceReferenceLocked(resource, ref); 1665a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase } 1675a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase} 1685a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase 169d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::destructor(const SkBitmap* resource) { 170e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase Mutex::Autolock _l(mLock); 17158ecc204fbcacef34806290492384677a330d4d4Romain Guy destructorLocked(resource); 17258ecc204fbcacef34806290492384677a330d4d4Romain Guy} 17358ecc204fbcacef34806290492384677a330d4d4Romain Guy 174d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::destructorLocked(const SkBitmap* resource) { 1758dcfd5e836341b4a803b04d104a930bb312182d3Romain Guy ssize_t index = mCache->indexOfKey(resource); 1768dcfd5e836341b4a803b04d104a930bb312182d3Romain Guy ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL; 1775c13d89c1332fcc499379b9064b891187b75ca32Chet Haase if (ref == NULL) { 1785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase // If we're not tracking this resource, just delete it 1795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase if (Caches::hasInstance()) { 18071d08a07189c2b433080203895d9d5e936b16b9eJohn Reck Caches::getInstance().textureCache.releaseTexture(resource); 1815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 18271d08a07189c2b433080203895d9d5e936b16b9eJohn Reck delete resource; 1835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return; 1845c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 1855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ref->destroyed = true; 1865c13d89c1332fcc499379b9064b891187b75ca32Chet Haase if (ref->refCount == 0) { 18797dc9172b0e58979c63de0dedbab656399a62281Romain Guy deleteResourceReferenceLocked(resource, ref); 1885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 1895c13d89c1332fcc499379b9064b891187b75ca32Chet Haase} 1905c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 191e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guyvoid ResourceCache::destructor(Res_png_9patch* resource) { 192e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy Mutex::Autolock _l(mLock); 193e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy destructorLocked(resource); 194e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy} 195e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 196e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guyvoid ResourceCache::destructorLocked(Res_png_9patch* resource) { 197e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy ssize_t index = mCache->indexOfKey(resource); 198e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL; 199e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy if (ref == NULL) { 20036fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee // If we're not tracking this resource, just delete it 201e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy if (Caches::hasInstance()) { 202e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy Caches::getInstance().patchCache.removeDeferred(resource); 20336fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee } else { 20436fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee // A Res_png_9patch is actually an array of byte that's larger 20536fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee // than sizeof(Res_png_9patch). It must be freed as an array. 20636fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee delete[] (int8_t*) resource; 207e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy } 208e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy return; 209e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy } 210e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy ref->destroyed = true; 211e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy if (ref->refCount == 0) { 212e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy deleteResourceReferenceLocked(resource, ref); 213e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy } 214e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy} 215e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 216547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase/** 217547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase * Return value indicates whether resource was actually recycled, which happens when RefCnt 218547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase * reaches 0. 219547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase */ 220547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haasebool ResourceCache::recycle(SkBitmap* resource) { 22158ecc204fbcacef34806290492384677a330d4d4Romain Guy Mutex::Autolock _l(mLock); 222547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase return recycleLocked(resource); 22358ecc204fbcacef34806290492384677a330d4d4Romain Guy} 22458ecc204fbcacef34806290492384677a330d4d4Romain Guy 225547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase/** 226547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase * Return value indicates whether resource was actually recycled, which happens when RefCnt 227547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase * reaches 0. 228547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase */ 229547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haasebool ResourceCache::recycleLocked(SkBitmap* resource) { 23058ecc204fbcacef34806290492384677a330d4d4Romain Guy ssize_t index = mCache->indexOfKey(resource); 23158ecc204fbcacef34806290492384677a330d4d4Romain Guy if (index < 0) { 23271d08a07189c2b433080203895d9d5e936b16b9eJohn Reck if (Caches::hasInstance()) { 23371d08a07189c2b433080203895d9d5e936b16b9eJohn Reck Caches::getInstance().textureCache.releaseTexture(resource); 23471d08a07189c2b433080203895d9d5e936b16b9eJohn Reck } 23558ecc204fbcacef34806290492384677a330d4d4Romain Guy // not tracking this resource; just recycle the pixel data 23658ecc204fbcacef34806290492384677a330d4d4Romain Guy resource->setPixels(NULL, NULL); 237547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase return true; 23858ecc204fbcacef34806290492384677a330d4d4Romain Guy } 23958ecc204fbcacef34806290492384677a330d4d4Romain Guy ResourceReference* ref = mCache->valueAt(index); 24058ecc204fbcacef34806290492384677a330d4d4Romain Guy if (ref == NULL) { 24158ecc204fbcacef34806290492384677a330d4d4Romain Guy // Should not get here - shouldn't get a call to recycle if we're not yet tracking it 242547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase return true; 24358ecc204fbcacef34806290492384677a330d4d4Romain Guy } 24458ecc204fbcacef34806290492384677a330d4d4Romain Guy ref->recycled = true; 24558ecc204fbcacef34806290492384677a330d4d4Romain Guy if (ref->refCount == 0) { 24697dc9172b0e58979c63de0dedbab656399a62281Romain Guy deleteResourceReferenceLocked(resource, ref); 247547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase return true; 24858ecc204fbcacef34806290492384677a330d4d4Romain Guy } 249547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase // Still referring to resource, don't recycle yet 250547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase return false; 25158ecc204fbcacef34806290492384677a330d4d4Romain Guy} 25258ecc204fbcacef34806290492384677a330d4d4Romain Guy 253e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase/** 254e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase * This method should only be called while the mLock mutex is held (that mutex is grabbed 255e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase * by the various destructor() and recycle() methods which call this method). 256e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase */ 257d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid ResourceCache::deleteResourceReferenceLocked(const void* resource, ResourceReference* ref) { 2585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase if (ref->recycled && ref->resourceType == kBitmap) { 25971d08a07189c2b433080203895d9d5e936b16b9eJohn Reck SkBitmap* bitmap = (SkBitmap*) resource; 26071d08a07189c2b433080203895d9d5e936b16b9eJohn Reck if (Caches::hasInstance()) { 26171d08a07189c2b433080203895d9d5e936b16b9eJohn Reck Caches::getInstance().textureCache.releaseTexture(bitmap); 26271d08a07189c2b433080203895d9d5e936b16b9eJohn Reck } 26371d08a07189c2b433080203895d9d5e936b16b9eJohn Reck bitmap->setPixels(NULL, NULL); 2645c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 2650e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck if (ref->destroyed) { 2665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase switch (ref->resourceType) { 267d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy case kBitmap: { 268d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy SkBitmap* bitmap = (SkBitmap*) resource; 2695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase if (Caches::hasInstance()) { 27071d08a07189c2b433080203895d9d5e936b16b9eJohn Reck Caches::getInstance().textureCache.releaseTexture(bitmap); 2715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 27271d08a07189c2b433080203895d9d5e936b16b9eJohn Reck delete bitmap; 2735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 2745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase break; 275d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy case kPath: { 276d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy SkPath* path = (SkPath*) resource; 2775a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase if (Caches::hasInstance()) { 2785a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase Caches::getInstance().pathCache.removeDeferred(path); 27936fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee } else { 28036fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee delete path; 2815a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase } 2825a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase } 2835a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase break; 284e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy case kNinePatch: { 285e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy if (Caches::hasInstance()) { 286e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy Caches::getInstance().patchCache.removeDeferred((Res_png_9patch*) resource); 28736fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee } else { 28836fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee // A Res_png_9patch is actually an array of byte that's larger 28936fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee // than sizeof(Res_png_9patch). It must be freed as an array. 29036fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee int8_t* patch = (int8_t*) resource; 29136fad8f6fcfbc2087b910600ed5a6f9741177d00Sangkyu Lee delete[] patch; 292e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy } 293e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy } 294e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy break; 2955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 2965c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 2975c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mCache->removeItem(resource); 2985c13d89c1332fcc499379b9064b891187b75ca32Chet Haase delete ref; 2995c13d89c1332fcc499379b9064b891187b75ca32Chet Haase} 3005c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 3015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; // namespace uirenderer 3025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; // namespace android 303