Chromium Code Reviews| 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 GrProgramElement_DEFINED | 8 #ifndef GrProgramElement_DEFINED |
| 9 #define GrProgramElement_DEFINED | 9 #define GrProgramElement_DEFINED |
| 10 | 10 |
| 11 #include "SkRefCnt.h" | 11 #include "SkRefCnt.h" |
| 12 #include "SkTArray.h" | 12 #include "SkTArray.h" |
| 13 | 13 |
| 14 class GrGpuResourceRef; | 14 class GrGpuResourceRef; |
| 15 | 15 |
| 16 /** | 16 /** |
| 17 * Base class for GrProcessor. GrDrawState uses this to manage | 17 * Base class for GrProcessor. GrDrawState uses this to manage |
| 18 * transitioning a GrProcessor from being owned by a client to being scheduled f or execution. It | 18 * transitioning a GrProcessor from being owned by a client to being scheduled f or execution. It |
| 19 * converts resources owned by the effect from being ref'ed to having pending re ads/writes. | 19 * converts resources owned by the effect from being ref'ed to having pending re ads/writes. |
| 20 * | 20 * |
| 21 * All GrGpuResource objects owned by a GrProgramElement or derived classes (eit her directly or | 21 * All GrGpuResource objects owned by a GrProgramElement or derived classes (eit her directly or |
| 22 * indirectly) must be wrapped in a GrGpuResourceRef and registered with the GrP rogramElement using | 22 * indirectly) must be wrapped in a GrGpuResourceRef and registered with the GrP rogramElement using |
| 23 * addGpuResource(). This allows the regular refs to be converted to pending IO events | 23 * addGpuResource(). This allows the regular refs to be converted to pending IO events |
| 24 * when the program element is scheduled for deferred execution. | 24 * when the program element is scheduled for deferred execution. |
|
robertphillips
2015/08/27 19:39:06
// Expand on this comment ?
| |
| 25 */ | 25 */ |
| 26 class GrProgramElement : public SkNoncopyable { | 26 class GrProgramElement : public SkNoncopyable { |
| 27 public: | 27 public: |
| 28 virtual ~GrProgramElement() { | 28 virtual ~GrProgramElement() { |
| 29 // fRefCnt can be one when an effect is created statically using GR_CREA TE_STATIC_EFFECT | 29 // fRefCnt can be one when an effect is created statically using GR_CREA TE_STATIC_EFFECT |
| 30 SkASSERT((0 == fRefCnt || 1 == fRefCnt) && 0 == fPendingExecutions); | 30 SkASSERT((0 == fRefCnt || 1 == fRefCnt) && 0 == fPendingExecutions); |
| 31 // Set to invalid values. | 31 // Set to invalid values. |
| 32 SkDEBUGCODE(fRefCnt = fPendingExecutions = -10;) | 32 SkDEBUGCODE(fRefCnt = fPendingExecutions = -10;) |
| 33 } | 33 } |
| 34 | 34 |
| 35 void ref() const { | 35 void ref() const { |
| 36 this->validate(); | 36 this->validate(); |
| 37 // Once the ref cnt reaches zero it should never be ref'ed again. | 37 // Once the ref cnt reaches zero it should never be ref'ed again. |
| 38 SkASSERT(fRefCnt > 0); | 38 SkASSERT(fRefCnt > 0); |
| 39 ++fRefCnt; | 39 ++fRefCnt; |
| 40 this->validate(); | 40 this->validate(); |
| 41 } | 41 } |
| 42 | 42 |
| 43 void unref() const { | 43 void unref() const { |
| 44 this->validate(); | 44 this->validate(); |
| 45 --fRefCnt; | 45 --fRefCnt; |
| 46 if (0 == fRefCnt) { | 46 if (0 == fRefCnt) { |
| 47 this->notifyRefCntIsZero(); | |
| 47 if (0 == fPendingExecutions) { | 48 if (0 == fPendingExecutions) { |
| 48 delete this; | 49 delete this; |
| 49 return; | 50 return; |
| 50 } else { | 51 } else { |
| 51 this->removeRefs(); | 52 this->removeRefs(); |
| 52 } | 53 } |
| 53 } | 54 } |
| 54 this->validate(); | 55 this->validate(); |
| 55 } | 56 } |
| 56 | 57 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 71 GrProgramElement() : fRefCnt(1), fPendingExecutions(0), fUniqueID(CreateUniq ueID()) {} | 72 GrProgramElement() : fRefCnt(1), fPendingExecutions(0), fUniqueID(CreateUniq ueID()) {} |
| 72 | 73 |
| 73 /** Subclasses registers their resources using this function. It is assumed the GrProgramResouce | 74 /** Subclasses registers their resources using this function. It is assumed the GrProgramResouce |
| 74 is and will remain owned by the subclass and this function will retain a raw ptr. Once a | 75 is and will remain owned by the subclass and this function will retain a raw ptr. Once a |
| 75 GrGpuResourceRef is registered its setResource must not be called. | 76 GrGpuResourceRef is registered its setResource must not be called. |
| 76 */ | 77 */ |
| 77 void addGpuResource(const GrGpuResourceRef* res) { | 78 void addGpuResource(const GrGpuResourceRef* res) { |
| 78 fGpuResources.push_back(res); | 79 fGpuResources.push_back(res); |
| 79 } | 80 } |
| 80 | 81 |
| 81 private: | |
| 82 static uint32_t CreateUniqueID(); | |
| 83 | |
| 84 void addPendingExecution() const { | 82 void addPendingExecution() const { |
| 85 this->validate(); | 83 this->validate(); |
| 86 SkASSERT(fRefCnt > 0); | 84 SkASSERT(fRefCnt > 0); |
| 87 if (0 == fPendingExecutions) { | 85 if (0 == fPendingExecutions) { |
| 88 this->addPendingIOs(); | 86 this->addPendingIOs(); |
| 89 } | 87 } |
| 90 ++fPendingExecutions; | 88 ++fPendingExecutions; |
| 91 this->validate(); | 89 this->validate(); |
| 92 } | 90 } |
| 93 | 91 |
| 94 void completedExecution() const { | 92 void completedExecution() const { |
| 95 this->validate(); | 93 this->validate(); |
| 96 --fPendingExecutions; | 94 --fPendingExecutions; |
| 97 if (0 == fPendingExecutions) { | 95 if (0 == fPendingExecutions) { |
| 98 if (0 == fRefCnt) { | 96 if (0 == fRefCnt) { |
| 99 delete this; | 97 delete this; |
| 100 return; | 98 return; |
| 101 } else { | 99 } else { |
| 102 this->pendingIOComplete(); | 100 this->pendingIOComplete(); |
| 103 } | 101 } |
| 104 } | 102 } |
| 105 this->validate(); | 103 this->validate(); |
| 106 } | 104 } |
| 107 | 105 |
| 106 private: | |
| 107 /** This will be called when the ref cnt is zero. The object may or may not have pending | |
| 108 executions. */ | |
| 109 virtual void notifyRefCntIsZero() const = 0; | |
| 110 | |
| 111 static uint32_t CreateUniqueID(); | |
| 112 | |
| 108 void removeRefs() const; | 113 void removeRefs() const; |
| 109 void addPendingIOs() const; | 114 void addPendingIOs() const; |
| 110 void pendingIOComplete() const; | 115 void pendingIOComplete() const; |
| 111 | 116 |
| 112 mutable int32_t fRefCnt; | 117 mutable int32_t fRefCnt; |
| 113 // Count of deferred executions not yet issued to the 3D API. | 118 // Count of deferred executions not yet issued to the 3D API. |
| 114 mutable int32_t fPendingExecutions; | 119 mutable int32_t fPendingExecutions; |
| 115 uint32_t fUniqueID; | 120 uint32_t fUniqueID; |
| 116 | 121 |
| 117 SkSTArray<4, const GrGpuResourceRef*, true> fGpuResources; | 122 SkSTArray<4, const GrGpuResourceRef*, true> fGpuResources; |
| 118 | 123 |
| 119 // Only this class can access addPendingExecution() and completedExecution() . | 124 // Only this class can access addPendingExecution() and completedExecution() . |
| 120 template <typename T> friend class GrPendingProgramElement; | 125 template <typename T> friend class GrPendingProgramElement; |
| 121 | 126 |
| 122 typedef SkNoncopyable INHERITED; | 127 typedef SkNoncopyable INHERITED; |
| 123 }; | 128 }; |
| 124 | 129 |
| 125 #endif | 130 #endif |
| OLD | NEW |