| Index: src/gpu/effects/GrOvalEffect.cpp
|
| diff --git a/src/gpu/effects/GrOvalEffect.cpp b/src/gpu/effects/GrOvalEffect.cpp
|
| index d915250fe5676a401e74be45b02f3ced44e07fd8..369b78042c770f9a558fd7243c033c250808ed98 100644
|
| --- a/src/gpu/effects/GrOvalEffect.cpp
|
| +++ b/src/gpu/effects/GrOvalEffect.cpp
|
| @@ -5,10 +5,10 @@
|
| * found in the LICENSE file.
|
| */
|
|
|
| +#include "gl/builders/GrGLProgramBuilder.h"
|
| #include "GrOvalEffect.h"
|
|
|
| #include "gl/GrGLEffect.h"
|
| -#include "gl/GrGLShaderBuilder.h"
|
| #include "gl/GrGLSL.h"
|
| #include "GrTBackendEffectFactory.h"
|
|
|
| @@ -100,7 +100,7 @@ class GLCircleEffect : public GrGLEffect {
|
| public:
|
| GLCircleEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
|
|
|
| - virtual void emitCode(GrGLShaderBuilder* builder,
|
| + virtual void emitCode(GrGLProgramBuilder* builder,
|
| const GrDrawEffect& drawEffect,
|
| const GrEffectKey& key,
|
| const char* outputColor,
|
| @@ -126,7 +126,7 @@ GLCircleEffect::GLCircleEffect(const GrBackendEffectFactory& factory,
|
| fPrevRadius = -1.f;
|
| }
|
|
|
| -void GLCircleEffect::emitCode(GrGLShaderBuilder* builder,
|
| +void GLCircleEffect::emitCode(GrGLProgramBuilder* builder,
|
| const GrDrawEffect& drawEffect,
|
| const GrEffectKey& key,
|
| const char* outputColor,
|
| @@ -137,27 +137,29 @@ void GLCircleEffect::emitCode(GrGLShaderBuilder* builder,
|
| const char *circleName;
|
| // The circle uniform is (center.x, center.y, radius + 0.5) for regular fills and
|
| // (... ,radius - 0.5) for inverse fills.
|
| - fCircleUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility,
|
| + fCircleUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| kVec3f_GrSLType,
|
| "circle",
|
| &circleName);
|
| - const char* fragmentPos = builder->fragmentPosition();
|
| +
|
| + GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| + const char* fragmentPos = fsBuilder->fragmentPosition();
|
|
|
| SkASSERT(kHairlineAA_GrEffectEdgeType != ce.getEdgeType());
|
| if (GrEffectEdgeTypeIsInverseFill(ce.getEdgeType())) {
|
| - builder->fsCodeAppendf("\t\tfloat d = length(%s.xy - %s.xy) - %s.z;\n",
|
| + fsBuilder->codeAppendf("\t\tfloat d = length(%s.xy - %s.xy) - %s.z;\n",
|
| circleName, fragmentPos, circleName);
|
| } else {
|
| - builder->fsCodeAppendf("\t\tfloat d = %s.z - length(%s.xy - %s.xy);\n",
|
| + fsBuilder->codeAppendf("\t\tfloat d = %s.z - length(%s.xy - %s.xy);\n",
|
| circleName, fragmentPos, circleName);
|
| }
|
| if (GrEffectEdgeTypeIsAA(ce.getEdgeType())) {
|
| - builder->fsCodeAppend("\t\td = clamp(d, 0.0, 1.0);\n");
|
| + fsBuilder->codeAppend("\t\td = clamp(d, 0.0, 1.0);\n");
|
| } else {
|
| - builder->fsCodeAppend("\t\td = d > 0.5 ? 1.0 : 0.0;\n");
|
| + fsBuilder->codeAppend("\t\td = d > 0.5 ? 1.0 : 0.0;\n");
|
| }
|
|
|
| - builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor,
|
| + fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor,
|
| (GrGLSLExpr4(inputColor) * GrGLSLExpr1("d")).c_str());
|
| }
|
|
|
| @@ -272,7 +274,7 @@ class GLEllipseEffect : public GrGLEffect {
|
| public:
|
| GLEllipseEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
|
|
|
| - virtual void emitCode(GrGLShaderBuilder* builder,
|
| + virtual void emitCode(GrGLProgramBuilder* builder,
|
| const GrDrawEffect& drawEffect,
|
| const GrEffectKey& key,
|
| const char* outputColor,
|
| @@ -298,7 +300,7 @@ GLEllipseEffect::GLEllipseEffect(const GrBackendEffectFactory& factory,
|
| fPrevRadii.fX = -1.f;
|
| }
|
|
|
| -void GLEllipseEffect::emitCode(GrGLShaderBuilder* builder,
|
| +void GLEllipseEffect::emitCode(GrGLProgramBuilder* builder,
|
| const GrDrawEffect& drawEffect,
|
| const GrEffectKey& key,
|
| const char* outputColor,
|
| @@ -308,41 +310,43 @@ void GLEllipseEffect::emitCode(GrGLShaderBuilder* builder,
|
| const EllipseEffect& ee = drawEffect.castEffect<EllipseEffect>();
|
| const char *ellipseName;
|
| // The ellipse uniform is (center.x, center.y, 1 / rx^2, 1 / ry^2)
|
| - fEllipseUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility,
|
| + fEllipseUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| kVec4f_GrSLType,
|
| "ellipse",
|
| &ellipseName);
|
| - const char* fragmentPos = builder->fragmentPosition();
|
| +
|
| + GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| + const char* fragmentPos = fsBuilder->fragmentPosition();
|
|
|
| // d is the offset to the ellipse center
|
| - builder->fsCodeAppendf("\t\tvec2 d = %s.xy - %s.xy;\n", fragmentPos, ellipseName);
|
| - builder->fsCodeAppendf("\t\tvec2 Z = d * %s.zw;\n", ellipseName);
|
| + fsBuilder->codeAppendf("\t\tvec2 d = %s.xy - %s.xy;\n", fragmentPos, ellipseName);
|
| + fsBuilder->codeAppendf("\t\tvec2 Z = d * %s.zw;\n", ellipseName);
|
| // implicit is the evaluation of (x/rx)^2 + (y/ry)^2 - 1.
|
| - builder->fsCodeAppend("\t\tfloat implicit = dot(Z, d) - 1.0;\n");
|
| + fsBuilder->codeAppend("\t\tfloat implicit = dot(Z, d) - 1.0;\n");
|
| // grad_dot is the squared length of the gradient of the implicit.
|
| - builder->fsCodeAppendf("\t\tfloat grad_dot = 4.0 * dot(Z, Z);\n");
|
| + fsBuilder->codeAppendf("\t\tfloat grad_dot = 4.0 * dot(Z, Z);\n");
|
| // avoid calling inversesqrt on zero.
|
| - builder->fsCodeAppend("\t\tgrad_dot = max(grad_dot, 1.0e-4);\n");
|
| - builder->fsCodeAppendf("\t\tfloat approx_dist = implicit * inversesqrt(grad_dot);\n");
|
| + fsBuilder->codeAppend("\t\tgrad_dot = max(grad_dot, 1.0e-4);\n");
|
| + fsBuilder->codeAppendf("\t\tfloat approx_dist = implicit * inversesqrt(grad_dot);\n");
|
|
|
| switch (ee.getEdgeType()) {
|
| case kFillAA_GrEffectEdgeType:
|
| - builder->fsCodeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1.0);\n");
|
| + fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1.0);\n");
|
| break;
|
| case kInverseFillAA_GrEffectEdgeType:
|
| - builder->fsCodeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1.0);\n");
|
| + fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1.0);\n");
|
| break;
|
| case kFillBW_GrEffectEdgeType:
|
| - builder->fsCodeAppend("\t\tfloat alpha = approx_dist > 0.0 ? 0.0 : 1.0;\n");
|
| + fsBuilder->codeAppend("\t\tfloat alpha = approx_dist > 0.0 ? 0.0 : 1.0;\n");
|
| break;
|
| case kInverseFillBW_GrEffectEdgeType:
|
| - builder->fsCodeAppend("\t\tfloat alpha = approx_dist > 0.0 ? 1.0 : 0.0;\n");
|
| + fsBuilder->codeAppend("\t\tfloat alpha = approx_dist > 0.0 ? 1.0 : 0.0;\n");
|
| break;
|
| case kHairlineAA_GrEffectEdgeType:
|
| SkFAIL("Hairline not expected here.");
|
| }
|
|
|
| - builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor,
|
| + fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor,
|
| (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str());
|
| }
|
|
|
|
|