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>
265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
275c13d89c1332fcc499379b9064b891187b75ca32Chet Haasenamespace android {
285c13d89c1332fcc499379b9064b891187b75ca32Chet Haasenamespace uirenderer {
295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase/**
315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * Type of Resource being cached
325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase */
335c13d89c1332fcc499379b9064b891187b75ca32Chet Haaseenum ResourceType {
345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    kBitmap,
355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    kShader,
36ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    kColorFilter,
375a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    kPath,
385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase};
395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
405c13d89c1332fcc499379b9064b891187b75ca32Chet Haaseclass ResourceReference {
415c13d89c1332fcc499379b9064b891187b75ca32Chet Haasepublic:
425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceReference() { refCount = 0; recycled = false; destroyed = false;}
445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceReference(ResourceType type) {
455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        refCount = 0; recycled = false; destroyed = false; resourceType = type;
465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    int refCount;
495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    bool recycled;
505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    bool destroyed;
515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceType resourceType;
525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase};
535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
547953745dd565167113f8cbfc461bc0521d32d870Romain Guyclass ANDROID_API ResourceCache {
555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    KeyedVector<void *, ResourceReference *>* mCache;
565c13d89c1332fcc499379b9064b891187b75ca32Chet Haasepublic:
575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceCache();
585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ~ResourceCache();
595a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    void incrementRefcount(SkPath* resource);
605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void incrementRefcount(SkBitmap* resource);
615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void incrementRefcount(SkiaShader* resource);
62ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    void incrementRefcount(SkiaColorFilter* resource);
635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void incrementRefcount(const void* resource, ResourceType resourceType);
645c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void decrementRefcount(void* resource);
655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void decrementRefcount(SkBitmap* resource);
665a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    void decrementRefcount(SkPath* resource);
675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void decrementRefcount(SkiaShader* resource);
68ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    void decrementRefcount(SkiaColorFilter* resource);
695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void recycle(SkBitmap* resource);
705a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    void destructor(SkPath* resource);
715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void destructor(SkBitmap* resource);
725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void destructor(SkiaShader* resource);
73ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    void destructor(SkiaColorFilter* resource);
745c13d89c1332fcc499379b9064b891187b75ca32Chet Haaseprivate:
755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void deleteResourceReference(void* resource, ResourceReference* ref);
765c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void incrementRefcount(void* resource, ResourceType resourceType);
775c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void logCache();
78e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase
79e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase    /**
80e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase     * Used to increment, decrement, and destroy. Incrementing is generally accessed on the UI
81e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase     * thread, but destroying resources may be called from the GC thread, the finalizer thread,
82e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase     * or a reference queue finalization thread.
83e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase     */
84e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase    mutable Mutex mLock;
855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase};
865c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
875c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; // namespace uirenderer
885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; // namespace android
895c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
905b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_RESOURCE_CACHE_H
91