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 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_RESOURCE_CACHE_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_RESOURCE_CACHE_H 195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 207953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 217953745dd565167113f8cbfc461bc0521d32d870Romain Guy 225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include <SkBitmap.h> 23ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase#include <SkiaColorFilter.h> 245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include <SkiaShader.h> 255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include <utils/KeyedVector.h> 26603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase#include "Layer.h" 275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 285c13d89c1332fcc499379b9064b891187b75ca32Chet Haasenamespace android { 295c13d89c1332fcc499379b9064b891187b75ca32Chet Haasenamespace uirenderer { 305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase/** 325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * Type of Resource being cached 335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase */ 345c13d89c1332fcc499379b9064b891187b75ca32Chet Haaseenum ResourceType { 355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase kBitmap, 365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase kShader, 37ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase kColorFilter, 385a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase kPath, 39603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase kLayer 405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; 415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 425c13d89c1332fcc499379b9064b891187b75ca32Chet Haaseclass ResourceReference { 435c13d89c1332fcc499379b9064b891187b75ca32Chet Haasepublic: 445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ResourceReference() { refCount = 0; recycled = false; destroyed = false;} 465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ResourceReference(ResourceType type) { 475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase refCount = 0; recycled = false; destroyed = false; resourceType = type; 485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase int refCount; 515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase bool recycled; 525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase bool destroyed; 535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ResourceType resourceType; 545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; 555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 567953745dd565167113f8cbfc461bc0521d32d870Romain Guyclass ANDROID_API ResourceCache { 575c13d89c1332fcc499379b9064b891187b75ca32Chet Haasepublic: 585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ResourceCache(); 595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ~ResourceCache(); 6058ecc204fbcacef34806290492384677a330d4d4Romain Guy 6158ecc204fbcacef34806290492384677a330d4d4Romain Guy /** 6258ecc204fbcacef34806290492384677a330d4d4Romain Guy * When using these two methods, make sure to only invoke the *Locked() 6358ecc204fbcacef34806290492384677a330d4d4Romain Guy * variants of increment/decrementRefcount(), recyle() and destructor() 6458ecc204fbcacef34806290492384677a330d4d4Romain Guy */ 6558ecc204fbcacef34806290492384677a330d4d4Romain Guy void lock(); 6658ecc204fbcacef34806290492384677a330d4d4Romain Guy void unlock(); 6758ecc204fbcacef34806290492384677a330d4d4Romain Guy 685a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase void incrementRefcount(SkPath* resource); 695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void incrementRefcount(SkBitmap* resource); 705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void incrementRefcount(SkiaShader* resource); 71ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase void incrementRefcount(SkiaColorFilter* resource); 72603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase void incrementRefcount(Layer* resource); 7358ecc204fbcacef34806290492384677a330d4d4Romain Guy 7458ecc204fbcacef34806290492384677a330d4d4Romain Guy void incrementRefcountLocked(SkPath* resource); 7558ecc204fbcacef34806290492384677a330d4d4Romain Guy void incrementRefcountLocked(SkBitmap* resource); 7658ecc204fbcacef34806290492384677a330d4d4Romain Guy void incrementRefcountLocked(SkiaShader* resource); 7758ecc204fbcacef34806290492384677a330d4d4Romain Guy void incrementRefcountLocked(SkiaColorFilter* resource); 78603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase void incrementRefcountLocked(Layer* resource); 7958ecc204fbcacef34806290492384677a330d4d4Romain Guy 805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void decrementRefcount(SkBitmap* resource); 815a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase void decrementRefcount(SkPath* resource); 825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void decrementRefcount(SkiaShader* resource); 83ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase void decrementRefcount(SkiaColorFilter* resource); 84603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase void decrementRefcount(Layer* resource); 8558ecc204fbcacef34806290492384677a330d4d4Romain Guy 8658ecc204fbcacef34806290492384677a330d4d4Romain Guy void decrementRefcountLocked(SkBitmap* resource); 8758ecc204fbcacef34806290492384677a330d4d4Romain Guy void decrementRefcountLocked(SkPath* resource); 8858ecc204fbcacef34806290492384677a330d4d4Romain Guy void decrementRefcountLocked(SkiaShader* resource); 8958ecc204fbcacef34806290492384677a330d4d4Romain Guy void decrementRefcountLocked(SkiaColorFilter* resource); 90603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase void decrementRefcountLocked(Layer* resource); 9158ecc204fbcacef34806290492384677a330d4d4Romain Guy 925a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase void destructor(SkPath* resource); 935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void destructor(SkBitmap* resource); 945c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void destructor(SkiaShader* resource); 95ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase void destructor(SkiaColorFilter* resource); 9658ecc204fbcacef34806290492384677a330d4d4Romain Guy 9758ecc204fbcacef34806290492384677a330d4d4Romain Guy void destructorLocked(SkPath* resource); 9858ecc204fbcacef34806290492384677a330d4d4Romain Guy void destructorLocked(SkBitmap* resource); 9958ecc204fbcacef34806290492384677a330d4d4Romain Guy void destructorLocked(SkiaShader* resource); 10058ecc204fbcacef34806290492384677a330d4d4Romain Guy void destructorLocked(SkiaColorFilter* resource); 10158ecc204fbcacef34806290492384677a330d4d4Romain Guy 102547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase bool recycle(SkBitmap* resource); 103547e66531d521eb1eadac87edb0f79f8c2f1bbe0Chet Haase bool recycleLocked(SkBitmap* resource); 10458ecc204fbcacef34806290492384677a330d4d4Romain Guy 1055c13d89c1332fcc499379b9064b891187b75ca32Chet Haaseprivate: 10697dc9172b0e58979c63de0dedbab656399a62281Romain Guy void deleteResourceReferenceLocked(void* resource, ResourceReference* ref); 10758ecc204fbcacef34806290492384677a330d4d4Romain Guy 1085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void incrementRefcount(void* resource, ResourceType resourceType); 10958ecc204fbcacef34806290492384677a330d4d4Romain Guy void incrementRefcountLocked(void* resource, ResourceType resourceType); 11058ecc204fbcacef34806290492384677a330d4d4Romain Guy 11158ecc204fbcacef34806290492384677a330d4d4Romain Guy void decrementRefcount(void* resource); 11258ecc204fbcacef34806290492384677a330d4d4Romain Guy void decrementRefcountLocked(void* resource); 11358ecc204fbcacef34806290492384677a330d4d4Romain Guy 1145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void logCache(); 115e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase 116e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase /** 117e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase * Used to increment, decrement, and destroy. Incrementing is generally accessed on the UI 118e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase * thread, but destroying resources may be called from the GC thread, the finalizer thread, 119e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase * or a reference queue finalization thread. 120e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase */ 121e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase mutable Mutex mLock; 12258ecc204fbcacef34806290492384677a330d4d4Romain Guy 12358ecc204fbcacef34806290492384677a330d4d4Romain Guy KeyedVector<void*, ResourceReference*>* mCache; 1245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; 1255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 1265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; // namespace uirenderer 1275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; // namespace android 1285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 1295b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_RESOURCE_CACHE_H 130