OLD | NEW |
---|---|
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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
133 | 133 |
134 template <typename, GrIOType> friend class GrPendingIOResource; | 134 template <typename, GrIOType> friend class GrPendingIOResource; |
135 }; | 135 }; |
136 | 136 |
137 /** | 137 /** |
138 * Base class for objects that can be kept in the GrResourceCache. | 138 * Base class for objects that can be kept in the GrResourceCache. |
139 */ | 139 */ |
140 class SK_API GrGpuResource : public GrIORef<GrGpuResource> { | 140 class SK_API GrGpuResource : public GrIORef<GrGpuResource> { |
141 public: | 141 public: |
142 | 142 |
143 | |
144 enum LifeCycle { | |
145 /** | |
146 * The resource is cached and owned by Skia. Resources with this status may be kept alive | |
147 * by the cache as either scratch or unique resources even when there ar e no refs to them. | |
148 * The cache may release them whenever there are no refs. | |
149 */ | |
150 kCached_LifeCycle, | |
151 | |
152 /** | |
153 * The resource is uncached. As soon as there are no more refs to it, it is released. Under | |
154 * the hood the cache may opaquely recycle it as a cached resource. | |
155 */ | |
156 kUncached_LifeCycle, | |
157 | |
158 /** | |
159 * Similar to uncached, but Skia does not manage the lifetime of the und erlying backend | |
160 * 3D API object(s). The client is responsible for freeing those. Used t o inject client- | |
161 * created GPU resources into Skia (e.g. to render to a client-created t exture). | |
162 */ | |
163 kBorrowed_LifeCycle, | |
164 | |
165 /** | |
166 * An external resource with ownership transfered into Skia. Skia will f ree the resource. | |
167 */ | |
168 kAdopted_LifeCycle, | |
169 }; | |
170 | |
171 /** | 143 /** |
172 * Tests whether a object has been abandoned or released. All objects will | 144 * Tests whether a object has been abandoned or released. All objects will |
173 * be in this state after their creating GrContext is destroyed or has | 145 * be in this state after their creating GrContext is destroyed or has |
174 * contextLost called. It's up to the client to test wasDestroyed() before | 146 * contextLost called. It's up to the client to test wasDestroyed() before |
175 * attempting to use an object if it holds refs on objects across | 147 * attempting to use an object if it holds refs on objects across |
176 * ~GrContext, freeResources with the force flag, or contextLost. | 148 * ~GrContext, freeResources with the force flag, or contextLost. |
177 * | 149 * |
178 * @return true if the object has been released or abandoned, | 150 * @return true if the object has been released or abandoned, |
179 * false otherwise. | 151 * false otherwise. |
180 */ | 152 */ |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
254 void abandon(); | 226 void abandon(); |
255 | 227 |
256 /** | 228 /** |
257 * Dumps memory usage information for this GrGpuResource to traceMemoryDump. | 229 * Dumps memory usage information for this GrGpuResource to traceMemoryDump. |
258 * Typically, subclasses should not need to override this, and should only | 230 * Typically, subclasses should not need to override this, and should only |
259 * need to override setMemoryBacking. | 231 * need to override setMemoryBacking. |
260 **/ | 232 **/ |
261 virtual void dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const; | 233 virtual void dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const; |
262 | 234 |
263 protected: | 235 protected: |
264 // This must be called by every GrGpuObject. It should be called once the ob ject is fully | 236 // This must be called by every non-wrapped GrGpuObject. It should be called once the object is |
265 // initialized (i.e. not in a base class constructor). | 237 // fully initialized (i.e. only from the constructors of the final class). |
266 void registerWithCache(); | 238 void registerWithCache(SkBudgeted); |
267 | 239 |
268 GrGpuResource(GrGpu*, LifeCycle); | 240 // This must be called by every GrGpuObject that references any wrapped back end objects. It |
241 // should be called once the object is fully initialized (i.e. only from the constructors of the | |
242 // final class). | |
243 void registerWithCacheWrapped(); | |
244 | |
245 GrGpuResource(GrGpu*); | |
269 virtual ~GrGpuResource(); | 246 virtual ~GrGpuResource(); |
270 | 247 |
271 GrGpu* getGpu() const { return fGpu; } | 248 GrGpu* getGpu() const { return fGpu; } |
272 | 249 |
273 /** Overridden to free GPU resources in the backend API. */ | 250 /** Overridden to free GPU resources in the backend API. */ |
274 virtual void onRelease() { } | 251 virtual void onRelease() { } |
275 /** Overridden to abandon any internal handles, ptrs, etc to backend API res ources. | 252 /** Overridden to abandon any internal handles, ptrs, etc to backend API res ources. |
276 This may be called when the underlying 3D context is no longer valid and so no | 253 This may be called when the underlying 3D context is no longer valid and so no |
277 backend API calls should be made. */ | 254 backend API calls should be made. */ |
278 virtual void onAbandon() { } | 255 virtual void onAbandon() { } |
279 | 256 |
280 bool shouldFreeResources() const { return fLifeCycle != kBorrowed_LifeCycle; } | |
281 | |
282 bool isExternal() const { | |
283 return GrGpuResource::kAdopted_LifeCycle == fLifeCycle || | |
284 GrGpuResource::kBorrowed_LifeCycle == fLifeCycle; | |
285 } | |
286 | |
287 /** | 257 /** |
288 * This entry point should be called whenever gpuMemorySize() should report a different size. | 258 * This entry point should be called whenever gpuMemorySize() should report a different size. |
289 * The cache will call gpuMemorySize() to update the current size of the res ource. | 259 * The cache will call gpuMemorySize() to update the current size of the res ource. |
290 */ | 260 */ |
291 void didChangeGpuMemorySize() const; | 261 void didChangeGpuMemorySize() const; |
292 | 262 |
293 /** | 263 /** |
294 * Optionally called by the GrGpuResource subclass if the resource can be us ed as scratch. | 264 * Called by the registerWithCache if the resource is available to be used a s scratch. |
295 * By default resources are not usable as scratch. This should only be calle d once. | 265 * Resource subclasses should override this if the instances should be recyc led as scratch |
266 * resources and populate the scratchKey with the key. | |
267 * By default resources are not recycled as scratch. | |
296 **/ | 268 **/ |
297 void setScratchKey(const GrScratchKey& scratchKey); | 269 virtual void computeScratchKey(GrScratchKey* scratchKey) const { }; |
bsalomon
2016/04/19 14:37:46
Can this be private? Seems like only registerWithC
Kimmo Kinnunen
2016/04/20 12:04:55
Done.
| |
298 | 270 |
299 /** | 271 /** |
300 * Allows subclasses to add additional backing information to the SkTraceMem oryDump. Called by | 272 * Allows subclasses to add additional backing information to the SkTraceMem oryDump. Called by |
301 * onMemoryDump. The default implementation adds no backing information. | 273 * onMemoryDump. The default implementation adds no backing information. |
302 **/ | 274 **/ |
303 virtual void setMemoryBacking(SkTraceMemoryDump*, const SkString&) const {} | 275 virtual void setMemoryBacking(SkTraceMemoryDump*, const SkString&) const {} |
304 | 276 |
305 private: | 277 private: |
306 /** | 278 /** |
307 * Frees the object in the underlying 3D API. Called by CacheAccess. | 279 * Frees the object in the underlying 3D API. Called by CacheAccess. |
(...skipping 26 matching lines...) Expand all Loading... | |
334 | 306 |
335 static const size_t kInvalidGpuMemorySize = ~static_cast<size_t>(0); | 307 static const size_t kInvalidGpuMemorySize = ~static_cast<size_t>(0); |
336 GrScratchKey fScratchKey; | 308 GrScratchKey fScratchKey; |
337 GrUniqueKey fUniqueKey; | 309 GrUniqueKey fUniqueKey; |
338 | 310 |
339 // This is not ref'ed but abandon() or release() will be called before the G rGpu object | 311 // This is not ref'ed but abandon() or release() will be called before the G rGpu object |
340 // is destroyed. Those calls set will this to NULL. | 312 // is destroyed. Those calls set will this to NULL. |
341 GrGpu* fGpu; | 313 GrGpu* fGpu; |
342 mutable size_t fGpuMemorySize; | 314 mutable size_t fGpuMemorySize; |
343 | 315 |
344 LifeCycle fLifeCycle; | 316 SkBudgeted fBudgeted; |
317 bool fRefsWrappedObjects; | |
345 const uint32_t fUniqueID; | 318 const uint32_t fUniqueID; |
346 | 319 |
347 SkAutoTUnref<const SkData> fData; | 320 SkAutoTUnref<const SkData> fData; |
348 | 321 |
349 typedef GrIORef<GrGpuResource> INHERITED; | 322 typedef GrIORef<GrGpuResource> INHERITED; |
350 friend class GrIORef<GrGpuResource>; // to access notifyAllCntsAreZero and n otifyRefCntIsZero. | 323 friend class GrIORef<GrGpuResource>; // to access notifyAllCntsAreZero and n otifyRefCntIsZero. |
351 }; | 324 }; |
352 | 325 |
353 #endif | 326 #endif |
OLD | NEW |