| Index: src/effects/SkLightingImageFilter.cpp
|
| diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
|
| index 9fda787d2cc9db51e2e8a81d81d47bd2edf234e0..4bb755e3edddeadff2858c8ddd0ac79a3fb1955f 100644
|
| --- a/src/effects/SkLightingImageFilter.cpp
|
| +++ b/src/effects/SkLightingImageFilter.cpp
|
| @@ -608,8 +608,10 @@ public:
|
| * the FS. The default of emitLightColor appends the name of the constant light color uniform
|
| * and so this function only needs to be overridden if the light color varies spatially.
|
| */
|
| - virtual void emitSurfaceToLight(GrGLSLFPBuilder*, const char* z) = 0;
|
| - virtual void emitLightColor(GrGLSLFPBuilder*, const char *surfaceToLight);
|
| + virtual void emitSurfaceToLight(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, const char* z) = 0;
|
| + virtual void emitLightColor(GrGLSLFPBuilder*,
|
| + GrGLSLFragmentBuilder*,
|
| + const char *surfaceToLight);
|
|
|
| // This is called from GrGLLightingEffect's setData(). Subclasses of GrGLLight must call
|
| // INHERITED::setData().
|
| @@ -634,7 +636,7 @@ class GrGLDistantLight : public GrGLLight {
|
| public:
|
| virtual ~GrGLDistantLight() {}
|
| void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* light) const override;
|
| - void emitSurfaceToLight(GrGLSLFPBuilder*, const char* z) override;
|
| + void emitSurfaceToLight(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, const char* z) override;
|
|
|
| private:
|
| typedef GrGLLight INHERITED;
|
| @@ -647,7 +649,7 @@ class GrGLPointLight : public GrGLLight {
|
| public:
|
| virtual ~GrGLPointLight() {}
|
| void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* light) const override;
|
| - void emitSurfaceToLight(GrGLSLFPBuilder*, const char* z) override;
|
| + void emitSurfaceToLight(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, const char* z) override;
|
|
|
| private:
|
| typedef GrGLLight INHERITED;
|
| @@ -660,8 +662,10 @@ class GrGLSpotLight : public GrGLLight {
|
| public:
|
| virtual ~GrGLSpotLight() {}
|
| void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* light) const override;
|
| - void emitSurfaceToLight(GrGLSLFPBuilder*, const char* z) override;
|
| - void emitLightColor(GrGLSLFPBuilder*, const char *surfaceToLight) override;
|
| + void emitSurfaceToLight(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, const char* z) override;
|
| + void emitLightColor(GrGLSLFPBuilder*,
|
| + GrGLSLFragmentBuilder*,
|
| + const char *surfaceToLight) override;
|
|
|
| private:
|
| typedef GrGLLight INHERITED;
|
| @@ -1523,7 +1527,7 @@ protected:
|
| */
|
| void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override;
|
|
|
| - virtual void emitLightFunc(GrGLSLFPBuilder*, SkString* funcName) = 0;
|
| + virtual void emitLightFunc(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, SkString* funcName) = 0;
|
|
|
| private:
|
| typedef GrGLSLFragmentProcessor INHERITED;
|
| @@ -1539,7 +1543,7 @@ private:
|
| class GrGLDiffuseLightingEffect : public GrGLLightingEffect {
|
| public:
|
| GrGLDiffuseLightingEffect(const GrProcessor&);
|
| - void emitLightFunc(GrGLSLFPBuilder*, SkString* funcName) override;
|
| + void emitLightFunc(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, SkString* funcName) override;
|
|
|
| protected:
|
| void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override;
|
| @@ -1555,7 +1559,7 @@ private:
|
| class GrGLSpecularLightingEffect : public GrGLLightingEffect {
|
| public:
|
| GrGLSpecularLightingEffect(const GrProcessor&);
|
| - void emitLightFunc(GrGLSLFPBuilder*, SkString* funcName) override;
|
| + void emitLightFunc(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, SkString* funcName) override;
|
|
|
| protected:
|
| void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override;
|
| @@ -1659,8 +1663,9 @@ void GrGLLightingEffect::emitCode(EmitArgs& args) {
|
| kFloat_GrSLType, kDefault_GrSLPrecision,
|
| "SurfaceScale");
|
| fLight->emitLightColorUniform(args.fBuilder);
|
| + GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
|
| SkString lightFunc;
|
| - this->emitLightFunc(args.fBuilder, &lightFunc);
|
| + this->emitLightFunc(args.fBuilder, fragBuilder, &lightFunc);
|
| static const GrGLSLShaderVar gSobelArgs[] = {
|
| GrGLSLShaderVar("a", kFloat_GrSLType),
|
| GrGLSLShaderVar("b", kFloat_GrSLType),
|
| @@ -1671,27 +1676,26 @@ void GrGLLightingEffect::emitCode(EmitArgs& args) {
|
| GrGLSLShaderVar("scale", kFloat_GrSLType),
|
| };
|
| SkString sobelFuncName;
|
| - GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| - SkString coords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| -
|
| - fsBuilder->emitFunction(kFloat_GrSLType,
|
| - "sobel",
|
| - SK_ARRAY_COUNT(gSobelArgs),
|
| - gSobelArgs,
|
| - "\treturn (-a + b - 2.0 * c + 2.0 * d -e + f) * scale;\n",
|
| - &sobelFuncName);
|
| + SkString coords2D = fragBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| +
|
| + fragBuilder->emitFunction(kFloat_GrSLType,
|
| + "sobel",
|
| + SK_ARRAY_COUNT(gSobelArgs),
|
| + gSobelArgs,
|
| + "\treturn (-a + b - 2.0 * c + 2.0 * d -e + f) * scale;\n",
|
| + &sobelFuncName);
|
| static const GrGLSLShaderVar gPointToNormalArgs[] = {
|
| GrGLSLShaderVar("x", kFloat_GrSLType),
|
| GrGLSLShaderVar("y", kFloat_GrSLType),
|
| GrGLSLShaderVar("scale", kFloat_GrSLType),
|
| };
|
| SkString pointToNormalName;
|
| - fsBuilder->emitFunction(kVec3f_GrSLType,
|
| - "pointToNormal",
|
| - SK_ARRAY_COUNT(gPointToNormalArgs),
|
| - gPointToNormalArgs,
|
| - "\treturn normalize(vec3(-x * scale, -y * scale, 1));\n",
|
| - &pointToNormalName);
|
| + fragBuilder->emitFunction(kVec3f_GrSLType,
|
| + "pointToNormal",
|
| + SK_ARRAY_COUNT(gPointToNormalArgs),
|
| + gPointToNormalArgs,
|
| + "\treturn normalize(vec3(-x * scale, -y * scale, 1));\n",
|
| + &pointToNormalName);
|
|
|
| static const GrGLSLShaderVar gInteriorNormalArgs[] = {
|
| GrGLSLShaderVar("m", kFloat_GrSLType, 9),
|
| @@ -1701,15 +1705,15 @@ void GrGLLightingEffect::emitCode(EmitArgs& args) {
|
| pointToNormalName.c_str(),
|
| sobelFuncName.c_str());
|
| SkString normalName;
|
| - fsBuilder->emitFunction(kVec3f_GrSLType,
|
| - "normal",
|
| - SK_ARRAY_COUNT(gInteriorNormalArgs),
|
| - gInteriorNormalArgs,
|
| - normalBody.c_str(),
|
| - &normalName);
|
| + fragBuilder->emitFunction(kVec3f_GrSLType,
|
| + "normal",
|
| + SK_ARRAY_COUNT(gInteriorNormalArgs),
|
| + gInteriorNormalArgs,
|
| + normalBody.c_str(),
|
| + &normalName);
|
|
|
| - fsBuilder->codeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str());
|
| - fsBuilder->codeAppend("\t\tfloat m[9];\n");
|
| + fragBuilder->codeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str());
|
| + fragBuilder->codeAppend("\t\tfloat m[9];\n");
|
|
|
| const char* imgInc = args.fBuilder->getUniformCStr(fImageIncrementUni);
|
| const char* surfScale = args.fBuilder->getUniformCStr(fSurfaceScaleUni);
|
| @@ -1719,23 +1723,23 @@ void GrGLLightingEffect::emitCode(EmitArgs& args) {
|
| for (int dx = -1; dx <= 1; dx++) {
|
| SkString texCoords;
|
| texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc);
|
| - fsBuilder->codeAppendf("\t\tm[%d] = ", index++);
|
| - fsBuilder->appendTextureLookup(args.fSamplers[0], texCoords.c_str());
|
| - fsBuilder->codeAppend(".a;\n");
|
| + fragBuilder->codeAppendf("\t\tm[%d] = ", index++);
|
| + fragBuilder->appendTextureLookup(args.fSamplers[0], texCoords.c_str());
|
| + fragBuilder->codeAppend(".a;\n");
|
| }
|
| }
|
| - fsBuilder->codeAppend("\t\tvec3 surfaceToLight = ");
|
| + fragBuilder->codeAppend("\t\tvec3 surfaceToLight = ");
|
| SkString arg;
|
| arg.appendf("%s * m[4]", surfScale);
|
| - fLight->emitSurfaceToLight(args.fBuilder, arg.c_str());
|
| - fsBuilder->codeAppend(";\n");
|
| - fsBuilder->codeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ",
|
| - args.fOutputColor, lightFunc.c_str(), normalName.c_str(), surfScale);
|
| - fLight->emitLightColor(args.fBuilder, "surfaceToLight");
|
| - fsBuilder->codeAppend(");\n");
|
| + fLight->emitSurfaceToLight(args.fBuilder, fragBuilder, arg.c_str());
|
| + fragBuilder->codeAppend(";\n");
|
| + fragBuilder->codeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ",
|
| + args.fOutputColor, lightFunc.c_str(), normalName.c_str(), surfScale);
|
| + fLight->emitLightColor(args.fBuilder, fragBuilder, "surfaceToLight");
|
| + fragBuilder->codeAppend(");\n");
|
| SkString modulate;
|
| GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor);
|
| - fsBuilder->codeAppend(modulate.c_str());
|
| + fragBuilder->codeAppend(modulate.c_str());
|
| }
|
|
|
| void GrGLLightingEffect::GenKey(const GrProcessor& proc,
|
| @@ -1764,7 +1768,9 @@ GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrProcessor& proc)
|
| : INHERITED(proc) {
|
| }
|
|
|
| -void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLFPBuilder* builder, SkString* funcName) {
|
| +void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLFPBuilder* builder,
|
| + GrGLSLFragmentBuilder* fragBuilder,
|
| + SkString* funcName) {
|
| const char* kd;
|
| fKDUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| kFloat_GrSLType, kDefault_GrSLPrecision,
|
| @@ -1778,12 +1784,12 @@ void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLFPBuilder* builder, SkString
|
| SkString lightBody;
|
| lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n", kd);
|
| lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1.0);\n");
|
| - builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType,
|
| - "light",
|
| - SK_ARRAY_COUNT(gLightArgs),
|
| - gLightArgs,
|
| - lightBody.c_str(),
|
| - funcName);
|
| + fragBuilder->emitFunction(kVec4f_GrSLType,
|
| + "light",
|
| + SK_ARRAY_COUNT(gLightArgs),
|
| + gLightArgs,
|
| + lightBody.c_str(),
|
| + funcName);
|
| }
|
|
|
| void GrGLDiffuseLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman,
|
| @@ -1846,7 +1852,9 @@ GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrProcessor& proc)
|
| : INHERITED(proc) {
|
| }
|
|
|
| -void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLFPBuilder* builder, SkString* funcName) {
|
| +void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLFPBuilder* builder,
|
| + GrGLSLFragmentBuilder* fragBuilder,
|
| + SkString* funcName) {
|
| const char* ks;
|
| const char* shininess;
|
|
|
| @@ -1868,12 +1876,12 @@ void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLFPBuilder* builder, SkStrin
|
| lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\n", ks, shininess);
|
| lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\n");
|
| lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b));\n");
|
| - builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType,
|
| - "light",
|
| - SK_ARRAY_COUNT(gLightArgs),
|
| - gLightArgs,
|
| - lightBody.c_str(),
|
| - funcName);
|
| + fragBuilder->emitFunction(kVec4f_GrSLType,
|
| + "light",
|
| + SK_ARRAY_COUNT(gLightArgs),
|
| + gLightArgs,
|
| + lightBody.c_str(),
|
| + funcName);
|
| }
|
|
|
| void GrGLSpecularLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman,
|
| @@ -1891,8 +1899,10 @@ void GrGLLight::emitLightColorUniform(GrGLSLFPBuilder* builder) {
|
| "LightColor");
|
| }
|
|
|
| -void GrGLLight::emitLightColor(GrGLSLFPBuilder* builder, const char *surfaceToLight) {
|
| - builder->getFragmentShaderBuilder()->codeAppend(builder->getUniformCStr(this->lightColorUni()));
|
| +void GrGLLight::emitLightColor(GrGLSLFPBuilder* builder,
|
| + GrGLSLFragmentBuilder* fragBuilder,
|
| + const char *surfaceToLight) {
|
| + fragBuilder->codeAppend(builder->getUniformCStr(this->lightColorUni()));
|
| }
|
|
|
| void GrGLLight::setData(const GrGLSLProgramDataManager& pdman,
|
| @@ -1911,12 +1921,14 @@ void GrGLDistantLight::setData(const GrGLSLProgramDataManager& pdman,
|
| setUniformNormal3(pdman, fDirectionUni, distantLight->direction());
|
| }
|
|
|
| -void GrGLDistantLight::emitSurfaceToLight(GrGLSLFPBuilder* builder, const char* z) {
|
| +void GrGLDistantLight::emitSurfaceToLight(GrGLSLFPBuilder* builder,
|
| + GrGLSLFragmentBuilder* fragBuilder,
|
| + const char* z) {
|
| const char* dir;
|
| fDirectionUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| "LightDirection", &dir);
|
| - builder->getFragmentShaderBuilder()->codeAppend(dir);
|
| + fragBuilder->codeAppend(dir);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -1929,14 +1941,15 @@ void GrGLPointLight::setData(const GrGLSLProgramDataManager& pdman,
|
| setUniformPoint3(pdman, fLocationUni, pointLight->location());
|
| }
|
|
|
| -void GrGLPointLight::emitSurfaceToLight(GrGLSLFPBuilder* builder, const char* z) {
|
| +void GrGLPointLight::emitSurfaceToLight(GrGLSLFPBuilder* builder,
|
| + GrGLSLFragmentBuilder* fragBuilder,
|
| + const char* z) {
|
| const char* loc;
|
| fLocationUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| "LightLocation", &loc);
|
| - GrGLSLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| - fsBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))",
|
| - loc, fsBuilder->fragmentPosition(), z);
|
| + fragBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))",
|
| + loc, fragBuilder->fragmentPosition(), z);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -1954,18 +1967,20 @@ void GrGLSpotLight::setData(const GrGLSLProgramDataManager& pdman,
|
| setUniformNormal3(pdman, fSUni, spotLight->s());
|
| }
|
|
|
| -void GrGLSpotLight::emitSurfaceToLight(GrGLSLFPBuilder* builder, const char* z) {
|
| +void GrGLSpotLight::emitSurfaceToLight(GrGLSLFPBuilder* builder,
|
| + GrGLSLFragmentBuilder* fragBuilder,
|
| + const char* z) {
|
| const char* location;
|
| fLocationUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| "LightLocation", &location);
|
|
|
| - GrGLSLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| - fsBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))",
|
| - location, fsBuilder->fragmentPosition(), z);
|
| + fragBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))",
|
| + location, fragBuilder->fragmentPosition(), z);
|
| }
|
|
|
| void GrGLSpotLight::emitLightColor(GrGLSLFPBuilder* builder,
|
| + GrGLSLFragmentBuilder* fragBuilder,
|
| const char *surfaceToLight) {
|
|
|
| const char* color = builder->getUniformCStr(this->lightColorUni()); // created by parent class.
|
| @@ -2004,15 +2019,14 @@ void GrGLSpotLight::emitLightColor(GrGLSLFPBuilder* builder,
|
| color, cosOuter, coneScale);
|
| lightColorBody.appendf("\t}\n");
|
| lightColorBody.appendf("\treturn %s;\n", color);
|
| - GrGLSLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
|
| - fsBuilder->emitFunction(kVec3f_GrSLType,
|
| - "lightColor",
|
| - SK_ARRAY_COUNT(gLightColorArgs),
|
| - gLightColorArgs,
|
| - lightColorBody.c_str(),
|
| - &fLightColorFunc);
|
| -
|
| - fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight);
|
| + fragBuilder->emitFunction(kVec3f_GrSLType,
|
| + "lightColor",
|
| + SK_ARRAY_COUNT(gLightColorArgs),
|
| + gLightColorArgs,
|
| + lightColorBody.c_str(),
|
| + &fLightColorFunc);
|
| +
|
| + fragBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight);
|
| }
|
|
|
| #endif
|
|
|