| 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 |
| 11 #include "GrResourceKey.h" | 11 #include "GrResourceKey.h" |
| 12 #include "GrTypesPriv.h" | 12 #include "GrTypesPriv.h" |
| 13 #include "SkData.h" | 13 #include "SkData.h" |
| 14 | 14 |
| 15 #include "GrDrawContext.h" |
| 16 |
| 15 class GrContext; | 17 class GrContext; |
| 18 class GrDrawContext; |
| 16 class GrGpu; | 19 class GrGpu; |
| 17 class GrResourceCache; | 20 class GrResourceCache; |
| 18 class SkTraceMemoryDump; | 21 class SkTraceMemoryDump; |
| 22 class GrRenderTarget; |
| 23 class GrSurface; |
| 24 class GrDrawTarget; |
| 25 class GrGpuResource; |
| 26 |
| 27 extern GrDrawTarget* getLastDT6(GrGpuResource* rt); |
| 28 |
| 29 // Due to header woes |
| 30 extern void addRequiredDep(GrDrawTarget* dst, GrDrawTarget* src); |
| 19 | 31 |
| 20 /** | 32 /** |
| 21 * Base class for GrGpuResource. Handles the various types of refs we need. Sepa
rated out as a base | 33 * Base class for GrGpuResource. Handles the various types of refs we need. Sepa
rated out as a base |
| 22 * class to isolate the ref-cnting behavior and provide friendship without expos
ing all of | 34 * class to isolate the ref-cnting behavior and provide friendship without expos
ing all of |
| 23 * GrGpuResource. | 35 * GrGpuResource. |
| 24 * | 36 * |
| 25 * Gpu resources can have three types of refs: | 37 * Gpu resources can have three types of refs: |
| 26 * 1) Normal ref (+ by ref(), - by unref()): These are used by code that is is
suing draw calls | 38 * 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 | 39 * 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. | 40 * GrGpuResource and is itself owned (directly or indirectly) by Skia-clien
t code. |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 | 99 |
| 88 bool isPurgeable() const { return !this->internalHasRef() && !this->internal
HasPendingIO(); } | 100 bool isPurgeable() const { return !this->internalHasRef() && !this->internal
HasPendingIO(); } |
| 89 | 101 |
| 90 bool internalHasPendingRead() const { return SkToBool(fPendingReads); } | 102 bool internalHasPendingRead() const { return SkToBool(fPendingReads); } |
| 91 bool internalHasPendingWrite() const { return SkToBool(fPendingWrites); } | 103 bool internalHasPendingWrite() const { return SkToBool(fPendingWrites); } |
| 92 bool internalHasPendingIO() const { return SkToBool(fPendingWrites | fPendin
gReads); } | 104 bool internalHasPendingIO() const { return SkToBool(fPendingWrites | fPendin
gReads); } |
| 93 | 105 |
| 94 bool internalHasRef() const { return SkToBool(fRefCnt); } | 106 bool internalHasRef() const { return SkToBool(fRefCnt); } |
| 95 | 107 |
| 96 private: | 108 private: |
| 97 void addPendingRead() const { | 109 void addPendingRead(const DERIVED* dst) const { |
| 110 const DERIVED* src = static_cast<const DERIVED*>(this); |
| 111 if ((const_cast<DERIVED*>(src))->arrgh()) { |
| 112 SkASSERT(dst); |
| 113 SkASSERT((const_cast<DERIVED*>(dst))->arrgh()); |
| 114 |
| 115 GrDrawTarget* dstDT = getLastDT6(const_cast<DERIVED*>(dst)); |
| 116 GrDrawTarget* srcDT = getLastDT6(const_cast<DERIVED*>(src)); |
| 117 |
| 118 SkASSERT(dstDT || !srcDT); |
| 119 |
| 120 if (src->fromRawPixels2()) { |
| 121 // adding a read on uploaded content |
| 122 SkASSERT(!srcDT); |
| 123 } else { |
| 124 // adding a read on rendered content |
| 125 if (srcDT) { |
| 126 SkASSERT(dstDT); |
| 127 |
| 128 if (dstDT == srcDT) { |
| 129 // self-read - presumably for dst reads |
| 130 } else { |
| 131 addRequiredDep(dstDT, srcDT); |
| 132 } |
| 133 } |
| 134 } |
| 135 } |
| 136 |
| 98 this->validate(); | 137 this->validate(); |
| 99 ++fPendingReads; | 138 ++fPendingReads; |
| 100 } | 139 } |
| 101 | 140 |
| 102 void completedRead() const { | 141 void completedRead() const { |
| 103 this->validate(); | 142 this->validate(); |
| 104 --fPendingReads; | 143 --fPendingReads; |
| 105 this->didRemoveRefOrPendingIO(kPendingRead_CntType); | 144 this->didRemoveRefOrPendingIO(kPendingRead_CntType); |
| 106 } | 145 } |
| 107 | 146 |
| 108 void addPendingWrite() const { | 147 void addPendingWrite() const { |
| 109 this->validate(); | 148 this->validate(); |
| 110 ++fPendingWrites; | 149 ++fPendingWrites; |
| 111 } | 150 } |
| 112 | 151 |
| 113 void completedWrite() const { | 152 void completedWrite() const { |
| 114 this->validate(); | 153 this->validate(); |
| 115 --fPendingWrites; | 154 --fPendingWrites; |
| 116 this->didRemoveRefOrPendingIO(kPendingWrite_CntType); | 155 this->didRemoveRefOrPendingIO(kPendingWrite_CntType); |
| 117 } | 156 } |
| 118 | 157 |
| 119 private: | 158 private: |
| 120 void didRemoveRefOrPendingIO(CntType cntTypeRemoved) const { | 159 void didRemoveRefOrPendingIO(CntType cntTypeRemoved) const { |
| 121 if (0 == fPendingReads && 0 == fPendingWrites && 0 == fRefCnt) { | 160 if (0 == fPendingReads && 0 == fPendingWrites && 0 == fRefCnt) { |
| 122 static_cast<const DERIVED*>(this)->notifyAllCntsAreZero(cntTypeRemov
ed); | 161 static_cast<const DERIVED*>(this)->notifyAllCntsAreZero(cntTypeRemov
ed); |
| 123 } | 162 } |
| 124 } | 163 } |
| 125 | 164 |
| 165 public: |
| 126 mutable int32_t fRefCnt; | 166 mutable int32_t fRefCnt; |
| 127 mutable int32_t fPendingReads; | 167 mutable int32_t fPendingReads; |
| 128 mutable int32_t fPendingWrites; | 168 mutable int32_t fPendingWrites; |
| 129 | 169 |
| 130 // This class is used to manage conversion of refs to pending reads/writes. | 170 // This class is used to manage conversion of refs to pending reads/writes. |
| 131 friend class GrGpuResourceRef; | 171 friend class GrGpuResourceRef; |
| 132 friend class GrResourceCache; // to check IO ref counts. | 172 friend class GrResourceCache; // to check IO ref counts. |
| 133 | 173 |
| 134 template <typename, GrIOType> friend class GrPendingIOResource; | 174 template <typename, GrIOType> friend class GrPendingIOResource; |
| 135 }; | 175 }; |
| 136 | 176 |
| 177 |
| 137 /** | 178 /** |
| 138 * Base class for objects that can be kept in the GrResourceCache. | 179 * Base class for objects that can be kept in the GrResourceCache. |
| 139 */ | 180 */ |
| 140 class SK_API GrGpuResource : public GrIORef<GrGpuResource> { | 181 class SK_API GrGpuResource : public GrIORef<GrGpuResource> { |
| 141 public: | 182 public: |
| 183 enum Type2 { |
| 184 kSurface, |
| 185 kOther |
| 186 }; |
| 142 | 187 |
| 188 public: |
| 189 |
| 190 Type2 type1() const { return fType1; } |
| 191 virtual GrRenderTarget* arrgh() = 0; |
| 192 |
| 193 private: |
| 194 // fFromRawPixels2, fException & fException2 are just for the alternate test
ing system |
| 195 mutable bool fFromRawPixels2; |
| 196 mutable bool fException; // there are often textures from raw data which do
not have a key |
| 197 public: |
| 198 mutable bool fException2; // yuv textures have a key but have been rendered
to |
| 199 // as have CMM alpha masks |
| 200 |
| 201 void validate() const { |
| 202 if (fException) { |
| 203 SkASSERT(fFromRawPixels2); |
| 204 } |
| 205 if (!fFromRawPixels2) { |
| 206 SkASSERT(!fException); // can't be an exception w/o being from raw
pixels |
| 207 } |
| 208 } |
| 209 |
| 210 bool fromRawPixels2() const { |
| 211 this->validate(); |
| 212 return fFromRawPixels2; |
| 213 } |
| 214 |
| 215 void setFromRawPixels(bool fromRawPixels) const { |
| 216 this->validate(); |
| 217 |
| 218 fFromRawPixels2 = fromRawPixels; |
| 219 |
| 220 this->validate(); |
| 221 } |
| 222 |
| 223 bool exception() const { return fException; } |
| 224 |
| 225 void setException(bool exception) { |
| 226 this->validate(); |
| 227 fException = exception; |
| 228 this->validate(); |
| 229 } |
| 143 | 230 |
| 144 enum LifeCycle { | 231 enum LifeCycle { |
| 145 /** | 232 /** |
| 146 * The resource is cached and owned by Skia. Resources with this status
may be kept alive | 233 * 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. | 234 * 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. | 235 * The cache may release them whenever there are no refs. |
| 149 */ | 236 */ |
| 150 kCached_LifeCycle, | 237 kCached_LifeCycle, |
| 151 | 238 |
| 152 /** | 239 /** |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 * Typically, subclasses should not need to override this, and should only | 345 * Typically, subclasses should not need to override this, and should only |
| 259 * need to override setMemoryBacking. | 346 * need to override setMemoryBacking. |
| 260 **/ | 347 **/ |
| 261 virtual void dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const; | 348 virtual void dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const; |
| 262 | 349 |
| 263 protected: | 350 protected: |
| 264 // This must be called by every GrGpuObject. It should be called once the ob
ject is fully | 351 // This must be called by every GrGpuObject. It should be called once the ob
ject is fully |
| 265 // initialized (i.e. not in a base class constructor). | 352 // initialized (i.e. not in a base class constructor). |
| 266 void registerWithCache(); | 353 void registerWithCache(); |
| 267 | 354 |
| 268 GrGpuResource(GrGpu*, LifeCycle); | 355 GrGpuResource(GrGpu*, LifeCycle, Type2); |
| 269 virtual ~GrGpuResource(); | 356 virtual ~GrGpuResource(); |
| 270 | 357 |
| 271 GrGpu* getGpu() const { return fGpu; } | 358 GrGpu* getGpu() const { return fGpu; } |
| 272 | 359 |
| 273 /** Overridden to free GPU resources in the backend API. */ | 360 /** Overridden to free GPU resources in the backend API. */ |
| 274 virtual void onRelease() { } | 361 virtual void onRelease() { } |
| 275 /** Overridden to abandon any internal handles, ptrs, etc to backend API res
ources. | 362 /** 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 | 363 This may be called when the underlying 3D context is no longer valid and
so no |
| 277 backend API calls should be made. */ | 364 backend API calls should be made. */ |
| 278 virtual void onAbandon() { } | 365 virtual void onAbandon() { } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 // This is not ref'ed but abandon() or release() will be called before the G
rGpu object | 426 // 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. | 427 // is destroyed. Those calls set will this to NULL. |
| 341 GrGpu* fGpu; | 428 GrGpu* fGpu; |
| 342 mutable size_t fGpuMemorySize; | 429 mutable size_t fGpuMemorySize; |
| 343 | 430 |
| 344 LifeCycle fLifeCycle; | 431 LifeCycle fLifeCycle; |
| 345 const uint32_t fUniqueID; | 432 const uint32_t fUniqueID; |
| 346 | 433 |
| 347 SkAutoTUnref<const SkData> fData; | 434 SkAutoTUnref<const SkData> fData; |
| 348 | 435 |
| 436 Type2 fType1; |
| 437 |
| 349 typedef GrIORef<GrGpuResource> INHERITED; | 438 typedef GrIORef<GrGpuResource> INHERITED; |
| 350 friend class GrIORef<GrGpuResource>; // to access notifyAllCntsAreZero and n
otifyRefCntIsZero. | 439 friend class GrIORef<GrGpuResource>; // to access notifyAllCntsAreZero and n
otifyRefCntIsZero. |
| 351 }; | 440 }; |
| 352 | 441 |
| 353 #endif | 442 #endif |
| OLD | NEW |