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); |