OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 GrEffect_DEFINED | 8 #ifndef GrEffect_DEFINED |
9 #define GrEffect_DEFINED | 9 #define GrEffect_DEFINED |
10 | 10 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 | 131 |
132 int numTextures() const { return fTextureAccesses.count(); } | 132 int numTextures() const { return fTextureAccesses.count(); } |
133 | 133 |
134 /** Returns the access pattern for the texture at index. index must be valid
according to | 134 /** Returns the access pattern for the texture at index. index must be valid
according to |
135 numTextures(). */ | 135 numTextures(). */ |
136 const GrTextureAccess& textureAccess(int index) const { return *fTextureAcce
sses[index]; } | 136 const GrTextureAccess& textureAccess(int index) const { return *fTextureAcce
sses[index]; } |
137 | 137 |
138 /** Shortcut for textureAccess(index).texture(); */ | 138 /** Shortcut for textureAccess(index).texture(); */ |
139 GrTexture* texture(int index) const { return this->textureAccess(index).getT
exture(); } | 139 GrTexture* texture(int index) const { return this->textureAccess(index).getT
exture(); } |
140 | 140 |
| 141 /** Will this effect read the destination pixel value? */ |
| 142 bool willReadDst() const { return fWillReadDst; } |
141 | 143 |
142 int numVertexAttribs() const { return fVertexAttribTypes.count(); } | 144 int numVertexAttribs() const { return fVertexAttribTypes.count(); } |
143 | 145 |
144 GrSLType vertexAttribType(int index) const { return fVertexAttribTypes[index
]; } | 146 GrSLType vertexAttribType(int index) const { return fVertexAttribTypes[index
]; } |
145 | 147 |
146 static const int kMaxVertexAttribs = 2; | 148 static const int kMaxVertexAttribs = 2; |
147 | 149 |
148 | |
149 /** Useful for effects that want to insert a texture matrix that is implied
by the texture | 150 /** Useful for effects that want to insert a texture matrix that is implied
by the texture |
150 dimensions */ | 151 dimensions */ |
151 static inline SkMatrix MakeDivByTextureWHMatrix(const GrTexture* texture) { | 152 static inline SkMatrix MakeDivByTextureWHMatrix(const GrTexture* texture) { |
152 GrAssert(NULL != texture); | 153 GrAssert(NULL != texture); |
153 SkMatrix mat; | 154 SkMatrix mat; |
154 mat.setIDiv(texture->width(), texture->height()); | 155 mat.setIDiv(texture->width(), texture->height()); |
155 return mat; | 156 return mat; |
156 } | 157 } |
157 | 158 |
158 void* operator new(size_t size); | 159 void* operator new(size_t size); |
(...skipping 25 matching lines...) Expand all Loading... |
184 */ | 185 */ |
185 void addTextureAccess(const GrTextureAccess* textureAccess); | 186 void addTextureAccess(const GrTextureAccess* textureAccess); |
186 | 187 |
187 /** | 188 /** |
188 * Subclasses call this from their constructor to register vertex attributes
(at most | 189 * Subclasses call this from their constructor to register vertex attributes
(at most |
189 * kMaxVertexAttribs). This must only be called from the constructor because
GrEffects are | 190 * kMaxVertexAttribs). This must only be called from the constructor because
GrEffects are |
190 * immutable. | 191 * immutable. |
191 */ | 192 */ |
192 void addVertexAttrib(GrSLType type); | 193 void addVertexAttrib(GrSLType type); |
193 | 194 |
194 GrEffect() : fEffectRef(NULL) {}; | 195 GrEffect() : fWillReadDst(false), fEffectRef(NULL) {} |
195 | 196 |
196 /** This should be called by GrEffect subclass factories. See the comment on
AutoEffectUnref for | 197 /** This should be called by GrEffect subclass factories. See the comment on
AutoEffectUnref for |
197 an example factory function. */ | 198 an example factory function. */ |
198 static GrEffectRef* CreateEffectRef(GrEffect* effect) { | 199 static GrEffectRef* CreateEffectRef(GrEffect* effect) { |
199 if (NULL == effect->fEffectRef) { | 200 if (NULL == effect->fEffectRef) { |
200 effect->fEffectRef = SkNEW_ARGS(GrEffectRef, (effect)); | 201 effect->fEffectRef = SkNEW_ARGS(GrEffectRef, (effect)); |
201 } else { | 202 } else { |
202 effect->fEffectRef->ref(); | 203 effect->fEffectRef->ref(); |
203 } | 204 } |
204 return effect->fEffectRef; | 205 return effect->fEffectRef; |
(...skipping 22 matching lines...) Expand all Loading... |
227 GrEffect* fEffect; | 228 GrEffect* fEffect; |
228 }; | 229 }; |
229 | 230 |
230 /** Helper for getting the GrEffect out of a GrEffectRef and down-casting to
a GrEffect subclass | 231 /** Helper for getting the GrEffect out of a GrEffectRef and down-casting to
a GrEffect subclass |
231 */ | 232 */ |
232 template <typename T> | 233 template <typename T> |
233 static const T& CastEffect(const GrEffect& effectRef) { | 234 static const T& CastEffect(const GrEffect& effectRef) { |
234 return *static_cast<const T*>(&effectRef); | 235 return *static_cast<const T*>(&effectRef); |
235 } | 236 } |
236 | 237 |
| 238 /** |
| 239 * If the effect subclass will read the destination pixel value then it must
call this function |
| 240 * from its constructor. Otherwise, when its generated backend-specific effe
ct class attempts |
| 241 * to generate code that reads the destination pixel it will fail. |
| 242 */ |
| 243 void setWillReadDst() { fWillReadDst = true; } |
| 244 |
237 private: | 245 private: |
238 bool isEqual(const GrEffect& other) const { | 246 bool isEqual(const GrEffect& other) const { |
239 if (&this->getFactory() != &other.getFactory()) { | 247 if (&this->getFactory() != &other.getFactory()) { |
240 return false; | 248 return false; |
241 } | 249 } |
242 bool result = this->onIsEqual(other); | 250 bool result = this->onIsEqual(other); |
243 #if GR_DEBUG | 251 #if GR_DEBUG |
244 if (result) { | 252 if (result) { |
245 GrAssert(this->numTextures() == other.numTextures()); | 253 GrAssert(this->numTextures() == other.numTextures()); |
246 for (int i = 0; i < this->numTextures(); ++i) { | 254 for (int i = 0; i < this->numTextures(); ++i) { |
(...skipping 11 matching lines...) Expand all Loading... |
258 | 266 |
259 void EffectRefDestroyed() { fEffectRef = NULL; } | 267 void EffectRefDestroyed() { fEffectRef = NULL; } |
260 | 268 |
261 friend class GrEffectRef; // to call EffectRefDestroyed() | 269 friend class GrEffectRef; // to call EffectRefDestroyed() |
262 friend class GrEffectStage; // to rewrap GrEffect in GrEffectRef when restor
ing an effect-stage | 270 friend class GrEffectStage; // to rewrap GrEffect in GrEffectRef when restor
ing an effect-stage |
263 // from deferred state, to call isEqual on naked
GrEffects, and | 271 // from deferred state, to call isEqual on naked
GrEffects, and |
264 // to inc/dec deferred ref counts. | 272 // to inc/dec deferred ref counts. |
265 | 273 |
266 SkSTArray<4, const GrTextureAccess*, true> fTextureAccesses; | 274 SkSTArray<4, const GrTextureAccess*, true> fTextureAccesses; |
267 SkSTArray<kMaxVertexAttribs, GrSLType, true> fVertexAttribTypes; | 275 SkSTArray<kMaxVertexAttribs, GrSLType, true> fVertexAttribTypes; |
| 276 bool fWillReadDst; |
268 GrEffectRef* fEffectRef; | 277 GrEffectRef* fEffectRef; |
269 | 278 |
270 typedef GrRefCnt INHERITED; | 279 typedef GrRefCnt INHERITED; |
271 }; | 280 }; |
272 | 281 |
273 inline GrEffectRef::GrEffectRef(GrEffect* effect) { | 282 inline GrEffectRef::GrEffectRef(GrEffect* effect) { |
274 GrAssert(NULL != effect); | 283 GrAssert(NULL != effect); |
275 effect->ref(); | 284 effect->ref(); |
276 fEffect = effect; | 285 fEffect = effect; |
277 } | 286 } |
278 | 287 |
279 #endif | 288 #endif |
OLD | NEW |