OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 GrDrawState_DEFINED | 8 #ifndef GrDrawState_DEFINED |
9 #define GrDrawState_DEFINED | 9 #define GrDrawState_DEFINED |
10 | 10 |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 uint8_t getCoverage() const { | 208 uint8_t getCoverage() const { |
209 return GrColorUnpackR(fCoverage); | 209 return GrColorUnpackR(fCoverage); |
210 } | 210 } |
211 | 211 |
212 GrColor getCoverageColor() const { | 212 GrColor getCoverageColor() const { |
213 return fCoverage; | 213 return fCoverage; |
214 } | 214 } |
215 | 215 |
216 /// @} | 216 /// @} |
217 | 217 |
| 218 /** |
| 219 * This struct is here so that the GrDrawState can have multiple instances o
f state information. |
| 220 * The use of this will come in a future revision when we want to keep track
of the original |
| 221 * draw state as well as an optimized version of it. |
| 222 */ |
| 223 struct State { |
| 224 State() { |
| 225 this->reset(); |
| 226 } |
| 227 |
| 228 State(const GrEffectStage* colorArray, int colorCount, |
| 229 const GrEffectStage* coverageArray, int coverageCount) |
| 230 : fColorStages(colorArray, colorCount), fCoverageStages(coverageArra
y, coverageCount) { |
| 231 fSrcBlend = kOne_GrBlendCoeff; |
| 232 fDstBlend = kZero_GrBlendCoeff; |
| 233 } |
| 234 |
| 235 static bool HaveCompatibleState(const State& a, const State& b, bool exp
licitLocalCoords); |
| 236 |
| 237 void reset() { |
| 238 fSrcBlend = kOne_GrBlendCoeff; |
| 239 fDstBlend = kZero_GrBlendCoeff; |
| 240 fColorStages.reset(); |
| 241 fCoverageStages.reset(); |
| 242 } |
| 243 |
| 244 GrBlendCoeff fSrcBlend; |
| 245 GrBlendCoeff fDstBlend; |
| 246 |
| 247 typedef SkSTArray<4, GrEffectStage> EffectStageArray; |
| 248 EffectStageArray fColorStages; |
| 249 EffectStageArray fCoverageStages; |
| 250 }; |
| 251 |
218 /////////////////////////////////////////////////////////////////////////// | 252 /////////////////////////////////////////////////////////////////////////// |
219 /// @name Effect Stages | 253 /// @name Effect Stages |
220 /// Each stage hosts a GrEffect. The effect produces an output color or cove
rage in the fragment | 254 /// Each stage hosts a GrEffect. The effect produces an output color or cove
rage in the fragment |
221 /// shader. Its inputs are the output from the previous stage as well as som
e variables | 255 /// shader. Its inputs are the output from the previous stage as well as som
e variables |
222 /// available to it in the fragment and vertex shader (e.g. the vertex posit
ion, the dst color, | 256 /// available to it in the fragment and vertex shader (e.g. the vertex posit
ion, the dst color, |
223 /// the fragment position, local coordinates). | 257 /// the fragment position, local coordinates). |
224 /// | 258 /// |
225 /// The stages are divided into two sets, color-computing and coverage-compu
ting. The final | 259 /// The stages are divided into two sets, color-computing and coverage-compu
ting. The final |
226 /// color stage produces the final pixel color. The coverage-computing stage
s function exactly | 260 /// color stage produces the final pixel color. The coverage-computing stage
s function exactly |
227 /// as the color-computing but the output of the final coverage stage is tre
ated as a fractional | 261 /// as the color-computing but the output of the final coverage stage is tre
ated as a fractional |
228 /// pixel coverage rather than as input to the src/dst color blend step. | 262 /// pixel coverage rather than as input to the src/dst color blend step. |
229 /// | 263 /// |
230 /// The input color to the first color-stage is either the constant color or
interpolated | 264 /// The input color to the first color-stage is either the constant color or
interpolated |
231 /// per-vertex colors. The input to the first coverage stage is either a con
stant coverage | 265 /// per-vertex colors. The input to the first coverage stage is either a con
stant coverage |
232 /// (usually full-coverage) or interpolated per-vertex coverage. | 266 /// (usually full-coverage) or interpolated per-vertex coverage. |
233 /// | 267 /// |
234 /// See the documentation of kCoverageDrawing_StateBit for information about
disabling the | 268 /// See the documentation of kCoverageDrawing_StateBit for information about
disabling the |
235 /// the color / coverage distinction. | 269 /// the color / coverage distinction. |
236 //// | 270 //// |
237 | 271 |
238 const GrEffect* addColorEffect(const GrEffect* effect, int attr0 = -1, int a
ttr1 = -1) { | 272 const GrEffect* addColorEffect(const GrEffect* effect, int attr0 = -1, int a
ttr1 = -1) { |
239 SkASSERT(NULL != effect); | 273 SkASSERT(NULL != effect); |
240 SkNEW_APPEND_TO_TARRAY(&fColorStages, GrEffectStage, (effect, attr0, att
r1)); | 274 SkNEW_APPEND_TO_TARRAY(&fState.fColorStages, GrEffectStage, (effect, att
r0, attr1)); |
241 this->invalidateBlendOptFlags(); | 275 this->invalidateBlendOptFlags(); |
242 return effect; | 276 return effect; |
243 } | 277 } |
244 | 278 |
245 const GrEffect* addCoverageEffect(const GrEffect* effect, int attr0 = -1, in
t attr1 = -1) { | 279 const GrEffect* addCoverageEffect(const GrEffect* effect, int attr0 = -1, in
t attr1 = -1) { |
246 SkASSERT(NULL != effect); | 280 SkASSERT(NULL != effect); |
247 SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrEffectStage, (effect, attr0,
attr1)); | 281 SkNEW_APPEND_TO_TARRAY(&fState.fCoverageStages, GrEffectStage, (effect,
attr0, attr1)); |
248 this->invalidateBlendOptFlags(); | 282 this->invalidateBlendOptFlags(); |
249 return effect; | 283 return effect; |
250 } | 284 } |
251 | 285 |
252 /** | 286 /** |
253 * Creates a GrSimpleTextureEffect that uses local coords as texture coordin
ates. | 287 * Creates a GrSimpleTextureEffect that uses local coords as texture coordin
ates. |
254 */ | 288 */ |
255 void addColorTextureEffect(GrTexture* texture, const SkMatrix& matrix) { | 289 void addColorTextureEffect(GrTexture* texture, const SkMatrix& matrix) { |
256 this->addColorEffect(GrSimpleTextureEffect::Create(texture, matrix))->un
ref(); | 290 this->addColorEffect(GrSimpleTextureEffect::Create(texture, matrix))->un
ref(); |
257 } | 291 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 void set(GrDrawState* ds); | 323 void set(GrDrawState* ds); |
290 | 324 |
291 bool isSet() const { return NULL != fDrawState; } | 325 bool isSet() const { return NULL != fDrawState; } |
292 | 326 |
293 private: | 327 private: |
294 GrDrawState* fDrawState; | 328 GrDrawState* fDrawState; |
295 int fColorEffectCnt; | 329 int fColorEffectCnt; |
296 int fCoverageEffectCnt; | 330 int fCoverageEffectCnt; |
297 }; | 331 }; |
298 | 332 |
299 int numColorStages() const { return fColorStages.count(); } | 333 int numColorStages() const { return fState.fColorStages.count(); } |
300 int numCoverageStages() const { return fCoverageStages.count(); } | 334 int numCoverageStages() const { return fState.fCoverageStages.count(); } |
301 int numTotalStages() const { return this->numColorStages() + this->numCovera
geStages(); } | 335 int numTotalStages() const { return this->numColorStages() + this->numCovera
geStages(); } |
302 | 336 |
303 const GrEffectStage& getColorStage(int stageIdx) const { return fColorStages
[stageIdx]; } | 337 const GrEffectStage& getColorStage(int stageIdx) const { return fState.fColo
rStages[stageIdx]; } |
304 const GrEffectStage& getCoverageStage(int stageIdx) const { return fCoverage
Stages[stageIdx]; } | 338 const GrEffectStage& getCoverageStage(int stageIdx) const { return fState.fC
overageStages[stageIdx]; } |
305 | 339 |
306 /** | 340 /** |
307 * Checks whether any of the effects will read the dst pixel color. | 341 * Checks whether any of the effects will read the dst pixel color. |
308 */ | 342 */ |
309 bool willEffectReadDstColor() const; | 343 bool willEffectReadDstColor() const; |
310 | 344 |
311 /// @} | 345 /// @} |
312 | 346 |
313 /////////////////////////////////////////////////////////////////////////// | 347 /////////////////////////////////////////////////////////////////////////// |
314 /// @name Blending | 348 /// @name Blending |
315 //// | 349 //// |
316 | 350 |
317 /** | 351 /** |
318 * Sets the blending function coefficients. | 352 * Sets the blending function coefficients. |
319 * | 353 * |
320 * The blend function will be: | 354 * The blend function will be: |
321 * D' = sat(S*srcCoef + D*dstCoef) | 355 * D' = sat(S*srcCoef + D*dstCoef) |
322 * | 356 * |
323 * where D is the existing destination color, S is the incoming source | 357 * where D is the existing destination color, S is the incoming source |
324 * color, and D' is the new destination color that will be written. sat() | 358 * color, and D' is the new destination color that will be written. sat() |
325 * is the saturation function. | 359 * is the saturation function. |
326 * | 360 * |
327 * @param srcCoef coefficient applied to the src color. | 361 * @param srcCoef coefficient applied to the src color. |
328 * @param dstCoef coefficient applied to the dst color. | 362 * @param dstCoef coefficient applied to the dst color. |
329 */ | 363 */ |
330 void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) { | 364 void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) { |
331 fSrcBlend = srcCoeff; | 365 fState.fSrcBlend = srcCoeff; |
332 fDstBlend = dstCoeff; | 366 fState.fDstBlend = dstCoeff; |
333 this->invalidateBlendOptFlags(); | 367 this->invalidateBlendOptFlags(); |
334 #ifdef SK_DEBUG | 368 #ifdef SK_DEBUG |
335 if (GrBlendCoeffRefsDst(dstCoeff)) { | 369 if (GrBlendCoeffRefsDst(dstCoeff)) { |
336 GrPrintf("Unexpected dst blend coeff. Won't work correctly with cove
rage stages.\n"); | 370 GrPrintf("Unexpected dst blend coeff. Won't work correctly with cove
rage stages.\n"); |
337 } | 371 } |
338 if (GrBlendCoeffRefsSrc(srcCoeff)) { | 372 if (GrBlendCoeffRefsSrc(srcCoeff)) { |
339 GrPrintf("Unexpected src blend coeff. Won't work correctly with cove
rage stages.\n"); | 373 GrPrintf("Unexpected src blend coeff. Won't work correctly with cove
rage stages.\n"); |
340 } | 374 } |
341 #endif | 375 #endif |
342 } | 376 } |
343 | 377 |
344 GrBlendCoeff getSrcBlendCoeff() const { return fSrcBlend; } | 378 GrBlendCoeff getSrcBlendCoeff() const { return fState.fSrcBlend; } |
345 GrBlendCoeff getDstBlendCoeff() const { return fDstBlend; } | 379 GrBlendCoeff getDstBlendCoeff() const { return fState.fDstBlend; } |
346 | 380 |
347 void getDstBlendCoeff(GrBlendCoeff* srcBlendCoeff, | 381 void getDstBlendCoeff(GrBlendCoeff* srcBlendCoeff, |
348 GrBlendCoeff* dstBlendCoeff) const { | 382 GrBlendCoeff* dstBlendCoeff) const { |
349 *srcBlendCoeff = fSrcBlend; | 383 *srcBlendCoeff = fState.fSrcBlend; |
350 *dstBlendCoeff = fDstBlend; | 384 *dstBlendCoeff = fState.fDstBlend; |
351 } | 385 } |
352 | 386 |
353 /** | 387 /** |
354 * Sets the blending function constant referenced by the following blending | 388 * Sets the blending function constant referenced by the following blending |
355 * coefficients: | 389 * coefficients: |
356 * kConstC_GrBlendCoeff | 390 * kConstC_GrBlendCoeff |
357 * kIConstC_GrBlendCoeff | 391 * kIConstC_GrBlendCoeff |
358 * kConstA_GrBlendCoeff | 392 * kConstA_GrBlendCoeff |
359 * kIConstA_GrBlendCoeff | 393 * kIConstA_GrBlendCoeff |
360 * | 394 * |
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
760 | 794 |
761 /** This function determines whether the GrDrawStates used for two draws can
be combined into | 795 /** This function determines whether the GrDrawStates used for two draws can
be combined into |
762 a single GrDrawState. This is used to avoid storing redundant GrDrawStat
es and to determine | 796 a single GrDrawState. This is used to avoid storing redundant GrDrawStat
es and to determine |
763 if draws can be batched. The return value indicates whether combining is
possible and, if | 797 if draws can be batched. The return value indicates whether combining is
possible and, if |
764 so, which of the two inputs should be used. */ | 798 so, which of the two inputs should be used. */ |
765 static CombinedState CombineIfPossible(const GrDrawState& a, const GrDrawSta
te& b); | 799 static CombinedState CombineIfPossible(const GrDrawState& a, const GrDrawSta
te& b); |
766 | 800 |
767 GrDrawState& operator= (const GrDrawState& that); | 801 GrDrawState& operator= (const GrDrawState& that); |
768 | 802 |
769 private: | 803 private: |
770 | |
771 void onReset(const SkMatrix* initialViewMatrix); | 804 void onReset(const SkMatrix* initialViewMatrix); |
772 | 805 |
773 BlendOptFlags calcBlendOpts(bool forceCoverage = false, | 806 BlendOptFlags calcBlendOpts(bool forceCoverage = false, |
774 GrBlendCoeff* srcCoeff = NULL, | 807 GrBlendCoeff* srcCoeff = NULL, |
775 GrBlendCoeff* dstCoeff = NULL) const; | 808 GrBlendCoeff* dstCoeff = NULL) const; |
776 | 809 |
777 // These fields are roughly sorted by decreasing likelihood of being differe
nt in op== | 810 // These fields are roughly sorted by decreasing likelihood of being differe
nt in op== |
778 SkAutoTUnref<GrRenderTarget> fRenderTarget; | 811 SkAutoTUnref<GrRenderTarget> fRenderTarget; |
779 GrColor fColor; | 812 GrColor fColor; |
780 SkMatrix fViewMatrix; | 813 SkMatrix fViewMatrix; |
781 GrBlendCoeff fSrcBlend; | |
782 GrBlendCoeff fDstBlend; | |
783 GrColor fBlendConstant; | 814 GrColor fBlendConstant; |
784 uint32_t fFlagBits; | 815 uint32_t fFlagBits; |
785 const GrVertexAttrib* fVAPtr; | 816 const GrVertexAttrib* fVAPtr; |
786 int fVACount; | 817 int fVACount; |
787 GrStencilSettings fStencilSettings; | 818 GrStencilSettings fStencilSettings; |
788 GrColor fCoverage; | 819 GrColor fCoverage; |
789 DrawFace fDrawFace; | 820 DrawFace fDrawFace; |
790 | 821 |
791 typedef SkSTArray<4, GrEffectStage> EffectStageArray; | 822 State fState; |
792 EffectStageArray fColorStages; | |
793 EffectStageArray fCoverageStages; | |
794 | 823 |
795 mutable GrBlendCoeff fOptSrcBlend; | 824 mutable GrBlendCoeff fOptSrcBlend; |
796 mutable GrBlendCoeff fOptDstBlend; | 825 mutable GrBlendCoeff fOptDstBlend; |
797 mutable BlendOptFlags fBlendOptFlags; | 826 mutable BlendOptFlags fBlendOptFlags; |
798 | 827 |
799 // This is simply a different representation of info in fVertexAttribs and t
hus does | 828 // This is simply a different representation of info in fVertexAttribs and t
hus does |
800 // not need to be compared in op==. | 829 // not need to be compared in op==. |
801 int fFixedFunctionVertexAttribIndices[kGrFixedFunctionVertexAttribBindingCnt
]; | 830 int fFixedFunctionVertexAttribIndices[kGrFixedFunctionVertexAttribBindingCnt
]; |
802 | 831 |
803 // Some of the auto restore objects assume that no effects are removed durin
g their lifetime. | 832 // Some of the auto restore objects assume that no effects are removed durin
g their lifetime. |
804 // This is used to assert that this condition holds. | 833 // This is used to assert that this condition holds. |
805 SkDEBUGCODE(int fBlockEffectRemovalCnt;) | 834 SkDEBUGCODE(int fBlockEffectRemovalCnt;) |
806 | 835 |
807 /** | 836 /** |
808 * Sets vertex attributes for next draw. | 837 * Sets vertex attributes for next draw. |
809 * | 838 * |
810 * @param attribs the array of vertex attributes to set. | 839 * @param attribs the array of vertex attributes to set. |
811 * @param count the number of attributes being set, limited to kMaxVer
texAttribCnt. | 840 * @param count the number of attributes being set, limited to kMaxVer
texAttribCnt. |
812 */ | 841 */ |
813 void setVertexAttribs(const GrVertexAttrib attribs[], int count); | 842 void setVertexAttribs(const GrVertexAttrib attribs[], int count); |
814 | 843 |
815 typedef SkRefCnt INHERITED; | 844 typedef SkRefCnt INHERITED; |
816 }; | 845 }; |
817 | 846 |
818 GR_MAKE_BITFIELD_OPS(GrDrawState::BlendOptFlags); | 847 GR_MAKE_BITFIELD_OPS(GrDrawState::BlendOptFlags); |
819 | 848 |
820 #endif | 849 #endif |
OLD | NEW |