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

Side by Side Diff: include/gpu/GrGpuResource.h

Issue 1032873002: Add mechanism to proactively purge old resources in GrResourceCache. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Add comment Created 5 years, 8 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 | « no previous file | src/gpu/GrContext.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 * Copyright 2014 Google Inc. 2 * Copyright 2014 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrGpuResource_DEFINED 8 #ifndef GrGpuResource_DEFINED
9 #define GrGpuResource_DEFINED 9 #define GrGpuResource_DEFINED
10 10
(...skipping 15 matching lines...) Expand all
26 * 1) Normal ref (+ by ref(), - by unref()): These are used by code that is is suing draw calls 26 * 1) Normal ref (+ by ref(), - by unref()): These are used by code that is is suing draw calls
27 * that read and write the resource via GrDrawTarget and by any object that must own a 27 * that read and write the resource via GrDrawTarget and by any object that must own a
28 * GrGpuResource and is itself owned (directly or indirectly) by Skia-clien t code. 28 * GrGpuResource and is itself owned (directly or indirectly) by Skia-clien t code.
29 * 2) Pending read (+ by addPendingRead(), - by completedRead()): GrContext ha s scheduled a read 29 * 2) Pending read (+ by addPendingRead(), - by completedRead()): GrContext ha s scheduled a read
30 * of the resource by the GPU as a result of a skia API call but hasn't exe cuted it yet. 30 * of the resource by the GPU as a result of a skia API call but hasn't exe cuted it yet.
31 * 3) Pending write (+ by addPendingWrite(), - by completedWrite()): GrContext has scheduled a 31 * 3) Pending write (+ by addPendingWrite(), - by completedWrite()): GrContext has scheduled a
32 * write to the resource by the GPU as a result of a skia API call but hasn 't executed it yet. 32 * write to the resource by the GPU as a result of a skia API call but hasn 't executed it yet.
33 * 33 *
34 * The latter two ref types are private and intended only for Gr core code. 34 * The latter two ref types are private and intended only for Gr core code.
35 * 35 *
36 * When an item is purgeable DERIVED:notifyIsPurgeable() will be called (static poly morphism using 36 * When all the ref/io counts reach zero DERIVED::notifyAllCntsAreZero() will be called (static poly
37 * CRTP). GrIORef and GrGpuResource are separate classes for organizational reas ons and to be 37 * morphism using CRTP). Similarly when the ref (but not necessarily pending rea d/write) count
38 * reaches 0 DERIVED::notifyRefCountIsZero() will be called. In the case when an unref() causes both
39 * the ref cnt to reach zero and the other counts are zero, notifyRefCountIsZero () will be called
40 * before notifyIsPurgeable(). Moreover, if notifyRefCountIsZero() returns false then
41 * notifyAllRefCntsAreZero() won't be called at all. notifyRefCountIsZero() must return false if the
42 * object may be deleted after notifyRefCntIsZero() returns.
43 *
44 * GrIORef and GrGpuResource are separate classes for organizational reasons and to be
38 * able to give access via friendship to only the functions related to pending I O operations. 45 * able to give access via friendship to only the functions related to pending I O operations.
39 */ 46 */
40 template <typename DERIVED> class GrIORef : public SkNoncopyable { 47 template <typename DERIVED> class GrIORef : public SkNoncopyable {
41 public: 48 public:
42 SK_DECLARE_INST_COUNT(GrIORef) 49 SK_DECLARE_INST_COUNT(GrIORef)
43 50
44 // Some of the signatures are written to mirror SkRefCnt so that GrGpuResour ce can work with 51 // Some of the signatures are written to mirror SkRefCnt so that GrGpuResour ce can work with
45 // templated helper classes (e.g. SkAutoTUnref). However, we have different categories of 52 // templated helper classes (e.g. SkAutoTUnref). However, we have different categories of
46 // refs (e.g. pending reads). We also don't require thread safety as GrCache able objects are 53 // refs (e.g. pending reads). We also don't require thread safety as GrCache able objects are
47 // not intended to cross thread boundaries. 54 // not intended to cross thread boundaries.
48 void ref() const { 55 void ref() const {
49 this->validate(); 56 this->validate();
50 ++fRefCnt; 57 ++fRefCnt;
51 } 58 }
52 59
53 void unref() const { 60 void unref() const {
54 this->validate(); 61 this->validate();
55 --fRefCnt; 62
56 this->didUnref(); 63 if (!(--fRefCnt)) {
64 if (!static_cast<const DERIVED*>(this)->notifyRefCountIsZero()) {
65 return;
66 }
67 }
68
69 this->didRemoveRefOrPendingIO(kRef_CntType);
57 } 70 }
58 71
59 void validate() const { 72 void validate() const {
60 #ifdef SK_DEBUG 73 #ifdef SK_DEBUG
61 SkASSERT(fRefCnt >= 0); 74 SkASSERT(fRefCnt >= 0);
62 SkASSERT(fPendingReads >= 0); 75 SkASSERT(fPendingReads >= 0);
63 SkASSERT(fPendingWrites >= 0); 76 SkASSERT(fPendingWrites >= 0);
64 SkASSERT(fRefCnt + fPendingReads + fPendingWrites >= 0); 77 SkASSERT(fRefCnt + fPendingReads + fPendingWrites >= 0);
65 #endif 78 #endif
66 } 79 }
67 80
68 protected: 81 protected:
69 GrIORef() : fRefCnt(1), fPendingReads(0), fPendingWrites(0) { } 82 GrIORef() : fRefCnt(1), fPendingReads(0), fPendingWrites(0) { }
70 83
84 enum CntType {
85 kRef_CntType,
86 kPendingRead_CntType,
87 kPendingWrite_CntType,
88 };
89
71 bool isPurgeable() const { return !this->internalHasRef() && !this->internal HasPendingIO(); } 90 bool isPurgeable() const { return !this->internalHasRef() && !this->internal HasPendingIO(); }
72 91
73 bool internalHasPendingRead() const { return SkToBool(fPendingReads); } 92 bool internalHasPendingRead() const { return SkToBool(fPendingReads); }
74 bool internalHasPendingWrite() const { return SkToBool(fPendingWrites); } 93 bool internalHasPendingWrite() const { return SkToBool(fPendingWrites); }
75 bool internalHasPendingIO() const { return SkToBool(fPendingWrites | fPendin gReads); } 94 bool internalHasPendingIO() const { return SkToBool(fPendingWrites | fPendin gReads); }
76 95
77 bool internalHasRef() const { return SkToBool(fRefCnt); } 96 bool internalHasRef() const { return SkToBool(fRefCnt); }
78 97
79 private: 98 private:
80 void addPendingRead() const { 99 void addPendingRead() const {
81 this->validate(); 100 this->validate();
82 ++fPendingReads; 101 ++fPendingReads;
83 } 102 }
84 103
85 void completedRead() const { 104 void completedRead() const {
86 this->validate(); 105 this->validate();
87 --fPendingReads; 106 --fPendingReads;
88 this->didUnref(); 107 this->didRemoveRefOrPendingIO(kPendingRead_CntType);
89 } 108 }
90 109
91 void addPendingWrite() const { 110 void addPendingWrite() const {
92 this->validate(); 111 this->validate();
93 ++fPendingWrites; 112 ++fPendingWrites;
94 } 113 }
95 114
96 void completedWrite() const { 115 void completedWrite() const {
97 this->validate(); 116 this->validate();
98 --fPendingWrites; 117 --fPendingWrites;
99 this->didUnref(); 118 this->didRemoveRefOrPendingIO(kPendingWrite_CntType);
100 } 119 }
101 120
102 private: 121 private:
103 void didUnref() const { 122 void didRemoveRefOrPendingIO(CntType cntTypeRemoved) const {
104 if (0 == fPendingReads && 0 == fPendingWrites && 0 == fRefCnt) { 123 if (0 == fPendingReads && 0 == fPendingWrites && 0 == fRefCnt) {
105 static_cast<const DERIVED*>(this)->notifyIsPurgeable(); 124 static_cast<const DERIVED*>(this)->notifyAllCntsAreZero(cntTypeRemov ed);
106 } 125 }
107 } 126 }
108 127
109 mutable int32_t fRefCnt; 128 mutable int32_t fRefCnt;
110 mutable int32_t fPendingReads; 129 mutable int32_t fPendingReads;
111 mutable int32_t fPendingWrites; 130 mutable int32_t fPendingWrites;
112 131
113 // This class is used to manage conversion of refs to pending reads/writes. 132 // This class is used to manage conversion of refs to pending reads/writes.
114 friend class GrGpuResourceRef; 133 friend class GrGpuResourceRef;
115 friend class GrResourceCache; // to check IO ref counts. 134 friend class GrResourceCache; // to check IO ref counts.
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 /** 283 /**
265 * Frees the object in the underlying 3D API. Called by CacheAccess. 284 * Frees the object in the underlying 3D API. Called by CacheAccess.
266 */ 285 */
267 void release(); 286 void release();
268 287
269 virtual size_t onGpuMemorySize() const = 0; 288 virtual size_t onGpuMemorySize() const = 0;
270 289
271 // See comments in CacheAccess and ResourcePriv. 290 // See comments in CacheAccess and ResourcePriv.
272 void setUniqueKey(const GrUniqueKey&); 291 void setUniqueKey(const GrUniqueKey&);
273 void removeUniqueKey(); 292 void removeUniqueKey();
274 void notifyIsPurgeable() const; 293 void notifyAllCntsAreZero(CntType) const;
294 bool notifyRefCountIsZero() const;
275 void removeScratchKey(); 295 void removeScratchKey();
276 void makeBudgeted(); 296 void makeBudgeted();
277 void makeUnbudgeted(); 297 void makeUnbudgeted();
278 298
279 #ifdef SK_DEBUG 299 #ifdef SK_DEBUG
280 friend class GrGpu; // for assert in GrGpu to access getGpu 300 friend class GrGpu; // for assert in GrGpu to access getGpu
281 #endif 301 #endif
282 302
283 static uint32_t CreateUniqueID(); 303 static uint32_t CreateUniqueID();
284 304
(...skipping 12 matching lines...) Expand all
297 // is destroyed. Those calls set will this to NULL. 317 // is destroyed. Those calls set will this to NULL.
298 GrGpu* fGpu; 318 GrGpu* fGpu;
299 mutable size_t fGpuMemorySize; 319 mutable size_t fGpuMemorySize;
300 320
301 LifeCycle fLifeCycle; 321 LifeCycle fLifeCycle;
302 const uint32_t fUniqueID; 322 const uint32_t fUniqueID;
303 323
304 SkAutoTUnref<const SkData> fData; 324 SkAutoTUnref<const SkData> fData;
305 325
306 typedef GrIORef<GrGpuResource> INHERITED; 326 typedef GrIORef<GrGpuResource> INHERITED;
307 friend class GrIORef<GrGpuResource>; // to access notifyIsPurgeable. 327 friend class GrIORef<GrGpuResource>; // to access notifyAllCntsAreZero and n otifyRefCntIsZero.
308 }; 328 };
309 329
310 #endif 330 #endif
OLDNEW
« no previous file with comments | « no previous file | src/gpu/GrContext.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698