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 GrProcessor_DEFINED | 8 #ifndef GrProcessor_DEFINED |
9 #define GrProcessor_DEFINED | 9 #define GrProcessor_DEFINED |
10 | 10 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 this->assertEquality(other); | 117 this->assertEquality(other); |
118 } | 118 } |
119 #endif | 119 #endif |
120 return result; | 120 return result; |
121 } | 121 } |
122 | 122 |
123 /** Human-meaningful string to identify this effect; may be embedded | 123 /** Human-meaningful string to identify this effect; may be embedded |
124 in generated shader code. */ | 124 in generated shader code. */ |
125 const char* name() const; | 125 const char* name() const; |
126 | 126 |
| 127 int numTransforms() const { return fCoordTransforms.count(); } |
| 128 |
| 129 /** Returns the coordinate transformation at index. index must be valid acco
rding to |
| 130 numTransforms(). */ |
| 131 const GrCoordTransform& coordTransform(int index) const { return *fCoordTran
sforms[index]; } |
| 132 |
127 int numTextures() const { return fTextureAccesses.count(); } | 133 int numTextures() const { return fTextureAccesses.count(); } |
128 | 134 |
129 /** Returns the access pattern for the texture at index. index must be valid
according to | 135 /** Returns the access pattern for the texture at index. index must be valid
according to |
130 numTextures(). */ | 136 numTextures(). */ |
131 const GrTextureAccess& textureAccess(int index) const { return *fTextureAcce
sses[index]; } | 137 const GrTextureAccess& textureAccess(int index) const { return *fTextureAcce
sses[index]; } |
132 | 138 |
133 /** Shortcut for textureAccess(index).texture(); */ | 139 /** Shortcut for textureAccess(index).texture(); */ |
134 GrTexture* texture(int index) const { return this->textureAccess(index).getT
exture(); } | 140 GrTexture* texture(int index) const { return this->textureAccess(index).getT
exture(); } |
135 | 141 |
136 /** Will this effect read the fragment position? */ | 142 /** Will this effect read the fragment position? */ |
137 bool willReadFragmentPosition() const { return fWillReadFragmentPosition; } | 143 bool willReadFragmentPosition() const { return fWillReadFragmentPosition; } |
138 | 144 |
139 void* operator new(size_t size); | 145 void* operator new(size_t size); |
140 void operator delete(void* target); | 146 void operator delete(void* target); |
141 | 147 |
142 void* operator new(size_t size, void* placement) { | 148 void* operator new(size_t size, void* placement) { |
143 return ::operator new(size, placement); | 149 return ::operator new(size, placement); |
144 } | 150 } |
145 void operator delete(void* target, void* placement) { | 151 void operator delete(void* target, void* placement) { |
146 ::operator delete(target, placement); | 152 ::operator delete(target, placement); |
147 } | 153 } |
148 | 154 |
149 /** | 155 /** |
150 * Helper for down-casting to a GrProcessor subclass | 156 * Helper for down-casting to a GrProcessor subclass |
151 */ | 157 */ |
152 template <typename T> const T& cast() const { return *static_cast<const T*>(
this); } | 158 template <typename T> const T& cast() const { return *static_cast<const T*>(
this); } |
153 | 159 |
154 protected: | 160 protected: |
155 /** | 161 /** |
| 162 * Subclasses call this from their constructor to register coordinate transf
ormations. The |
| 163 * effect subclass manages the lifetime of the transformations (this functio
n only stores a |
| 164 * pointer). The GrCoordTransform is typically a member field of the GrProce
ssor subclass. When |
| 165 * the matrix has perspective, the transformed coordinates will have 3 compo
nents. Otherwise |
| 166 * they'll have 2. This must only be called from the constructor because GrP
rocessors are |
| 167 * immutable. |
| 168 */ |
| 169 void addCoordTransform(const GrCoordTransform* coordTransform); |
| 170 |
| 171 /** |
156 * Subclasses call this from their constructor to register GrTextureAccesses
. The effect | 172 * Subclasses call this from their constructor to register GrTextureAccesses
. The effect |
157 * subclass manages the lifetime of the accesses (this function only stores
a pointer). The | 173 * subclass manages the lifetime of the accesses (this function only stores
a pointer). The |
158 * GrTextureAccess is typically a member field of the GrProcessor subclass.
This must only be | 174 * GrTextureAccess is typically a member field of the GrProcessor subclass.
This must only be |
159 * called from the constructor because GrProcessors are immutable. | 175 * called from the constructor because GrProcessors are immutable. |
160 */ | 176 */ |
161 void addTextureAccess(const GrTextureAccess* textureAccess); | 177 void addTextureAccess(const GrTextureAccess* textureAccess); |
162 | 178 |
163 GrProcessor() | 179 GrProcessor() |
164 : fWillReadFragmentPosition(false) {} | 180 : fWillReadFragmentPosition(false) {} |
165 | 181 |
166 /** | 182 /** |
167 * If the effect will generate a backend-specific effect that will read the
fragment position | 183 * If the effect will generate a backend-specific effect that will read the
fragment position |
168 * in the FS then it must call this method from its constructor. Otherwise,
the request to | 184 * in the FS then it must call this method from its constructor. Otherwise,
the request to |
169 * access the fragment position will be denied. | 185 * access the fragment position will be denied. |
170 */ | 186 */ |
171 void setWillReadFragmentPosition() { fWillReadFragmentPosition = true; } | 187 void setWillReadFragmentPosition() { fWillReadFragmentPosition = true; } |
172 | 188 |
173 private: | 189 private: |
174 SkDEBUGCODE(void assertEquality(const GrProcessor& other) const;) | 190 SkDEBUGCODE(void assertEquality(const GrProcessor& other) const;) |
175 | 191 |
176 /** Subclass implements this to support isEqual(). It will only be called if
it is known that | 192 /** Subclass implements this to support isEqual(). It will only be called if
it is known that |
177 the two effects are of the same subclass (i.e. they return the same obje
ct from | 193 the two effects are of the same subclass (i.e. they return the same obje
ct from |
178 getFactory()).*/ | 194 getFactory()).*/ |
179 virtual bool onIsEqual(const GrProcessor& other) const = 0; | 195 virtual bool onIsEqual(const GrProcessor& other) const = 0; |
180 | 196 |
181 /** | 197 /** |
182 * Subclass implements this to support getConstantColorComponents(...). | 198 * Subclass implements this to support getConstantColorComponents(...). |
183 */ | 199 */ |
184 virtual void onComputeInvariantOutput(InvariantOutput* inout) const = 0; | 200 virtual void onComputeInvariantOutput(InvariantOutput* inout) const = 0; |
| 201 friend class GrGeometryProcessor; // to set fRequiresVertexShader and build
fVertexAttribTypes. |
185 | 202 |
| 203 SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms; |
186 SkSTArray<4, const GrTextureAccess*, true> fTextureAccesses; | 204 SkSTArray<4, const GrTextureAccess*, true> fTextureAccesses; |
187 bool fWillReadFragmentPosition; | 205 bool fWillReadFragmentPosition; |
188 | 206 |
189 typedef GrProgramElement INHERITED; | 207 typedef GrProgramElement INHERITED; |
190 }; | 208 }; |
191 | 209 |
192 class GrFragmentProcessor : public GrProcessor { | 210 class GrFragmentProcessor : public GrProcessor { |
193 public: | 211 public: |
194 GrFragmentProcessor() | 212 GrFragmentProcessor() |
195 : INHERITED() | 213 : INHERITED() |
196 , fWillReadDstColor(false) | 214 , fWillReadDstColor(false) |
197 , fWillUseInputColor(true) {} | 215 , fWillUseInputColor(true) {} |
198 | 216 |
199 virtual const GrBackendFragmentProcessorFactory& getFactory() const = 0; | 217 virtual const GrBackendFragmentProcessorFactory& getFactory() const = 0; |
200 | 218 |
201 int numTransforms() const { return fCoordTransforms.count(); } | |
202 | |
203 /** Returns the coordinate transformation at index. index must be valid acco
rding to | |
204 numTransforms(). */ | |
205 const GrCoordTransform& coordTransform(int index) const { return *fCoordTran
sforms[index]; } | |
206 | |
207 /** Will this effect read the destination pixel value? */ | 219 /** Will this effect read the destination pixel value? */ |
208 bool willReadDstColor() const { return fWillReadDstColor; } | 220 bool willReadDstColor() const { return fWillReadDstColor; } |
209 | 221 |
210 /** Will this effect read the source color value? */ | 222 /** Will this effect read the source color value? */ |
211 bool willUseInputColor() const { return fWillUseInputColor; } | 223 bool willUseInputColor() const { return fWillUseInputColor; } |
212 | 224 |
213 protected: | 225 protected: |
214 /** | 226 /** |
215 * Fragment Processor subclasses call this from their constructor to registe
r coordinate | |
216 * transformations. The processor subclass manages the lifetime of the trans
formations (this | |
217 * function only stores a pointer). The GrCoordTransform is typically a memb
er field of the | |
218 * GrProcessor subclass. When the matrix has perspective, the transformed co
ordinates will have | |
219 * 3 components. Otherwise they'll have 2. This must only be called from the
constructor because | |
220 * GrProcessors are immutable. | |
221 */ | |
222 void addCoordTransform(const GrCoordTransform*); | |
223 | |
224 /** | |
225 * If the effect subclass will read the destination pixel value then it must
call this function | 227 * If the effect subclass will read the destination pixel value then it must
call this function |
226 * from its constructor. Otherwise, when its generated backend-specific effe
ct class attempts | 228 * from its constructor. Otherwise, when its generated backend-specific effe
ct class attempts |
227 * to generate code that reads the destination pixel it will fail. | 229 * to generate code that reads the destination pixel it will fail. |
228 */ | 230 */ |
229 void setWillReadDstColor() { fWillReadDstColor = true; } | 231 void setWillReadDstColor() { fWillReadDstColor = true; } |
230 | 232 |
231 /** | 233 /** |
232 * If the effect will generate a result that does not depend on the input co
lor value then it | 234 * If the effect will generate a result that does not depend on the input co
lor value then it |
233 * must call this function from its constructor. Otherwise, when its generat
ed backend-specific | 235 * must call this function from its constructor. Otherwise, when its generat
ed backend-specific |
234 * code might fail during variable binding due to unused variables. | 236 * code might fail during variable binding due to unused variables. |
235 */ | 237 */ |
236 void setWillNotUseInputColor() { fWillUseInputColor = false; } | 238 void setWillNotUseInputColor() { fWillUseInputColor = false; } |
237 | 239 |
238 private: | 240 private: |
239 SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms; | |
240 bool fWillReadDstColor; | 241 bool fWillReadDstColor; |
241 bool fWillUseInputColor; | 242 bool fWillUseInputColor; |
242 | 243 |
243 typedef GrProcessor INHERITED; | 244 typedef GrProcessor INHERITED; |
244 }; | 245 }; |
245 | 246 |
246 /** | 247 /** |
247 * This creates an effect outside of the effect memory pool. The effect's destru
ctor will be called | 248 * This creates an effect outside of the effect memory pool. The effect's destru
ctor will be called |
248 * at global destruction time. NAME will be the name of the created GrProcessor. | 249 * at global destruction time. NAME will be the name of the created GrProcessor. |
249 */ | 250 */ |
250 #define GR_CREATE_STATIC_FRAGMENT_PROCESSOR(NAME, EFFECT_CLASS, ARGS)
\ | 251 #define GR_CREATE_STATIC_FRAGMENT_PROCESSOR(NAME, EFFECT_CLASS, ARGS)
\ |
251 static SkAlignedSStorage<sizeof(EFFECT_CLASS)> g_##NAME##_Storage;
\ | 252 static SkAlignedSStorage<sizeof(EFFECT_CLASS)> g_##NAME##_Storage;
\ |
252 static GrFragmentProcessor*
\ | 253 static GrFragmentProcessor*
\ |
253 NAME SkNEW_PLACEMENT_ARGS(g_##NAME##_Storage.get(), EFFECT_CLASS, ARGS);
\ | 254 NAME SkNEW_PLACEMENT_ARGS(g_##NAME##_Storage.get(), EFFECT_CLASS, ARGS);
\ |
254 static SkAutoTDestroy<GrFragmentProcessor> NAME##_ad(NAME); | 255 static SkAutoTDestroy<GrFragmentProcessor> NAME##_ad(NAME); |
255 | 256 |
256 #endif | 257 #endif |
OLD | NEW |