remove separate color from coverage
authorjoshualitt <joshualitt@chromium.org>
Tue, 11 Nov 2014 16:51:30 +0000 (08:51 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 11 Nov 2014 16:51:30 +0000 (08:51 -0800)
BUG=skia:

Review URL: https://codereview.chromium.org/699023003

expectations/gm/ignored-tests.txt
src/gpu/GrDrawState.cpp
src/gpu/GrDrawState.h
src/gpu/GrOptDrawState.cpp
src/gpu/GrOptDrawState.h
src/gpu/gl/GrGLProgramDesc.cpp

index e524d331e469eed4c7a860a042b0cf34fdc90b3f..f268a0f9c085f3650f52b6cd342ebe6d21efe1fa 100644 (file)
@@ -63,3 +63,6 @@ multipicturedraw_rrectclip_simple
 multipicturedraw_rrectclip_tiled
 multipicturedraw_sierpinski_simple
 multipicturedraw_sierpinski_tiled
+
+#joshualitt
+hairmodes
index c82c5adad1f771354e711e1ce149234d8ee77acf..1f9f6967c2d717ce8c1a0083de8d3c1f3871ebea 100644 (file)
@@ -185,7 +185,7 @@ void GrDrawState::onReset(const SkMatrix* initialViewMatrix) {
 }
 
 bool GrDrawState::setIdentityViewMatrix()  {
-    if (this->numTotalStages()) {
+    if (this->numFragmentStages()) {
         SkMatrix invVM;
         if (!fViewMatrix.invert(&invVM)) {
             // sad trombone sound
@@ -378,6 +378,10 @@ bool GrDrawState::hasSolidCoverage() const {
         return true;
     }
 
+    if (this->numCoverageStages() > 0) {
+        return false;
+    }
+
     GrProcessor::InvariantOutput inout;
     inout.fIsSingleComponent = true;
     // Initialize to an unknown starting coverage if per-vertex coverage is specified.
@@ -388,15 +392,11 @@ bool GrDrawState::hasSolidCoverage() const {
         inout.fValidFlags = kRGBA_GrColorComponentFlags;
     }
 
-    // Run through the coverage stages and see if the coverage will be all ones at the end.
+    // check the coverage output from the GP
     if (this->hasGeometryProcessor()) {
         fGeometryProcessor->computeInvariantOutput(&inout);
     }
 
-    for (int s = 0; s < this->numCoverageStages(); ++s) {
-        const GrProcessor* processor = this->getCoverageStage(s).getProcessor();
-        processor->computeInvariantOutput(&inout);
-    }
     return inout.isSolidWhite();
 }
 
@@ -533,7 +533,7 @@ bool GrDrawState::AutoViewMatrixRestore::setIdentity(GrDrawState* drawState) {
     }
 
     fViewMatrix = drawState->getViewMatrix();
-    if (0 == drawState->numTotalStages()) {
+    if (0 == drawState->numFragmentStages()) {
         drawState->fViewMatrix.reset();
         fDrawState = drawState;
         fNumColorStages = 0;
@@ -554,7 +554,7 @@ bool GrDrawState::AutoViewMatrixRestore::setIdentity(GrDrawState* drawState) {
 }
 
 void GrDrawState::AutoViewMatrixRestore::doEffectCoordChanges(const SkMatrix& coordChangeMatrix) {
-    fSavedCoordChanges.reset(fDrawState->numTotalStages());
+    fSavedCoordChanges.reset(fDrawState->numFragmentStages());
     int i = 0;
 
     fNumColorStages = fDrawState->numColorStages();
index 15df975d73c4470d5c1e0b83a85ae77c96e4fe9a..baa92afd594d348dc38612585797a5ed022c1396 100644 (file)
@@ -246,9 +246,9 @@ public:
 
     int numColorStages() const { return fColorStages.count(); }
     int numCoverageStages() const { return fCoverageStages.count(); }
+    int numFragmentStages() const { return this->numColorStages() + this->numCoverageStages(); }
     int numTotalStages() const {
-         return this->numColorStages() + this->numCoverageStages() +
-                 (this->hasGeometryProcessor() ? 1 : 0);
+         return this->numFragmentStages() + (this->hasGeometryProcessor() ? 1 : 0);
     }
 
     bool hasGeometryProcessor() const { return SkToBool(fGeometryProcessor.get()); }
index c764b432a17abcff1e4dc6f0b25ce13ada6ff0eb..79eef0c02499153e642c084e62ea706db0ebcacb 100644 (file)
@@ -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;
         }
     }
 }
index 945cbfb7599075118e098d2414b9eb0fbbfa1884..cef32b615780151fe39cd0e725e2c9f03c7fc987 100644 (file)
@@ -354,8 +354,7 @@ private:
      * blend coeffs will represent those used by backend API.
      */
     void setOutputStateInfo(const GrDrawState& ds, const GrDrawTargetCaps&,
-                            int firstCoverageStageIdx, GrProgramDesc::DescInfo*,
-                            bool* separateCoverageFromColor);
+                            GrProgramDesc::DescInfo*);
 
     bool isEqual(const GrOptDrawState& that) const;
 
index 4a182b36e6f1fa45fac607618dc334e4a01f41bc..836400e350c0566fe81372ad551df86f660e72a2 100644 (file)
@@ -175,12 +175,12 @@ struct FragmentProcessorKeyBuilder {
 
 
 template <class ProcessorKeyBuilder>
-bool
-GrGLProgramDescBuilder::BuildStagedProcessorKey(const typename ProcessorKeyBuilder::StagedProcessor& stage,
-                                         const GrGLCaps& caps,
-                                         bool requiresLocalCoordAttrib,
-                                         GrProgramDesc* desc,
-                                         int* offsetAndSizeIndex) {
+bool GrGLProgramDescBuilder::BuildStagedProcessorKey(
+        const typename ProcessorKeyBuilder::StagedProcessor& stage,
+        const GrGLCaps& caps,
+        bool requiresLocalCoordAttrib,
+        GrProgramDesc* desc,
+        int* offsetAndSizeIndex) {
     GrProcessorKeyBuilder b(&desc->fKey);
     uint16_t processorKeySize;
     uint32_t processorOffset = desc->fKey.count();
@@ -201,11 +201,11 @@ GrGLProgramDescBuilder::BuildStagedProcessorKey(const typename ProcessorKeyBuild
 }
 
 bool GrGLProgramDescBuilder::Build(const GrOptDrawState& optState,
-                            const GrProgramDesc::DescInfo& descInfo,
-                            GrGpu::DrawType drawType,
-                            GrGpuGL* gpu,
-                            const GrDeviceCoordTexture* dstCopy,
-                            GrProgramDesc* desc) {
+                                   const GrProgramDesc::DescInfo& descInfo,
+                                   GrGpu::DrawType drawType,
+                                   GrGpuGL* gpu,
+                                   const GrDeviceCoordTexture* dstCopy,
+                                   GrProgramDesc* desc) {
     bool inputColorIsUsed = descInfo.fInputColorIsUsed;
     bool inputCoverageIsUsed = descInfo.fInputCoverageIsUsed;