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