Index: src/gpu/GrOptDrawState.cpp |
diff --git a/src/gpu/GrOptDrawState.cpp b/src/gpu/GrOptDrawState.cpp |
index 2435e5fc33514ebfe321373249e061202304f2db..93cc04798bbcada8a20737ea257acfbdd6cb54d5 100644 |
--- a/src/gpu/GrOptDrawState.cpp |
+++ b/src/gpu/GrOptDrawState.cpp |
@@ -14,7 +14,7 @@ |
#include "GrProcOptInfo.h" |
GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, |
- BlendOptFlags blendOptFlags, |
+ GrDrawState::BlendOpt blendOpt, |
GrBlendCoeff optSrcCoeff, |
GrBlendCoeff optDstCoeff, |
GrGpu* gpu, |
@@ -25,17 +25,26 @@ GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, |
fScissorState = scissorState; |
fViewMatrix = drawState.getViewMatrix(); |
fBlendConstant = drawState.getBlendConstant(); |
- fFlagBits = drawState.getFlagBits(); |
fVAPtr = drawState.getVertexAttribs(); |
fVACount = drawState.getVertexAttribCount(); |
fVAStride = drawState.getVertexStride(); |
fStencilSettings = drawState.getStencil(); |
- fDrawFace = (DrawFace)drawState.getDrawFace(); |
- fBlendOptFlags = blendOptFlags; |
+ fDrawFace = drawState.getDrawFace(); |
fSrcBlend = optSrcCoeff; |
fDstBlend = optDstCoeff; |
GrProgramDesc::DescInfo descInfo; |
+ fFlags = 0; |
+ if (drawState.isHWAntialias()) { |
+ fFlags |= kHWAA_Flag; |
+ } |
+ if (drawState.isColorWriteDisabled()) { |
+ fFlags |= kDisableColorWrite_Flag; |
+ } |
+ if (drawState.isDither()) { |
+ fFlags |= kDither_Flag; |
+ } |
+ |
memcpy(descInfo.fFixedFunctionVertexAttribIndices, |
drawState.getFixedFunctionVertexAttribIndices(), |
sizeof(descInfo.fFixedFunctionVertexAttribIndices)); |
@@ -56,8 +65,8 @@ GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, |
descInfo.fInputCoverageIsUsed = true; |
fCoverage = drawState.getCoverage(); |
- this->adjustFromBlendOpts(drawState, &descInfo, &firstColorStageIdx, &firstCoverageStageIdx, |
- &fixedFunctionVAToRemove); |
+ this->adjustProgramForBlendOpt(drawState, blendOpt, &descInfo, &firstColorStageIdx, |
+ &firstCoverageStageIdx, &fixedFunctionVAToRemove); |
// Should not be setting any more FFVA to be removed at this point |
if (0 != fixedFunctionVAToRemove) { |
this->removeFixedFunctionVertexAttribs(fixedFunctionVAToRemove, &descInfo); |
@@ -85,7 +94,7 @@ GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, |
(drawState.fCoverageStages[i], explicitLocalCoords)); |
} |
- this->setOutputStateInfo(drawState, *gpu->caps(), &descInfo); |
+ this->setOutputStateInfo(drawState, blendOpt, *gpu->caps(), &descInfo); |
// now create a key |
gpu->buildProgramDesc(*this, descInfo, drawType, dstCopy, &fDesc); |
@@ -98,9 +107,7 @@ GrOptDrawState* GrOptDrawState::Create(const GrDrawState& drawState, |
GrGpu::DrawType drawType) { |
GrBlendCoeff srcCoeff; |
GrBlendCoeff dstCoeff; |
- BlendOptFlags blendFlags = (BlendOptFlags) drawState.getBlendOpts(false, |
- &srcCoeff, |
- &dstCoeff); |
+ GrDrawState::BlendOpt blendOpt = drawState.getBlendOpt(false, &srcCoeff, &dstCoeff); |
// If our blend coeffs are set to 0,1 we know we will not end up drawing unless we are |
// stenciling. When path rendering the stencil settings are not always set on the draw state |
@@ -111,23 +118,23 @@ GrOptDrawState* GrOptDrawState::Create(const GrDrawState& drawState, |
return NULL; |
} |
- return SkNEW_ARGS(GrOptDrawState, (drawState, blendFlags, srcCoeff, |
+ return SkNEW_ARGS(GrOptDrawState, (drawState, blendOpt, srcCoeff, |
dstCoeff, gpu, scissorState, dstCopy, drawType)); |
} |
void GrOptDrawState::setOutputStateInfo(const GrDrawState& ds, |
+ GrDrawState::BlendOpt blendOpt, |
const GrDrawTargetCaps& caps, |
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. 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()) { |
+ // Determine whether we should use dual source blending or shader code to keep coverage |
+ // separate from color. |
+ bool keepCoverageSeparate = !(GrDrawState::kCoverageAsAlpha_BlendOpt == blendOpt || |
+ GrDrawState::kEmitCoverage_BlendOpt == blendOpt); |
+ if (keepCoverageSeparate && !ds.hasSolidCoverage()) { |
if (caps.dualSourceBlendingSupport()) { |
if (kZero_GrBlendCoeff == fDstBlend) { |
// write the coverage value to second color |
@@ -150,25 +157,24 @@ void GrOptDrawState::setOutputStateInfo(const GrDrawState& ds, |
} |
} |
-void GrOptDrawState::adjustFromBlendOpts(const GrDrawState& ds, |
- GrProgramDesc::DescInfo* descInfo, |
- int* firstColorStageIdx, |
- int* firstCoverageStageIdx, |
- uint8_t* fixedFunctionVAToRemove) { |
- switch (fBlendOptFlags) { |
- case kNone_BlendOpt: |
- case kSkipDraw_BlendOptFlag: |
- break; |
- case kCoverageAsAlpha_BlendOptFlag: |
- fFlagBits |= kCoverageDrawing_StateBit; |
+void GrOptDrawState::adjustProgramForBlendOpt(const GrDrawState& ds, |
+ GrDrawState::BlendOpt blendOpt, |
+ GrProgramDesc::DescInfo* descInfo, |
+ int* firstColorStageIdx, |
+ int* firstCoverageStageIdx, |
+ uint8_t* fixedFunctionVAToRemove) { |
+ switch (blendOpt) { |
+ case GrDrawState::kNone_BlendOpt: |
+ case GrDrawState::kSkipDraw_BlendOpt: |
+ case GrDrawState::kCoverageAsAlpha_BlendOpt: |
break; |
- case kEmitCoverage_BlendOptFlag: |
+ case GrDrawState::kEmitCoverage_BlendOpt: |
fColor = 0xffffffff; |
descInfo->fInputColorIsUsed = true; |
*firstColorStageIdx = ds.numColorStages(); |
*fixedFunctionVAToRemove |= 0x1 << kColor_GrVertexAttribBinding; |
break; |
- case kEmitTransBlack_BlendOptFlag: |
+ case GrDrawState::kEmitTransBlack_BlendOpt: |
fColor = 0; |
fCoverage = 0xff; |
descInfo->fInputColorIsUsed = true; |
@@ -178,8 +184,6 @@ void GrOptDrawState::adjustFromBlendOpts(const GrDrawState& ds, |
*fixedFunctionVAToRemove |= (0x1 << kColor_GrVertexAttribBinding | |
0x1 << kCoverage_GrVertexAttribBinding); |
break; |
- default: |
- SkFAIL("Unknown BlendOptFlag"); |
} |
} |
@@ -269,7 +273,7 @@ bool GrOptDrawState::operator== (const GrOptDrawState& that) const { |
this->fSrcBlend != that.fSrcBlend || |
this->fDstBlend != that.fDstBlend || |
this->fBlendConstant != that.fBlendConstant || |
- this->fFlagBits != that.fFlagBits || |
+ this->fFlags != that.fFlags || |
this->fVACount != that.fVACount || |
this->fVAStride != that.fVAStride || |
memcmp(this->fVAPtr, that.fVAPtr, this->fVACount * sizeof(GrVertexAttrib)) || |