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 #include "GrDrawState.h" | 8 #include "GrDrawState.h" |
9 | 9 |
10 #include "GrBlend.h" | 10 #include "GrBlend.h" |
11 #include "GrOptDrawState.h" | 11 #include "GrOptDrawState.h" |
12 #include "GrPaint.h" | 12 #include "GrPaint.h" |
13 #include "GrProcOptInfo.h" | 13 #include "GrProcOptInfo.h" |
14 #include "GrXferProcessor.h" | 14 #include "GrXferProcessor.h" |
15 #include "effects/GrPorterDuffXferProcessor.h" | 15 #include "effects/GrPorterDuffXferProcessor.h" |
16 | 16 |
17 /////////////////////////////////////////////////////////////////////////////// | 17 /////////////////////////////////////////////////////////////////////////////// |
18 | 18 |
19 bool GrDrawState::isEqual(const GrDrawState& that) const { | 19 bool GrDrawState::isEqual(const GrDrawState& that) const { |
20 bool usingVertexColors = this->hasColorVertexAttribute(); | |
21 if (!usingVertexColors && this->fColor != that.fColor) { | |
22 return false; | |
23 } | |
24 | |
25 if (this->getRenderTarget() != that.getRenderTarget() || | 20 if (this->getRenderTarget() != that.getRenderTarget() || |
26 this->fColorStages.count() != that.fColorStages.count() || | 21 this->fColorStages.count() != that.fColorStages.count() || |
27 this->fCoverageStages.count() != that.fCoverageStages.count() || | 22 this->fCoverageStages.count() != that.fCoverageStages.count() || |
28 !this->fViewMatrix.cheapEqualTo(that.fViewMatrix) || | 23 !this->fViewMatrix.cheapEqualTo(that.fViewMatrix) || |
29 this->fSrcBlend != that.fSrcBlend || | 24 this->fSrcBlend != that.fSrcBlend || |
30 this->fDstBlend != that.fDstBlend || | 25 this->fDstBlend != that.fDstBlend || |
31 this->fBlendConstant != that.fBlendConstant || | 26 this->fBlendConstant != that.fBlendConstant || |
32 this->fFlagBits != that.fFlagBits || | 27 this->fFlagBits != that.fFlagBits || |
33 this->fStencilSettings != that.fStencilSettings || | 28 this->fStencilSettings != that.fStencilSettings || |
34 this->fDrawFace != that.fDrawFace) { | 29 this->fDrawFace != that.fDrawFace) { |
35 return false; | 30 return false; |
36 } | 31 } |
37 | 32 |
38 bool usingVertexCoverage = this->hasCoverageVertexAttribute(); | |
39 if (!usingVertexCoverage && this->fCoverage != that.fCoverage) { | |
40 return false; | |
41 } | |
42 | |
43 bool explicitLocalCoords = this->hasLocalCoordAttribute(); | 33 bool explicitLocalCoords = this->hasLocalCoordAttribute(); |
44 if (this->hasGeometryProcessor()) { | 34 if (this->hasGeometryProcessor()) { |
45 if (!that.hasGeometryProcessor()) { | 35 if (!that.hasGeometryProcessor()) { |
46 return false; | 36 return false; |
47 } else if (!this->getGeometryProcessor()->isEqual(*that.getGeometryProce
ssor())) { | 37 } else if (!this->getGeometryProcessor()->isEqual(*that.getGeometryProce
ssor())) { |
48 return false; | 38 return false; |
49 } | 39 } |
50 } else if (that.hasGeometryProcessor()) { | 40 } else if (that.hasGeometryProcessor()) { |
51 return false; | 41 return false; |
52 } | 42 } |
(...skipping 24 matching lines...) Expand all Loading... |
77 fColorStages[i].localCoordChange(preConcatMatrix); | 67 fColorStages[i].localCoordChange(preConcatMatrix); |
78 } | 68 } |
79 for (int i = 0; i < this->numCoverageStages(); ++i) { | 69 for (int i = 0; i < this->numCoverageStages(); ++i) { |
80 fCoverageStages[i].localCoordChange(preConcatMatrix); | 70 fCoverageStages[i].localCoordChange(preConcatMatrix); |
81 } | 71 } |
82 } | 72 } |
83 } | 73 } |
84 | 74 |
85 GrDrawState& GrDrawState::operator=(const GrDrawState& that) { | 75 GrDrawState& GrDrawState::operator=(const GrDrawState& that) { |
86 fRenderTarget.reset(SkSafeRef(that.fRenderTarget.get())); | 76 fRenderTarget.reset(SkSafeRef(that.fRenderTarget.get())); |
87 fColor = that.fColor; | |
88 fViewMatrix = that.fViewMatrix; | 77 fViewMatrix = that.fViewMatrix; |
89 fSrcBlend = that.fSrcBlend; | 78 fSrcBlend = that.fSrcBlend; |
90 fDstBlend = that.fDstBlend; | 79 fDstBlend = that.fDstBlend; |
91 fBlendConstant = that.fBlendConstant; | 80 fBlendConstant = that.fBlendConstant; |
92 fFlagBits = that.fFlagBits; | 81 fFlagBits = that.fFlagBits; |
93 fStencilSettings = that.fStencilSettings; | 82 fStencilSettings = that.fStencilSettings; |
94 fCoverage = that.fCoverage; | |
95 fDrawFace = that.fDrawFace; | 83 fDrawFace = that.fDrawFace; |
96 fGeometryProcessor.reset(SkSafeRef(that.fGeometryProcessor.get())); | 84 fGeometryProcessor.reset(SkSafeRef(that.fGeometryProcessor.get())); |
97 fXPFactory.reset(SkRef(that.getXPFactory())); | 85 fXPFactory.reset(SkRef(that.getXPFactory())); |
98 fColorStages = that.fColorStages; | 86 fColorStages = that.fColorStages; |
99 fCoverageStages = that.fCoverageStages; | 87 fCoverageStages = that.fCoverageStages; |
100 | 88 |
101 fHints = that.fHints; | 89 fHints = that.fHints; |
102 | 90 |
103 fColorProcInfoValid = that.fColorProcInfoValid; | 91 fColorProcInfoValid = that.fColorProcInfoValid; |
104 fCoverageProcInfoValid = that.fCoverageProcInfoValid; | 92 fCoverageProcInfoValid = that.fCoverageProcInfoValid; |
105 if (fColorProcInfoValid) { | 93 if (fColorProcInfoValid) { |
106 fColorProcInfo = that.fColorProcInfo; | 94 fColorProcInfo = that.fColorProcInfo; |
107 } | 95 } |
108 if (fCoverageProcInfoValid) { | 96 if (fCoverageProcInfoValid) { |
109 fCoverageProcInfo = that.fCoverageProcInfo; | 97 fCoverageProcInfo = that.fCoverageProcInfo; |
110 } | 98 } |
111 return *this; | 99 return *this; |
112 } | 100 } |
113 | 101 |
114 void GrDrawState::onReset(const SkMatrix* initialViewMatrix) { | 102 void GrDrawState::onReset(const SkMatrix* initialViewMatrix) { |
115 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); | 103 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); |
116 fRenderTarget.reset(NULL); | 104 fRenderTarget.reset(NULL); |
117 | 105 |
118 fGeometryProcessor.reset(NULL); | 106 fGeometryProcessor.reset(NULL); |
119 fXPFactory.reset(GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode)); | 107 fXPFactory.reset(GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode)); |
120 fColorStages.reset(); | 108 fColorStages.reset(); |
121 fCoverageStages.reset(); | 109 fCoverageStages.reset(); |
122 | 110 |
123 fColor = 0xffffffff; | |
124 if (NULL == initialViewMatrix) { | 111 if (NULL == initialViewMatrix) { |
125 fViewMatrix.reset(); | 112 fViewMatrix.reset(); |
126 } else { | 113 } else { |
127 fViewMatrix = *initialViewMatrix; | 114 fViewMatrix = *initialViewMatrix; |
128 } | 115 } |
129 fSrcBlend = kOne_GrBlendCoeff; | 116 fSrcBlend = kOne_GrBlendCoeff; |
130 fDstBlend = kZero_GrBlendCoeff; | 117 fDstBlend = kZero_GrBlendCoeff; |
131 fBlendConstant = 0x0; | 118 fBlendConstant = 0x0; |
132 fFlagBits = 0x0; | 119 fFlagBits = 0x0; |
133 fStencilSettings.setDisabled(); | 120 fStencilSettings.setDisabled(); |
134 fCoverage = 0xff; | |
135 fDrawFace = kBoth_DrawFace; | 121 fDrawFace = kBoth_DrawFace; |
136 | 122 |
137 fHints = 0; | 123 fHints = 0; |
138 | 124 |
139 fColorProcInfoValid = false; | 125 fColorProcInfoValid = false; |
140 fCoverageProcInfoValid = false; | 126 fCoverageProcInfoValid = false; |
141 } | 127 } |
142 | 128 |
143 bool GrDrawState::setIdentityViewMatrix() { | 129 bool GrDrawState::setIdentityViewMatrix() { |
144 if (this->numFragmentStages()) { | 130 if (this->numFragmentStages()) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 // These have no equivalent in GrPaint, set them to defaults | 169 // These have no equivalent in GrPaint, set them to defaults |
184 fBlendConstant = 0x0; | 170 fBlendConstant = 0x0; |
185 fDrawFace = kBoth_DrawFace; | 171 fDrawFace = kBoth_DrawFace; |
186 fStencilSettings.setDisabled(); | 172 fStencilSettings.setDisabled(); |
187 fFlagBits = 0; | 173 fFlagBits = 0; |
188 fHints = 0; | 174 fHints = 0; |
189 | 175 |
190 // Enable the clip bit | 176 // Enable the clip bit |
191 this->enableState(GrDrawState::kClip_StateBit); | 177 this->enableState(GrDrawState::kClip_StateBit); |
192 | 178 |
193 this->setColor(paint.getColor()); | |
194 this->setState(GrDrawState::kDither_StateBit, paint.isDither()); | 179 this->setState(GrDrawState::kDither_StateBit, paint.isDither()); |
195 this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias()); | 180 this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias()); |
196 | 181 |
197 this->setCoverage(0xFF); | |
198 fColorProcInfoValid = false; | 182 fColorProcInfoValid = false; |
199 fCoverageProcInfoValid = false; | 183 fCoverageProcInfoValid = false; |
200 } | 184 } |
201 | 185 |
202 //////////////////////////////////////////////////////////////////////////////// | 186 //////////////////////////////////////////////////////////////////////////////// |
203 | 187 |
204 bool GrDrawState::couldApplyCoverage(const GrDrawTargetCaps& caps) const { | 188 bool GrDrawState::couldApplyCoverage(GrColor color, GrColor coverage, |
| 189 const GrDrawTargetCaps& caps) const { |
205 if (caps.dualSourceBlendingSupport()) { | 190 if (caps.dualSourceBlendingSupport()) { |
206 return true; | 191 return true; |
207 } | 192 } |
208 // we can correctly apply coverage if a) we have dual source blending | 193 // we can correctly apply coverage if a) we have dual source blending |
209 // or b) one of our blend optimizations applies | 194 // or b) one of our blend optimizations applies |
210 // or c) the src, dst blend coeffs are 1,0 and we will read Dst Color | 195 // or c) the src, dst blend coeffs are 1,0 and we will read Dst Color |
211 GrBlendCoeff srcCoeff; | 196 GrBlendCoeff srcCoeff; |
212 GrBlendCoeff dstCoeff; | 197 GrBlendCoeff dstCoeff; |
213 BlendOpt opt = this->getBlendOpt(true, &srcCoeff, &dstCoeff); | 198 BlendOpt opt = this->getBlendOpt(color, coverage, true, &srcCoeff, &dstCoeff
); |
214 return GrDrawState::kNone_BlendOpt != opt || | 199 return GrDrawState::kNone_BlendOpt != opt || |
215 (this->willEffectReadDstColor() && | 200 (this->willEffectReadDstColor(color, coverage) && |
216 kOne_GrBlendCoeff == srcCoeff && kZero_GrBlendCoeff == dstCoeff); | 201 kOne_GrBlendCoeff == srcCoeff && kZero_GrBlendCoeff == dstCoeff); |
217 } | 202 } |
218 | 203 |
219 bool GrDrawState::hasSolidCoverage() const { | 204 bool GrDrawState::hasSolidCoverage(GrColor coverage) const { |
220 // If we're drawing coverage directly then coverage is effectively treated a
s color. | 205 // If we're drawing coverage directly then coverage is effectively treated a
s color. |
221 if (this->isCoverageDrawing()) { | 206 if (this->isCoverageDrawing()) { |
222 return true; | 207 return true; |
223 } | 208 } |
224 | 209 |
225 if (this->numCoverageStages() > 0) { | 210 if (this->numCoverageStages() > 0) { |
226 return false; | 211 return false; |
227 } | 212 } |
228 | 213 |
229 this->calcCoverageInvariantOutput(); | 214 this->calcCoverageInvariantOutput(coverage); |
230 return fCoverageProcInfo.isSolidWhite(); | 215 return fCoverageProcInfo.isSolidWhite(); |
231 } | 216 } |
232 | 217 |
233 //////////////////////////////////////////////////////////////////////////////s | 218 //////////////////////////////////////////////////////////////////////////////s |
234 | 219 |
235 bool GrDrawState::willEffectReadDstColor() const { | 220 bool GrDrawState::willEffectReadDstColor(GrColor color, GrColor coverage) const
{ |
236 if (!this->isColorWriteDisabled()) { | 221 if (!this->isColorWriteDisabled()) { |
237 this->calcColorInvariantOutput(); | 222 this->calcColorInvariantOutput(color); |
238 if (fColorProcInfo.readsDst()) { | 223 if (fColorProcInfo.readsDst()) { |
239 return true; | 224 return true; |
240 } | 225 } |
241 } | 226 } |
242 this->calcCoverageInvariantOutput(); | 227 this->calcCoverageInvariantOutput(coverage); |
243 return fCoverageProcInfo.readsDst(); | 228 return fCoverageProcInfo.readsDst(); |
244 } | 229 } |
245 | 230 |
246 void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) { | 231 void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) { |
247 if (fDrawState) { | 232 if (fDrawState) { |
248 // See the big comment on the class definition about GPs. | 233 // See the big comment on the class definition about GPs. |
249 if (SK_InvalidUniqueID == fOriginalGPID) { | 234 if (SK_InvalidUniqueID == fOriginalGPID) { |
250 fDrawState->fGeometryProcessor.reset(NULL); | 235 fDrawState->fGeometryProcessor.reset(NULL); |
251 } else { | 236 } else { |
252 SkASSERT(fDrawState->getGeometryProcessor()->getUniqueID() == | 237 SkASSERT(fDrawState->getGeometryProcessor()->getUniqueID() == |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 } | 374 } |
390 | 375 |
391 //////////////////////////////////////////////////////////////////////////////// | 376 //////////////////////////////////////////////////////////////////////////////// |
392 | 377 |
393 GrDrawState::~GrDrawState() { | 378 GrDrawState::~GrDrawState() { |
394 SkASSERT(0 == fBlockEffectRemovalCnt); | 379 SkASSERT(0 == fBlockEffectRemovalCnt); |
395 } | 380 } |
396 | 381 |
397 //////////////////////////////////////////////////////////////////////////////// | 382 //////////////////////////////////////////////////////////////////////////////// |
398 | 383 |
399 GrDrawState::BlendOpt GrDrawState::getBlendOpt(bool forceCoverage, | 384 GrDrawState::BlendOpt GrDrawState::getBlendOpt(GrColor color, |
| 385 GrColor coverage, |
| 386 bool forceCoverage, |
400 GrBlendCoeff* srcCoeff, | 387 GrBlendCoeff* srcCoeff, |
401 GrBlendCoeff* dstCoeff) const { | 388 GrBlendCoeff* dstCoeff) const { |
402 GrBlendCoeff bogusSrcCoeff, bogusDstCoeff; | 389 GrBlendCoeff bogusSrcCoeff, bogusDstCoeff; |
403 if (NULL == srcCoeff) { | 390 if (NULL == srcCoeff) { |
404 srcCoeff = &bogusSrcCoeff; | 391 srcCoeff = &bogusSrcCoeff; |
405 } | 392 } |
406 if (NULL == dstCoeff) { | 393 if (NULL == dstCoeff) { |
407 dstCoeff = &bogusDstCoeff; | 394 dstCoeff = &bogusDstCoeff; |
408 } | 395 } |
409 | 396 |
410 *srcCoeff = this->getSrcBlendCoeff(); | 397 *srcCoeff = this->getSrcBlendCoeff(); |
411 *dstCoeff = this->getDstBlendCoeff(); | 398 *dstCoeff = this->getDstBlendCoeff(); |
412 | 399 |
413 if (this->isColorWriteDisabled()) { | 400 if (this->isColorWriteDisabled()) { |
414 *srcCoeff = kZero_GrBlendCoeff; | 401 *srcCoeff = kZero_GrBlendCoeff; |
415 *dstCoeff = kOne_GrBlendCoeff; | 402 *dstCoeff = kOne_GrBlendCoeff; |
416 } | 403 } |
417 | 404 |
418 bool srcAIsOne = this->srcAlphaWillBeOne(); | 405 bool srcAIsOne = this->srcAlphaWillBeOne(color, coverage); |
419 bool dstCoeffIsOne = kOne_GrBlendCoeff == *dstCoeff || | 406 bool dstCoeffIsOne = kOne_GrBlendCoeff == *dstCoeff || |
420 (kSA_GrBlendCoeff == *dstCoeff && srcAIsOne); | 407 (kSA_GrBlendCoeff == *dstCoeff && srcAIsOne); |
421 bool dstCoeffIsZero = kZero_GrBlendCoeff == *dstCoeff || | 408 bool dstCoeffIsZero = kZero_GrBlendCoeff == *dstCoeff || |
422 (kISA_GrBlendCoeff == *dstCoeff && srcAIsOne); | 409 (kISA_GrBlendCoeff == *dstCoeff && srcAIsOne); |
423 | 410 |
424 // When coeffs are (0,1) there is no reason to draw at all, unless | 411 // When coeffs are (0,1) there is no reason to draw at all, unless |
425 // stenciling is enabled. Having color writes disabled is effectively | 412 // stenciling is enabled. Having color writes disabled is effectively |
426 // (0,1). | 413 // (0,1). |
427 if ((kZero_GrBlendCoeff == *srcCoeff && dstCoeffIsOne)) { | 414 if ((kZero_GrBlendCoeff == *srcCoeff && dstCoeffIsOne)) { |
428 if (this->getStencil().doesWrite()) { | 415 if (this->getStencil().doesWrite()) { |
429 return kEmitCoverage_BlendOpt; | 416 return kEmitCoverage_BlendOpt; |
430 } else { | 417 } else { |
431 *dstCoeff = kOne_GrBlendCoeff; | 418 *dstCoeff = kOne_GrBlendCoeff; |
432 return kSkipDraw_BlendOpt; | 419 return kSkipDraw_BlendOpt; |
433 } | 420 } |
434 } | 421 } |
435 | 422 |
436 bool hasCoverage = forceCoverage || !this->hasSolidCoverage(); | 423 bool hasCoverage = forceCoverage || !this->hasSolidCoverage(coverage); |
437 | 424 |
438 // if we don't have coverage we can check whether the dst | 425 // if we don't have coverage we can check whether the dst |
439 // has to read at all. If not, we'll disable blending. | 426 // has to read at all. If not, we'll disable blending. |
440 if (!hasCoverage) { | 427 if (!hasCoverage) { |
441 if (dstCoeffIsZero) { | 428 if (dstCoeffIsZero) { |
442 if (kOne_GrBlendCoeff == *srcCoeff) { | 429 if (kOne_GrBlendCoeff == *srcCoeff) { |
443 // if there is no coverage and coeffs are (1,0) then we | 430 // if there is no coverage and coeffs are (1,0) then we |
444 // won't need to read the dst at all, it gets replaced by src | 431 // won't need to read the dst at all, it gets replaced by src |
445 *dstCoeff = kZero_GrBlendCoeff; | 432 *dstCoeff = kZero_GrBlendCoeff; |
446 return kNone_BlendOpt; | 433 return kNone_BlendOpt; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 // the dst coeff is effectively one so blend works out to: | 467 // the dst coeff is effectively one so blend works out to: |
481 // cS + (c)(1)D + (1-c)D = cS + D. | 468 // cS + (c)(1)D + (1-c)D = cS + D. |
482 *dstCoeff = kOne_GrBlendCoeff; | 469 *dstCoeff = kOne_GrBlendCoeff; |
483 return kCoverageAsAlpha_BlendOpt; | 470 return kCoverageAsAlpha_BlendOpt; |
484 } | 471 } |
485 } | 472 } |
486 | 473 |
487 return kNone_BlendOpt; | 474 return kNone_BlendOpt; |
488 } | 475 } |
489 | 476 |
490 bool GrDrawState::srcAlphaWillBeOne() const { | 477 bool GrDrawState::srcAlphaWillBeOne(GrColor color, GrColor coverage) const { |
491 this->calcColorInvariantOutput(); | 478 this->calcColorInvariantOutput(color); |
492 if (this->isCoverageDrawing()) { | 479 if (this->isCoverageDrawing()) { |
493 this->calcCoverageInvariantOutput(); | 480 this->calcCoverageInvariantOutput(coverage); |
494 return (fColorProcInfo.isOpaque() && fCoverageProcInfo.isOpaque()); | 481 return (fColorProcInfo.isOpaque() && fCoverageProcInfo.isOpaque()); |
495 } | 482 } |
496 return fColorProcInfo.isOpaque(); | 483 return fColorProcInfo.isOpaque(); |
497 } | 484 } |
498 | 485 |
499 bool GrDrawState::willBlendWithDst() const { | 486 bool GrDrawState::willBlendWithDst(GrColor color, GrColor coverage) const { |
500 if (!this->hasSolidCoverage()) { | 487 if (!this->hasSolidCoverage(coverage)) { |
501 return true; | 488 return true; |
502 } | 489 } |
503 | 490 |
504 if (this->willEffectReadDstColor()) { | 491 if (this->willEffectReadDstColor(color, coverage)) { |
505 return true; | 492 return true; |
506 } | 493 } |
507 | 494 |
508 if (GrBlendCoeffRefsDst(this->getSrcBlendCoeff())) { | 495 if (GrBlendCoeffRefsDst(this->getSrcBlendCoeff())) { |
509 return true; | 496 return true; |
510 } | 497 } |
511 | 498 |
512 GrBlendCoeff dstCoeff = this->getDstBlendCoeff(); | 499 GrBlendCoeff dstCoeff = this->getDstBlendCoeff(); |
513 if (!(kZero_GrBlendCoeff == dstCoeff || | 500 if (!(kZero_GrBlendCoeff == dstCoeff || |
514 (kISA_GrBlendCoeff == dstCoeff && this->srcAlphaWillBeOne()))) { | 501 (kISA_GrBlendCoeff == dstCoeff && this->srcAlphaWillBeOne(color, covera
ge)))) { |
515 return true; | 502 return true; |
516 } | 503 } |
517 | 504 |
518 return false; | 505 return false; |
519 } | 506 } |
520 | 507 |
521 void GrDrawState::calcColorInvariantOutput() const { | 508 void GrDrawState::calcColorInvariantOutput(GrColor color) const { |
522 if (!fColorProcInfoValid) { | 509 if (!fColorProcInfoValid || color != fColorCache) { |
523 GrColor color; | |
524 GrColorComponentFlags flags; | 510 GrColorComponentFlags flags; |
525 if (this->hasColorVertexAttribute()) { | 511 if (this->hasColorVertexAttribute()) { |
526 if (fHints & kVertexColorsAreOpaque_Hint) { | 512 if (fHints & kVertexColorsAreOpaque_Hint) { |
527 flags = kA_GrColorComponentFlag; | 513 flags = kA_GrColorComponentFlag; |
528 color = 0xFF << GrColor_SHIFT_A; | 514 color = 0xFF << GrColor_SHIFT_A; |
529 } else { | 515 } else { |
530 flags = static_cast<GrColorComponentFlags>(0); | 516 flags = static_cast<GrColorComponentFlags>(0); |
531 color = 0; | 517 color = 0; |
532 } | 518 } |
533 } else { | 519 } else { |
534 flags = kRGBA_GrColorComponentFlags; | 520 flags = kRGBA_GrColorComponentFlags; |
535 color = this->getColor(); | |
536 } | 521 } |
537 fColorProcInfo.calcWithInitialValues(fColorStages.begin(), this->numColo
rStages(), | 522 fColorProcInfo.calcWithInitialValues(fColorStages.begin(), this->numColo
rStages(), |
538 color, flags, false); | 523 color, flags, false); |
539 fColorProcInfoValid = true; | 524 fColorProcInfoValid = true; |
| 525 fColorCache = color; |
540 } | 526 } |
541 } | 527 } |
542 | 528 |
543 void GrDrawState::calcCoverageInvariantOutput() const { | 529 void GrDrawState::calcCoverageInvariantOutput(GrColor coverage) const { |
544 if (!fCoverageProcInfoValid) { | 530 if (!fCoverageProcInfoValid || coverage != fCoverageCache) { |
545 GrColor color; | |
546 GrColorComponentFlags flags; | 531 GrColorComponentFlags flags; |
547 // Check if per-vertex or constant color may have partial alpha | 532 // Check if per-vertex or constant color may have partial alpha |
548 if (this->hasCoverageVertexAttribute()) { | 533 if (this->hasCoverageVertexAttribute()) { |
549 flags = static_cast<GrColorComponentFlags>(0); | 534 flags = static_cast<GrColorComponentFlags>(0); |
550 color = 0; | 535 coverage = 0; |
551 } else { | 536 } else { |
552 flags = kRGBA_GrColorComponentFlags; | 537 flags = kRGBA_GrColorComponentFlags; |
553 color = this->getCoverageColor(); | |
554 } | 538 } |
555 fCoverageProcInfo.calcWithInitialValues(fCoverageStages.begin(), this->n
umCoverageStages(), | 539 fCoverageProcInfo.calcWithInitialValues(fCoverageStages.begin(), this->n
umCoverageStages(), |
556 color, flags, true, fGeometryPro
cessor.get()); | 540 coverage, flags, true, fGeometry
Processor.get()); |
557 fCoverageProcInfoValid = true; | 541 fCoverageProcInfoValid = true; |
| 542 fCoverageCache = coverage; |
558 } | 543 } |
559 } | 544 } |
560 | 545 |
OLD | NEW |