| Index: src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
|
| diff --git a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
|
| index 1e4a060c3b3ab3d8be4ccf0d9fd5b5cb58f7484a..9461f1377071b0e85eaf6b76e9eb6db09d4aaad8 100644
|
| --- a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
|
| +++ b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
|
| @@ -144,12 +144,7 @@ public:
|
| GLEdge2PtConicalEffect(const GrProcessor&);
|
| virtual ~GLEdge2PtConicalEffect() { }
|
|
|
| - virtual void emitCode(GrGLFPBuilder*,
|
| - const GrFragmentProcessor&,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray&,
|
| - const TextureSamplerArray&) override;
|
| + virtual void emitCode(EmitArgs&) override;
|
| void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
|
|
|
| static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKeyBuilder* b);
|
| @@ -228,15 +223,10 @@ GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&)
|
| , fCachedRadius(-SK_ScalarMax)
|
| , fCachedDiffRadius(-SK_ScalarMax) {}
|
|
|
| -void GLEdge2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
|
| - const GrFragmentProcessor& fp,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray& coords,
|
| - const TextureSamplerArray& samplers) {
|
| - const Edge2PtConicalEffect& ge = fp.cast<Edge2PtConicalEffect>();
|
| - this->emitUniforms(builder, ge);
|
| - fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibility,
|
| +void GLEdge2PtConicalEffect::emitCode(EmitArgs& args) {
|
| + const Edge2PtConicalEffect& ge = args.fFp.cast<Edge2PtConicalEffect>();
|
| + this->emitUniforms(args.fBuilder, ge);
|
| + fParamUni = args.fBuilder->addUniformArray(GrGLProgramBuilder::kFragment_Visibility,
|
| kFloat_GrSLType, kDefault_GrSLPrecision,
|
| "Conical2FSParams", 3);
|
|
|
| @@ -246,29 +236,29 @@ void GLEdge2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
|
| SkString p1; // start radius squared
|
| SkString p2; // difference in radii (r1 - r0)
|
|
|
| - builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0);
|
| - builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1);
|
| - builder->getUniformVariable(fParamUni).appendArrayAccess(2, &p2);
|
| + args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0);
|
| + args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1);
|
| + args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(2, &p2);
|
|
|
| // We interpolate the linear component in coords[1].
|
| - SkASSERT(coords[0].getType() == coords[1].getType());
|
| + SkASSERT(args.fCoords[0].getType() == args.fCoords[1].getType());
|
| const char* coords2D;
|
| SkString bVar;
|
| - GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| - if (kVec3f_GrSLType == coords[0].getType()) {
|
| + GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| + if (kVec3f_GrSLType == args.fCoords[0].getType()) {
|
| fsBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n",
|
| - coords[0].c_str(), coords[0].c_str(), coords[1].c_str(),
|
| - coords[1].c_str());
|
| + args.fCoords[0].c_str(), args.fCoords[0].c_str(),
|
| + args.fCoords[1].c_str(), args.fCoords[1].c_str());
|
| coords2D = "interpolants.xy";
|
| bVar = "interpolants.z";
|
| } else {
|
| - coords2D = coords[0].c_str();
|
| - bVar.printf("%s.x", coords[1].c_str());
|
| + coords2D = args.fCoords[0].c_str();
|
| + bVar.printf("%s.x", args.fCoords[1].c_str());
|
| }
|
|
|
| // output will default to transparent black (we simply won't write anything
|
| // else to it if invalid, instead of discarding or returning prematurely)
|
| - fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor);
|
| + fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColor);
|
|
|
| // c = (x^2)+(y^2) - params[1]
|
| fsBuilder->codeAppendf("\tfloat %s = dot(%s, %s) - %s;\n",
|
| @@ -282,7 +272,8 @@ void GLEdge2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
|
| fsBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(),
|
| p2.c_str(), p0.c_str());
|
| fsBuilder->codeAppend("\t");
|
| - this->emitColor(builder, ge, tName.c_str(), outputColor, inputColor, samplers);
|
| + this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fInputColor,
|
| + args.fSamplers);
|
| fsBuilder->codeAppend("\t}\n");
|
| }
|
|
|
| @@ -434,12 +425,7 @@ public:
|
| GLFocalOutside2PtConicalEffect(const GrProcessor&);
|
| virtual ~GLFocalOutside2PtConicalEffect() { }
|
|
|
| - virtual void emitCode(GrGLFPBuilder*,
|
| - const GrFragmentProcessor&,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray&,
|
| - const TextureSamplerArray&) override;
|
| + virtual void emitCode(EmitArgs&) override;
|
| void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
|
|
|
| static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKeyBuilder* b);
|
| @@ -520,34 +506,29 @@ GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor
|
| fIsFlipped = data.isFlipped();
|
| }
|
|
|
| -void GLFocalOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
|
| - const GrFragmentProcessor& fp,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray& coords,
|
| - const TextureSamplerArray& samplers) {
|
| - const FocalOutside2PtConicalEffect& ge = fp.cast<FocalOutside2PtConicalEffect>();
|
| - this->emitUniforms(builder, ge);
|
| - fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibility,
|
| +void GLFocalOutside2PtConicalEffect::emitCode(EmitArgs& args) {
|
| + const FocalOutside2PtConicalEffect& ge = args.fFp.cast<FocalOutside2PtConicalEffect>();
|
| + this->emitUniforms(args.fBuilder, ge);
|
| + fParamUni = args.fBuilder->addUniformArray(GrGLProgramBuilder::kFragment_Visibility,
|
| kFloat_GrSLType, kDefault_GrSLPrecision,
|
| "Conical2FSParams", 2);
|
| SkString tName("t");
|
| SkString p0; // focalX
|
| SkString p1; // 1 - focalX * focalX
|
|
|
| - builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0);
|
| - builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1);
|
| + args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0);
|
| + args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1);
|
|
|
| // if we have a vec3 from being in perspective, convert it to a vec2 first
|
| - GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| - SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0);
|
| + GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| + SkString coords2DString = fsBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| const char* coords2D = coords2DString.c_str();
|
|
|
| // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2)
|
|
|
| // output will default to transparent black (we simply won't write anything
|
| // else to it if invalid, instead of discarding or returning prematurely)
|
| - fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor);
|
| + fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColor);
|
|
|
| fsBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D);
|
| fsBuilder->codeAppendf("\tfloat ys = %s.y * %s.y;\n", coords2D, coords2D);
|
| @@ -565,7 +546,8 @@ void GLFocalOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
|
|
|
| fsBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str());
|
| fsBuilder->codeAppend("\t\t");
|
| - this->emitColor(builder, ge, tName.c_str(), outputColor, inputColor, samplers);
|
| + this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fInputColor,
|
| + args.fSamplers);
|
| fsBuilder->codeAppend("\t}\n");
|
| }
|
|
|
| @@ -656,12 +638,7 @@ public:
|
| GLFocalInside2PtConicalEffect(const GrProcessor&);
|
| virtual ~GLFocalInside2PtConicalEffect() {}
|
|
|
| - virtual void emitCode(GrGLFPBuilder*,
|
| - const GrFragmentProcessor&,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray&,
|
| - const TextureSamplerArray&) override;
|
| + virtual void emitCode(EmitArgs&) override;
|
| void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
|
|
|
| static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKeyBuilder* b);
|
| @@ -737,33 +714,29 @@ GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&)
|
| , fFSVaryingName(NULL)
|
| , fCachedFocal(SK_ScalarMax) {}
|
|
|
| -void GLFocalInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
|
| - const GrFragmentProcessor& fp,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray& coords,
|
| - const TextureSamplerArray& samplers) {
|
| - const FocalInside2PtConicalEffect& ge = fp.cast<FocalInside2PtConicalEffect>();
|
| - this->emitUniforms(builder, ge);
|
| - fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| +void GLFocalInside2PtConicalEffect::emitCode(EmitArgs& args) {
|
| + const FocalInside2PtConicalEffect& ge = args.fFp.cast<FocalInside2PtConicalEffect>();
|
| + this->emitUniforms(args.fBuilder, ge);
|
| + fFocalUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| kFloat_GrSLType, kDefault_GrSLPrecision,
|
| "Conical2FSParams");
|
| SkString tName("t");
|
|
|
| // this is the distance along x-axis from the end center to focal point in
|
| // transformed coordinates
|
| - GrGLShaderVar focal = builder->getUniformVariable(fFocalUni);
|
| + GrGLShaderVar focal = args.fBuilder->getUniformVariable(fFocalUni);
|
|
|
| // if we have a vec3 from being in perspective, convert it to a vec2 first
|
| - GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| - SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0);
|
| + GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| + SkString coords2DString = fsBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| const char* coords2D = coords2DString.c_str();
|
|
|
| // t = p.x * focalX + length(p)
|
| fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_str(),
|
| coords2D, focal.c_str(), coords2D);
|
|
|
| - this->emitColor(builder, ge, tName.c_str(), outputColor, inputColor, samplers);
|
| + this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fInputColor,
|
| + args.fSamplers);
|
| }
|
|
|
| void GLFocalInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman,
|
| @@ -907,12 +880,7 @@ public:
|
| GLCircleInside2PtConicalEffect(const GrProcessor&);
|
| virtual ~GLCircleInside2PtConicalEffect() {}
|
|
|
| - virtual void emitCode(GrGLFPBuilder*,
|
| - const GrFragmentProcessor&,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray&,
|
| - const TextureSamplerArray&) override;
|
| + virtual void emitCode(EmitArgs&) override;
|
| void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
|
|
|
| static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKeyBuilder* b);
|
| @@ -997,31 +965,26 @@ GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrProcessor
|
| , fCachedB(SK_ScalarMax)
|
| , fCachedC(SK_ScalarMax) {}
|
|
|
| -void GLCircleInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
|
| - const GrFragmentProcessor& fp,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray& coords,
|
| - const TextureSamplerArray& samplers) {
|
| - const CircleInside2PtConicalEffect& ge = fp.cast<CircleInside2PtConicalEffect>();
|
| - this->emitUniforms(builder, ge);
|
| - fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| +void GLCircleInside2PtConicalEffect::emitCode(EmitArgs& args) {
|
| + const CircleInside2PtConicalEffect& ge = args.fFp.cast<CircleInside2PtConicalEffect>();
|
| + this->emitUniforms(args.fBuilder, ge);
|
| + fCenterUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| kVec2f_GrSLType, kDefault_GrSLPrecision,
|
| "Conical2FSCenter");
|
| - fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| + fParamUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| "Conical2FSParams");
|
| SkString tName("t");
|
|
|
| - GrGLShaderVar center = builder->getUniformVariable(fCenterUni);
|
| + GrGLShaderVar center = args.fBuilder->getUniformVariable(fCenterUni);
|
| // params.x = A
|
| // params.y = B
|
| // params.z = C
|
| - GrGLShaderVar params = builder->getUniformVariable(fParamUni);
|
| + GrGLShaderVar params = args.fBuilder->getUniformVariable(fParamUni);
|
|
|
| // if we have a vec3 from being in perspective, convert it to a vec2 first
|
| - GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| - SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0);
|
| + GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| + SkString coords2DString = fsBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| const char* coords2D = coords2DString.c_str();
|
|
|
| // p = coords2D
|
| @@ -1038,7 +1001,8 @@ void GLCircleInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
|
| fsBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\n",
|
| tName.c_str(), params.c_str(), params.c_str());
|
|
|
| - this->emitColor(builder, ge, tName.c_str(), outputColor, inputColor, samplers);
|
| + this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fInputColor,
|
| + args.fSamplers);
|
| }
|
|
|
| void GLCircleInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman,
|
| @@ -1144,12 +1108,7 @@ public:
|
| GLCircleOutside2PtConicalEffect(const GrProcessor&);
|
| virtual ~GLCircleOutside2PtConicalEffect() {}
|
|
|
| - virtual void emitCode(GrGLFPBuilder*,
|
| - const GrFragmentProcessor&,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray&,
|
| - const TextureSamplerArray&) override;
|
| + virtual void emitCode(EmitArgs&) override;
|
| void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
|
|
|
| static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKeyBuilder* b);
|
| @@ -1241,36 +1200,31 @@ GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrProcess
|
| fIsFlipped = data.isFlipped();
|
| }
|
|
|
| -void GLCircleOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
|
| - const GrFragmentProcessor& fp,
|
| - const char* outputColor,
|
| - const char* inputColor,
|
| - const TransformedCoordsArray& coords,
|
| - const TextureSamplerArray& samplers) {
|
| - const CircleOutside2PtConicalEffect& ge = fp.cast<CircleOutside2PtConicalEffect>();
|
| - this->emitUniforms(builder, ge);
|
| - fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| +void GLCircleOutside2PtConicalEffect::emitCode(EmitArgs& args) {
|
| + const CircleOutside2PtConicalEffect& ge = args.fFp.cast<CircleOutside2PtConicalEffect>();
|
| + this->emitUniforms(args.fBuilder, ge);
|
| + fCenterUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| kVec2f_GrSLType, kDefault_GrSLPrecision,
|
| "Conical2FSCenter");
|
| - fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| + fParamUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| "Conical2FSParams");
|
| SkString tName("t");
|
|
|
| - GrGLShaderVar center = builder->getUniformVariable(fCenterUni);
|
| + GrGLShaderVar center = args.fBuilder->getUniformVariable(fCenterUni);
|
| // params.x = A
|
| // params.y = B
|
| // params.z = C
|
| - GrGLShaderVar params = builder->getUniformVariable(fParamUni);
|
| + GrGLShaderVar params = args.fBuilder->getUniformVariable(fParamUni);
|
|
|
| // if we have a vec3 from being in perspective, convert it to a vec2 first
|
| - GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| - SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0);
|
| + GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| + SkString coords2DString = fsBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| const char* coords2D = coords2DString.c_str();
|
|
|
| // output will default to transparent black (we simply won't write anything
|
| // else to it if invalid, instead of discarding or returning prematurely)
|
| - fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor);
|
| + fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColor);
|
|
|
| // p = coords2D
|
| // e = center end
|
| @@ -1297,7 +1251,8 @@ void GLCircleOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
|
|
|
| fsBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str(), params.c_str());
|
| fsBuilder->codeAppend("\t\t");
|
| - this->emitColor(builder, ge, tName.c_str(), outputColor, inputColor, samplers);
|
| + this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fInputColor,
|
| + args.fSamplers);
|
| fsBuilder->codeAppend("\t}\n");
|
| }
|
|
|
|
|