| Index: src/gpu/GrOvalRenderer.cpp
|
| diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
|
| index f233fcb22e4d7b1aa5203df75fada96a44ecc84f..d3f590277e28997ebea7aa6ad5705725dd8423dd 100644
|
| --- a/src/gpu/GrOvalRenderer.cpp
|
| +++ b/src/gpu/GrOvalRenderer.cpp
|
| @@ -33,9 +33,10 @@
|
| // TODO(joshualitt) - Break this file up during GrBatch post implementation cleanup
|
|
|
| namespace {
|
| -// TODO(joshualitt) add per vertex colors
|
| +
|
| struct CircleVertex {
|
| SkPoint fPos;
|
| + GrColor fColor;
|
| SkPoint fOffset;
|
| SkScalar fOuterRadius;
|
| SkScalar fInnerRadius;
|
| @@ -43,6 +44,7 @@ struct CircleVertex {
|
|
|
| struct EllipseVertex {
|
| SkPoint fPos;
|
| + GrColor fColor;
|
| SkPoint fOffset;
|
| SkPoint fOuterRadii;
|
| SkPoint fInnerRadii;
|
| @@ -50,6 +52,7 @@ struct EllipseVertex {
|
|
|
| struct DIEllipseVertex {
|
| SkPoint fPos;
|
| + GrColor fColor;
|
| SkPoint fOuterOffset;
|
| SkPoint fInnerOffset;
|
| };
|
| @@ -81,6 +84,7 @@ public:
|
| }
|
|
|
| const Attribute* inPosition() const { return fInPosition; }
|
| + const Attribute* inColor() const { return fInColor; }
|
| const Attribute* inCircleEdge() const { return fInCircleEdge; }
|
| GrColor color() const { return fColor; }
|
| bool colorIgnored() const { return GrColor_ILLEGAL == fColor; }
|
| @@ -94,8 +98,7 @@ public:
|
|
|
| class GLSLProcessor : public GrGLSLGeometryProcessor {
|
| public:
|
| - GLSLProcessor()
|
| - : fColor(GrColor_ILLEGAL) {}
|
| + GLSLProcessor() {}
|
|
|
| void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
|
| const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>();
|
| @@ -113,8 +116,7 @@ public:
|
| GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
|
| // setup pass through color
|
| if (!ce.colorIgnored()) {
|
| - this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
|
| - &fColorUniform);
|
| + varyingHandler->addPassThroughAttribute(ce.inColor(), args.fOutputColor);
|
| }
|
|
|
| // Setup position
|
| @@ -154,13 +156,6 @@ public:
|
|
|
| void setData(const GrGLSLProgramDataManager& pdman,
|
| const GrPrimitiveProcessor& gp) override {
|
| - const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>();
|
| - if (ce.color() != fColor) {
|
| - float c[4];
|
| - GrColorToRGBAFloat(ce.color(), c);
|
| - pdman.set4fv(fColorUniform, 1, c);
|
| - fColor = ce.color();
|
| - }
|
| }
|
|
|
| void setTransformData(const GrPrimitiveProcessor& primProc,
|
| @@ -171,8 +166,6 @@ public:
|
| }
|
|
|
| private:
|
| - GrColor fColor;
|
| - UniformHandle fColorUniform;
|
| typedef GrGLSLGeometryProcessor INHERITED;
|
| };
|
|
|
| @@ -192,6 +185,7 @@ private:
|
| this->initClassID<CircleEdgeEffect>();
|
| fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
|
| kHigh_GrSLPrecision));
|
| + fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType));
|
| fInCircleEdge = &this->addVertexAttrib(Attribute("inCircleEdge",
|
| kVec4f_GrVertexAttribType));
|
| fStroke = stroke;
|
| @@ -200,6 +194,7 @@ private:
|
| GrColor fColor;
|
| SkMatrix fLocalMatrix;
|
| const Attribute* fInPosition;
|
| + const Attribute* fInColor;
|
| const Attribute* fInCircleEdge;
|
| bool fStroke;
|
| bool fUsesLocalCoords;
|
| @@ -240,6 +235,7 @@ public:
|
| const char* name() const override { return "EllipseEdge"; }
|
|
|
| const Attribute* inPosition() const { return fInPosition; }
|
| + const Attribute* inColor() const { return fInColor; }
|
| const Attribute* inEllipseOffset() const { return fInEllipseOffset; }
|
| const Attribute* inEllipseRadii() const { return fInEllipseRadii; }
|
| GrColor color() const { return fColor; }
|
| @@ -251,8 +247,7 @@ public:
|
|
|
| class GLSLProcessor : public GrGLSLGeometryProcessor {
|
| public:
|
| - GLSLProcessor()
|
| - : fColor(GrColor_ILLEGAL) {}
|
| + GLSLProcessor() {}
|
|
|
| void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
|
| const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>();
|
| @@ -276,8 +271,7 @@ public:
|
| GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
|
| // setup pass through color
|
| if (!ee.colorIgnored()) {
|
| - this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
|
| - &fColorUniform);
|
| + varyingHandler->addPassThroughAttribute(ee.inColor(), args.fOutputColor);
|
| }
|
|
|
| // Setup position
|
| @@ -330,13 +324,6 @@ public:
|
| }
|
|
|
| void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp) override {
|
| - const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>();
|
| - if (ee.color() != fColor) {
|
| - float c[4];
|
| - GrColorToRGBAFloat(ee.color(), c);
|
| - pdman.set4fv(fColorUniform, 1, c);
|
| - fColor = ee.color();
|
| - }
|
| }
|
|
|
| void setTransformData(const GrPrimitiveProcessor& primProc,
|
| @@ -347,9 +334,6 @@ public:
|
| }
|
|
|
| private:
|
| - GrColor fColor;
|
| - UniformHandle fColorUniform;
|
| -
|
| typedef GrGLSLGeometryProcessor INHERITED;
|
| };
|
|
|
| @@ -369,6 +353,7 @@ private:
|
| , fUsesLocalCoords(usesLocalCoords) {
|
| this->initClassID<EllipseEdgeEffect>();
|
| fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
|
| + fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType));
|
| fInEllipseOffset = &this->addVertexAttrib(Attribute("inEllipseOffset",
|
| kVec2f_GrVertexAttribType));
|
| fInEllipseRadii = &this->addVertexAttrib(Attribute("inEllipseRadii",
|
| @@ -377,6 +362,7 @@ private:
|
| }
|
|
|
| const Attribute* fInPosition;
|
| + const Attribute* fInColor;
|
| const Attribute* fInEllipseOffset;
|
| const Attribute* fInEllipseRadii;
|
| GrColor fColor;
|
| @@ -423,6 +409,7 @@ public:
|
| const char* name() const override { return "DIEllipseEdge"; }
|
|
|
| const Attribute* inPosition() const { return fInPosition; }
|
| + const Attribute* inColor() const { return fInColor; }
|
| const Attribute* inEllipseOffsets0() const { return fInEllipseOffsets0; }
|
| const Attribute* inEllipseOffsets1() const { return fInEllipseOffsets1; }
|
| GrColor color() const { return fColor; }
|
| @@ -435,7 +422,7 @@ public:
|
| class GLSLProcessor : public GrGLSLGeometryProcessor {
|
| public:
|
| GLSLProcessor()
|
| - : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {}
|
| + : fViewMatrix(SkMatrix::InvalidMatrix()) {}
|
|
|
| void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
|
| const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>();
|
| @@ -459,8 +446,7 @@ public:
|
| GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
|
| // setup pass through color
|
| if (!ee.colorIgnored()) {
|
| - this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
|
| - &fColorUniform);
|
| + varyingHandler->addPassThroughAttribute(ee.inColor(), args.fOutputColor);
|
| }
|
|
|
| // Setup position
|
| @@ -540,19 +526,10 @@ public:
|
| GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
|
| pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
|
| }
|
| -
|
| - if (dee.color() != fColor) {
|
| - float c[4];
|
| - GrColorToRGBAFloat(dee.color(), c);
|
| - pdman.set4fv(fColorUniform, 1, c);
|
| - fColor = dee.color();
|
| - }
|
| }
|
|
|
| private:
|
| SkMatrix fViewMatrix;
|
| - GrColor fColor;
|
| - UniformHandle fColorUniform;
|
| UniformHandle fViewMatrixUniform;
|
|
|
| typedef GrGLSLGeometryProcessor INHERITED;
|
| @@ -575,6 +552,7 @@ private:
|
| this->initClassID<DIEllipseEdgeEffect>();
|
| fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
|
| kHigh_GrSLPrecision));
|
| + fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType));
|
| fInEllipseOffsets0 = &this->addVertexAttrib(Attribute("inEllipseOffsets0",
|
| kVec2f_GrVertexAttribType));
|
| fInEllipseOffsets1 = &this->addVertexAttrib(Attribute("inEllipseOffsets1",
|
| @@ -583,6 +561,7 @@ private:
|
| }
|
|
|
| const Attribute* fInPosition;
|
| + const Attribute* fInColor;
|
| const Attribute* fInEllipseOffsets0;
|
| const Attribute* fInEllipseOffsets1;
|
| GrColor fColor;
|
| @@ -722,6 +701,7 @@ private:
|
| for (int i = 0; i < instanceCount; i++) {
|
| const Geometry& geom = fGeoData[i];
|
|
|
| + GrColor color = geom.fColor;
|
| SkScalar innerRadius = geom.fInnerRadius;
|
| SkScalar outerRadius = geom.fOuterRadius;
|
|
|
| @@ -730,21 +710,25 @@ private:
|
| // The inner radius in the vertex data must be specified in normalized space.
|
| innerRadius = innerRadius / outerRadius;
|
| verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop);
|
| + verts[0].fColor = color;
|
| verts[0].fOffset = SkPoint::Make(-1, -1);
|
| verts[0].fOuterRadius = outerRadius;
|
| verts[0].fInnerRadius = innerRadius;
|
|
|
| verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
|
| + verts[1].fColor = color;
|
| verts[1].fOffset = SkPoint::Make(-1, 1);
|
| verts[1].fOuterRadius = outerRadius;
|
| verts[1].fInnerRadius = innerRadius;
|
|
|
| verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
|
| + verts[2].fColor = color;
|
| verts[2].fOffset = SkPoint::Make(1, 1);
|
| verts[2].fOuterRadius = outerRadius;
|
| verts[2].fInnerRadius = innerRadius;
|
|
|
| verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
|
| + verts[3].fColor = color;
|
| verts[3].fOffset = SkPoint::Make(1, -1);
|
| verts[3].fOuterRadius = outerRadius;
|
| verts[3].fInnerRadius = innerRadius;
|
| @@ -769,11 +753,6 @@ private:
|
| return false;
|
| }
|
|
|
| - // TODO use vertex color to avoid breaking batches
|
| - if (this->color() != that->color()) {
|
| - return false;
|
| - }
|
| -
|
| if (this->stroke() != that->stroke()) {
|
| return false;
|
| }
|
| @@ -941,6 +920,7 @@ private:
|
| for (int i = 0; i < instanceCount; i++) {
|
| const Geometry& geom = fGeoData[i];
|
|
|
| + GrColor color = geom.fColor;
|
| SkScalar xRadius = geom.fXRadius;
|
| SkScalar yRadius = geom.fYRadius;
|
|
|
| @@ -954,21 +934,25 @@ private:
|
|
|
| // The inner radius in the vertex data must be specified in normalized space.
|
| verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop);
|
| + verts[0].fColor = color;
|
| verts[0].fOffset = SkPoint::Make(-xRadius, -yRadius);
|
| verts[0].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts[0].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
|
|
| verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
|
| + verts[1].fColor = color;
|
| verts[1].fOffset = SkPoint::Make(-xRadius, yRadius);
|
| verts[1].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts[1].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
|
|
| verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
|
| + verts[2].fColor = color;
|
| verts[2].fOffset = SkPoint::Make(xRadius, yRadius);
|
| verts[2].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts[2].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
|
|
| verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
|
| + verts[3].fColor = color;
|
| verts[3].fOffset = SkPoint::Make(xRadius, -yRadius);
|
| verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
| @@ -994,11 +978,6 @@ private:
|
| return false;
|
| }
|
|
|
| - // TODO use vertex color to avoid breaking batches
|
| - if (this->color() != that->color()) {
|
| - return false;
|
| - }
|
| -
|
| if (this->stroke() != that->stroke()) {
|
| return false;
|
| }
|
| @@ -1208,6 +1187,7 @@ private:
|
| for (int i = 0; i < instanceCount; i++) {
|
| const Geometry& geom = fGeoData[i];
|
|
|
| + GrColor color = geom.fColor;
|
| SkScalar xRadius = geom.fXRadius;
|
| SkScalar yRadius = geom.fYRadius;
|
|
|
| @@ -1221,18 +1201,22 @@ private:
|
| SkScalar innerRatioY = yRadius / geom.fInnerYRadius;
|
|
|
| verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop);
|
| + verts[0].fColor = color;
|
| verts[0].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, -1.0f - offsetDy);
|
| verts[0].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, -innerRatioY - offsetDy);
|
|
|
| verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
|
| + verts[1].fColor = color;
|
| verts[1].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, 1.0f + offsetDy);
|
| verts[1].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, innerRatioY + offsetDy);
|
|
|
| verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
|
| + verts[2].fColor = color;
|
| verts[2].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offsetDy);
|
| verts[2].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerRatioY + offsetDy);
|
|
|
| verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
|
| + verts[3].fColor = color;
|
| verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offsetDy);
|
| verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -innerRatioY - offsetDy);
|
|
|
| @@ -1256,11 +1240,6 @@ private:
|
| return false;
|
| }
|
|
|
| - // TODO use vertex color to avoid breaking batches
|
| - if (this->color() != that->color()) {
|
| - return false;
|
| - }
|
| -
|
| if (this->mode() != that->mode()) {
|
| return false;
|
| }
|
| @@ -1579,6 +1558,7 @@ private:
|
| for (int i = 0; i < instanceCount; i++) {
|
| const Geometry& args = fGeoData[i];
|
|
|
| + GrColor color = args.fColor;
|
| SkScalar outerRadius = args.fOuterRadius;
|
|
|
| const SkRect& bounds = args.fDevBounds;
|
| @@ -1595,24 +1575,28 @@ private:
|
| SkScalar innerRadius = args.fInnerRadius / args.fOuterRadius;
|
| for (int i = 0; i < 4; ++i) {
|
| verts->fPos = SkPoint::Make(bounds.fLeft, yCoords[i]);
|
| + verts->fColor = color;
|
| verts->fOffset = SkPoint::Make(-1, yOuterRadii[i]);
|
| verts->fOuterRadius = outerRadius;
|
| verts->fInnerRadius = innerRadius;
|
| verts++;
|
|
|
| verts->fPos = SkPoint::Make(bounds.fLeft + outerRadius, yCoords[i]);
|
| + verts->fColor = color;
|
| verts->fOffset = SkPoint::Make(0, yOuterRadii[i]);
|
| verts->fOuterRadius = outerRadius;
|
| verts->fInnerRadius = innerRadius;
|
| verts++;
|
|
|
| verts->fPos = SkPoint::Make(bounds.fRight - outerRadius, yCoords[i]);
|
| + verts->fColor = color;
|
| verts->fOffset = SkPoint::Make(0, yOuterRadii[i]);
|
| verts->fOuterRadius = outerRadius;
|
| verts->fInnerRadius = innerRadius;
|
| verts++;
|
|
|
| verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]);
|
| + verts->fColor = color;
|
| verts->fOffset = SkPoint::Make(1, yOuterRadii[i]);
|
| verts->fOuterRadius = outerRadius;
|
| verts->fInnerRadius = innerRadius;
|
| @@ -1638,11 +1622,6 @@ private:
|
| return false;
|
| }
|
|
|
| - // TODO use vertex color to avoid breaking batches
|
| - if (this->color() != that->color()) {
|
| - return false;
|
| - }
|
| -
|
| if (this->stroke() != that->stroke()) {
|
| return false;
|
| }
|
| @@ -1758,6 +1737,8 @@ private:
|
| for (int i = 0; i < instanceCount; i++) {
|
| const Geometry& args = fGeoData[i];
|
|
|
| + GrColor color = args.fColor;
|
| +
|
| // Compute the reciprocals of the radii here to save time in the shader
|
| SkScalar xRadRecip = SkScalarInvert(args.fXRadius);
|
| SkScalar yRadRecip = SkScalarInvert(args.fYRadius);
|
| @@ -1785,24 +1766,28 @@ private:
|
|
|
| for (int i = 0; i < 4; ++i) {
|
| verts->fPos = SkPoint::Make(bounds.fLeft, yCoords[i]);
|
| + verts->fColor = color;
|
| verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]);
|
| verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
| verts++;
|
|
|
| verts->fPos = SkPoint::Make(bounds.fLeft + xOuterRadius, yCoords[i]);
|
| + verts->fColor = color;
|
| verts->fOffset = SkPoint::Make(SK_ScalarNearlyZero, yOuterOffsets[i]);
|
| verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
| verts++;
|
|
|
| verts->fPos = SkPoint::Make(bounds.fRight - xOuterRadius, yCoords[i]);
|
| + verts->fColor = color;
|
| verts->fOffset = SkPoint::Make(SK_ScalarNearlyZero, yOuterOffsets[i]);
|
| verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
| verts++;
|
|
|
| verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]);
|
| + verts->fColor = color;
|
| verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]);
|
| verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
| @@ -1828,11 +1813,6 @@ private:
|
| return false;
|
| }
|
|
|
| - // TODO use vertex color to avoid breaking batches
|
| - if (this->color() != that->color()) {
|
| - return false;
|
| - }
|
| -
|
| if (this->stroke() != that->stroke()) {
|
| return false;
|
| }
|
|
|