blob: 1d28ecbf6a00b366a61a93a1a7574c8ec5c58e6c [file] [log] [blame]
Romain Guy7fbcc042010-08-04 15:40:07 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Romain Guy5b3b3522010-10-27 18:57:51 -070017#ifndef ANDROID_HWUI_PATH_CACHE_H
18#define ANDROID_HWUI_PATH_CACHE_H
Romain Guy7fbcc042010-08-04 15:40:07 -070019
Romain Guyca89e2a2013-03-08 17:44:20 -080020#include <utils/Thread.h>
Romain Guyfe48f652010-11-11 15:36:56 -080021#include <utils/Vector.h>
22
Romain Guyc15008e2010-11-10 11:59:15 -080023#include "Debug.h"
Romain Guyff26a0c2011-01-20 11:35:46 -080024#include "ShapeCache.h"
Romain Guyca89e2a2013-03-08 17:44:20 -080025#include "thread/Signal.h"
26
27class SkPaint;
28class SkPath;
Romain Guyff26a0c2011-01-20 11:35:46 -080029
Romain Guy7fbcc042010-08-04 15:40:07 -070030namespace android {
31namespace uirenderer {
32
Romain Guyca89e2a2013-03-08 17:44:20 -080033class Caches;
34
Romain Guy9e108412010-11-09 14:35:20 -080035///////////////////////////////////////////////////////////////////////////////
Romain Guy9e108412010-11-09 14:35:20 -080036// Classes
37///////////////////////////////////////////////////////////////////////////////
38
Romain Guyff26a0c2011-01-20 11:35:46 -080039struct PathCacheEntry: public ShapeCacheEntry {
40 PathCacheEntry(SkPath* path, SkPaint* paint):
41 ShapeCacheEntry(ShapeCacheEntry::kShapePath, paint) {
42 this->path = path;
43 }
44
45 PathCacheEntry(): ShapeCacheEntry() {
Romain Guy7fbcc042010-08-04 15:40:07 -070046 path = NULL;
Romain Guy7fbcc042010-08-04 15:40:07 -070047 }
48
Romain Guy059e12c2012-11-28 17:35:51 -080049 hash_t hash() const {
50 uint32_t hash = ShapeCacheEntry::hash();
51 hash = JenkinsHashMix(hash, android::hash_type(path));
52 return JenkinsHashWhiten(hash);
53 }
54
55 int compare(const ShapeCacheEntry& r) const {
56 int deltaInt = ShapeCacheEntry::compare(r);
57 if (deltaInt != 0) return deltaInt;
58
Romain Guyff26a0c2011-01-20 11:35:46 -080059 const PathCacheEntry& rhs = (const PathCacheEntry&) r;
Romain Guy059e12c2012-11-28 17:35:51 -080060 return path - rhs.path;
Romain Guy7fbcc042010-08-04 15:40:07 -070061 }
Romain Guy7fbcc042010-08-04 15:40:07 -070062
Romain Guyff26a0c2011-01-20 11:35:46 -080063 SkPath* path;
Romain Guyb29cfbf2011-03-18 16:24:19 -070064
Romain Guyff26a0c2011-01-20 11:35:46 -080065}; // PathCacheEntry
Romain Guy7fbcc042010-08-04 15:40:07 -070066
Romain Guy059e12c2012-11-28 17:35:51 -080067inline hash_t hash_type(const PathCacheEntry& entry) {
68 return entry.hash();
69}
70
Romain Guy7fbcc042010-08-04 15:40:07 -070071/**
72 * A simple LRU path cache. The cache has a maximum size expressed in bytes.
73 * Any texture added to the cache causing the cache to grow beyond the maximum
74 * allowed size will also cause the oldest texture to be kicked out.
75 */
Romain Guyff26a0c2011-01-20 11:35:46 -080076class PathCache: public ShapeCache<PathCacheEntry> {
Romain Guy7fbcc042010-08-04 15:40:07 -070077public:
Romain Guyfb8b7632010-08-23 21:05:08 -070078 PathCache();
Romain Guyca89e2a2013-03-08 17:44:20 -080079 ~PathCache();
Romain Guy7fbcc042010-08-04 15:40:07 -070080
81 /**
82 * Returns the texture associated with the specified path. If the texture
83 * cannot be found in the cache, a new texture is generated.
84 */
85 PathTexture* get(SkPath* path, SkPaint* paint);
86 /**
Romain Guya2341a92010-09-08 18:04:33 -070087 * Removes an entry.
88 */
89 void remove(SkPath* path);
Romain Guyfe48f652010-11-11 15:36:56 -080090 /**
91 * Removes the specified path. This is meant to be called from threads
92 * that are not the EGL context thread.
93 */
94 void removeDeferred(SkPath* path);
95 /**
96 * Process deferred removals.
97 */
98 void clearGarbage();
Romain Guy7fbcc042010-08-04 15:40:07 -070099
Romain Guyca89e2a2013-03-08 17:44:20 -0800100 void precache(SkPath* path, SkPaint* paint);
101
Romain Guy7fbcc042010-08-04 15:40:07 -0700102private:
Romain Guyca89e2a2013-03-08 17:44:20 -0800103 class PrecacheThread: public Thread {
104 public:
105 PrecacheThread(): mSignal(Condition::WAKE_UP_ONE) { }
106
107 void addTask(PathTexture* texture, SkPath* path, SkPaint* paint);
108 void exit();
109
110 private:
111 struct Task {
112 PathTexture* texture;
113 SkPath* path;
114 SkPaint* paint;
115 };
116
117 virtual bool threadLoop();
118
119 // Lock for the list of tasks
120 Mutex mLock;
121 Vector<Task> mTasks;
122
123 // Signal used to wake up the thread when a new
124 // task is available in the list
125 mutable Signal mSignal;
126 };
127
128 sp<PrecacheThread> mThread;
Romain Guyfe48f652010-11-11 15:36:56 -0800129 Vector<SkPath*> mGarbage;
Romain Guya2341a92010-09-08 18:04:33 -0700130 mutable Mutex mLock;
Romain Guy7fbcc042010-08-04 15:40:07 -0700131}; // class PathCache
132
133}; // namespace uirenderer
134}; // namespace android
135
Romain Guy5b3b3522010-10-27 18:57:51 -0700136#endif // ANDROID_HWUI_PATH_CACHE_H