Index: src/gpu/GrOptDrawState.cpp |
diff --git a/src/gpu/GrOptDrawState.cpp b/src/gpu/GrOptDrawState.cpp |
index cb03d2d683005dfe063bbedf49cf0cd53b8e933a..ac30311455ac062c8d96322504b43992cf8a5649 100644 |
--- a/src/gpu/GrOptDrawState.cpp |
+++ b/src/gpu/GrOptDrawState.cpp |
@@ -8,11 +8,14 @@ |
#include "GrOptDrawState.h" |
#include "GrDrawState.h" |
+#include "GrDrawTargetCaps.h" |
+#include "GrGpu.h" |
GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, |
BlendOptFlags blendOptFlags, |
GrBlendCoeff optSrcCoeff, |
- GrBlendCoeff optDstCoeff) : INHERITED(drawState) { |
+ GrBlendCoeff optDstCoeff, |
+ const GrDrawTargetCaps& caps) : INHERITED(drawState) { |
fColor = drawState.getColor(); |
fCoverage = drawState.getCoverage(); |
fViewMatrix = drawState.getViewMatrix(); |
@@ -45,8 +48,56 @@ GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, |
this->copyEffectiveCoverageStages(drawState); |
this->adjustFromBlendOpts(); |
this->getStageStats(); |
+ this->setOutputStateInfo(caps); |
}; |
+void GrOptDrawState::setOutputStateInfo(const GrDrawTargetCaps& caps) { |
+ // Set this default and then possibly change our mind if there is coverage. |
+ fPrimaryOutputType = kModulate_PrimaryOutputType; |
+ fSecondaryOutputType = kNone_SecondaryOutputType; |
+ |
+ // If we do have coverage determine whether it matters. |
+ bool separateCoverageFromColor = this->hasGeometryProcessor(); |
+ if (!this->isCoverageDrawing() && |
+ (this->numCoverageStages() > 0 || |
+ this->hasGeometryProcessor() || |
+ this->hasCoverageVertexAttribute())) { |
+ |
+ if (caps.dualSourceBlendingSupport()) { |
+ if (kZero_GrBlendCoeff == fDstBlend) { |
+ // write the coverage value to second color |
+ fSecondaryOutputType = 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. |
+ fSecondaryOutputType = 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. |
+ fSecondaryOutputType = kCoverageISC_SecondaryOutputType; |
+ separateCoverageFromColor = true; |
+ fDstBlend = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff; |
+ } |
+ } else if (fReadsDst && |
+ kOne_GrBlendCoeff == fSrcBlend && |
+ kZero_GrBlendCoeff == fDstBlend) { |
+ fPrimaryOutputType = kCombineWithDst_PrimaryOutputType; |
+ separateCoverageFromColor = true; |
+ } |
+ } |
+ |
+ // TODO: Once we have flag to know if we only multiply on stages, only push coverage into color |
+ // stages if everything is multipy |
+ if (!separateCoverageFromColor) { |
+ for (int s = 0; s < this->numCoverageStages(); ++s) { |
+ fColorStages.push_back(this->getCoverageStage(s)); |
+ } |
+ fCoverageStages.reset(); |
+ } |
+} |
+ |
void GrOptDrawState::adjustFromBlendOpts() { |
switch (fBlendOptFlags) { |