Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: src/gpu/GrResourceCache.h

Issue 608883003: GrResourceCache2 manages scratch texture. (Closed) Base URL: https://skia.googlesource.com/skia.git@surfimpl
Patch Set: remove todo Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/GrOptDrawState.cpp ('k') | src/gpu/GrResourceCache.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9
10
11 #ifndef GrResourceCache_DEFINED 9 #ifndef GrResourceCache_DEFINED
12 #define GrResourceCache_DEFINED 10 #define GrResourceCache_DEFINED
13 11
12 #include "GrDrawTargetCaps.h"
14 #include "GrResourceKey.h" 13 #include "GrResourceKey.h"
15 #include "SkTMultiMap.h" 14 #include "SkTMultiMap.h"
16 #include "SkMessageBus.h" 15 #include "SkMessageBus.h"
17 #include "SkTInternalLList.h" 16 #include "SkTInternalLList.h"
18 17
19 class GrGpuResource; 18 class GrGpuResource;
20 class GrResourceCache; 19 class GrResourceCache;
21 class GrResourceCacheEntry; 20 class GrResourceCacheEntry;
22 21
23 22
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 * list backwards from the tail, since those are the least recently used. 80 * list backwards from the tail, since those are the least recently used.
82 * 81 *
83 * For fast searches, we maintain a hash map based on the GrResourceKey. 82 * For fast searches, we maintain a hash map based on the GrResourceKey.
84 * 83 *
85 * It is a goal to make the GrResourceCache the central repository and bookkeep er 84 * It is a goal to make the GrResourceCache the central repository and bookkeep er
86 * of all resources. It should replace the linked list of GrGpuResources that 85 * of all resources. It should replace the linked list of GrGpuResources that
87 * GrGpu uses to call abandon/release. 86 * GrGpu uses to call abandon/release.
88 */ 87 */
89 class GrResourceCache { 88 class GrResourceCache {
90 public: 89 public:
91 GrResourceCache(int maxCount, size_t maxBytes); 90 GrResourceCache(const GrDrawTargetCaps*, int maxCount, size_t maxBytes);
92 ~GrResourceCache(); 91 ~GrResourceCache();
93 92
94 /** 93 /**
95 * Return the current resource cache limits. 94 * Return the current resource cache limits.
96 * 95 *
97 * @param maxResource If non-null, returns maximum number of resources 96 * @param maxResource If non-null, returns maximum number of resources
98 * that can be held in the cache. 97 * that can be held in the cache.
99 * @param maxBytes If non-null, returns maximum number of bytes of 98 * @param maxBytes If non-null, returns maximum number of bytes of
100 * gpu memory that can be held in the cache. 99 * gpu memory that can be held in the cache.
101 */ 100 */
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 /** 133 /**
135 * Returns the number of bytes consumed by cached resources. 134 * Returns the number of bytes consumed by cached resources.
136 */ 135 */
137 size_t getCachedResourceBytes() const { return fEntryBytes; } 136 size_t getCachedResourceBytes() const { return fEntryBytes; }
138 137
139 /** 138 /**
140 * Returns the number of cached resources. 139 * Returns the number of cached resources.
141 */ 140 */
142 int getCachedResourceCount() const { return fEntryCount; } 141 int getCachedResourceCount() const { return fEntryCount; }
143 142
144 // For a found or added resource to be completely exclusive to the caller
145 // both the kNoOtherOwners and kHide flags need to be specified
146 enum OwnershipFlags {
147 kNoOtherOwners_OwnershipFlag = 0x1, // found/added resource has no other owners
148 kHide_OwnershipFlag = 0x2 // found/added resource is hidden from future 'find's
149 };
150
151 /** 143 /**
152 * Search for an entry with the same Key. If found, return it. 144 * Search for an entry with the same Key. If found, return it.
153 * If not found, return null. 145 * If not found, return null.
154 * If ownershipFlags includes kNoOtherOwners and a resource is returned
155 * then that resource has no other refs to it.
156 * If ownershipFlags includes kHide and a resource is returned then that
157 * resource will not be returned from future 'find' calls until it is
158 * 'freed' (and recycled) or makeNonExclusive is called.
159 * For a resource to be completely exclusive to a caller both kNoOtherOwner s
160 * and kHide must be specified.
161 */ 146 */
162 GrGpuResource* find(const GrResourceKey& key, 147 GrGpuResource* find(const GrResourceKey& key);
163 uint32_t ownershipFlags = 0); 148
149 void makeResourceMRU(GrGpuResource*);
150
151 /** Called by GrGpuResources when they detects that they are newly purgable. */
152 void notifyPurgable(const GrGpuResource*);
164 153
165 /** 154 /**
166 * Add the new resource to the cache (by creating a new cache entry based 155 * Add the new resource to the cache (by creating a new cache entry based
167 * on the provided key and resource). 156 * on the provided key and resource).
168 * 157 *
169 * Ownership of the resource is transferred to the resource cache, 158 * Ownership of the resource is transferred to the resource cache,
170 * which will unref() it when it is purged or deleted. 159 * which will unref() it when it is purged or deleted.
171 *
172 * If ownershipFlags includes kHide, subsequent calls to 'find' will not
173 * return 'resource' until it is 'freed' (and recycled) or makeNonExclusive
174 * is called.
175 */ 160 */
176 void addResource(const GrResourceKey& key, 161 void addResource(const GrResourceKey& key, GrGpuResource* resource);
177 GrGpuResource* resource,
178 uint32_t ownershipFlags = 0);
179 162
180 /** 163 /**
181 * Determines if the cache contains an entry matching a key. If a matching 164 * Determines if the cache contains an entry matching a key. If a matching
182 * entry exists but was detached then it will not be found. 165 * entry exists but was detached then it will not be found.
183 */ 166 */
184 bool hasKey(const GrResourceKey& key) const { return SkToBool(fCache.find(ke y)); } 167 bool hasKey(const GrResourceKey& key) const { return SkToBool(fCache.find(ke y)); }
185 168
186 /** 169 /**
187 * Hide 'entry' so that future searches will not find it. Such
188 * hidden entries will not be purged. The entry still counts against
189 * the cache's budget and should be made non-exclusive when exclusive access
190 * is no longer needed.
191 */
192 void makeExclusive(GrResourceCacheEntry* entry);
193
194 /**
195 * Restore 'entry' so that it can be found by future searches. 'entry'
196 * will also be purgeable (provided its lock count is now 0.)
197 */
198 void makeNonExclusive(GrResourceCacheEntry* entry);
199
200 /**
201 * Notify the cache that the size of a resource has changed. 170 * Notify the cache that the size of a resource has changed.
202 */ 171 */
203 void didIncreaseResourceSize(const GrResourceCacheEntry*, size_t amountInc); 172 void didIncreaseResourceSize(const GrResourceCacheEntry*, size_t amountInc);
204 void didDecreaseResourceSize(const GrResourceCacheEntry*, size_t amountDec); 173 void didDecreaseResourceSize(const GrResourceCacheEntry*, size_t amountDec);
205 174
206 /** 175 /**
207 * Remove a resource from the cache and delete it! 176 * Remove a resource from the cache and delete it!
208 */ 177 */
209 void deleteResource(GrResourceCacheEntry* entry); 178 void deleteResource(GrResourceCacheEntry* entry);
210 179
(...skipping 19 matching lines...) Expand all
230 void validate() const; 199 void validate() const;
231 #else 200 #else
232 void validate() const {} 201 void validate() const {}
233 #endif 202 #endif
234 203
235 #if GR_CACHE_STATS 204 #if GR_CACHE_STATS
236 void printStats(); 205 void printStats();
237 #endif 206 #endif
238 207
239 private: 208 private:
240 enum BudgetBehaviors { 209 void internalDetach(GrResourceCacheEntry*);
241 kAccountFor_BudgetBehavior, 210 void attachToHead(GrResourceCacheEntry*);
242 kIgnore_BudgetBehavior 211 void purgeInvalidated();
243 }; 212 void internalPurge(int extraCount, size_t extraBytes);
213 #ifdef SK_DEBUG
214 static size_t countBytes(const SkTInternalLList<GrResourceCacheEntry>& list) ;
215 #endif
244 216
245 void internalDetach(GrResourceCacheEntry*, BudgetBehaviors behavior = kAccou ntFor_BudgetBehavior); 217 typedef SkTMultiMap<GrResourceCacheEntry, GrResourceKey> CacheMap;
246 void attachToHead(GrResourceCacheEntry*, BudgetBehaviors behavior = kAccount For_BudgetBehavior); 218 CacheMap fCache;
247
248 void removeInvalidResource(GrResourceCacheEntry* entry);
249
250 SkTMultiMap<GrResourceCacheEntry, GrResourceKey> fCache;
251 219
252 // We're an internal doubly linked list 220 // We're an internal doubly linked list
253 typedef SkTInternalLList<GrResourceCacheEntry> EntryList; 221 typedef SkTInternalLList<GrResourceCacheEntry> EntryList;
254 EntryList fList; 222 EntryList fList;
255
256 #ifdef SK_DEBUG
257 // These objects cannot be returned by a search
258 EntryList fExclusiveList;
259 #endif
260 223
261 // our budget, used in purgeAsNeeded() 224 // our budget, used in purgeAsNeeded()
262 int fMaxCount; 225 int fMaxCount;
263 size_t fMaxBytes; 226 size_t fMaxBytes;
264 227
265 // our current stats, related to our budget 228 // our current stats, related to our budget
266 #if GR_CACHE_STATS 229 #if GR_CACHE_STATS
267 int fHighWaterEntryCount; 230 int fHighWaterEntryCount;
268 size_t fHighWaterEntryBytes; 231 size_t fHighWaterEntryBytes;
269 int fHighWaterClientDetachedCount;
270 size_t fHighWaterClientDetachedBytes;
271 #endif 232 #endif
272 233
273 int fEntryCount; 234 int fEntryCount;
274 size_t fEntryBytes; 235 size_t fEntryBytes;
275 int fClientDetachedCount;
276 size_t fClientDetachedBytes;
277 236
278 // prevents recursive purging 237 // prevents recursive purging
279 bool fPurging; 238 bool fPurging;
280 239
281 PFOverbudgetCB fOverbudgetCB; 240 PFOverbudgetCB fOverbudgetCB;
282 void* fOverbudgetData; 241 void* fOverbudgetData;
283 242
284 void internalPurge(int extraCount, size_t extraBytes); 243 SkAutoTUnref<const GrDrawTargetCaps> fCaps;
285 244
286 // Listen for messages that a resource has been invalidated and purge cached junk proactively. 245 // Listen for messages that a resource has been invalidated and purge cached junk proactively.
287 SkMessageBus<GrResourceInvalidatedMessage>::Inbox fInvalidationInbox; 246 typedef SkMessageBus<GrResourceInvalidatedMessage>::Inbox Inbox;
288 void purgeInvalidated(); 247 Inbox fInvalidationInbox;
289
290 #ifdef SK_DEBUG
291 static size_t countBytes(const SkTInternalLList<GrResourceCacheEntry>& list) ;
292 #endif
293 }; 248 };
294 249
295 /////////////////////////////////////////////////////////////////////////////// 250 ///////////////////////////////////////////////////////////////////////////////
296 251
297 #ifdef SK_DEBUG 252 #ifdef SK_DEBUG
298 class GrAutoResourceCacheValidate { 253 class GrAutoResourceCacheValidate {
299 public: 254 public:
300 GrAutoResourceCacheValidate(GrResourceCache* cache) : fCache(cache) { 255 GrAutoResourceCacheValidate(GrResourceCache* cache) : fCache(cache) {
301 cache->validate(); 256 cache->validate();
302 } 257 }
303 ~GrAutoResourceCacheValidate() { 258 ~GrAutoResourceCacheValidate() {
304 fCache->validate(); 259 fCache->validate();
305 } 260 }
306 private: 261 private:
307 GrResourceCache* fCache; 262 GrResourceCache* fCache;
308 }; 263 };
309 #else 264 #else
310 class GrAutoResourceCacheValidate { 265 class GrAutoResourceCacheValidate {
311 public: 266 public:
312 GrAutoResourceCacheValidate(GrResourceCache*) {} 267 GrAutoResourceCacheValidate(GrResourceCache*) {}
313 }; 268 };
314 #endif 269 #endif
315 270
316 #endif 271 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrOptDrawState.cpp ('k') | src/gpu/GrResourceCache.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698