Chromium Code Reviews| Index: src/gpu/GrOptDrawState.cpp |
| diff --git a/src/gpu/GrOptDrawState.cpp b/src/gpu/GrOptDrawState.cpp |
| index a9d8ec48881c1fc77c7d8f6b86bd2f1e72e75f65..787d0723a2fcf0d59f6134eff7d0b9a7e56869ed 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); |
| }; |
| @@ -136,42 +132,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() && (this->numCoverageStages() || !ds.hasSolidCoverage())) { |
|
bsalomon
2014/11/10 20:13:41
Do we need this->numCoverageStages()?
Seems like
joshualitt
2014/11/10 20:17:16
We could actually JUST do that test, but its a bit
|
| 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; |
| } |
| } |
| } |