Index: src/gpu/GrOvalRenderer.cpp |
diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp |
index 0a7b3f89fce1f8c8976bbe1bb31bb32db1141ae2..69baebb22821155b1b311c5388102532112e2036 100644 |
--- a/src/gpu/GrOvalRenderer.cpp |
+++ b/src/gpu/GrOvalRenderer.cpp |
@@ -71,14 +71,17 @@ inline bool circle_stays_circle(const SkMatrix& m) { |
class CircleEdgeEffect : public GrGeometryProcessor { |
public: |
- static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatrix& localMatrix) { |
- return SkNEW_ARGS(CircleEdgeEffect, (color, stroke, localMatrix)); |
+ static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatrix& localMatrix, |
+ bool usesLocalCoords) { |
+ return SkNEW_ARGS(CircleEdgeEffect, (color, stroke, localMatrix, usesLocalCoords)); |
} |
const Attribute* inPosition() const { return fInPosition; } |
const Attribute* inCircleEdge() const { return fInCircleEdge; } |
GrColor color() const { return fColor; } |
+ bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } |
const SkMatrix& localMatrix() const { return fLocalMatrix; } |
+ bool usesLocalCoords() const { return fUsesLocalCoords; } |
virtual ~CircleEdgeEffect() {} |
const char* name() const override { return "CircleEdge"; } |
@@ -94,7 +97,6 @@ public: |
void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); |
GrGLGPBuilder* pb = args.fPB; |
- const BatchTracker& local = args.fBT.cast<BatchTracker>(); |
GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
// emit attributes |
@@ -104,9 +106,10 @@ public: |
args.fPB->addVarying("CircleEdge", &v); |
vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fName); |
- // Setup pass through color |
- this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, |
- &fColorUniform); |
+ // setup pass through color |
+ if (!ce.colorIgnored()) { |
+ this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
+ } |
// Setup position |
this->setupPosition(pb, gpArgs, ce.inPosition()->fName); |
@@ -131,22 +134,22 @@ public: |
const GrBatchTracker& bt, |
const GrGLSLCaps&, |
GrProcessorKeyBuilder* b) { |
- const BatchTracker& local = bt.cast<BatchTracker>(); |
const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>(); |
uint16_t key = ce.isStroked() ? 0x1 : 0x0; |
- key |= local.fUsesLocalCoords && ce.localMatrix().hasPerspective() ? 0x2 : 0x0; |
- b->add32(key << 16 | local.fInputColorType); |
+ key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x2 : 0x0; |
+ key |= ce.colorIgnored() ? 0x4 : 0x0; |
+ b->add32(key); |
} |
virtual void setData(const GrGLProgramDataManager& pdman, |
const GrPrimitiveProcessor& gp, |
const GrBatchTracker& bt) override { |
- const BatchTracker& local = bt.cast<BatchTracker>(); |
- if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
+ const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>(); |
+ if (ce.color() != fColor) { |
GrGLfloat c[4]; |
- GrColorToRGBAFloat(local.fColor, c); |
+ GrColorToRGBAFloat(ce.color(), c); |
pdman.set4fv(fColorUniform, 1, c); |
- fColor = local.fColor; |
+ fColor = ce.color(); |
} |
} |
@@ -174,16 +177,11 @@ public: |
return SkNEW_ARGS(GLProcessor, (*this, bt)); |
} |
- void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override { |
- BatchTracker* local = bt->cast<BatchTracker>(); |
- local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); |
- local->fUsesLocalCoords = init.fUsesLocalCoords; |
- } |
- |
private: |
- CircleEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix) |
+ CircleEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix, bool usesLocalCoords) |
: fColor(color) |
- , fLocalMatrix(localMatrix) { |
+ , fLocalMatrix(localMatrix) |
+ , fUsesLocalCoords(usesLocalCoords) { |
this->initClassID<CircleEdgeEffect>(); |
fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); |
fInCircleEdge = &this->addVertexAttrib(Attribute("inCircleEdge", |
@@ -191,17 +189,12 @@ private: |
fStroke = stroke; |
} |
- struct BatchTracker { |
- GrGPInput fInputColorType; |
- GrColor fColor; |
- bool fUsesLocalCoords; |
- }; |
- |
GrColor fColor; |
SkMatrix fLocalMatrix; |
const Attribute* fInPosition; |
const Attribute* fInCircleEdge; |
bool fStroke; |
+ bool fUsesLocalCoords; |
GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
@@ -216,7 +209,8 @@ GrGeometryProcessor* CircleEdgeEffect::TestCreate(SkRandom* random, |
GrTexture* textures[]) { |
return CircleEdgeEffect::Create(GrRandomColor(random), |
random->nextBool(), |
- GrTest::TestMatrix(random)); |
+ GrTest::TestMatrix(random), |
+ random->nextBool()); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -231,8 +225,9 @@ GrGeometryProcessor* CircleEdgeEffect::TestCreate(SkRandom* random, |
class EllipseEdgeEffect : public GrGeometryProcessor { |
public: |
- static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatrix& localMatrix) { |
- return SkNEW_ARGS(EllipseEdgeEffect, (color, stroke, localMatrix)); |
+ static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatrix& localMatrix, |
+ bool usesLocalCoords) { |
+ return SkNEW_ARGS(EllipseEdgeEffect, (color, stroke, localMatrix, usesLocalCoords)); |
} |
virtual ~EllipseEdgeEffect() {} |
@@ -243,7 +238,9 @@ public: |
const Attribute* inEllipseOffset() const { return fInEllipseOffset; } |
const Attribute* inEllipseRadii() const { return fInEllipseRadii; } |
GrColor color() const { return fColor; } |
+ bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } |
const SkMatrix& localMatrix() const { return fLocalMatrix; } |
+ bool usesLocalCoords() const { return fUsesLocalCoords; } |
inline bool isStroked() const { return fStroke; } |
@@ -256,7 +253,6 @@ public: |
void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); |
GrGLGPBuilder* pb = args.fPB; |
- const BatchTracker& local = args.fBT.cast<BatchTracker>(); |
GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
// emit attributes |
@@ -272,9 +268,10 @@ public: |
vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), |
ee.inEllipseRadii()->fName); |
- // Setup pass through color |
- this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, |
- &fColorUniform); |
+ // setup pass through color |
+ if (!ee.colorIgnored()) { |
+ this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
+ } |
// Setup position |
this->setupPosition(pb, gpArgs, ee.inPosition()->fName); |
@@ -314,23 +311,22 @@ public: |
const GrBatchTracker& bt, |
const GrGLSLCaps&, |
GrProcessorKeyBuilder* b) { |
- const BatchTracker& local = bt.cast<BatchTracker>(); |
const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>(); |
uint16_t key = ee.isStroked() ? 0x1 : 0x0; |
- key |= local.fUsesLocalCoords && ee.localMatrix().hasPerspective() ? 0x2 : 0x0; |
- b->add32(key << 16 | local.fInputColorType); |
+ key |= ee.usesLocalCoords() && ee.localMatrix().hasPerspective() ? 0x2 : 0x0; |
+ key |= ee.colorIgnored() ? 0x4 : 0x0; |
+ b->add32(key); |
} |
virtual void setData(const GrGLProgramDataManager& pdman, |
const GrPrimitiveProcessor& gp, |
const GrBatchTracker& bt) override { |
- |
- const BatchTracker& local = bt.cast<BatchTracker>(); |
- if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
+ const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>(); |
+ if (ee.color() != fColor) { |
GrGLfloat c[4]; |
- GrColorToRGBAFloat(local.fColor, c); |
+ GrColorToRGBAFloat(ee.color(), c); |
pdman.set4fv(fColorUniform, 1, c); |
- fColor = local.fColor; |
+ fColor = ee.color(); |
} |
} |
@@ -359,16 +355,12 @@ public: |
return SkNEW_ARGS(GLProcessor, (*this, bt)); |
} |
- void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override { |
- BatchTracker* local = bt->cast<BatchTracker>(); |
- local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); |
- local->fUsesLocalCoords = init.fUsesLocalCoords; |
- } |
- |
private: |
- EllipseEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix) |
+ EllipseEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix, |
+ bool usesLocalCoords) |
: fColor(color) |
- , fLocalMatrix(localMatrix) { |
+ , fLocalMatrix(localMatrix) |
+ , fUsesLocalCoords(usesLocalCoords) { |
this->initClassID<EllipseEdgeEffect>(); |
fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); |
fInEllipseOffset = &this->addVertexAttrib(Attribute("inEllipseOffset", |
@@ -378,18 +370,13 @@ private: |
fStroke = stroke; |
} |
- struct BatchTracker { |
- GrGPInput fInputColorType; |
- GrColor fColor; |
- bool fUsesLocalCoords; |
- }; |
- |
const Attribute* fInPosition; |
const Attribute* fInEllipseOffset; |
const Attribute* fInEllipseRadii; |
GrColor fColor; |
SkMatrix fLocalMatrix; |
bool fStroke; |
+ bool fUsesLocalCoords; |
GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
@@ -404,7 +391,8 @@ GrGeometryProcessor* EllipseEdgeEffect::TestCreate(SkRandom* random, |
GrTexture* textures[]) { |
return EllipseEdgeEffect::Create(GrRandomColor(random), |
random->nextBool(), |
- GrTest::TestMatrix(random)); |
+ GrTest::TestMatrix(random), |
+ random->nextBool()); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -422,8 +410,9 @@ class DIEllipseEdgeEffect : public GrGeometryProcessor { |
public: |
enum Mode { kStroke = 0, kHairline, kFill }; |
- static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, Mode mode) { |
- return SkNEW_ARGS(DIEllipseEdgeEffect, (color, viewMatrix, mode)); |
+ static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, Mode mode, |
+ bool usesLocalCoords) { |
+ return SkNEW_ARGS(DIEllipseEdgeEffect, (color, viewMatrix, mode, usesLocalCoords)); |
} |
virtual ~DIEllipseEdgeEffect() {} |
@@ -434,7 +423,9 @@ public: |
const Attribute* inEllipseOffsets0() const { return fInEllipseOffsets0; } |
const Attribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } |
GrColor color() const { return fColor; } |
+ bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } |
const SkMatrix& viewMatrix() const { return fViewMatrix; } |
+ bool usesLocalCoords() const { return fUsesLocalCoords; } |
inline Mode getMode() const { return fMode; } |
@@ -447,7 +438,6 @@ public: |
void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>(); |
GrGLGPBuilder* pb = args.fPB; |
- const BatchTracker& local = args.fBT.cast<BatchTracker>(); |
GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
// emit attributes |
@@ -463,9 +453,10 @@ public: |
vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), |
ee.inEllipseOffsets1()->fName); |
- // Setup pass through color |
- this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, |
- &fColorUniform); |
+ // setup pass through color |
+ if (!ee.colorIgnored()) { |
+ this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
+ } |
// Setup position |
this->setupPosition(pb, gpArgs, ee.inPosition()->fName, ee.viewMatrix()); |
@@ -519,11 +510,11 @@ public: |
const GrBatchTracker& bt, |
const GrGLSLCaps&, |
GrProcessorKeyBuilder* b) { |
- const BatchTracker& local = bt.cast<BatchTracker>(); |
const DIEllipseEdgeEffect& ellipseEffect = gp.cast<DIEllipseEdgeEffect>(); |
uint16_t key = ellipseEffect.getMode(); |
- key |= ComputePosKey(ellipseEffect.viewMatrix()) << 9; |
- b->add32(key << 16 | local.fInputColorType); |
+ key |= ellipseEffect.colorIgnored() << 9; |
+ key |= ComputePosKey(ellipseEffect.viewMatrix()) << 10; |
+ b->add32(key); |
} |
virtual void setData(const GrGLProgramDataManager& pdman, |
@@ -532,12 +523,11 @@ public: |
const DIEllipseEdgeEffect& dee = gp.cast<DIEllipseEdgeEffect>(); |
this->setUniformViewMatrix(pdman, dee.viewMatrix()); |
- const BatchTracker& local = bt.cast<BatchTracker>(); |
- if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
+ if (dee.color() != fColor) { |
GrGLfloat c[4]; |
- GrColorToRGBAFloat(local.fColor, c); |
+ GrColorToRGBAFloat(dee.color(), c); |
pdman.set4fv(fColorUniform, 1, c); |
- fColor = local.fColor; |
+ fColor = dee.color(); |
} |
} |
@@ -559,37 +549,28 @@ public: |
return SkNEW_ARGS(GLProcessor, (*this, bt)); |
} |
- void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override { |
- BatchTracker* local = bt->cast<BatchTracker>(); |
- local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); |
- local->fUsesLocalCoords = init.fUsesLocalCoords; |
- } |
- |
private: |
- DIEllipseEdgeEffect(GrColor color, const SkMatrix& viewMatrix, Mode mode) |
+ DIEllipseEdgeEffect(GrColor color, const SkMatrix& viewMatrix, Mode mode, |
+ bool usesLocalCoords) |
: fColor(color) |
- , fViewMatrix(viewMatrix) { |
+ , fViewMatrix(viewMatrix) |
+ , fUsesLocalCoords(usesLocalCoords) { |
this->initClassID<DIEllipseEdgeEffect>(); |
fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); |
fInEllipseOffsets0 = &this->addVertexAttrib(Attribute("inEllipseOffsets0", |
- kVec2f_GrVertexAttribType)); |
+ kVec2f_GrVertexAttribType)); |
fInEllipseOffsets1 = &this->addVertexAttrib(Attribute("inEllipseOffsets1", |
- kVec2f_GrVertexAttribType)); |
+ kVec2f_GrVertexAttribType)); |
fMode = mode; |
} |
- struct BatchTracker { |
- GrGPInput fInputColorType; |
- GrColor fColor; |
- bool fUsesLocalCoords; |
- }; |
- |
const Attribute* fInPosition; |
const Attribute* fInEllipseOffsets0; |
const Attribute* fInEllipseOffsets1; |
GrColor fColor; |
SkMatrix fViewMatrix; |
Mode fMode; |
+ bool fUsesLocalCoords; |
GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
@@ -604,7 +585,8 @@ GrGeometryProcessor* DIEllipseEdgeEffect::TestCreate(SkRandom* random, |
GrTexture* textures[]) { |
return DIEllipseEdgeEffect::Create(GrRandomColor(random), |
GrTest::TestMatrix(random), |
- (Mode)(random->nextRangeU(0,2))); |
+ (Mode)(random->nextRangeU(0,2)), |
+ random->nextBool()); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -692,20 +674,11 @@ public: |
// Setup geometry processor |
SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->color(), |
this->stroke(), |
- invert)); |
+ invert, |
+ this->usesLocalCoords())); |
batchTarget->initDraw(gp, pipeline); |
- // TODO this is hacky, but the only way we have to initialize the GP is to use the |
- // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch |
- // everywhere we can remove this nastiness |
- GrPipelineInfo init; |
- init.fColorIgnored = fBatch.fColorIgnored; |
- init.fOverrideColor = GrColor_ILLEGAL; |
- init.fCoverageIgnored = fBatch.fCoverageIgnored; |
- init.fUsesLocalCoords = this->usesLocalCoords(); |
- gp->initBatchTracker(batchTarget->currentBatchTracker(), init); |
- |
int instanceCount = fGeoData.count(); |
size_t vertexStride = gp->getVertexStride(); |
SkASSERT(vertexStride == sizeof(CircleVertex)); |
@@ -916,20 +889,11 @@ public: |
// Setup geometry processor |
SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->color(), |
this->stroke(), |
- invert)); |
+ invert, |
+ this->usesLocalCoords())); |
batchTarget->initDraw(gp, pipeline); |
- // TODO this is hacky, but the only way we have to initialize the GP is to use the |
- // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch |
- // everywhere we can remove this nastiness |
- GrPipelineInfo init; |
- init.fColorIgnored = fBatch.fColorIgnored; |
- init.fOverrideColor = GrColor_ILLEGAL; |
- init.fCoverageIgnored = fBatch.fCoverageIgnored; |
- init.fUsesLocalCoords = this->usesLocalCoords(); |
- gp->initBatchTracker(batchTarget->currentBatchTracker(), init); |
- |
int instanceCount = fGeoData.count(); |
QuadHelper helper; |
size_t vertexStride = gp->getVertexStride(); |
@@ -1184,20 +1148,11 @@ public: |
// Setup geometry processor |
SkAutoTUnref<GrGeometryProcessor> gp(DIEllipseEdgeEffect::Create(this->color(), |
this->viewMatrix(), |
- this->mode())); |
+ this->mode(), |
+ this->usesLocalCoords())); |
batchTarget->initDraw(gp, pipeline); |
- // TODO this is hacky, but the only way we have to initialize the GP is to use the |
- // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch |
- // everywhere we can remove this nastiness |
- GrPipelineInfo init; |
- init.fColorIgnored = fBatch.fColorIgnored; |
- init.fOverrideColor = GrColor_ILLEGAL; |
- init.fCoverageIgnored = fBatch.fCoverageIgnored; |
- init.fUsesLocalCoords = this->usesLocalCoords(); |
- gp->initBatchTracker(batchTarget->currentBatchTracker(), init); |
- |
int instanceCount = fGeoData.count(); |
size_t vertexStride = gp->getVertexStride(); |
SkASSERT(vertexStride == sizeof(DIEllipseVertex)); |
@@ -1549,20 +1504,11 @@ public: |
// Setup geometry processor |
SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->color(), |
this->stroke(), |
- invert)); |
+ invert, |
+ this->usesLocalCoords())); |
batchTarget->initDraw(gp, pipeline); |
- // TODO this is hacky, but the only way we have to initialize the GP is to use the |
- // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch |
- // everywhere we can remove this nastiness |
- GrPipelineInfo init; |
- init.fColorIgnored = fBatch.fColorIgnored; |
- init.fOverrideColor = GrColor_ILLEGAL; |
- init.fCoverageIgnored = fBatch.fCoverageIgnored; |
- init.fUsesLocalCoords = this->usesLocalCoords(); |
- gp->initBatchTracker(batchTarget->currentBatchTracker(), init); |
- |
int instanceCount = fGeoData.count(); |
size_t vertexStride = gp->getVertexStride(); |
SkASSERT(vertexStride == sizeof(CircleVertex)); |
@@ -1731,20 +1677,11 @@ public: |
// Setup geometry processor |
SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->color(), |
this->stroke(), |
- invert)); |
+ invert, |
+ this->usesLocalCoords())); |
batchTarget->initDraw(gp, pipeline); |
- // TODO this is hacky, but the only way we have to initialize the GP is to use the |
- // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch |
- // everywhere we can remove this nastiness |
- GrPipelineInfo init; |
- init.fColorIgnored = fBatch.fColorIgnored; |
- init.fOverrideColor = GrColor_ILLEGAL; |
- init.fCoverageIgnored = fBatch.fCoverageIgnored; |
- init.fUsesLocalCoords = this->usesLocalCoords(); |
- gp->initBatchTracker(batchTarget->currentBatchTracker(), init); |
- |
int instanceCount = fGeoData.count(); |
size_t vertexStride = gp->getVertexStride(); |
SkASSERT(vertexStride == sizeof(EllipseVertex)); |