diff options
author | joshualitt <joshualitt@google.com> | 2015-05-19 07:15:28 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-19 07:15:28 -0700 |
commit | d3a560fa80bfb3e2d2e989f951bb3b1c52316654 (patch) | |
tree | 6702bf0af4281910271596fe9b11316902194d79 /src/gpu/effects | |
parent | cbfe91d82500f4ae8c3ff7bd74b3021a4b89fd84 (diff) |
Revert of Preliminary attempt to remove batch tracker (patchset #3 id:40001 of https://codereview.chromium.org/1139723004/)
Reason for revert:
breaking bots
Original issue's description:
> Preliminary attempt to remove batch tracker
>
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/cbfe91d82500f4ae8c3ff7bd74b3021a4b89fd84
TBR=robertphillips@google.com,joshualitt@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Review URL: https://codereview.chromium.org/1132323003
Diffstat (limited to 'src/gpu/effects')
-rw-r--r-- | src/gpu/effects/GrBezierEffect.cpp | 130 | ||||
-rw-r--r-- | src/gpu/effects/GrBezierEffect.h | 33 | ||||
-rw-r--r-- | src/gpu/effects/GrBitmapTextGeoProc.cpp | 50 | ||||
-rw-r--r-- | src/gpu/effects/GrBitmapTextGeoProc.h | 15 | ||||
-rw-r--r-- | src/gpu/effects/GrDashingEffect.cpp | 136 | ||||
-rwxr-xr-x | src/gpu/effects/GrDistanceFieldGeoProc.cpp | 131 | ||||
-rw-r--r-- | src/gpu/effects/GrDistanceFieldGeoProc.h | 44 |
7 files changed, 302 insertions, 237 deletions
diff --git a/src/gpu/effects/GrBezierEffect.cpp b/src/gpu/effects/GrBezierEffect.cpp index 8d1b0dbd7a..a09d6ce414 100644 --- a/src/gpu/effects/GrBezierEffect.cpp +++ b/src/gpu/effects/GrBezierEffect.cpp @@ -12,6 +12,13 @@ #include "gl/GrGLGeometryProcessor.h" #include "gl/builders/GrGLProgramBuilder.h" +struct ConicBatchTracker { + GrGPInput fInputColorType; + GrColor fColor; + uint8_t fCoverageScale; + bool fUsesLocalCoords; +}; + class GrGLConicEffect : public GrGLGeometryProcessor { public: GrGLConicEffect(const GrGeometryProcessor&, @@ -30,16 +37,16 @@ public: const GrConicEffect& ce = primProc.cast<GrConicEffect>(); this->setUniformViewMatrix(pdman, ce.viewMatrix()); - if (ce.color() != fColor) { + const ConicBatchTracker& local = bt.cast<ConicBatchTracker>(); + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; - GrColorToRGBAFloat(ce.color(), c); + GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); - fColor = ce.color(); + fColor = local.fColor; } - - if (ce.coverageScale() != 0xff && ce.coverageScale() != fCoverageScale) { - pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(ce.coverageScale())); - fCoverageScale = ce.coverageScale(); + if (0xff != local.fCoverageScale && fCoverageScale != local.fCoverageScale) { + pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale)); + fCoverageScale = local.fCoverageScale; } } @@ -71,6 +78,7 @@ void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { GrGLGPBuilder* pb = args.fPB; GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); + const ConicBatchTracker& local = args.fBT.cast<ConicBatchTracker>(); // emit attributes vsBuilder->emitAttributes(gp); @@ -80,9 +88,8 @@ void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); // Setup pass through color - if (!gp.colorIgnored()) { - this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); - } + this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL, + &fColorUniform); // Setup position this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix()); @@ -148,8 +155,7 @@ void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { SkFAIL("Shouldn't get here"); } - // TODO should we really be doing this? - if (gp.coverageScale() != 0xff) { + if (0xff != local.fCoverageScale) { const char* coverageScale; fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, kFloat_GrSLType, @@ -167,10 +173,11 @@ void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp, const GrGLSLCaps&, GrProcessorKeyBuilder* b) { const GrConicEffect& ce = gp.cast<GrConicEffect>(); + const ConicBatchTracker& local = bt.cast<ConicBatchTracker>(); uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; - key |= GrColor_ILLEGAL != ce.color() ? 0x4 : 0x0; - key |= 0xff != ce.coverageScale() ? 0x8 : 0x0; - key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0; + key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0; + key |= 0xff != local.fCoverageScale ? 0x8 : 0x0; + key |= local.fUsesLocalCoords && ce.localMatrix().hasPerspective() ? 0x10 : 0x0; key |= ComputePosKey(ce.viewMatrix()) << 5; b->add32(key); } @@ -191,18 +198,23 @@ GrGLPrimitiveProcessor* GrConicEffect::createGLInstance(const GrBatchTracker& bt } GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage, - GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix, - bool usesLocalCoords) + GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix) : fColor(color) , fViewMatrix(viewMatrix) , fLocalMatrix(viewMatrix) - , fUsesLocalCoords(usesLocalCoords) , fCoverageScale(coverage) , fEdgeType(edgeType) { this->initClassID<GrConicEffect>(); fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); fInConicCoeffs = &this->addVertexAttrib(Attribute("inConicCoeffs", - kVec4f_GrVertexAttribType)); + kVec4f_GrVertexAttribType)); +} + +void GrConicEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const { + ConicBatchTracker* local = bt->cast<ConicBatchTracker>(); + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); + local->fCoverageScale = fCoverageScale; + local->fUsesLocalCoords = init.fUsesLocalCoords; } ////////////////////////////////////////////////////////////////////////////// @@ -219,7 +231,7 @@ GrGeometryProcessor* GrConicEffect::TestCreate(SkRandom* random, random->nextULessThan(kGrProcessorEdgeTypeCnt)); gp = GrConicEffect::Create(GrRandomColor(random), GrTest::TestMatrix(random), edgeType, caps, - GrTest::TestMatrix(random), random->nextBool()); + GrTest::TestMatrix(random)); } while (NULL == gp); return gp; } @@ -228,6 +240,13 @@ GrGeometryProcessor* GrConicEffect::TestCreate(SkRandom* random, // Quad ////////////////////////////////////////////////////////////////////////////// +struct QuadBatchTracker { + GrGPInput fInputColorType; + GrColor fColor; + uint8_t fCoverageScale; + bool fUsesLocalCoords; +}; + class GrGLQuadEffect : public GrGLGeometryProcessor { public: GrGLQuadEffect(const GrGeometryProcessor&, @@ -246,16 +265,16 @@ public: const GrQuadEffect& qe = primProc.cast<GrQuadEffect>(); this->setUniformViewMatrix(pdman, qe.viewMatrix()); - if (qe.color() != fColor) { + const QuadBatchTracker& local = bt.cast<QuadBatchTracker>(); + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; - GrColorToRGBAFloat(qe.color(), c); + GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); - fColor = qe.color(); + fColor = local.fColor; } - - if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) { - pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale())); - fCoverageScale = qe.coverageScale(); + if (0xff != local.fCoverageScale && local.fCoverageScale != fCoverageScale) { + pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale)); + fCoverageScale = local.fCoverageScale; } } @@ -287,6 +306,7 @@ void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { GrGLGPBuilder* pb = args.fPB; GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); + const QuadBatchTracker& local = args.fBT.cast<QuadBatchTracker>(); // emit attributes vsBuilder->emitAttributes(gp); @@ -296,9 +316,8 @@ void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); // Setup pass through color - if (!gp.colorIgnored()) { - this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); - } + this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL, + &fColorUniform); // Setup position this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix()); @@ -350,7 +369,7 @@ void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { SkFAIL("Shouldn't get here"); } - if (0xff != gp.coverageScale()) { + if (0xff != local.fCoverageScale) { const char* coverageScale; fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, kFloat_GrSLType, @@ -368,10 +387,11 @@ void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp, const GrGLSLCaps&, GrProcessorKeyBuilder* b) { const GrQuadEffect& ce = gp.cast<GrQuadEffect>(); + const QuadBatchTracker& local = bt.cast<QuadBatchTracker>(); uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; - key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0; - key |= ce.coverageScale() != 0xff ? 0x8 : 0x0; - key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0; + key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0; + key |= 0xff != local.fCoverageScale ? 0x8 : 0x0; + key |= local.fUsesLocalCoords && ce.localMatrix().hasPerspective() ? 0x10 : 0x0; key |= ComputePosKey(ce.viewMatrix()) << 5; b->add32(key); } @@ -392,12 +412,10 @@ GrGLPrimitiveProcessor* GrQuadEffect::createGLInstance(const GrBatchTracker& bt, } GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage, - GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix, - bool usesLocalCoords) + GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix) : fColor(color) , fViewMatrix(viewMatrix) , fLocalMatrix(localMatrix) - , fUsesLocalCoords(usesLocalCoords) , fCoverageScale(coverage) , fEdgeType(edgeType) { this->initClassID<GrQuadEffect>(); @@ -406,6 +424,13 @@ GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t co kVec4f_GrVertexAttribType)); } +void GrQuadEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const { + QuadBatchTracker* local = bt->cast<QuadBatchTracker>(); + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); + local->fCoverageScale = fCoverageScale; + local->fUsesLocalCoords = init.fUsesLocalCoords; +} + ////////////////////////////////////////////////////////////////////////////// GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect); @@ -421,8 +446,7 @@ GrGeometryProcessor* GrQuadEffect::TestCreate(SkRandom* random, gp = GrQuadEffect::Create(GrRandomColor(random), GrTest::TestMatrix(random), edgeType, caps, - GrTest::TestMatrix(random), - random->nextBool()); + GrTest::TestMatrix(random)); } while (NULL == gp); return gp; } @@ -431,6 +455,12 @@ GrGeometryProcessor* GrQuadEffect::TestCreate(SkRandom* random, // Cubic ////////////////////////////////////////////////////////////////////////////// +struct CubicBatchTracker { + GrGPInput fInputColorType; + GrColor fColor; + bool fUsesLocalCoords; +}; + class GrGLCubicEffect : public GrGLGeometryProcessor { public: GrGLCubicEffect(const GrGeometryProcessor&, @@ -449,11 +479,12 @@ public: const GrCubicEffect& ce = primProc.cast<GrCubicEffect>(); this->setUniformViewMatrix(pdman, ce.viewMatrix()); - if (ce.color() != fColor) { + const CubicBatchTracker& local = bt.cast<CubicBatchTracker>(); + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; - GrColorToRGBAFloat(ce.color(), c); + GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); - fColor = ce.color(); + fColor = local.fColor; } } @@ -475,6 +506,7 @@ GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor, void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); + const CubicBatchTracker& local = args.fBT.cast<CubicBatchTracker>(); // emit attributes vsBuilder->emitAttributes(gp); @@ -484,9 +516,8 @@ void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); // Setup pass through color - if (!gp.colorIgnored()) { - this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); - } + this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL, + &fColorUniform); // Setup position this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix()); @@ -587,8 +618,9 @@ void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp, const GrGLSLCaps&, GrProcessorKeyBuilder* b) { const GrCubicEffect& ce = gp.cast<GrCubicEffect>(); + const CubicBatchTracker& local = bt.cast<CubicBatchTracker>(); uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; - key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8; + key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x8; key |= ComputePosKey(ce.viewMatrix()) << 5; b->add32(key); } @@ -619,6 +651,12 @@ GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix, kVec4f_GrVertexAttribType)); } +void GrCubicEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const { + CubicBatchTracker* local = bt->cast<CubicBatchTracker>(); + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); + local->fUsesLocalCoords = init.fUsesLocalCoords; +} + ////////////////////////////////////////////////////////////////////////////// GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect); diff --git a/src/gpu/effects/GrBezierEffect.h b/src/gpu/effects/GrBezierEffect.h index 7700c58fe6..f1b22fa8a4 100644 --- a/src/gpu/effects/GrBezierEffect.h +++ b/src/gpu/effects/GrBezierEffect.h @@ -63,7 +63,6 @@ public: const GrPrimitiveEdgeType edgeType, const GrDrawTargetCaps& caps, const SkMatrix& localMatrix, - bool usesLocalCoords, uint8_t coverage = 0xff) { switch (edgeType) { case kFillAA_GrProcessorEdgeType: @@ -72,18 +71,18 @@ public: } return SkNEW_ARGS(GrConicEffect, (color, viewMatrix, coverage, kFillAA_GrProcessorEdgeType, - localMatrix, usesLocalCoords)); + localMatrix)); case kHairlineAA_GrProcessorEdgeType: if (!caps.shaderCaps()->shaderDerivativeSupport()) { return NULL; } return SkNEW_ARGS(GrConicEffect, (color, viewMatrix, coverage, kHairlineAA_GrProcessorEdgeType, - localMatrix, usesLocalCoords)); + localMatrix)); case kFillBW_GrProcessorEdgeType: return SkNEW_ARGS(GrConicEffect, (color, viewMatrix, coverage, kFillBW_GrProcessorEdgeType, - localMatrix, usesLocalCoords)); + localMatrix)); default: return NULL; } @@ -99,11 +98,8 @@ public: inline bool isFilled() const { return GrProcessorEdgeTypeIsFill(fEdgeType); } inline GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } GrColor color() const { return fColor; } - bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } const SkMatrix& viewMatrix() const { return fViewMatrix; } const SkMatrix& localMatrix() const { return fLocalMatrix; } - bool usesLocalCoords() const { return fUsesLocalCoords; } - uint8_t coverageScale() const { return fCoverageScale; } virtual void getGLProcessorKey(const GrBatchTracker& bt, const GrGLSLCaps& caps, @@ -112,14 +108,15 @@ public: virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, const GrGLSLCaps&) const override; + void initBatchTracker(GrBatchTracker*, const GrPipelineInfo&) const override; + private: GrConicEffect(GrColor, const SkMatrix& viewMatrix, uint8_t coverage, GrPrimitiveEdgeType, - const SkMatrix& localMatrix, bool usesLocalCoords); + const SkMatrix& localMatrix); GrColor fColor; SkMatrix fViewMatrix; SkMatrix fLocalMatrix; - bool fUsesLocalCoords; uint8_t fCoverageScale; GrPrimitiveEdgeType fEdgeType; const Attribute* fInPosition; @@ -148,7 +145,6 @@ public: const GrPrimitiveEdgeType edgeType, const GrDrawTargetCaps& caps, const SkMatrix& localMatrix, - bool usesLocalCoords, uint8_t coverage = 0xff) { switch (edgeType) { case kFillAA_GrProcessorEdgeType: @@ -157,18 +153,18 @@ public: } return SkNEW_ARGS(GrQuadEffect, (color, viewMatrix, coverage, kFillAA_GrProcessorEdgeType, - localMatrix, usesLocalCoords)); + localMatrix)); case kHairlineAA_GrProcessorEdgeType: if (!caps.shaderCaps()->shaderDerivativeSupport()) { return NULL; } return SkNEW_ARGS(GrQuadEffect, (color, viewMatrix, coverage, kHairlineAA_GrProcessorEdgeType, - localMatrix, usesLocalCoords)); + localMatrix)); case kFillBW_GrProcessorEdgeType: return SkNEW_ARGS(GrQuadEffect, (color, viewMatrix, coverage, kFillBW_GrProcessorEdgeType, - localMatrix, usesLocalCoords)); + localMatrix)); default: return NULL; } @@ -184,11 +180,8 @@ public: inline bool isFilled() const { return GrProcessorEdgeTypeIsFill(fEdgeType); } inline GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } GrColor color() const { return fColor; } - bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } const SkMatrix& viewMatrix() const { return fViewMatrix; } const SkMatrix& localMatrix() const { return fLocalMatrix; } - bool usesLocalCoords() const { return fUsesLocalCoords; } - uint8_t coverageScale() const { return fCoverageScale; } virtual void getGLProcessorKey(const GrBatchTracker& bt, const GrGLSLCaps& caps, @@ -197,14 +190,15 @@ public: virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, const GrGLSLCaps&) const override; + void initBatchTracker(GrBatchTracker*, const GrPipelineInfo&) const override; + private: GrQuadEffect(GrColor, const SkMatrix& viewMatrix, uint8_t coverage, GrPrimitiveEdgeType, - const SkMatrix& localMatrix, bool usesLocalCoords); + const SkMatrix& localMatrix); GrColor fColor; SkMatrix fViewMatrix; SkMatrix fLocalMatrix; - bool fUsesLocalCoords; uint8_t fCoverageScale; GrPrimitiveEdgeType fEdgeType; const Attribute* fInPosition; @@ -264,7 +258,6 @@ public: inline bool isFilled() const { return GrProcessorEdgeTypeIsFill(fEdgeType); } inline GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } GrColor color() const { return fColor; } - bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } const SkMatrix& viewMatrix() const { return fViewMatrix; } virtual void getGLProcessorKey(const GrBatchTracker& bt, @@ -274,6 +267,8 @@ public: virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, const GrGLSLCaps&) const override; + void initBatchTracker(GrBatchTracker*, const GrPipelineInfo&) const override; + private: GrCubicEffect(GrColor, const SkMatrix& viewMatrix, GrPrimitiveEdgeType); diff --git a/src/gpu/effects/GrBitmapTextGeoProc.cpp b/src/gpu/effects/GrBitmapTextGeoProc.cpp index ad06792fb5..a7261c0549 100644 --- a/src/gpu/effects/GrBitmapTextGeoProc.cpp +++ b/src/gpu/effects/GrBitmapTextGeoProc.cpp @@ -15,6 +15,12 @@ #include "gl/GrGLGeometryProcessor.h" #include "gl/builders/GrGLProgramBuilder.h" +struct BitmapTextBatchTracker { + GrGPInput fInputColorType; + GrColor fColor; + bool fUsesLocalCoords; +}; + class GrGLBitmapTextGeoProc : public GrGLGeometryProcessor { public: GrGLBitmapTextGeoProc(const GrGeometryProcessor&, const GrBatchTracker&) @@ -22,6 +28,7 @@ public: void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ const GrBitmapTextGeoProc& cte = args.fGP.cast<GrBitmapTextGeoProc>(); + const BitmapTextBatchTracker& local = args.fBT.cast<BitmapTextBatchTracker>(); GrGLGPBuilder* pb = args.fPB; GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder(); @@ -43,13 +50,8 @@ public: } // Setup pass through color - if (!cte.colorIgnored()) { - if (cte.hasVertexColor()) { - pb->addPassThroughAttribute(cte.inColor(), args.fOutputColor); - } else { - this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); - } - } + this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, cte.inColor(), + &fColorUniform); // Setup position this->setupPosition(pb, gpArgs, cte.inPosition()->fName); @@ -77,12 +79,12 @@ public: virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& gp, const GrBatchTracker& bt) override { - const GrBitmapTextGeoProc& btgp = gp.cast<GrBitmapTextGeoProc>(); - if (btgp.color() != fColor && !btgp.hasVertexColor()) { + const BitmapTextBatchTracker& local = bt.cast<BitmapTextBatchTracker>(); + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; - GrColorToRGBAFloat(btgp.color(), c); + GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); - fColor = btgp.color(); + fColor = local.fColor; } } @@ -97,12 +99,16 @@ public: const GrBatchTracker& bt, const GrGLSLCaps&, GrProcessorKeyBuilder* b) { + const BitmapTextBatchTracker& local = bt.cast<BitmapTextBatchTracker>(); + // We have to put the optional vertex attribute as part of the key. See the comment + // on addVertexAttrib. + // TODO When we have deferred geometry we can fix this const GrBitmapTextGeoProc& gp = proc.cast<GrBitmapTextGeoProc>(); uint32_t key = 0; - key |= gp.usesLocalCoords() && gp.localMatrix().hasPerspective() ? 0x1 : 0x0; - key |= gp.colorIgnored() ? 0x2 : 0x0; - key |= gp.maskFormat() << 3; - b->add32(key); + key |= SkToBool(gp.inColor()) ? 0x1 : 0x0; + key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x2 : 0x0; + key |= gp.maskFormat() == kARGB_GrMaskFormat ? 0x4 : 0x0; + b->add32(local.fInputColorType << 16 | key); } private: @@ -116,18 +122,15 @@ private: GrBitmapTextGeoProc::GrBitmapTextGeoProc(GrColor color, GrTexture* texture, const GrTextureParams& params, GrMaskFormat format, - const SkMatrix& localMatrix, bool usesLocalCoords) + const SkMatrix& localMatrix) : fColor(color) , fLocalMatrix(localMatrix) - , fUsesLocalCoords(usesLocalCoords) , fTextureAccess(texture, params) , fInColor(NULL) , fMaskFormat(format) { this->initClassID<GrBitmapTextGeoProc>(); fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); - // TODO we could think about removing this attribute if color is ignored, but unfortunately - // we don't do text positioning in batch, so we can't quite do that yet. bool hasVertexColor = kA8_GrMaskFormat == fMaskFormat; if (hasVertexColor) { fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType)); @@ -149,6 +152,13 @@ GrBitmapTextGeoProc::createGLInstance(const GrBatchTracker& bt, return SkNEW_ARGS(GrGLBitmapTextGeoProc, (*this, bt)); } +void GrBitmapTextGeoProc::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const { + BitmapTextBatchTracker* local = bt->cast<BitmapTextBatchTracker>(); + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, + SkToBool(fInColor)); + local->fUsesLocalCoords = init.fUsesLocalCoords; +} + /////////////////////////////////////////////////////////////////////////////// GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrBitmapTextGeoProc); @@ -187,5 +197,5 @@ GrGeometryProcessor* GrBitmapTextGeoProc::TestCreate(SkRandom* random, } return GrBitmapTextGeoProc::Create(GrRandomColor(random), textures[texIdx], params, - format, GrTest::TestMatrix(random), random->nextBool()); + format, GrTest::TestMatrix(random)); } diff --git a/src/gpu/effects/GrBitmapTextGeoProc.h b/src/gpu/effects/GrBitmapTextGeoProc.h index 2bd2726814..837dcb6fe5 100644 --- a/src/gpu/effects/GrBitmapTextGeoProc.h +++ b/src/gpu/effects/GrBitmapTextGeoProc.h @@ -22,10 +22,9 @@ class GrInvariantOutput; class GrBitmapTextGeoProc : public GrGeometryProcessor { public: static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& p, - GrMaskFormat format, const SkMatrix& localMatrix, - bool usesLocalCoords) { - return SkNEW_ARGS(GrBitmapTextGeoProc, (color, tex, p, format, localMatrix, - usesLocalCoords)); + GrMaskFormat format, + const SkMatrix& localMatrix) { + return SkNEW_ARGS(GrBitmapTextGeoProc, (color, tex, p, format, localMatrix)); } virtual ~GrBitmapTextGeoProc() {} @@ -37,10 +36,7 @@ public: const Attribute* inTextureCoords() const { return fInTextureCoords; } GrMaskFormat maskFormat() const { return fMaskFormat; } GrColor color() const { return fColor; } - bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } - bool hasVertexColor() const { return SkToBool(fInColor); } const SkMatrix& localMatrix() const { return fLocalMatrix; } - bool usesLocalCoords() const { return fUsesLocalCoords; } virtual void getGLProcessorKey(const GrBatchTracker& bt, const GrGLSLCaps& caps, @@ -49,13 +45,14 @@ public: virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, const GrGLSLCaps& caps) const override; + void initBatchTracker(GrBatchTracker*, const GrPipelineInfo&) const override; + private: GrBitmapTextGeoProc(GrColor, GrTexture* texture, const GrTextureParams& params, - GrMaskFormat format, const SkMatrix& localMatrix, bool usesLocalCoords); + GrMaskFormat format, const SkMatrix& localMatrix); GrColor fColor; SkMatrix fLocalMatrix; - bool fUsesLocalCoords; GrTextureAccess fTextureAccess; const Attribute* fInPosition; const Attribute* fInColor; diff --git a/src/gpu/effects/GrDashingEffect.cpp b/src/gpu/effects/GrDashingEffect.cpp index 8e942a1dfd..1d873de749 100644 --- a/src/gpu/effects/GrDashingEffect.cpp +++ b/src/gpu/effects/GrDashingEffect.cpp @@ -241,8 +241,7 @@ static void setup_dashed_rect_pos(const SkRect& rect, int idx, const SkMatrix& m static GrGeometryProcessor* create_dash_gp(GrColor, DashAAMode aaMode, DashCap cap, - const SkMatrix& localMatrix, - bool usesLocalCoords); + const SkMatrix& localMatrix); class DashBatch : public GrBatch { public: @@ -316,20 +315,25 @@ public: bool isRoundCap = SkPaint::kRound_Cap == cap; DashCap capType = isRoundCap ? kRound_DashCap : kNonRound_DashCap; if (this->fullDash()) { - gp.reset(create_dash_gp(this->color(), this->aaMode(), capType, invert, - this->usesLocalCoords())); + gp.reset(create_dash_gp(this->color(), this->aaMode(), capType, invert)); } else { // Set up the vertex data for the line and start/end dashes gp.reset(GrDefaultGeoProcFactory::Create(GrDefaultGeoProcFactory::kPosition_GPType, this->color(), - this->usesLocalCoords(), - this->coverageIgnored(), SkMatrix::I(), invert)); } batchTarget->initDraw(gp, pipeline); + // TODO remove this when batch is everywhere + GrPipelineInfo init; + init.fColorIgnored = fBatch.fColorIgnored; + init.fOverrideColor = GrColor_ILLEGAL; + init.fCoverageIgnored = fBatch.fCoverageIgnored; + init.fUsesLocalCoords = this->usesLocalCoords(); + gp->initBatchTracker(batchTarget->currentBatchTracker(), init); + // useAA here means Edge AA or MSAA bool useAA = this->aaMode() != kBW_DashAAMode; bool fullDash = this->fullDash(); @@ -657,7 +661,6 @@ private: DashAAMode aaMode() const { return fBatch.fAAMode; } bool fullDash() const { return fBatch.fFullDash; } SkPaint::Cap cap() const { return fBatch.fCap; } - bool coverageIgnored() const { return fBatch.fCoverageIgnored; } struct BatchTracker { GrColor fColor; @@ -747,6 +750,12 @@ bool GrDashingEffect::DrawDashLine(GrDrawTarget* target, class GLDashingCircleEffect; +struct DashingCircleBatchTracker { + GrGPInput fInputColorType; + GrColor fColor; + bool fUsesLocalCoords; +}; + /* * This effect will draw a dotted line (defined as a dashed lined with round caps and no on * interval). The radius of the dots is given by the strokeWidth and the spacing by the DashInfo. @@ -762,8 +771,7 @@ public: static GrGeometryProcessor* Create(GrColor, DashAAMode aaMode, - const SkMatrix& localMatrix, - bool usesLocalCoords); + const SkMatrix& localMatrix); const char* name() const override { return "DashingCircleEffect"; } @@ -777,12 +785,8 @@ public: GrColor color() const { return fColor; } - bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } - const SkMatrix& localMatrix() const { return fLocalMatrix; } - bool usesLocalCoords() const { return fUsesLocalCoords; } - virtual void getGLProcessorKey(const GrBatchTracker&, const GrGLSLCaps&, GrProcessorKeyBuilder* b) const override; @@ -790,13 +794,13 @@ public: virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker&, const GrGLSLCaps&) const override; + void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override; + private: - DashingCircleEffect(GrColor, DashAAMode aaMode, const SkMatrix& localMatrix, - bool usesLocalCoords); + DashingCircleEffect(GrColor, DashAAMode aaMode, const SkMatrix& localMatrix); GrColor fColor; SkMatrix fLocalMatrix; - bool fUsesLocalCoords; DashAAMode fAAMode; const Attribute* fInPosition; const Attribute* fInDashParams; @@ -851,6 +855,7 @@ GLDashingCircleEffect::GLDashingCircleEffect(const GrGeometryProcessor&, void GLDashingCircleEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { const DashingCircleEffect& dce = args.fGP.cast<DashingCircleEffect>(); + const DashingCircleBatchTracker local = args.fBT.cast<DashingCircleBatchTracker>(); GrGLGPBuilder* pb = args.fPB; GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); @@ -868,9 +873,7 @@ void GLDashingCircleEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { vsBuilder->codeAppendf("%s = %s;", circleParams.vsOut(), dce.inCircleParams()->fName); // Setup pass through color - if (!dce.colorIgnored()) { - this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); - } + this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, &fColorUniform); // Setup position this->setupPosition(pb, gpArgs, dce.inPosition()->fName); @@ -901,12 +904,12 @@ void GLDashingCircleEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& processor, const GrBatchTracker& bt) { - const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); - if (dce.color() != fColor) { + const DashingCircleBatchTracker& local = bt.cast<DashingCircleBatchTracker>(); + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; - GrColorToRGBAFloat(dce.color(), c); + GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); - fColor = dce.color(); + fColor = local.fColor; } } @@ -914,21 +917,20 @@ void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& gp, const GrBatchTracker& bt, const GrGLSLCaps&, GrProcessorKeyBuilder* b) { + const DashingCircleBatchTracker& local = bt.cast<DashingCircleBatchTracker>(); const DashingCircleEffect& dce = gp.cast<DashingCircleEffect>(); uint32_t key = 0; - key |= dce.usesLocalCoords() && dce.localMatrix().hasPerspective() ? 0x1 : 0x0; - key |= dce.colorIgnored() ? 0x2 : 0x0; + key |= local.fUsesLocalCoords && dce.localMatrix().hasPerspective() ? 0x1 : 0x0; key |= dce.aaMode() << 8; - b->add32(key); + b->add32(key << 16 | local.fInputColorType); } ////////////////////////////////////////////////////////////////////////////// GrGeometryProcessor* DashingCircleEffect::Create(GrColor color, DashAAMode aaMode, - const SkMatrix& localMatrix, - bool usesLocalCoords) { - return SkNEW_ARGS(DashingCircleEffect, (color, aaMode, localMatrix, usesLocalCoords)); + const SkMatrix& localMatrix) { + return SkNEW_ARGS(DashingCircleEffect, (color, aaMode, localMatrix)); } void DashingCircleEffect::getGLProcessorKey(const GrBatchTracker& bt, @@ -944,11 +946,9 @@ GrGLPrimitiveProcessor* DashingCircleEffect::createGLInstance(const GrBatchTrack DashingCircleEffect::DashingCircleEffect(GrColor color, DashAAMode aaMode, - const SkMatrix& localMatrix, - bool usesLocalCoords) + const SkMatrix& localMatrix) : fColor(color) , fLocalMatrix(localMatrix) - , fUsesLocalCoords(usesLocalCoords) , fAAMode(aaMode) { this->initClassID<DashingCircleEffect>(); fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); @@ -957,6 +957,12 @@ DashingCircleEffect::DashingCircleEffect(GrColor color, kVec2f_GrVertexAttribType)); } +void DashingCircleEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const { + DashingCircleBatchTracker* local = bt->cast<DashingCircleBatchTracker>(); + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); + local->fUsesLocalCoords = init.fUsesLocalCoords; +} + GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingCircleEffect); GrGeometryProcessor* DashingCircleEffect::TestCreate(SkRandom* random, @@ -965,14 +971,19 @@ GrGeometryProcessor* DashingCircleEffect::TestCreate(SkRandom* random, GrTexture*[]) { DashAAMode aaMode = static_cast<DashAAMode>(random->nextULessThan(kDashAAModeCount)); return DashingCircleEffect::Create(GrRandomColor(random), - aaMode, GrTest::TestMatrix(random), - random->nextBool()); + aaMode, GrTest::TestMatrix(random)); } ////////////////////////////////////////////////////////////////////////////// class GLDashingLineEffect; +struct DashingLineBatchTracker { + GrGPInput fInputColorType; + GrColor fColor; + bool fUsesLocalCoords; +}; + /* * This effect will draw a dashed line. The width of the dash is given by the strokeWidth and the * length and spacing by the DashInfo. Both of the previous two parameters are in device space. @@ -988,8 +999,7 @@ public: static GrGeometryProcessor* Create(GrColor, DashAAMode aaMode, - const SkMatrix& localMatrix, - bool usesLocalCoords); + const SkMatrix& localMatrix); const char* name() const override { return "DashingEffect"; } @@ -1003,12 +1013,8 @@ public: GrColor color() const { return fColor; } - bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } - const SkMatrix& localMatrix() const { return fLocalMatrix; } - bool usesLocalCoords() const { return fUsesLocalCoords; } - virtual void getGLProcessorKey(const GrBatchTracker& bt, const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override; @@ -1016,13 +1022,13 @@ public: virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, const GrGLSLCaps&) const override; + void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override; + private: - DashingLineEffect(GrColor, DashAAMode aaMode, const SkMatrix& localMatrix, - bool usesLocalCoords); + DashingLineEffect(GrColor, DashAAMode aaMode, const SkMatrix& localMatrix); GrColor fColor; SkMatrix fLocalMatrix; - bool fUsesLocalCoords; DashAAMode fAAMode; const Attribute* fInPosition; const Attribute* fInDashParams; @@ -1070,6 +1076,7 @@ GLDashingLineEffect::GLDashingLineEffect(const GrGeometryProcessor&, void GLDashingLineEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { const DashingLineEffect& de = args.fGP.cast<DashingLineEffect>(); + const DashingLineBatchTracker& local = args.fBT.cast<DashingLineBatchTracker>(); GrGLGPBuilder* pb = args.fPB; GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); @@ -1089,10 +1096,7 @@ void GLDashingLineEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { vsBuilder->codeAppendf("%s = %s;", inRectParams.vsOut(), de.inRectParams()->fName); // Setup pass through color - if (!de.colorIgnored()) { - this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); - } - + this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, &fColorUniform); // Setup position this->setupPosition(pb, gpArgs, de.inPosition()->fName); @@ -1140,12 +1144,12 @@ void GLDashingLineEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& processor, const GrBatchTracker& bt) { - const DashingLineEffect& de = processor.cast<DashingLineEffect>(); - if (de.color() != fColor) { + const DashingLineBatchTracker& local = bt.cast<DashingLineBatchTracker>(); + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; - GrColorToRGBAFloat(de.color(), c); + GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); - fColor = de.color(); + fColor = local.fColor; } } @@ -1153,21 +1157,20 @@ void GLDashingLineEffect::GenKey(const GrGeometryProcessor& gp, const GrBatchTracker& bt, const GrGLSLCaps&, GrProcessorKeyBuilder* b) { + const DashingLineBatchTracker& local = bt.cast<DashingLineBatchTracker>(); const DashingLineEffect& de = gp.cast<DashingLineEffect>(); uint32_t key = 0; - key |= de.usesLocalCoords() && de.localMatrix().hasPerspective() ? 0x1 : 0x0; - key |= de.colorIgnored() ? 0x2 : 0x0; + key |= local.fUsesLocalCoords && de.localMatrix().hasPerspective() ? 0x1 : 0x0; key |= de.aaMode() << 8; - b->add32(key); + b->add32(key << 16 | local.fInputColorType); } ////////////////////////////////////////////////////////////////////////////// GrGeometryProcessor* DashingLineEffect::Create(GrColor color, DashAAMode aaMode, - const SkMatrix& localMatrix, - bool usesLocalCoords) { - return SkNEW_ARGS(DashingLineEffect, (color, aaMode, localMatrix, usesLocalCoords)); + const SkMatrix& localMatrix) { + return SkNEW_ARGS(DashingLineEffect, (color, aaMode, localMatrix)); } void DashingLineEffect::getGLProcessorKey(const GrBatchTracker& bt, @@ -1183,11 +1186,9 @@ GrGLPrimitiveProcessor* DashingLineEffect::createGLInstance(const GrBatchTracker DashingLineEffect::DashingLineEffect(GrColor color, DashAAMode aaMode, - const SkMatrix& localMatrix, - bool usesLocalCoords) + const SkMatrix& localMatrix) : fColor(color) , fLocalMatrix(localMatrix) - , fUsesLocalCoords(usesLocalCoords) , fAAMode(aaMode) { this->initClassID<DashingLineEffect>(); fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); @@ -1195,6 +1196,12 @@ DashingLineEffect::DashingLineEffect(GrColor color, fInRectParams = &this->addVertexAttrib(Attribute("inRect", kVec4f_GrVertexAttribType)); } +void DashingLineEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const { + DashingLineBatchTracker* local = bt->cast<DashingLineBatchTracker>(); + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); + local->fUsesLocalCoords = init.fUsesLocalCoords; +} + GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingLineEffect); GrGeometryProcessor* DashingLineEffect::TestCreate(SkRandom* random, @@ -1203,7 +1210,7 @@ GrGeometryProcessor* DashingLineEffect::TestCreate(SkRandom* random, GrTexture*[]) { DashAAMode aaMode = static_cast<DashAAMode>(random->nextULessThan(kDashAAModeCount)); return DashingLineEffect::Create(GrRandomColor(random), - aaMode, GrTest::TestMatrix(random), random->nextBool()); + aaMode, GrTest::TestMatrix(random)); } ////////////////////////////////////////////////////////////////////////////// @@ -1211,13 +1218,12 @@ GrGeometryProcessor* DashingLineEffect::TestCreate(SkRandom* random, static GrGeometryProcessor* create_dash_gp(GrColor color, DashAAMode dashAAMode, DashCap cap, - const SkMatrix& localMatrix, - bool usesLocalCoords) { + const SkMatrix& localMatrix) { switch (cap) { case kRound_DashCap: - return DashingCircleEffect::Create(color, dashAAMode, localMatrix, usesLocalCoords); + return DashingCircleEffect::Create(color, dashAAMode, localMatrix); case kNonRound_DashCap: - return DashingLineEffect::Create(color, dashAAMode, localMatrix, usesLocalCoords); + return DashingLineEffect::Create(color, dashAAMode, localMatrix); default: SkFAIL("Unexpected dashed cap."); } diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp index 09228e505a..ba42bb44f1 100755 --- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp +++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp @@ -21,6 +21,12 @@ // Assuming a radius of a little less than the diagonal of the fragment #define SK_DistanceFieldAAFactor "0.65" +struct DistanceFieldBatchTracker { + GrGPInput fInputColorType; + GrColor fColor; + bool fUsesLocalCoords; +}; + class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { public: GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&, @@ -34,6 +40,7 @@ public: void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ const GrDistanceFieldA8TextGeoProc& dfTexEffect = args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); + const DistanceFieldBatchTracker& local = args.fBT.cast<DistanceFieldBatchTracker>(); GrGLGPBuilder* pb = args.fPB; GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); SkAssertResult(fsBuilder->enableFeature( @@ -54,13 +61,8 @@ public: #endif // Setup pass through color - if (!dfTexEffect.colorIgnored()) { - if (dfTexEffect.hasVertexColor()) { - pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor); - } else { - this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); - } - } + this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, + dfTexEffect.inColor(), &fColorUniform); // Setup position this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEffect.viewMatrix()); @@ -152,11 +154,12 @@ public: const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8TextGeoProc>(); this->setUniformViewMatrix(pdman, dfa8gp.viewMatrix()); - if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { + const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTracker>(); + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; - GrColorToRGBAFloat(dfa8gp.color(), c); + GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); - fColor = dfa8gp.color(); + fColor = local.fColor; } } @@ -165,9 +168,9 @@ public: const GrGLSLCaps&, GrProcessorKeyBuilder* b) { const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFieldA8TextGeoProc>(); + const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTracker>(); uint32_t key = dfTexEffect.getFlags(); - key |= dfTexEffect.hasVertexColor() << 16; - key |= dfTexEffect.colorIgnored() << 17; + key |= local.fInputColorType << 16; key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; b->add32(key); } @@ -192,8 +195,7 @@ GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc(GrColor color, #ifdef SK_GAMMA_APPLY_TO_A8 float distanceAdjust, #endif - uint32_t flags, - bool usesLocalCoords) + uint32_t flags) : fColor(color) , fViewMatrix(viewMatrix) , fTextureAccess(texture, params) @@ -201,8 +203,7 @@ GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc(GrColor color, , fDistanceAdjust(distanceAdjust) #endif , fFlags(flags & kNonLCD_DistanceFieldEffectMask) - , fInColor(NULL) - , fUsesLocalCoords(usesLocalCoords) { + , fInColor(NULL) { SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); this->initClassID<GrDistanceFieldA8TextGeoProc>(); fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); @@ -226,6 +227,14 @@ GrDistanceFieldA8TextGeoProc::createGLInstance(const GrBatchTracker& bt, return SkNEW_ARGS(GrGLDistanceFieldA8TextGeoProc, (*this, bt)); } +void GrDistanceFieldA8TextGeoProc::initBatchTracker(GrBatchTracker* bt, + const GrPipelineInfo& init) const { + DistanceFieldBatchTracker* local = bt->cast<DistanceFieldBatchTracker>(); + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, + SkToBool(fInColor)); + local->fUsesLocalCoords = init.fUsesLocalCoords; +} + /////////////////////////////////////////////////////////////////////////////// GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc); @@ -255,12 +264,17 @@ GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(SkRandom* random, random->nextF(), #endif random->nextBool() ? - kSimilarity_DistanceFieldEffectFlag : 0, - random->nextBool()); + kSimilarity_DistanceFieldEffectFlag : 0); } /////////////////////////////////////////////////////////////////////////////// +struct DistanceFieldPathBatchTracker { + GrGPInput fInputColorType; + GrColor fColor; + bool fUsesLocalCoords; +}; + class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { public: GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&, @@ -270,6 +284,7 @@ public: void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistanceFieldPathGeoProc>(); + const DistanceFieldPathBatchTracker& local = args.fBT.cast<DistanceFieldPathBatchTracker>(); GrGLGPBuilder* pb = args.fPB; GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); SkAssertResult(fsBuilder->enableFeature( @@ -284,13 +299,9 @@ public: args.fPB->addVarying("TextureCoords", &v, kHigh_GrSLPrecision); // setup pass through color - if (!dfTexEffect.colorIgnored()) { - if (dfTexEffect.hasVertexColor()) { - pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor); - } else { - this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); - } - } + this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, + dfTexEffect.inColor(), &fColorUniform); + vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoords()->fName); // Setup position @@ -373,11 +384,12 @@ public: const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathGeoProc>(); this->setUniformViewMatrix(pdman, dfpgp.viewMatrix()); - if (dfpgp.color() != fColor) { + const DistanceFieldPathBatchTracker& local = bt.cast<DistanceFieldPathBatchTracker>(); + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; - GrColorToRGBAFloat(dfpgp.color(), c); + GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); - fColor = dfpgp.color(); + fColor = local.fColor; } } @@ -387,9 +399,9 @@ public: GrProcessorKeyBuilder* b) { const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldPathGeoProc>(); + const DistanceFieldPathBatchTracker& local = bt.cast<DistanceFieldPathBatchTracker>(); uint32_t key = dfTexEffect.getFlags(); - key |= dfTexEffect.colorIgnored() << 16; - key |= dfTexEffect.hasVertexColor() << 17; + key |= local.fInputColorType << 16; key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; b->add32(key); } @@ -410,14 +422,12 @@ GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( const SkMatrix& viewMatrix, GrTexture* texture, const GrTextureParams& params, - uint32_t flags, - bool usesLocalCoords) + uint32_t flags) : fColor(color) , fViewMatrix(viewMatrix) , fTextureAccess(texture, params) , fFlags(flags & kNonLCD_DistanceFieldEffectMask) - , fInColor(NULL) - , fUsesLocalCoords(usesLocalCoords) { + , fInColor(NULL) { SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); this->initClassID<GrDistanceFieldPathGeoProc>(); fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); @@ -425,7 +435,7 @@ GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType)); } fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", - kVec2f_GrVertexAttribType)); + kVec2f_GrVertexAttribType)); this->addTextureAccess(&fTextureAccess); } @@ -440,6 +450,14 @@ GrDistanceFieldPathGeoProc::createGLInstance(const GrBatchTracker& bt, const GrG return SkNEW_ARGS(GrGLDistanceFieldPathGeoProc, (*this, bt)); } +void GrDistanceFieldPathGeoProc::initBatchTracker(GrBatchTracker* bt, + const GrPipelineInfo& init) const { + DistanceFieldPathBatchTracker* local = bt->cast<DistanceFieldPathBatchTracker>(); + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, + SkToBool(fInColor)); + local->fUsesLocalCoords = init.fUsesLocalCoords; +} + /////////////////////////////////////////////////////////////////////////////// GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc); @@ -466,13 +484,17 @@ GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(SkRandom* random, GrTest::TestMatrix(random), textures[texIdx], params, - random->nextBool() ? - kSimilarity_DistanceFieldEffectFlag : 0, - random->nextBool()); + random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0); } /////////////////////////////////////////////////////////////////////////////// +struct DistanceFieldLCDBatchTracker { + GrGPInput fInputColorType; + GrColor fColor; + bool fUsesLocalCoords; +}; + class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { public: GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTracker&) @@ -483,6 +505,7 @@ public: void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ const GrDistanceFieldLCDTextGeoProc& dfTexEffect = args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); + const DistanceFieldLCDBatchTracker& local = args.fBT.cast<DistanceFieldLCDBatchTracker>(); GrGLGPBuilder* pb = args.fPB; GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); @@ -491,9 +514,8 @@ public: vsBuilder->emitAttributes(dfTexEffect); // setup pass through color - if (!dfTexEffect.colorIgnored()) { - this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); - } + this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, + &fColorUniform); // Setup position this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEffect.viewMatrix()); @@ -630,11 +652,12 @@ public: this->setUniformViewMatrix(pdman, dfTexEffect.viewMatrix()); - if (dfTexEffect.color() != fColor) { + const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatchTracker>(); + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; - GrColorToRGBAFloat(dfTexEffect.color(), c); + GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); - fColor = dfTexEffect.color(); + fColor = local.fColor; } } @@ -644,8 +667,9 @@ public: GrProcessorKeyBuilder* b) { const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFieldLCDTextGeoProc>(); + const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatchTracker>(); uint32_t key = dfTexEffect.getFlags(); - key |= dfTexEffect.colorIgnored() << 16; + key |= local.fInputColorType << 16; key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; b->add32(key); } @@ -665,18 +689,17 @@ GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( GrColor color, const SkMatrix& viewMatrix, GrTexture* texture, const GrTextureParams& params, DistanceAdjust distanceAdjust, - uint32_t flags, bool usesLocalCoords) + uint32_t flags) : fColor(color) , fViewMatrix(viewMatrix) , fTextureAccess(texture, params) , fDistanceAdjust(distanceAdjust) - , fFlags(flags & kLCD_DistanceFieldEffectMask) - , fUsesLocalCoords(usesLocalCoords) { + , fFlags(flags & kLCD_DistanceFieldEffectMask){ SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_DistanceFieldEffectFlag)); this->initClassID<GrDistanceFieldLCDTextGeoProc>(); fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", - kVec2s_GrVertexAttribType)); + kVec2s_GrVertexAttribType)); this->addTextureAccess(&fTextureAccess); } @@ -692,6 +715,13 @@ GrDistanceFieldLCDTextGeoProc::createGLInstance(const GrBatchTracker& bt, return SkNEW_ARGS(GrGLDistanceFieldLCDTextGeoProc, (*this, bt)); } +void GrDistanceFieldLCDTextGeoProc::initBatchTracker(GrBatchTracker* bt, + const GrPipelineInfo& init) const { + DistanceFieldLCDBatchTracker* local = bt->cast<DistanceFieldLCDBatchTracker>(); + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); + local->fUsesLocalCoords = init.fUsesLocalCoords; +} + /////////////////////////////////////////////////////////////////////////////// GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc); @@ -721,6 +751,5 @@ GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(SkRandom* random, GrTest::TestMatrix(random), textures[texIdx], params, wa, - flags, - random->nextBool()); + flags); } diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.h b/src/gpu/effects/GrDistanceFieldGeoProc.h index 42c397dd6c..ec661cedb8 100644 --- a/src/gpu/effects/GrDistanceFieldGeoProc.h +++ b/src/gpu/effects/GrDistanceFieldGeoProc.h @@ -49,16 +49,15 @@ public: #ifdef SK_GAMMA_APPLY_TO_A8 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, GrTexture* tex, const GrTextureParams& params, - float lum, uint32_t flags, bool usesLocalCoords) { + float lum, uint32_t flags) { return SkNEW_ARGS(GrDistanceFieldA8TextGeoProc, (color, viewMatrix, tex, params, lum, - flags, usesLocalCoords)); + flags)); } #else static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, GrTexture* tex, const GrTextureParams& params, - uint32_t flags, bool usesLocalCoords) { - return SkNEW_ARGS(GrDistanceFieldA8TextGeoProc, (color, viewMatrix, tex, params, flags, - usesLocalCoords)); + uint32_t flags) { + return SkNEW_ARGS(GrDistanceFieldA8TextGeoProc, (color, viewMatrix, tex, params, flags)); } #endif @@ -70,10 +69,7 @@ public: const Attribute* inColor() const { return fInColor; } const Attribute* inTextureCoords() const { return fInTextureCoords; } GrColor color() const { return fColor; } - bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } - bool hasVertexColor() const { return SkToBool(fInColor); } const SkMatrix& viewMatrix() const { return fViewMatrix; } - bool usesLocalCoords() const { return fUsesLocalCoords; } #ifdef SK_GAMMA_APPLY_TO_A8 float getDistanceAdjust() const { return fDistanceAdjust; } #endif @@ -86,13 +82,15 @@ public: virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, const GrGLSLCaps&) const override; + void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override; + private: GrDistanceFieldA8TextGeoProc(GrColor, const SkMatrix& viewMatrix, GrTexture* texture, const GrTextureParams& params, #ifdef SK_GAMMA_APPLY_TO_A8 float distanceAdjust, #endif - uint32_t flags, bool usesLocalCoords); + uint32_t flags); GrColor fColor; SkMatrix fViewMatrix; @@ -104,7 +102,6 @@ private: const Attribute* fInPosition; const Attribute* fInColor; const Attribute* fInTextureCoords; - bool fUsesLocalCoords; GR_DECLARE_GEOMETRY_PROCESSOR_TEST; @@ -122,9 +119,8 @@ class GrDistanceFieldPathGeoProc : public GrGeometryProcessor { public: static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, GrTexture* tex, const GrTextureParams& params, - uint32_t flags, bool usesLocalCoords) { - return SkNEW_ARGS(GrDistanceFieldPathGeoProc, (color, viewMatrix, tex, params, flags, - usesLocalCoords)); + uint32_t flags) { + return SkNEW_ARGS(GrDistanceFieldPathGeoProc, (color, viewMatrix, tex, params, flags)); } virtual ~GrDistanceFieldPathGeoProc() {} @@ -135,11 +131,8 @@ public: const Attribute* inColor() const { return fInColor; } const Attribute* inTextureCoords() const { return fInTextureCoords; } GrColor color() const { return fColor; } - bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } - bool hasVertexColor() const { return SkToBool(fInColor); } const SkMatrix& viewMatrix() const { return fViewMatrix; } uint32_t getFlags() const { return fFlags; } - bool usesLocalCoords() const { return fUsesLocalCoords; } virtual void getGLProcessorKey(const GrBatchTracker& bt, const GrGLSLCaps& caps, @@ -148,10 +141,11 @@ public: virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, const GrGLSLCaps&) const override; + void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override; + private: GrDistanceFieldPathGeoProc(GrColor, const SkMatrix& viewMatrix, GrTexture* texture, - const GrTextureParams& params, uint32_t flags, - bool usesLocalCoords); + const GrTextureParams& params, uint32_t flags); GrColor fColor; SkMatrix fViewMatrix; @@ -160,7 +154,6 @@ private: const Attribute* fInPosition; const Attribute* fInColor; const Attribute* fInTextureCoords; - bool fUsesLocalCoords; GR_DECLARE_GEOMETRY_PROCESSOR_TEST; @@ -192,10 +185,9 @@ public: static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, GrTexture* tex, const GrTextureParams& params, - DistanceAdjust distanceAdjust, uint32_t flags, - bool usesLocalCoords) { + DistanceAdjust distanceAdjust, uint32_t flags) { return SkNEW_ARGS(GrDistanceFieldLCDTextGeoProc, - (color, viewMatrix, tex, params, distanceAdjust, flags, usesLocalCoords)); + (color, viewMatrix, tex, params, distanceAdjust, flags)); } virtual ~GrDistanceFieldLCDTextGeoProc() {} @@ -206,10 +198,8 @@ public: const Attribute* inTextureCoords() const { return fInTextureCoords; } DistanceAdjust getDistanceAdjust() const { return fDistanceAdjust; } GrColor color() const { return fColor; } - bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } const SkMatrix& viewMatrix() const { return fViewMatrix; } uint32_t getFlags() const { return fFlags; } - bool usesLocalCoords() const { return fUsesLocalCoords; } virtual void getGLProcessorKey(const GrBatchTracker& bt, const GrGLSLCaps& caps, @@ -218,11 +208,12 @@ public: virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, const GrGLSLCaps&) const override; + void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override; + private: GrDistanceFieldLCDTextGeoProc(GrColor, const SkMatrix& viewMatrix, GrTexture* texture, const GrTextureParams& params, - DistanceAdjust wa, uint32_t flags, - bool usesLocalCoords); + DistanceAdjust wa, uint32_t flags); GrColor fColor; SkMatrix fViewMatrix; @@ -231,7 +222,6 @@ private: uint32_t fFlags; const Attribute* fInPosition; const Attribute* fInTextureCoords; - bool fUsesLocalCoords; GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |