Index: src/gpu/GrOvalRenderer.cpp |
diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp |
index 69baebb22821155b1b311c5388102532112e2036..0a7b3f89fce1f8c8976bbe1bb31bb32db1141ae2 100644 |
--- a/src/gpu/GrOvalRenderer.cpp |
+++ b/src/gpu/GrOvalRenderer.cpp |
@@ -71,17 +71,14 @@ |
class CircleEdgeEffect : public GrGeometryProcessor { |
public: |
- static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatrix& localMatrix, |
- bool usesLocalCoords) { |
- return SkNEW_ARGS(CircleEdgeEffect, (color, stroke, localMatrix, usesLocalCoords)); |
+ static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatrix& localMatrix) { |
+ return SkNEW_ARGS(CircleEdgeEffect, (color, stroke, localMatrix)); |
} |
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"; } |
@@ -97,6 +94,7 @@ |
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 |
@@ -106,10 +104,9 @@ |
args.fPB->addVarying("CircleEdge", &v); |
vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fName); |
- // setup pass through color |
- if (!ce.colorIgnored()) { |
- this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
- } |
+ // Setup pass through color |
+ this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, |
+ &fColorUniform); |
// Setup position |
this->setupPosition(pb, gpArgs, ce.inPosition()->fName); |
@@ -134,22 +131,22 @@ |
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 |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x2 : 0x0; |
- key |= ce.colorIgnored() ? 0x4 : 0x0; |
- b->add32(key); |
+ key |= local.fUsesLocalCoords && ce.localMatrix().hasPerspective() ? 0x2 : 0x0; |
+ b->add32(key << 16 | local.fInputColorType); |
} |
virtual void setData(const GrGLProgramDataManager& pdman, |
const GrPrimitiveProcessor& gp, |
const GrBatchTracker& bt) override { |
- const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>(); |
- if (ce.color() != fColor) { |
+ const BatchTracker& local = bt.cast<BatchTracker>(); |
+ 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; |
} |
} |
@@ -177,11 +174,16 @@ |
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, bool usesLocalCoords) |
+ CircleEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix) |
: fColor(color) |
- , fLocalMatrix(localMatrix) |
- , fUsesLocalCoords(usesLocalCoords) { |
+ , fLocalMatrix(localMatrix) { |
this->initClassID<CircleEdgeEffect>(); |
fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); |
fInCircleEdge = &this->addVertexAttrib(Attribute("inCircleEdge", |
@@ -189,12 +191,17 @@ |
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; |
@@ -209,8 +216,7 @@ |
GrTexture* textures[]) { |
return CircleEdgeEffect::Create(GrRandomColor(random), |
random->nextBool(), |
- GrTest::TestMatrix(random), |
- random->nextBool()); |
+ GrTest::TestMatrix(random)); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -225,9 +231,8 @@ |
class EllipseEdgeEffect : public GrGeometryProcessor { |
public: |
- static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatrix& localMatrix, |
- bool usesLocalCoords) { |
- return SkNEW_ARGS(EllipseEdgeEffect, (color, stroke, localMatrix, usesLocalCoords)); |
+ static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatrix& localMatrix) { |
+ return SkNEW_ARGS(EllipseEdgeEffect, (color, stroke, localMatrix)); |
} |
virtual ~EllipseEdgeEffect() {} |
@@ -238,9 +243,7 @@ |
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; } |
@@ -253,6 +256,7 @@ |
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 |
@@ -268,10 +272,9 @@ |
vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), |
ee.inEllipseRadii()->fName); |
- // setup pass through color |
- if (!ee.colorIgnored()) { |
- this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
- } |
+ // Setup pass through color |
+ this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, |
+ &fColorUniform); |
// Setup position |
this->setupPosition(pb, gpArgs, ee.inPosition()->fName); |
@@ -311,22 +314,23 @@ |
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 |= ee.usesLocalCoords() && ee.localMatrix().hasPerspective() ? 0x2 : 0x0; |
- key |= ee.colorIgnored() ? 0x4 : 0x0; |
- b->add32(key); |
+ key |= local.fUsesLocalCoords && ee.localMatrix().hasPerspective() ? 0x2 : 0x0; |
+ b->add32(key << 16 | local.fInputColorType); |
} |
virtual void setData(const GrGLProgramDataManager& pdman, |
const GrPrimitiveProcessor& gp, |
const GrBatchTracker& bt) override { |
- const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>(); |
- if (ee.color() != fColor) { |
+ |
+ const BatchTracker& local = bt.cast<BatchTracker>(); |
+ if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
GrGLfloat c[4]; |
- GrColorToRGBAFloat(ee.color(), c); |
+ GrColorToRGBAFloat(local.fColor, c); |
pdman.set4fv(fColorUniform, 1, c); |
- fColor = ee.color(); |
+ fColor = local.fColor; |
} |
} |
@@ -355,12 +359,16 @@ |
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, |
- bool usesLocalCoords) |
+ EllipseEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix) |
: fColor(color) |
- , fLocalMatrix(localMatrix) |
- , fUsesLocalCoords(usesLocalCoords) { |
+ , fLocalMatrix(localMatrix) { |
this->initClassID<EllipseEdgeEffect>(); |
fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); |
fInEllipseOffset = &this->addVertexAttrib(Attribute("inEllipseOffset", |
@@ -370,13 +378,18 @@ |
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; |
@@ -391,8 +404,7 @@ |
GrTexture* textures[]) { |
return EllipseEdgeEffect::Create(GrRandomColor(random), |
random->nextBool(), |
- GrTest::TestMatrix(random), |
- random->nextBool()); |
+ GrTest::TestMatrix(random)); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -410,9 +422,8 @@ |
public: |
enum Mode { kStroke = 0, kHairline, kFill }; |
- static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, Mode mode, |
- bool usesLocalCoords) { |
- return SkNEW_ARGS(DIEllipseEdgeEffect, (color, viewMatrix, mode, usesLocalCoords)); |
+ static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, Mode mode) { |
+ return SkNEW_ARGS(DIEllipseEdgeEffect, (color, viewMatrix, mode)); |
} |
virtual ~DIEllipseEdgeEffect() {} |
@@ -423,9 +434,7 @@ |
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; } |
@@ -438,6 +447,7 @@ |
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 |
@@ -453,10 +463,9 @@ |
vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), |
ee.inEllipseOffsets1()->fName); |
- // setup pass through color |
- if (!ee.colorIgnored()) { |
- this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
- } |
+ // Setup pass through color |
+ this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, |
+ &fColorUniform); |
// Setup position |
this->setupPosition(pb, gpArgs, ee.inPosition()->fName, ee.viewMatrix()); |
@@ -510,11 +519,11 @@ |
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 |= ellipseEffect.colorIgnored() << 9; |
- key |= ComputePosKey(ellipseEffect.viewMatrix()) << 10; |
- b->add32(key); |
+ key |= ComputePosKey(ellipseEffect.viewMatrix()) << 9; |
+ b->add32(key << 16 | local.fInputColorType); |
} |
virtual void setData(const GrGLProgramDataManager& pdman, |
@@ -523,11 +532,12 @@ |
const DIEllipseEdgeEffect& dee = gp.cast<DIEllipseEdgeEffect>(); |
this->setUniformViewMatrix(pdman, dee.viewMatrix()); |
- if (dee.color() != fColor) { |
+ const BatchTracker& local = bt.cast<BatchTracker>(); |
+ if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
GrGLfloat c[4]; |
- GrColorToRGBAFloat(dee.color(), c); |
+ GrColorToRGBAFloat(local.fColor, c); |
pdman.set4fv(fColorUniform, 1, c); |
- fColor = dee.color(); |
+ fColor = local.fColor; |
} |
} |
@@ -549,20 +559,30 @@ |
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, |
- bool usesLocalCoords) |
+ DIEllipseEdgeEffect(GrColor color, const SkMatrix& viewMatrix, Mode mode) |
: fColor(color) |
- , fViewMatrix(viewMatrix) |
- , fUsesLocalCoords(usesLocalCoords) { |
+ , fViewMatrix(viewMatrix) { |
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; |
@@ -570,7 +590,6 @@ |
GrColor fColor; |
SkMatrix fViewMatrix; |
Mode fMode; |
- bool fUsesLocalCoords; |
GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
@@ -585,8 +604,7 @@ |
GrTexture* textures[]) { |
return DIEllipseEdgeEffect::Create(GrRandomColor(random), |
GrTest::TestMatrix(random), |
- (Mode)(random->nextRangeU(0,2)), |
- random->nextBool()); |
+ (Mode)(random->nextRangeU(0,2))); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -674,10 +692,19 @@ |
// Setup geometry processor |
SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->color(), |
this->stroke(), |
- invert, |
- this->usesLocalCoords())); |
+ invert)); |
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(); |
@@ -889,10 +916,19 @@ |
// Setup geometry processor |
SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->color(), |
this->stroke(), |
- invert, |
- this->usesLocalCoords())); |
+ invert)); |
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; |
@@ -1148,10 +1184,19 @@ |
// Setup geometry processor |
SkAutoTUnref<GrGeometryProcessor> gp(DIEllipseEdgeEffect::Create(this->color(), |
this->viewMatrix(), |
- this->mode(), |
- this->usesLocalCoords())); |
+ this->mode())); |
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(); |
@@ -1504,10 +1549,19 @@ |
// Setup geometry processor |
SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->color(), |
this->stroke(), |
- invert, |
- this->usesLocalCoords())); |
+ invert)); |
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(); |
@@ -1677,10 +1731,19 @@ |
// Setup geometry processor |
SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->color(), |
this->stroke(), |
- invert, |
- this->usesLocalCoords())); |
+ invert)); |
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(); |