Index: src/gpu/GrOptDrawState.cpp |
diff --git a/src/gpu/GrOptDrawState.cpp b/src/gpu/GrOptDrawState.cpp |
index c764b432a17abcff1e4dc6f0b25ce13ada6ff0eb..79eef0c02499153e642c084e62ea706db0ebcacb 100644 |
--- a/src/gpu/GrOptDrawState.cpp |
+++ b/src/gpu/GrOptDrawState.cpp |
@@ -44,7 +44,6 @@ GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, |
int firstColorStageIdx = 0; |
int firstCoverageStageIdx = 0; |
- bool separateCoverageFromColor; |
uint8_t fixedFunctionVAToRemove = 0; |
@@ -58,8 +57,6 @@ GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, |
this->removeFixedFunctionVertexAttribs(fixedFunctionVAToRemove, &descInfo); |
} |
this->getStageStats(drawState, firstColorStageIdx, firstCoverageStageIdx, &descInfo); |
- this->setOutputStateInfo(drawState, *gpu->caps(), firstCoverageStageIdx, &descInfo, |
- &separateCoverageFromColor); |
// Copy GeometryProcesssor from DS or ODS |
if (drawState.hasGeometryProcessor()) { |
@@ -86,11 +83,10 @@ GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, |
if (firstCoverageStageIdx < drawState.numCoverageStages()) { |
fFragmentStages.push_back_n(drawState.numCoverageStages() - firstCoverageStageIdx, |
&drawState.getCoverageStage(firstCoverageStageIdx)); |
- if (!separateCoverageFromColor) { |
- fNumColorStages = fFragmentStages.count(); |
- } |
} |
+ this->setOutputStateInfo(drawState, *gpu->caps(), &descInfo); |
+ |
// now create a key |
gpu->buildProgramDesc(*this, descInfo, drawType, dstCopy, &fDesc); |
}; |
@@ -120,42 +116,35 @@ GrOptDrawState* GrOptDrawState::Create(const GrDrawState& drawState, |
void GrOptDrawState::setOutputStateInfo(const GrDrawState& ds, |
const GrDrawTargetCaps& caps, |
- int firstCoverageStageIdx, |
- GrProgramDesc::DescInfo* descInfo, |
- bool* separateCoverageFromColor) { |
+ GrProgramDesc::DescInfo* descInfo) { |
// Set this default and then possibly change our mind if there is coverage. |
descInfo->fPrimaryOutputType = GrProgramDesc::kModulate_PrimaryOutputType; |
descInfo->fSecondaryOutputType = GrProgramDesc::kNone_SecondaryOutputType; |
- // If we do have coverage determine whether it matters. |
- *separateCoverageFromColor = this->hasGeometryProcessor(); |
- if (!this->isCoverageDrawing() && |
- (ds.numCoverageStages() - firstCoverageStageIdx > 0 || |
- ds.hasGeometryProcessor() || |
- descInfo->hasCoverageVertexAttribute())) { |
- |
+ // If we do have coverage determine whether it matters. Dual source blending is expensive so |
+ // we don't do it if we are doing coverage drawing. If we aren't then We always do dual source |
+ // blending if we have any effective coverage stages OR the geometry processor doesn't emits |
+ // solid coverage. |
+ // TODO move the gp logic into the GP base class |
+ if (!this->isCoverageDrawing() && !ds.hasSolidCoverage()) { |
if (caps.dualSourceBlendingSupport()) { |
if (kZero_GrBlendCoeff == fDstBlend) { |
// write the coverage value to second color |
descInfo->fSecondaryOutputType = GrProgramDesc::kCoverage_SecondaryOutputType; |
- *separateCoverageFromColor = true; |
fDstBlend = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff; |
} else if (kSA_GrBlendCoeff == fDstBlend) { |
// SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered. |
descInfo->fSecondaryOutputType = GrProgramDesc::kCoverageISA_SecondaryOutputType; |
- *separateCoverageFromColor = true; |
fDstBlend = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff; |
} else if (kSC_GrBlendCoeff == fDstBlend) { |
// SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered. |
descInfo->fSecondaryOutputType = GrProgramDesc::kCoverageISC_SecondaryOutputType; |
- *separateCoverageFromColor = true; |
fDstBlend = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff; |
} |
} else if (descInfo->fReadsDst && |
kOne_GrBlendCoeff == fSrcBlend && |
kZero_GrBlendCoeff == fDstBlend) { |
descInfo->fPrimaryOutputType = GrProgramDesc::kCombineWithDst_PrimaryOutputType; |
- *separateCoverageFromColor = true; |
} |
} |
} |