Index: src/gpu/effects/GrDashingEffect.cpp |
diff --git a/src/gpu/effects/GrDashingEffect.cpp b/src/gpu/effects/GrDashingEffect.cpp |
index 05aa277b5e74a99e00d61661dc7e38f3e073af3b..a79abbae239a67c1b6e7df2ff1b070d6967363d0 100644 |
--- a/src/gpu/effects/GrDashingEffect.cpp |
+++ b/src/gpu/effects/GrDashingEffect.cpp |
@@ -241,7 +241,8 @@ 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); |
+ const SkMatrix& localMatrix, |
+ bool usesLocalCoords); |
class DashBatch : public GrBatch { |
public: |
@@ -315,25 +316,20 @@ 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)); |
+ gp.reset(create_dash_gp(this->color(), this->aaMode(), capType, invert, |
+ this->usesLocalCoords())); |
} 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(); |
@@ -661,6 +657,7 @@ 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; |
@@ -750,12 +747,6 @@ 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. |
@@ -771,7 +762,8 @@ public: |
static GrGeometryProcessor* Create(GrColor, |
DashAAMode aaMode, |
- const SkMatrix& localMatrix); |
+ const SkMatrix& localMatrix, |
+ bool usesLocalCoords); |
const char* name() const override { return "DashingCircleEffect"; } |
@@ -785,8 +777,12 @@ 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; |
@@ -794,13 +790,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); |
+ DashingCircleEffect(GrColor, DashAAMode aaMode, const SkMatrix& localMatrix, |
+ bool usesLocalCoords); |
GrColor fColor; |
SkMatrix fLocalMatrix; |
+ bool fUsesLocalCoords; |
DashAAMode fAAMode; |
const Attribute* fInPosition; |
const Attribute* fInDashParams; |
@@ -855,7 +851,6 @@ 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(); |
@@ -873,7 +868,9 @@ void GLDashingCircleEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
vsBuilder->codeAppendf("%s = %s;", circleParams.vsOut(), dce.inCircleParams()->fName); |
// Setup pass through color |
- this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, &fColorUniform); |
+ if (!dce.colorIgnored()) { |
+ this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
+ } |
// Setup position |
this->setupPosition(pb, gpArgs, dce.inPosition()->fName); |
@@ -904,12 +901,12 @@ void GLDashingCircleEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman, |
const GrPrimitiveProcessor& processor, |
const GrBatchTracker& bt) { |
- const DashingCircleBatchTracker& local = bt.cast<DashingCircleBatchTracker>(); |
- if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
+ const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); |
+ if (dce.color() != fColor) { |
GrGLfloat c[4]; |
- GrColorToRGBAFloat(local.fColor, c); |
+ GrColorToRGBAFloat(dce.color(), c); |
pdman.set4fv(fColorUniform, 1, c); |
- fColor = local.fColor; |
+ fColor = dce.color(); |
} |
} |
@@ -917,20 +914,21 @@ 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 |= local.fUsesLocalCoords && dce.localMatrix().hasPerspective() ? 0x1 : 0x0; |
+ key |= dce.usesLocalCoords() && dce.localMatrix().hasPerspective() ? 0x1 : 0x0; |
+ key |= dce.colorIgnored() ? 0x2 : 0x0; |
key |= dce.aaMode() << 8; |
- b->add32(key << 16 | local.fInputColorType); |
+ b->add32(key); |
} |
////////////////////////////////////////////////////////////////////////////// |
GrGeometryProcessor* DashingCircleEffect::Create(GrColor color, |
DashAAMode aaMode, |
- const SkMatrix& localMatrix) { |
- return SkNEW_ARGS(DashingCircleEffect, (color, aaMode, localMatrix)); |
+ const SkMatrix& localMatrix, |
+ bool usesLocalCoords) { |
+ return SkNEW_ARGS(DashingCircleEffect, (color, aaMode, localMatrix, usesLocalCoords)); |
} |
void DashingCircleEffect::getGLProcessorKey(const GrBatchTracker& bt, |
@@ -946,9 +944,11 @@ GrGLPrimitiveProcessor* DashingCircleEffect::createGLInstance(const GrBatchTrack |
DashingCircleEffect::DashingCircleEffect(GrColor color, |
DashAAMode aaMode, |
- const SkMatrix& localMatrix) |
+ const SkMatrix& localMatrix, |
+ bool usesLocalCoords) |
: fColor(color) |
, fLocalMatrix(localMatrix) |
+ , fUsesLocalCoords(usesLocalCoords) |
, fAAMode(aaMode) { |
this->initClassID<DashingCircleEffect>(); |
fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); |
@@ -957,12 +957,6 @@ 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, |
@@ -971,19 +965,14 @@ GrGeometryProcessor* DashingCircleEffect::TestCreate(SkRandom* random, |
GrTexture*[]) { |
DashAAMode aaMode = static_cast<DashAAMode>(random->nextULessThan(kDashAAModeCount)); |
return DashingCircleEffect::Create(GrRandomColor(random), |
- aaMode, GrTest::TestMatrix(random)); |
+ aaMode, GrTest::TestMatrix(random), |
+ random->nextBool()); |
} |
////////////////////////////////////////////////////////////////////////////// |
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. |
@@ -999,7 +988,8 @@ public: |
static GrGeometryProcessor* Create(GrColor, |
DashAAMode aaMode, |
- const SkMatrix& localMatrix); |
+ const SkMatrix& localMatrix, |
+ bool usesLocalCoords); |
const char* name() const override { return "DashingEffect"; } |
@@ -1013,8 +1003,12 @@ 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; |
@@ -1022,13 +1016,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); |
+ DashingLineEffect(GrColor, DashAAMode aaMode, const SkMatrix& localMatrix, |
+ bool usesLocalCoords); |
GrColor fColor; |
SkMatrix fLocalMatrix; |
+ bool fUsesLocalCoords; |
DashAAMode fAAMode; |
const Attribute* fInPosition; |
const Attribute* fInDashParams; |
@@ -1076,7 +1070,6 @@ 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(); |
@@ -1096,7 +1089,10 @@ void GLDashingLineEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
vsBuilder->codeAppendf("%s = %s;", inRectParams.vsOut(), de.inRectParams()->fName); |
// Setup pass through color |
- this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, &fColorUniform); |
+ if (!de.colorIgnored()) { |
+ this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
+ } |
+ |
// Setup position |
this->setupPosition(pb, gpArgs, de.inPosition()->fName); |
@@ -1144,12 +1140,12 @@ void GLDashingLineEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman, |
const GrPrimitiveProcessor& processor, |
const GrBatchTracker& bt) { |
- const DashingLineBatchTracker& local = bt.cast<DashingLineBatchTracker>(); |
- if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
+ const DashingLineEffect& de = processor.cast<DashingLineEffect>(); |
+ if (de.color() != fColor) { |
GrGLfloat c[4]; |
- GrColorToRGBAFloat(local.fColor, c); |
+ GrColorToRGBAFloat(de.color(), c); |
pdman.set4fv(fColorUniform, 1, c); |
- fColor = local.fColor; |
+ fColor = de.color(); |
} |
} |
@@ -1157,20 +1153,21 @@ 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 |= local.fUsesLocalCoords && de.localMatrix().hasPerspective() ? 0x1 : 0x0; |
+ key |= de.usesLocalCoords() && de.localMatrix().hasPerspective() ? 0x1 : 0x0; |
+ key |= de.colorIgnored() ? 0x2 : 0x0; |
key |= de.aaMode() << 8; |
- b->add32(key << 16 | local.fInputColorType); |
+ b->add32(key); |
} |
////////////////////////////////////////////////////////////////////////////// |
GrGeometryProcessor* DashingLineEffect::Create(GrColor color, |
DashAAMode aaMode, |
- const SkMatrix& localMatrix) { |
- return SkNEW_ARGS(DashingLineEffect, (color, aaMode, localMatrix)); |
+ const SkMatrix& localMatrix, |
+ bool usesLocalCoords) { |
+ return SkNEW_ARGS(DashingLineEffect, (color, aaMode, localMatrix, usesLocalCoords)); |
} |
void DashingLineEffect::getGLProcessorKey(const GrBatchTracker& bt, |
@@ -1186,9 +1183,11 @@ GrGLPrimitiveProcessor* DashingLineEffect::createGLInstance(const GrBatchTracker |
DashingLineEffect::DashingLineEffect(GrColor color, |
DashAAMode aaMode, |
- const SkMatrix& localMatrix) |
+ const SkMatrix& localMatrix, |
+ bool usesLocalCoords) |
: fColor(color) |
, fLocalMatrix(localMatrix) |
+ , fUsesLocalCoords(usesLocalCoords) |
, fAAMode(aaMode) { |
this->initClassID<DashingLineEffect>(); |
fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); |
@@ -1196,12 +1195,6 @@ 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, |
@@ -1210,7 +1203,7 @@ GrGeometryProcessor* DashingLineEffect::TestCreate(SkRandom* random, |
GrTexture*[]) { |
DashAAMode aaMode = static_cast<DashAAMode>(random->nextULessThan(kDashAAModeCount)); |
return DashingLineEffect::Create(GrRandomColor(random), |
- aaMode, GrTest::TestMatrix(random)); |
+ aaMode, GrTest::TestMatrix(random), random->nextBool()); |
} |
////////////////////////////////////////////////////////////////////////////// |
@@ -1218,12 +1211,13 @@ GrGeometryProcessor* DashingLineEffect::TestCreate(SkRandom* random, |
static GrGeometryProcessor* create_dash_gp(GrColor color, |
DashAAMode dashAAMode, |
DashCap cap, |
- const SkMatrix& localMatrix) { |
+ const SkMatrix& localMatrix, |
+ bool usesLocalCoords) { |
switch (cap) { |
case kRound_DashCap: |
- return DashingCircleEffect::Create(color, dashAAMode, localMatrix); |
+ return DashingCircleEffect::Create(color, dashAAMode, localMatrix, usesLocalCoords); |
case kNonRound_DashCap: |
- return DashingLineEffect::Create(color, dashAAMode, localMatrix); |
+ return DashingLineEffect::Create(color, dashAAMode, localMatrix, usesLocalCoords); |
default: |
SkFAIL("Unexpected dashed cap."); |
} |