| Index: src/effects/SkLightingImageFilter.cpp
|
| diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
|
| index 9b6a20f0efb05061ca547dfde5df1c0b919e89f4..ac7488be6b7e9acb5f1f90f7e049ce45792f97d1 100644
|
| --- a/src/effects/SkLightingImageFilter.cpp
|
| +++ b/src/effects/SkLightingImageFilter.cpp
|
| @@ -23,8 +23,8 @@
|
| #include "effects/GrSingleTextureEffect.h"
|
| #include "glsl/GrGLSLFragmentProcessor.h"
|
| #include "glsl/GrGLSLFragmentShaderBuilder.h"
|
| -#include "glsl/GrGLSLProgramBuilder.h"
|
| #include "glsl/GrGLSLProgramDataManager.h"
|
| +#include "glsl/GrGLSLUniformHandler.h"
|
|
|
| class GrGLDiffuseLightingEffect;
|
| class GrGLSpecularLightingEffect;
|
| @@ -599,7 +599,7 @@ public:
|
| * This is called by GrGLLightingEffect::emitCode() before either of the two virtual functions
|
| * below. It adds a vec3f uniform visible in the FS that represents the constant light color.
|
| */
|
| - void emitLightColorUniform(GrGLSLFPBuilder*);
|
| + void emitLightColorUniform(GrGLSLUniformHandler*);
|
|
|
| /**
|
| * These two functions are called from GrGLLightingEffect's emitCode() function.
|
| @@ -609,8 +609,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*, GrGLSLFragmentBuilder*, const char* z) = 0;
|
| - virtual void emitLightColor(GrGLSLFPBuilder*,
|
| + virtual void emitSurfaceToLight(GrGLSLUniformHandler*,
|
| + GrGLSLFragmentBuilder*,
|
| + const char* z) = 0;
|
| + virtual void emitLightColor(GrGLSLUniformHandler*,
|
| GrGLSLFragmentBuilder*,
|
| const char *surfaceToLight);
|
|
|
| @@ -637,7 +639,7 @@ class GrGLDistantLight : public GrGLLight {
|
| public:
|
| virtual ~GrGLDistantLight() {}
|
| void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* light) const override;
|
| - void emitSurfaceToLight(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, const char* z) override;
|
| + void emitSurfaceToLight(GrGLSLUniformHandler*, GrGLSLFragmentBuilder*, const char* z) override;
|
|
|
| private:
|
| typedef GrGLLight INHERITED;
|
| @@ -650,7 +652,7 @@ class GrGLPointLight : public GrGLLight {
|
| public:
|
| virtual ~GrGLPointLight() {}
|
| void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* light) const override;
|
| - void emitSurfaceToLight(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, const char* z) override;
|
| + void emitSurfaceToLight(GrGLSLUniformHandler*, GrGLSLFragmentBuilder*, const char* z) override;
|
|
|
| private:
|
| typedef GrGLLight INHERITED;
|
| @@ -663,8 +665,8 @@ class GrGLSpotLight : public GrGLLight {
|
| public:
|
| virtual ~GrGLSpotLight() {}
|
| void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* light) const override;
|
| - void emitSurfaceToLight(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, const char* z) override;
|
| - void emitLightColor(GrGLSLFPBuilder*,
|
| + void emitSurfaceToLight(GrGLSLUniformHandler*, GrGLSLFragmentBuilder*, const char* z) override;
|
| + void emitLightColor(GrGLSLUniformHandler*,
|
| GrGLSLFragmentBuilder*,
|
| const char *surfaceToLight) override;
|
|
|
| @@ -1528,7 +1530,9 @@ protected:
|
| */
|
| void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override;
|
|
|
| - virtual void emitLightFunc(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, SkString* funcName) = 0;
|
| + virtual void emitLightFunc(GrGLSLUniformHandler*,
|
| + GrGLSLFragmentBuilder*,
|
| + SkString* funcName) = 0;
|
|
|
| private:
|
| typedef GrGLSLFragmentProcessor INHERITED;
|
| @@ -1544,7 +1548,7 @@ private:
|
| class GrGLDiffuseLightingEffect : public GrGLLightingEffect {
|
| public:
|
| GrGLDiffuseLightingEffect(const GrProcessor&);
|
| - void emitLightFunc(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, SkString* funcName) override;
|
| + void emitLightFunc(GrGLSLUniformHandler*, GrGLSLFragmentBuilder*, SkString* funcName) override;
|
|
|
| protected:
|
| void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override;
|
| @@ -1560,7 +1564,7 @@ private:
|
| class GrGLSpecularLightingEffect : public GrGLLightingEffect {
|
| public:
|
| GrGLSpecularLightingEffect(const GrProcessor&);
|
| - void emitLightFunc(GrGLSLFPBuilder*, GrGLSLFragmentBuilder*, SkString* funcName) override;
|
| + void emitLightFunc(GrGLSLUniformHandler*, GrGLSLFragmentBuilder*, SkString* funcName) override;
|
|
|
| protected:
|
| void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override;
|
| @@ -1657,16 +1661,17 @@ GrGLLightingEffect::~GrGLLightingEffect() {
|
| }
|
|
|
| void GrGLLightingEffect::emitCode(EmitArgs& args) {
|
| - fImageIncrementUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec2f_GrSLType, kDefault_GrSLPrecision,
|
| - "ImageIncrement");
|
| - fSurfaceScaleUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType, kDefault_GrSLPrecision,
|
| - "SurfaceScale");
|
| - fLight->emitLightColorUniform(args.fBuilder);
|
| + GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
|
| + fImageIncrementUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec2f_GrSLType, kDefault_GrSLPrecision,
|
| + "ImageIncrement");
|
| + fSurfaceScaleUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kFloat_GrSLType, kDefault_GrSLPrecision,
|
| + "SurfaceScale");
|
| + fLight->emitLightColorUniform(uniformHandler);
|
| GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
|
| SkString lightFunc;
|
| - this->emitLightFunc(args.fBuilder, fragBuilder, &lightFunc);
|
| + this->emitLightFunc(uniformHandler, fragBuilder, &lightFunc);
|
| static const GrGLSLShaderVar gSobelArgs[] = {
|
| GrGLSLShaderVar("a", kFloat_GrSLType),
|
| GrGLSLShaderVar("b", kFloat_GrSLType),
|
| @@ -1716,8 +1721,8 @@ void GrGLLightingEffect::emitCode(EmitArgs& args) {
|
| 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);
|
| + const char* imgInc = uniformHandler->getUniformCStr(fImageIncrementUni);
|
| + const char* surfScale = uniformHandler->getUniformCStr(fSurfaceScaleUni);
|
|
|
| int index = 0;
|
| for (int dy = 1; dy >= -1; dy--) {
|
| @@ -1732,11 +1737,11 @@ void GrGLLightingEffect::emitCode(EmitArgs& args) {
|
| fragBuilder->codeAppend("\t\tvec3 surfaceToLight = ");
|
| SkString arg;
|
| arg.appendf("%s * m[4]", surfScale);
|
| - fLight->emitSurfaceToLight(args.fBuilder, fragBuilder, arg.c_str());
|
| + fLight->emitSurfaceToLight(uniformHandler, 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");
|
| + fLight->emitLightColor(uniformHandler, fragBuilder, "surfaceToLight");
|
| fragBuilder->codeAppend(");\n");
|
| SkString modulate;
|
| GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor);
|
| @@ -1769,11 +1774,11 @@ GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrProcessor& proc)
|
| : INHERITED(proc) {
|
| }
|
|
|
| -void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLFPBuilder* builder,
|
| +void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHandler,
|
| GrGLSLFragmentBuilder* fragBuilder,
|
| SkString* funcName) {
|
| const char* kd;
|
| - fKDUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| + fKDUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| kFloat_GrSLType, kDefault_GrSLPrecision,
|
| "KD", &kd);
|
|
|
| @@ -1853,19 +1858,19 @@ GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrProcessor& proc)
|
| : INHERITED(proc) {
|
| }
|
|
|
| -void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLFPBuilder* builder,
|
| +void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHandler,
|
| GrGLSLFragmentBuilder* fragBuilder,
|
| SkString* funcName) {
|
| const char* ks;
|
| const char* shininess;
|
|
|
| - fKSUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType, kDefault_GrSLPrecision, "KS", &ks);
|
| - fShininessUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType,
|
| - kDefault_GrSLPrecision,
|
| - "Shininess",
|
| - &shininess);
|
| + fKSUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kFloat_GrSLType, kDefault_GrSLPrecision, "KS", &ks);
|
| + fShininessUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kFloat_GrSLType,
|
| + kDefault_GrSLPrecision,
|
| + "Shininess",
|
| + &shininess);
|
|
|
| static const GrGLSLShaderVar gLightArgs[] = {
|
| GrGLSLShaderVar("normal", kVec3f_GrSLType),
|
| @@ -1894,16 +1899,16 @@ void GrGLSpecularLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| -void GrGLLight::emitLightColorUniform(GrGLSLFPBuilder* builder) {
|
| - fColorUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| - "LightColor");
|
| +void GrGLLight::emitLightColorUniform(GrGLSLUniformHandler* uniformHandler) {
|
| + fColorUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| + "LightColor");
|
| }
|
|
|
| -void GrGLLight::emitLightColor(GrGLSLFPBuilder* builder,
|
| +void GrGLLight::emitLightColor(GrGLSLUniformHandler* uniformHandler,
|
| GrGLSLFragmentBuilder* fragBuilder,
|
| const char *surfaceToLight) {
|
| - fragBuilder->codeAppend(builder->getUniformCStr(this->lightColorUni()));
|
| + fragBuilder->codeAppend(uniformHandler->getUniformCStr(this->lightColorUni()));
|
| }
|
|
|
| void GrGLLight::setData(const GrGLSLProgramDataManager& pdman,
|
| @@ -1922,13 +1927,13 @@ void GrGLDistantLight::setData(const GrGLSLProgramDataManager& pdman,
|
| setUniformNormal3(pdman, fDirectionUni, distantLight->direction());
|
| }
|
|
|
| -void GrGLDistantLight::emitSurfaceToLight(GrGLSLFPBuilder* builder,
|
| +void GrGLDistantLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler,
|
| GrGLSLFragmentBuilder* fragBuilder,
|
| const char* z) {
|
| const char* dir;
|
| - fDirectionUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| - "LightDirection", &dir);
|
| + fDirectionUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| + "LightDirection", &dir);
|
| fragBuilder->codeAppend(dir);
|
| }
|
|
|
| @@ -1942,13 +1947,13 @@ void GrGLPointLight::setData(const GrGLSLProgramDataManager& pdman,
|
| setUniformPoint3(pdman, fLocationUni, pointLight->location());
|
| }
|
|
|
| -void GrGLPointLight::emitSurfaceToLight(GrGLSLFPBuilder* builder,
|
| +void GrGLPointLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler,
|
| GrGLSLFragmentBuilder* fragBuilder,
|
| const char* z) {
|
| const char* loc;
|
| - fLocationUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| - "LightLocation", &loc);
|
| + fLocationUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| + "LightLocation", &loc);
|
| fragBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))",
|
| loc, fragBuilder->fragmentPosition(), z);
|
| }
|
| @@ -1968,43 +1973,43 @@ void GrGLSpotLight::setData(const GrGLSLProgramDataManager& pdman,
|
| setUniformNormal3(pdman, fSUni, spotLight->s());
|
| }
|
|
|
| -void GrGLSpotLight::emitSurfaceToLight(GrGLSLFPBuilder* builder,
|
| +void GrGLSpotLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler,
|
| GrGLSLFragmentBuilder* fragBuilder,
|
| const char* z) {
|
| const char* location;
|
| - fLocationUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| - "LightLocation", &location);
|
| + fLocationUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| + "LightLocation", &location);
|
|
|
| fragBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))",
|
| location, fragBuilder->fragmentPosition(), z);
|
| }
|
|
|
| -void GrGLSpotLight::emitLightColor(GrGLSLFPBuilder* builder,
|
| +void GrGLSpotLight::emitLightColor(GrGLSLUniformHandler* uniformHandler,
|
| GrGLSLFragmentBuilder* fragBuilder,
|
| const char *surfaceToLight) {
|
|
|
| - const char* color = builder->getUniformCStr(this->lightColorUni()); // created by parent class.
|
| + const char* color = uniformHandler->getUniformCStr(this->lightColorUni()); // created by parent class.
|
|
|
| const char* exponent;
|
| const char* cosInner;
|
| const char* cosOuter;
|
| const char* coneScale;
|
| const char* s;
|
| - fExponentUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType, kDefault_GrSLPrecision,
|
| - "Exponent", &exponent);
|
| - fCosInnerConeAngleUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType, kDefault_GrSLPrecision,
|
| - "CosInnerConeAngle", &cosInner);
|
| - fCosOuterConeAngleUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType, kDefault_GrSLPrecision,
|
| - "CosOuterConeAngle", &cosOuter);
|
| - fConeScaleUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType, kDefault_GrSLPrecision,
|
| - "ConeScale", &coneScale);
|
| - fSUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec3f_GrSLType, kDefault_GrSLPrecision, "S", &s);
|
| + fExponentUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kFloat_GrSLType, kDefault_GrSLPrecision,
|
| + "Exponent", &exponent);
|
| + fCosInnerConeAngleUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kFloat_GrSLType, kDefault_GrSLPrecision,
|
| + "CosInnerConeAngle", &cosInner);
|
| + fCosOuterConeAngleUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kFloat_GrSLType, kDefault_GrSLPrecision,
|
| + "CosOuterConeAngle", &cosOuter);
|
| + fConeScaleUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kFloat_GrSLType, kDefault_GrSLPrecision,
|
| + "ConeScale", &coneScale);
|
| + fSUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec3f_GrSLType, kDefault_GrSLPrecision, "S", &s);
|
|
|
| static const GrGLSLShaderVar gLightColorArgs[] = {
|
| GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType)
|
|
|