| Index: src/gpu/GrOvalRenderer.cpp
|
| diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
|
| index f694678e9dbb2c1d3601af3f4d576f9ec993a7a1..46ba72d239e8d7a26c679436b0d42a34cb85e1e1 100644
|
| --- a/src/gpu/GrOvalRenderer.cpp
|
| +++ b/src/gpu/GrOvalRenderer.cpp
|
| @@ -11,7 +11,7 @@
|
| #include "GrEffect.h"
|
| #include "gl/GrGLEffect.h"
|
| #include "gl/GrGLSL.h"
|
| -#include "gl/GrGLVertexEffect.h"
|
| +#include "gl/GrGLGeometryProcessor.h"
|
| #include "GrTBackendEffectFactory.h"
|
|
|
| #include "GrDrawState.h"
|
| @@ -22,7 +22,7 @@
|
| #include "SkStrokeRec.h"
|
| #include "SkTLazy.h"
|
|
|
| -#include "effects/GrVertexEffect.h"
|
| +#include "effects/GrGeometryProcessor.h"
|
| #include "effects/GrRRectEffect.h"
|
|
|
| namespace {
|
| @@ -60,7 +60,7 @@ inline bool circle_stays_circle(const SkMatrix& m) {
|
| * specified as offset_x, offset_y (both from center point), outer radius and inner radius.
|
| */
|
|
|
| -class CircleEdgeEffect : public GrVertexEffect {
|
| +class CircleEdgeEffect : public GrGeometryProcessor {
|
| public:
|
| static GrEffect* Create(bool stroke) {
|
| GR_CREATE_STATIC_EFFECT(gCircleStrokeEdge, CircleEdgeEffect, (true));
|
| @@ -80,6 +80,8 @@ public:
|
| *validFlags = 0;
|
| }
|
|
|
| + const GrShaderVar& inCircleEdge() const { return fInCircleEdge; }
|
| +
|
| virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE {
|
| return GrTBackendEffectFactory<CircleEdgeEffect>::getInstance();
|
| }
|
| @@ -90,7 +92,7 @@ public:
|
|
|
| inline bool isStroked() const { return fStroke; }
|
|
|
| - class GLEffect : public GrGLVertexEffect {
|
| + class GLEffect : public GrGLGeometryProcessor {
|
| public:
|
| GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&)
|
| : INHERITED (factory) {}
|
| @@ -106,10 +108,8 @@ public:
|
| const char *vsName, *fsName;
|
| builder->addVarying(kVec4f_GrSLType, "CircleEdge", &vsName, &fsName);
|
|
|
| - GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
|
| - const SkString* attr0Name =
|
| - vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
|
| - vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str());
|
| + GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();;
|
| + vsBuilder->codeAppendf("\t%s = %s;\n", vsName, circleEffect.inCircleEdge().c_str());
|
|
|
| GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| fsBuilder->codeAppendf("\tfloat d = length(%s.xy);\n", fsName);
|
| @@ -132,13 +132,16 @@ public:
|
| virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_OVERRIDE {}
|
|
|
| private:
|
| - typedef GrGLVertexEffect INHERITED;
|
| + typedef GrGLGeometryProcessor INHERITED;
|
| };
|
|
|
|
|
| private:
|
| - CircleEdgeEffect(bool stroke) : GrVertexEffect() {
|
| - this->addVertexAttrib(kVec4f_GrSLType);
|
| + CircleEdgeEffect(bool stroke)
|
| + : fInCircleEdge(this->addVertexAttrib(
|
| + GrShaderVar("inCircleEdge",
|
| + kVec4f_GrSLType,
|
| + GrShaderVar::kAttribute_TypeModifier))) {
|
| fStroke = stroke;
|
| }
|
|
|
| @@ -147,11 +150,12 @@ private:
|
| return cee.fStroke == fStroke;
|
| }
|
|
|
| + const GrShaderVar& fInCircleEdge;
|
| bool fStroke;
|
|
|
| GR_DECLARE_EFFECT_TEST;
|
|
|
| - typedef GrVertexEffect INHERITED;
|
| + typedef GrGeometryProcessor INHERITED;
|
| };
|
|
|
| GR_DEFINE_EFFECT_TEST(CircleEdgeEffect);
|
| @@ -173,7 +177,7 @@ GrEffect* CircleEdgeEffect::TestCreate(SkRandom* random,
|
| * We are using an implicit function of x^2/a^2 + y^2/b^2 - 1 = 0.
|
| */
|
|
|
| -class EllipseEdgeEffect : public GrVertexEffect {
|
| +class EllipseEdgeEffect : public GrGeometryProcessor {
|
| public:
|
| static GrEffect* Create(bool stroke) {
|
| GR_CREATE_STATIC_EFFECT(gEllipseStrokeEdge, EllipseEdgeEffect, (true));
|
| @@ -201,9 +205,12 @@ public:
|
|
|
| static const char* Name() { return "EllipseEdge"; }
|
|
|
| + const GrShaderVar& inEllipseOffset() const { return fInEllipseOffset; }
|
| + const GrShaderVar& inEllipseRadii() const { return fInEllipseRadii; }
|
| +
|
| inline bool isStroked() const { return fStroke; }
|
|
|
| - class GLEffect : public GrGLVertexEffect {
|
| + class GLEffect : public GrGLGeometryProcessor {
|
| public:
|
| GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&)
|
| : INHERITED (factory) {}
|
| @@ -223,14 +230,11 @@ public:
|
| builder->addVarying(kVec2f_GrSLType, "EllipseOffsets", &vsOffsetName, &fsOffsetName);
|
|
|
| GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
|
| - const SkString* attr0Name =
|
| - vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
|
| - vsBuilder->codeAppendf("\t%s = %s;\n", vsOffsetName, attr0Name->c_str());
|
| + vsBuilder->codeAppendf("%s = %s;", vsOffsetName,
|
| + ellipseEffect.inEllipseOffset().c_str());
|
|
|
| builder->addVarying(kVec4f_GrSLType, "EllipseRadii", &vsRadiiName, &fsRadiiName);
|
| - const SkString* attr1Name =
|
| - vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[1]);
|
| - vsBuilder->codeAppendf("\t%s = %s;\n", vsRadiiName, attr1Name->c_str());
|
| + vsBuilder->codeAppendf("%s = %s;", vsRadiiName, ellipseEffect.inEllipseRadii().c_str());
|
|
|
| // for outer curve
|
| GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| @@ -266,13 +270,19 @@ public:
|
| }
|
|
|
| private:
|
| - typedef GrGLVertexEffect INHERITED;
|
| + typedef GrGLGeometryProcessor INHERITED;
|
| };
|
|
|
| private:
|
| - EllipseEdgeEffect(bool stroke) : GrVertexEffect() {
|
| - this->addVertexAttrib(kVec2f_GrSLType);
|
| - this->addVertexAttrib(kVec4f_GrSLType);
|
| + EllipseEdgeEffect(bool stroke)
|
| + : fInEllipseOffset(this->addVertexAttrib(
|
| + GrShaderVar("inEllipseOffset",
|
| + kVec2f_GrSLType,
|
| + GrShaderVar::kAttribute_TypeModifier)))
|
| + , fInEllipseRadii(this->addVertexAttrib(
|
| + GrShaderVar("inEllipseRadii",
|
| + kVec4f_GrSLType,
|
| + GrShaderVar::kAttribute_TypeModifier))) {
|
| fStroke = stroke;
|
| }
|
|
|
| @@ -281,11 +291,13 @@ private:
|
| return eee.fStroke == fStroke;
|
| }
|
|
|
| + const GrShaderVar& fInEllipseOffset;
|
| + const GrShaderVar& fInEllipseRadii;
|
| bool fStroke;
|
|
|
| GR_DECLARE_EFFECT_TEST;
|
|
|
| - typedef GrVertexEffect INHERITED;
|
| + typedef GrGeometryProcessor INHERITED;
|
| };
|
|
|
| GR_DEFINE_EFFECT_TEST(EllipseEdgeEffect);
|
| @@ -308,7 +320,7 @@ GrEffect* EllipseEdgeEffect::TestCreate(SkRandom* random,
|
| * The result is device-independent and can be used with any affine matrix.
|
| */
|
|
|
| -class DIEllipseEdgeEffect : public GrVertexEffect {
|
| +class DIEllipseEdgeEffect : public GrGeometryProcessor {
|
| public:
|
| enum Mode { kStroke = 0, kHairline, kFill };
|
|
|
| @@ -342,9 +354,12 @@ public:
|
|
|
| static const char* Name() { return "DIEllipseEdge"; }
|
|
|
| + const GrShaderVar& inEllipseOffsets0() const { return fInEllipseOffsets0; }
|
| + const GrShaderVar& inEllipseOffsets1() const { return fInEllipseOffsets1; }
|
| +
|
| inline Mode getMode() const { return fMode; }
|
|
|
| - class GLEffect : public GrGLVertexEffect {
|
| + class GLEffect : public GrGLGeometryProcessor {
|
| public:
|
| GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&)
|
| : INHERITED (factory) {}
|
| @@ -363,15 +378,13 @@ public:
|
| &vsOffsetName0, &fsOffsetName0);
|
|
|
| GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
|
| - const SkString* attr0Name =
|
| - vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
|
| - vsBuilder->codeAppendf("\t%s = %s;\n", vsOffsetName0, attr0Name->c_str());
|
| + vsBuilder->codeAppendf("%s = %s;", vsOffsetName0,
|
| + ellipseEffect.inEllipseOffsets0().c_str());
|
| const char *vsOffsetName1, *fsOffsetName1;
|
| builder->addVarying(kVec2f_GrSLType, "EllipseOffsets1",
|
| &vsOffsetName1, &fsOffsetName1);
|
| - const SkString* attr1Name =
|
| - vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[1]);
|
| - vsBuilder->codeAppendf("\t%s = %s;\n", vsOffsetName1, attr1Name->c_str());
|
| + vsBuilder->codeAppendf("\t%s = %s;\n", vsOffsetName1,
|
| + ellipseEffect.inEllipseOffsets1().c_str());
|
|
|
| GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| SkAssertResult(fsBuilder->enableFeature(
|
| @@ -426,13 +439,19 @@ public:
|
| }
|
|
|
| private:
|
| - typedef GrGLVertexEffect INHERITED;
|
| + typedef GrGLGeometryProcessor INHERITED;
|
| };
|
|
|
| private:
|
| - DIEllipseEdgeEffect(Mode mode) : GrVertexEffect() {
|
| - this->addVertexAttrib(kVec2f_GrSLType);
|
| - this->addVertexAttrib(kVec2f_GrSLType);
|
| + DIEllipseEdgeEffect(Mode mode)
|
| + : fInEllipseOffsets0(this->addVertexAttrib(
|
| + GrShaderVar("inEllipseOffsets0",
|
| + kVec2f_GrSLType,
|
| + GrShaderVar::kAttribute_TypeModifier)))
|
| + , fInEllipseOffsets1(this->addVertexAttrib(
|
| + GrShaderVar("inEllipseOffsets1",
|
| + kVec2f_GrSLType,
|
| + GrShaderVar::kAttribute_TypeModifier))) {
|
| fMode = mode;
|
| }
|
|
|
| @@ -441,11 +460,13 @@ private:
|
| return eee.fMode == fMode;
|
| }
|
|
|
| + const GrShaderVar& fInEllipseOffsets0;
|
| + const GrShaderVar& fInEllipseOffsets1;
|
| Mode fMode;
|
|
|
| GR_DECLARE_EFFECT_TEST;
|
|
|
| - typedef GrVertexEffect INHERITED;
|
| + typedef GrGeometryProcessor INHERITED;
|
| };
|
|
|
| GR_DEFINE_EFFECT_TEST(DIEllipseEdgeEffect);
|
| @@ -552,8 +573,7 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
| }
|
|
|
| GrEffect* effect = CircleEdgeEffect::Create(isStrokeOnly && innerRadius > 0);
|
| - static const int kCircleEdgeAttrIndex = 1;
|
| - drawState->setGeometryProcessor(effect, kCircleEdgeAttrIndex)->unref();
|
| + drawState->setGeometryProcessor(effect)->unref();
|
|
|
| // The radii are outset for two reasons. First, it allows the shader to simply perform
|
| // clamp(distance-to-center - radius, 0, 1). Second, the outer radius is used to compute the
|
| @@ -694,9 +714,7 @@ bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| GrEffect* effect = EllipseEdgeEffect::Create(isStrokeOnly &&
|
| innerXRadius > 0 && innerYRadius > 0);
|
|
|
| - static const int kEllipseCenterAttrIndex = 1;
|
| - static const int kEllipseEdgeAttrIndex = 2;
|
| - drawState->setGeometryProcessor(effect, kEllipseCenterAttrIndex, kEllipseEdgeAttrIndex)->unref();
|
| + drawState->setGeometryProcessor(effect)->unref();
|
|
|
| // Compute the reciprocals of the radii here to save time in the shader
|
| SkScalar xRadRecip = SkScalarInvert(xRadius);
|
| @@ -812,10 +830,7 @@ bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
|
|
| GrEffect* effect = DIEllipseEdgeEffect::Create(mode);
|
|
|
| - static const int kEllipseOuterOffsetAttrIndex = 1;
|
| - static const int kEllipseInnerOffsetAttrIndex = 2;
|
| - drawState->setGeometryProcessor(effect, kEllipseOuterOffsetAttrIndex,
|
| - kEllipseInnerOffsetAttrIndex)->unref();
|
| + drawState->setGeometryProcessor(effect)->unref();
|
|
|
| // This expands the outer rect so that after CTM we end up with a half-pixel border
|
| SkScalar a = vm[SkMatrix::kMScaleX];
|
| @@ -1062,8 +1077,7 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target, GrContext* context, bool us
|
| isStrokeOnly = (isStrokeOnly && innerRadius >= 0);
|
|
|
| GrEffect* effect = CircleEdgeEffect::Create(isStrokeOnly);
|
| - static const int kCircleEdgeAttrIndex = 1;
|
| - drawState->setGeometryProcessor(effect, kCircleEdgeAttrIndex)->unref();
|
| + drawState->setGeometryProcessor(effect)->unref();
|
|
|
| // The radii are outset for two reasons. First, it allows the shader to simply perform
|
| // clamp(distance-to-center - radius, 0, 1). Second, the outer radius is used to compute the
|
| @@ -1166,11 +1180,7 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target, GrContext* context, bool us
|
| EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices());
|
|
|
| GrEffect* effect = EllipseEdgeEffect::Create(isStrokeOnly);
|
| - static const int kEllipseOffsetAttrIndex = 1;
|
| - static const int kEllipseRadiiAttrIndex = 2;
|
| - drawState->setGeometryProcessor(effect,
|
| - kEllipseOffsetAttrIndex,
|
| - kEllipseRadiiAttrIndex)->unref();
|
| + drawState->setGeometryProcessor(effect)->unref();
|
|
|
| // Compute the reciprocals of the radii here to save time in the shader
|
| SkScalar xRadRecip = SkScalarInvert(xRadius);
|
|
|