Index: src/gpu/GrDrawState.cpp |
diff --git a/src/gpu/GrDrawState.cpp b/src/gpu/GrDrawState.cpp |
index 72ec7a32b555ee45a57348f6a167d6165f6e3c2b..465c10c99ac61a25947978e46ed122362937e9b3 100644 |
--- a/src/gpu/GrDrawState.cpp |
+++ b/src/gpu/GrDrawState.cpp |
@@ -14,7 +14,7 @@ |
#include "GrXferProcessor.h" |
#include "effects/GrPorterDuffXferProcessor.h" |
-bool GrDrawState::isEqual(const GrDrawState& that, bool explicitLocalCoords) const { |
+bool GrDrawState::isEqual(const GrDrawState& that) const { |
if (this->getRenderTarget() != that.getRenderTarget() || |
this->fColorStages.count() != that.fColorStages.count() || |
this->fCoverageStages.count() != that.fCoverageStages.count() || |
@@ -25,6 +25,17 @@ |
return false; |
} |
+ bool explicitLocalCoords = this->hasLocalCoordAttribute(); |
+ if (this->hasGeometryProcessor()) { |
+ if (!that.hasGeometryProcessor()) { |
+ return false; |
+ } else if (!this->getGeometryProcessor()->isEqual(*that.getGeometryProcessor())) { |
+ return false; |
+ } |
+ } else if (that.hasGeometryProcessor()) { |
+ return false; |
+ } |
+ |
if (!this->getXPFactory()->isEqual(*that.getXPFactory())) { |
return false; |
} |
@@ -66,6 +77,7 @@ |
fFlagBits = that.fFlagBits; |
fStencilSettings = that.fStencilSettings; |
fDrawFace = that.fDrawFace; |
+ fGeometryProcessor.reset(SkSafeRef(that.fGeometryProcessor.get())); |
fXPFactory.reset(SkRef(that.getXPFactory())); |
fColorStages = that.fColorStages; |
fCoverageStages = that.fCoverageStages; |
@@ -84,9 +96,10 @@ |
} |
void GrDrawState::onReset(const SkMatrix* initialViewMatrix) { |
- SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numFragmentStages()); |
+ SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); |
fRenderTarget.reset(NULL); |
+ fGeometryProcessor.reset(NULL); |
fXPFactory.reset(GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode)); |
fColorStages.reset(); |
fCoverageStages.reset(); |
@@ -107,10 +120,6 @@ |
fColorCache = GrColor_ILLEGAL; |
fCoverageCache = GrColor_ILLEGAL; |
- |
- fColorPrimProc = NULL; |
- fCoveragePrimProc = NULL; |
- |
} |
bool GrDrawState::setIdentityViewMatrix() { |
@@ -132,8 +141,9 @@ |
} |
void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRenderTarget* rt) { |
- SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numFragmentStages()); |
- |
+ SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); |
+ |
+ fGeometryProcessor.reset(NULL); |
fColorStages.reset(); |
fCoverageStages.reset(); |
@@ -187,7 +197,7 @@ |
this->isCoverageDrawing(), this->isColorWriteDisabled()); |
} |
-bool GrDrawState::hasSolidCoverage(const GrPrimitiveProcessor* pp) const { |
+bool GrDrawState::hasSolidCoverage(GrColor coverage) const { |
// If we're drawing coverage directly then coverage is effectively treated as color. |
if (this->isCoverageDrawing()) { |
return true; |
@@ -197,15 +207,15 @@ |
return false; |
} |
- this->calcCoverageInvariantOutput(pp); |
+ this->calcCoverageInvariantOutput(coverage); |
return fCoverageProcInfo.isSolidWhite(); |
} |
//////////////////////////////////////////////////////////////////////////////s |
-bool GrDrawState::willEffectReadDstColor(const GrPrimitiveProcessor* pp) const { |
- this->calcColorInvariantOutput(pp); |
- this->calcCoverageInvariantOutput(pp); |
+bool GrDrawState::willEffectReadDstColor(GrColor color, GrColor coverage) const { |
+ this->calcColorInvariantOutput(color); |
+ this->calcCoverageInvariantOutput(coverage); |
// TODO: Remove need to create the XP here. |
// Also once all custom blends are turned into XPs we can remove the need |
// to check other stages since only xp's will be able to read dst |
@@ -225,6 +235,15 @@ |
void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) { |
if (fDrawState) { |
+ // See the big comment on the class definition about GPs. |
+ if (SK_InvalidUniqueID == fOriginalGPID) { |
+ fDrawState->fGeometryProcessor.reset(NULL); |
+ } else { |
+ SkASSERT(fDrawState->getGeometryProcessor()->getUniqueID() == |
+ fOriginalGPID); |
+ fOriginalGPID = SK_InvalidUniqueID; |
+ } |
+ |
int m = fDrawState->numColorStages() - fColorEffectCnt; |
SkASSERT(m >= 0); |
fDrawState->fColorStages.pop_back_n(m); |
@@ -240,6 +259,10 @@ |
} |
fDrawState = ds; |
if (NULL != ds) { |
+ SkASSERT(SK_InvalidUniqueID == fOriginalGPID); |
+ if (NULL != ds->getGeometryProcessor()) { |
+ fOriginalGPID = ds->getGeometryProcessor()->getUniqueID(); |
+ } |
fColorEffectCnt = ds->numColorStages(); |
fCoverageEffectCnt = ds->numCoverageStages(); |
SkDEBUGCODE(++ds->fBlockEffectRemovalCnt;) |
@@ -349,35 +372,38 @@ |
//////////////////////////////////////////////////////////////////////////////// |
-bool GrDrawState::willBlendWithDst(const GrPrimitiveProcessor* pp) const { |
- this->calcColorInvariantOutput(pp); |
- this->calcCoverageInvariantOutput(pp); |
+bool GrDrawState::srcAlphaWillBeOne(GrColor color, GrColor coverage) const { |
+ this->calcColorInvariantOutput(color); |
+ if (this->isCoverageDrawing()) { |
+ this->calcCoverageInvariantOutput(coverage); |
+ return (fColorProcInfo.isOpaque() && fCoverageProcInfo.isOpaque()); |
+ } |
+ return fColorProcInfo.isOpaque(); |
+} |
+ |
+bool GrDrawState::willBlendWithDst(GrColor color, GrColor coverage) const { |
+ this->calcColorInvariantOutput(color); |
+ this->calcCoverageInvariantOutput(coverage); |
return fXPFactory->willBlendWithDst(fColorProcInfo, fCoverageProcInfo, |
this->isCoverageDrawing(), this->isColorWriteDisabled()); |
} |
-void GrDrawState::calcColorInvariantOutput(const GrPrimitiveProcessor* pp) const { |
- if (!fColorProcInfoValid || fColorPrimProc != pp) { |
- fColorProcInfo.calcColorWithPrimProc(pp, fColorStages.begin(), this->numColorStages()); |
- fColorProcInfoValid = true; |
- fColorPrimProc = pp; |
- } |
-} |
- |
-void GrDrawState::calcCoverageInvariantOutput(const GrPrimitiveProcessor* pp) const { |
- if (!fCoverageProcInfoValid || fCoveragePrimProc != pp) { |
- fCoverageProcInfo.calcCoverageWithPrimProc(pp, fCoverageStages.begin(), |
- this->numCoverageStages()); |
- fCoverageProcInfoValid = true; |
- fCoveragePrimProc = pp; |
- } |
-} |
- |
void GrDrawState::calcColorInvariantOutput(GrColor color) const { |
if (!fColorProcInfoValid || color != fColorCache) { |
- GrColorComponentFlags flags = kRGBA_GrColorComponentFlags; |
- fColorProcInfo.calcWithInitialValues(fColorStages.begin(), this->numColorStages(), color, |
- flags, false); |
+ GrColorComponentFlags flags; |
+ if (this->hasColorVertexAttribute()) { |
+ if (fHints & kVertexColorsAreOpaque_Hint) { |
+ flags = kA_GrColorComponentFlag; |
+ color = 0xFF << GrColor_SHIFT_A; |
+ } else { |
+ flags = static_cast<GrColorComponentFlags>(0); |
+ color = 0; |
+ } |
+ } else { |
+ flags = kRGBA_GrColorComponentFlags; |
+ } |
+ fColorProcInfo.calcWithInitialValues(fColorStages.begin(), this->numColorStages(), |
+ color, flags, false); |
fColorProcInfoValid = true; |
fColorCache = color; |
} |
@@ -385,10 +411,16 @@ |
void GrDrawState::calcCoverageInvariantOutput(GrColor coverage) const { |
if (!fCoverageProcInfoValid || coverage != fCoverageCache) { |
- GrColorComponentFlags flags = kRGBA_GrColorComponentFlags; |
- fCoverageProcInfo.calcWithInitialValues(fCoverageStages.begin(), |
- this->numCoverageStages(), coverage, flags, |
- true); |
+ GrColorComponentFlags flags; |
+ // Check if per-vertex or constant color may have partial alpha |
+ if (this->hasCoverageVertexAttribute()) { |
+ flags = static_cast<GrColorComponentFlags>(0); |
+ coverage = 0; |
+ } else { |
+ flags = kRGBA_GrColorComponentFlags; |
+ } |
+ fCoverageProcInfo.calcWithInitialValues(fCoverageStages.begin(), this->numCoverageStages(), |
+ coverage, flags, true, fGeometryProcessor.get()); |
fCoverageProcInfoValid = true; |
fCoverageCache = coverage; |
} |