Chromium Code Reviews| Index: src/core/SkNormalSource.cpp |
| diff --git a/src/core/SkNormalSource.cpp b/src/core/SkNormalSource.cpp |
| index 394ce8fe45eab79934790050fbeb34f9bf750955..41c3da3995b1a1124409e988ad7935a52045316f 100644 |
| --- a/src/core/SkNormalSource.cpp |
| +++ b/src/core/SkNormalSource.cpp |
| @@ -14,9 +14,41 @@ |
| #include "SkReadBuffer.h" |
| #include "SkWriteBuffer.h" |
| -// Genretating vtable |
| +#if SK_SUPPORT_GPU |
| + #include "GrCoordTransform.h" |
| + #include "GrInvariantOutput.h" |
| + #include "GrTextureParams.h" |
| + #include "glsl/GrGLSLFragmentProcessor.h" |
| + #include "glsl/GrGLSLFragmentShaderBuilder.h" |
| + #include "SkGr.h" |
| +#endif |
| + |
| +// Generating vtable |
| SkNormalSource::~SkNormalSource() {} |
| +#if SK_SUPPORT_GPU |
| + |
| +// GLSLFragmentProcessors for NormalSourceImpls must sub-class this class and override onEmitCode. |
| +// This class exists to intercept emitCode calls and emit <0, 0, 1> if the FP requires a distance |
| +// vector but the GP doesn't provide it. |
|
egdaniel
2016/07/13 19:27:26
Add to this comment that we don't need to adjust t
dvonbeck
2016/07/13 21:28:14
Done.
|
| +class GLSLNormalFP : public GrGLSLFragmentProcessor { |
| +public: |
| + void emitCode(EmitArgs& args) override { |
| + if (args.fFp.usesDistanceVectorField() && !args.fGpImplementsDistanceVector) { |
| + GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| + fragBuilder->codeAppendf("// GLSLNormalFP intercepted emitCode call, GP does not " |
| + "implement required distance vector feature\n"); |
| + fragBuilder->codeAppendf("%s = vec4(0, 0, 1, 0);", args.fOutputColor); |
| + } else { |
| + this->onEmitCode(args); |
| + } |
| + } |
| +protected: |
| + virtual void onEmitCode(EmitArgs& args) = 0; |
| +}; |
| + |
| +#endif |
| + |
| /////////////////////////////////////////////////////////////////////////////// |
| class NormalMapSourceImpl : public SkNormalSource { |
| @@ -75,13 +107,6 @@ private: |
| #if SK_SUPPORT_GPU |
| -#include "GrCoordTransform.h" |
| -#include "GrInvariantOutput.h" |
| -#include "GrTextureParams.h" |
| -#include "glsl/GrGLSLFragmentProcessor.h" |
| -#include "glsl/GrGLSLFragmentShaderBuilder.h" |
| -#include "SkGr.h" |
| - |
| class NormalMapFP : public GrFragmentProcessor { |
| public: |
| NormalMapFP(sk_sp<GrFragmentProcessor> mapFP, const SkMatrix& invCTM) |
| @@ -91,12 +116,12 @@ public: |
| this->initClassID<NormalMapFP>(); |
| } |
| - class GLSLNormalMapFP : public GrGLSLFragmentProcessor { |
| + class GLSLNormalMapFP : public GLSLNormalFP { |
| public: |
| GLSLNormalMapFP() |
| : fColumnMajorInvCTM22{0.0f} {} |
| - void emitCode(EmitArgs& args) override { |
| + void onEmitCode(EmitArgs& args) override { |
| GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
| @@ -382,13 +407,12 @@ public: |
| this->initClassID<NormalFlatFP>(); |
| } |
| - class GLSLNormalFlatFP : public GrGLSLFragmentProcessor { |
| + class GLSLNormalFlatFP : public GLSLNormalFP { |
| public: |
| GLSLNormalFlatFP() {} |
| - void emitCode(EmitArgs& args) override { |
| + void onEmitCode(EmitArgs& args) override { |
| GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| - |
| fragBuilder->codeAppendf("%s = vec4(0, 0, 1, 0);", args.fOutputColor); |
| } |
| @@ -530,10 +554,12 @@ public: |
| : fType(type) |
| , fWidth(width) |
| , fHeight(height) { |
| + fUsesDistanceVectorField = true; |
| + |
| this->initClassID<NormalBevelFP>(); |
| } |
| - class GLSLNormalBevelFP : public GrGLSLFragmentProcessor { |
| + class GLSLNormalBevelFP : public GLSLNormalFP { |
| public: |
| GLSLNormalBevelFP() { |
| fPrevType = SkNormalSource::BevelType::kLinear; |
| @@ -541,10 +567,10 @@ public: |
| fPrevHeight = SkFloatToScalar(0.0f); |
| } |
| - void emitCode(EmitArgs& args) override { |
| + void onEmitCode(EmitArgs& args) override { |
| GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| - |
| - fragBuilder->codeAppendf("%s = vec4(0, 0, 1, 0);", args.fOutputColor); |
| + fragBuilder->codeAppendf("%s = normalize(vec4(0.0, 0.0, 1.0, 0.0));", |
| + args.fOutputColor); |
| } |
| static void GenKey(const GrProcessor& proc, const GrGLSLCaps&, |