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

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

Issue 729683002: Make GrResourceCache2 responsible for calling release, abandon, and ~. (Closed) Base URL: https://skia.googlesource.com/skia.git@revrev
Patch Set: tiny cleanup Created 6 years, 1 month 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 | « bench/GrResourceCacheBench.cpp ('k') | src/gpu/GrGpuResource.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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 this->validate(); 49 this->validate();
50 ++fRefCnt; 50 ++fRefCnt;
51 } 51 }
52 52
53 void unref() const { 53 void unref() const {
54 this->validate(); 54 this->validate();
55 --fRefCnt; 55 --fRefCnt;
56 this->didUnref(); 56 this->didUnref();
57 } 57 }
58 58
59 bool isPurgable() const { return this->reffedOnlyByCache() && !this->interna lHasPendingIO(); }
60 bool reffedOnlyByCache() const { return 1 == fRefCnt; }
61
62 void validate() const { 59 void validate() const {
63 #ifdef SK_DEBUG 60 #ifdef SK_DEBUG
64 SkASSERT(fRefCnt >= 0); 61 SkASSERT(fRefCnt >= 0);
65 SkASSERT(fPendingReads >= 0); 62 SkASSERT(fPendingReads >= 0);
66 SkASSERT(fPendingWrites >= 0); 63 SkASSERT(fPendingWrites >= 0);
67 SkASSERT(fRefCnt + fPendingReads + fPendingWrites > 0); 64 SkASSERT(fRefCnt + fPendingReads + fPendingWrites >= 0);
68 #endif 65 #endif
69 } 66 }
70 67
71 protected: 68 protected:
72 GrIORef() : fRefCnt(1), fPendingReads(0), fPendingWrites(0) { } 69 GrIORef() : fRefCnt(1), fPendingReads(0), fPendingWrites(0) { }
73 70
71 bool isPurgable() const { return !this->internalHasRef() && !this->internalH asPendingIO(); }
72
74 bool internalHasPendingRead() const { return SkToBool(fPendingReads); } 73 bool internalHasPendingRead() const { return SkToBool(fPendingReads); }
75 bool internalHasPendingWrite() const { return SkToBool(fPendingWrites); } 74 bool internalHasPendingWrite() const { return SkToBool(fPendingWrites); }
76 bool internalHasPendingIO() const { return SkToBool(fPendingWrites | fPendin gReads); } 75 bool internalHasPendingIO() const { return SkToBool(fPendingWrites | fPendin gReads); }
77 76
78 bool internalHasRef() const { return SkToBool(fRefCnt); } 77 bool internalHasRef() const { return SkToBool(fRefCnt); }
79 78
80 private: 79 private:
81 void addPendingRead() const { 80 void addPendingRead() const {
82 this->validate(); 81 this->validate();
83 ++fPendingReads; 82 ++fPendingReads;
(...skipping 11 matching lines...) Expand all
95 } 94 }
96 95
97 void completedWrite() const { 96 void completedWrite() const {
98 this->validate(); 97 this->validate();
99 --fPendingWrites; 98 --fPendingWrites;
100 this->didUnref(); 99 this->didUnref();
101 } 100 }
102 101
103 private: 102 private:
104 void didUnref() const { 103 void didUnref() const {
105 if (0 == fPendingReads && 0 == fPendingWrites) { 104 if (0 == fPendingReads && 0 == fPendingWrites && 0 == fRefCnt) {
106 if (0 == fRefCnt) { 105 static_cast<const DERIVED*>(this)->notifyIsPurgable();
107 // Must call derived destructor since this is not a virtual clas s.
108 SkDELETE(static_cast<const DERIVED*>(this));
109 } else if (1 == fRefCnt) {
110 // The one ref is the cache's
111 static_cast<const DERIVED*>(this)->notifyIsPurgable();
112 }
113 } 106 }
114 } 107 }
115 108
116 mutable int32_t fRefCnt; 109 mutable int32_t fRefCnt;
117 mutable int32_t fPendingReads; 110 mutable int32_t fPendingReads;
118 mutable int32_t fPendingWrites; 111 mutable int32_t fPendingWrites;
119 112
120 // This class is used to manage conversion of refs to pending reads/writes. 113 // This class is used to manage conversion of refs to pending reads/writes.
121 friend class GrGpuResourceRef; 114 friend class GrGpuResourceRef;
122 friend class GrResourceCache2; // to check IO ref counts. 115 friend class GrResourceCache2; // to check IO ref counts.
123 116
124 template <typename, GrIOType> friend class GrPendingIOResource; 117 template <typename, GrIOType> friend class GrPendingIOResource;
125 }; 118 };
126 119
127 /** 120 /**
128 * Base class for objects that can be kept in the GrResourceCache2. 121 * Base class for objects that can be kept in the GrResourceCache2.
129 */ 122 */
130 class SK_API GrGpuResource : public GrIORef<GrGpuResource> { 123 class SK_API GrGpuResource : public GrIORef<GrGpuResource> {
131 public: 124 public:
132 SK_DECLARE_INST_COUNT(GrGpuResource) 125 SK_DECLARE_INST_COUNT(GrGpuResource)
133 126
134 /** 127 /**
135 * Frees the object in the underlying 3D API. It must be safe to call this
136 * when the object has been previously abandoned.
137 */
138 void release();
139
140 /**
141 * Removes references to objects in the underlying 3D API without freeing
142 * them. Used when the API context has been torn down before the GrContext.
143 */
144 void abandon();
145
146 /**
147 * Tests whether a object has been abandoned or released. All objects will 128 * Tests whether a object has been abandoned or released. All objects will
148 * be in this state after their creating GrContext is destroyed or has 129 * be in this state after their creating GrContext is destroyed or has
149 * contextLost called. It's up to the client to test wasDestroyed() before 130 * contextLost called. It's up to the client to test wasDestroyed() before
150 * attempting to use an object if it holds refs on objects across 131 * attempting to use an object if it holds refs on objects across
151 * ~GrContext, freeResources with the force flag, or contextLost. 132 * ~GrContext, freeResources with the force flag, or contextLost.
152 * 133 *
153 * @return true if the object has been released or abandoned, 134 * @return true if the object has been released or abandoned,
154 * false otherwise. 135 * false otherwise.
155 */ 136 */
156 bool wasDestroyed() const { return NULL == fGpu; } 137 bool wasDestroyed() const { return NULL == fGpu; }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 protected: 177 protected:
197 // This must be called by every GrGpuObject. It should be called once the ob ject is fully 178 // This must be called by every GrGpuObject. It should be called once the ob ject is fully
198 // initialized (i.e. not in a base class constructor). 179 // initialized (i.e. not in a base class constructor).
199 void registerWithCache(); 180 void registerWithCache();
200 181
201 GrGpuResource(GrGpu*, bool isWrapped); 182 GrGpuResource(GrGpu*, bool isWrapped);
202 virtual ~GrGpuResource(); 183 virtual ~GrGpuResource();
203 184
204 GrGpu* getGpu() const { return fGpu; } 185 GrGpu* getGpu() const { return fGpu; }
205 186
206 // Derived classes should always call their parent class' onRelease 187 /** Overridden to free GPU resources in the backend API. */
207 // and onAbandon methods in their overrides. 188 virtual void onRelease() { }
208 virtual void onRelease() {}; 189 /** Overridden to abandon any internal handles, ptrs, etc to backend API res ources.
209 virtual void onAbandon() {}; 190 This may be called when the underlying 3D context is no longer valid and so no
191 backend API calls should be made. */
192 virtual void onAbandon() { }
210 193
211 bool isWrapped() const { return kWrapped_FlagBit & fFlags; } 194 bool isWrapped() const { return kWrapped_FlagBit & fFlags; }
212 195
213 /** 196 /**
214 * This entry point should be called whenever gpuMemorySize() should report a different size. 197 * This entry point should be called whenever gpuMemorySize() should report a different size.
215 * The cache will call gpuMemorySize() to update the current size of the res ource. 198 * The cache will call gpuMemorySize() to update the current size of the res ource.
216 */ 199 */
217 void didChangeGpuMemorySize() const; 200 void didChangeGpuMemorySize() const;
218 201
219 /** 202 /**
220 * Optionally called by the GrGpuResource subclass if the resource can be us ed as scratch. 203 * Optionally called by the GrGpuResource subclass if the resource can be us ed as scratch.
221 * By default resources are not usable as scratch. This should only be calle d once. 204 * By default resources are not usable as scratch. This should only be calle d once.
222 **/ 205 **/
223 void setScratchKey(const GrResourceKey& scratchKey); 206 void setScratchKey(const GrResourceKey& scratchKey);
224 207
225 private: 208 private:
209 /**
210 * Frees the object in the underlying 3D API. Called by CacheAccess.
211 */
212 void release();
213
214 /**
215 * Removes references to objects in the underlying 3D API without freeing th em.
216 * Called by CacheAccess.
217 */
218 void abandon();
219
226 virtual size_t onGpuMemorySize() const = 0; 220 virtual size_t onGpuMemorySize() const = 0;
227 221
228 // See comments in CacheAccess. 222 // See comments in CacheAccess.
229 bool setContentKey(const GrResourceKey& contentKey); 223 bool setContentKey(const GrResourceKey& contentKey);
230 224
231 void notifyIsPurgable() const; 225 void notifyIsPurgable() const;
232 226
233 #ifdef SK_DEBUG 227 #ifdef SK_DEBUG
234 friend class GrGpu; // for assert in GrGpu to access getGpu 228 friend class GrGpu; // for assert in GrGpu to access getGpu
235 #endif 229 #endif
(...skipping 27 matching lines...) Expand all
263 // keys. 257 // keys.
264 GrResourceKey fScratchKey; 258 GrResourceKey fScratchKey;
265 GrResourceKey fContentKey; 259 GrResourceKey fContentKey;
266 bool fContentKeySet; 260 bool fContentKeySet;
267 261
268 typedef GrIORef<GrGpuResource> INHERITED; 262 typedef GrIORef<GrGpuResource> INHERITED;
269 friend class GrIORef<GrGpuResource>; // to access notifyIsPurgable. 263 friend class GrIORef<GrGpuResource>; // to access notifyIsPurgable.
270 }; 264 };
271 265
272 #endif 266 #endif
OLDNEW
« no previous file with comments | « bench/GrResourceCacheBench.cpp ('k') | src/gpu/GrGpuResource.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698