OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 #include "GrMatrixConvolutionEffect.h" | 7 #include "GrMatrixConvolutionEffect.h" |
8 #include "glsl/GrGLSLFragmentProcessor.h" | 8 #include "glsl/GrGLSLFragmentProcessor.h" |
9 #include "glsl/GrGLSLProgramBuilder.h" | 9 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
10 #include "glsl/GrGLSLProgramDataManager.h" | 10 #include "glsl/GrGLSLProgramDataManager.h" |
| 11 #include "glsl/GrGLSLUniformHandler.h" |
11 | 12 |
12 class GrGLMatrixConvolutionEffect : public GrGLSLFragmentProcessor { | 13 class GrGLMatrixConvolutionEffect : public GrGLSLFragmentProcessor { |
13 public: | 14 public: |
14 GrGLMatrixConvolutionEffect(const GrProcessor&); | 15 GrGLMatrixConvolutionEffect(const GrProcessor&); |
15 virtual void emitCode(EmitArgs&) override; | 16 virtual void emitCode(EmitArgs&) override; |
16 | 17 |
17 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); | 18 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); |
18 | 19 |
19 protected: | 20 protected: |
20 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; | 21 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
(...skipping 14 matching lines...) Expand all Loading... |
35 }; | 36 }; |
36 | 37 |
37 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrProcessor& proc
essor) { | 38 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrProcessor& proc
essor) { |
38 const GrMatrixConvolutionEffect& m = processor.cast<GrMatrixConvolutionEffec
t>(); | 39 const GrMatrixConvolutionEffect& m = processor.cast<GrMatrixConvolutionEffec
t>(); |
39 fKernelSize = m.kernelSize(); | 40 fKernelSize = m.kernelSize(); |
40 fConvolveAlpha = m.convolveAlpha(); | 41 fConvolveAlpha = m.convolveAlpha(); |
41 } | 42 } |
42 | 43 |
43 void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) { | 44 void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) { |
44 const GrTextureDomain& domain = args.fFp.cast<GrMatrixConvolutionEffect>().d
omain(); | 45 const GrTextureDomain& domain = args.fFp.cast<GrMatrixConvolutionEffect>().d
omain(); |
45 fImageIncrementUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragme
nt_Visibility, | 46 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
46 kVec2f_GrSLType, kDefault_GrSLPreci
sion, | 47 fImageIncrementUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragm
ent_Visibility, |
47 "ImageIncrement"); | 48 kVec2f_GrSLType, kDefault_Gr
SLPrecision, |
48 fKernelUni = args.fBuilder->addUniformArray(GrGLSLProgramBuilder::kFragment_
Visibility, | 49 "ImageIncrement"); |
49 kFloat_GrSLType, kDefault_GrSLPrecisio
n, | 50 fKernelUni = uniformHandler->addUniformArray(GrGLSLUniformHandler::kFragment
_Visibility, |
50 "Kernel", | 51 kFloat_GrSLType, kDefault_GrSLP
recision, |
51 fKernelSize.width() * fKernelSize.heig
ht()); | 52 "Kernel", |
52 fKernelOffsetUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment
_Visibility, | 53 fKernelSize.width() * fKernelSi
ze.height()); |
53 kVec2f_GrSLType, kDefault_GrSLPrecisi
on, "KernelOffset"); | 54 fKernelOffsetUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragmen
t_Visibility, |
54 fGainUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibil
ity, | 55 kVec2f_GrSLType, kDefault_GrSL
Precision, |
55 kFloat_GrSLType, kDefault_GrSLPrecision, "Gai
n"); | 56 "KernelOffset"); |
56 fBiasUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibil
ity, | 57 fGainUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibi
lity, |
57 kFloat_GrSLType, kDefault_GrSLPrecision, "Bia
s"); | 58 kFloat_GrSLType, kDefault_GrSLPrecisio
n, "Gain"); |
| 59 fBiasUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibi
lity, |
| 60 kFloat_GrSLType, kDefault_GrSLPrecisio
n, "Bias"); |
58 | 61 |
59 const char* kernelOffset = args.fBuilder->getUniformCStr(fKernelOffsetUni); | 62 const char* kernelOffset = uniformHandler->getUniformCStr(fKernelOffsetUni); |
60 const char* imgInc = args.fBuilder->getUniformCStr(fImageIncrementUni); | 63 const char* imgInc = uniformHandler->getUniformCStr(fImageIncrementUni); |
61 const char* kernel = args.fBuilder->getUniformCStr(fKernelUni); | 64 const char* kernel = uniformHandler->getUniformCStr(fKernelUni); |
62 const char* gain = args.fBuilder->getUniformCStr(fGainUni); | 65 const char* gain = uniformHandler->getUniformCStr(fGainUni); |
63 const char* bias = args.fBuilder->getUniformCStr(fBiasUni); | 66 const char* bias = uniformHandler->getUniformCStr(fBiasUni); |
64 int kWidth = fKernelSize.width(); | 67 int kWidth = fKernelSize.width(); |
65 int kHeight = fKernelSize.height(); | 68 int kHeight = fKernelSize.height(); |
66 | 69 |
67 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 70 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
68 SkString coords2D = fragBuilder->ensureFSCoords2D(args.fCoords, 0); | 71 SkString coords2D = fragBuilder->ensureFSCoords2D(args.fCoords, 0); |
69 fragBuilder->codeAppend("vec4 sum = vec4(0, 0, 0, 0);"); | 72 fragBuilder->codeAppend("vec4 sum = vec4(0, 0, 0, 0);"); |
70 fragBuilder->codeAppendf("vec2 coord = %s - %s * %s;", coords2D.c_str(), ker
nelOffset, imgInc); | 73 fragBuilder->codeAppendf("vec2 coord = %s - %s * %s;", coords2D.c_str(), ker
nelOffset, imgInc); |
71 fragBuilder->codeAppend("vec4 c;"); | 74 fragBuilder->codeAppend("vec4 c;"); |
72 | 75 |
73 for (int y = 0; y < kHeight; y++) { | 76 for (int y = 0; y < kHeight; y++) { |
74 for (int x = 0; x < kWidth; x++) { | 77 for (int x = 0; x < kWidth; x++) { |
75 GrGLSLShaderBuilder::ShaderBlock block(fragBuilder); | 78 GrGLSLShaderBuilder::ShaderBlock block(fragBuilder); |
76 fragBuilder->codeAppendf("float k = %s[%d * %d + %d];", kernel, y, k
Width, x); | 79 fragBuilder->codeAppendf("float k = %s[%d * %d + %d];", kernel, y, k
Width, x); |
77 SkString coord; | 80 SkString coord; |
78 coord.printf("coord + vec2(%d, %d) * %s", x, y, imgInc); | 81 coord.printf("coord + vec2(%d, %d) * %s", x, y, imgInc); |
79 fDomain.sampleTexture(fragBuilder, | 82 fDomain.sampleTexture(fragBuilder, |
| 83 uniformHandler, |
80 args.fGLSLCaps, | 84 args.fGLSLCaps, |
81 domain, | 85 domain, |
82 "c", | 86 "c", |
83 coord, | 87 coord, |
84 args.fSamplers[0]); | 88 args.fSamplers[0]); |
85 if (!fConvolveAlpha) { | 89 if (!fConvolveAlpha) { |
86 fragBuilder->codeAppend("c.rgb /= c.a;"); | 90 fragBuilder->codeAppend("c.rgb /= c.a;"); |
87 fragBuilder->codeAppend("c.rgb = clamp(c.rgb, 0.0, 1.0);"); | 91 fragBuilder->codeAppend("c.rgb = clamp(c.rgb, 0.0, 1.0);"); |
88 } | 92 } |
89 fragBuilder->codeAppend("sum += c * k;"); | 93 fragBuilder->codeAppend("sum += c * k;"); |
90 } | 94 } |
91 } | 95 } |
92 if (fConvolveAlpha) { | 96 if (fConvolveAlpha) { |
93 fragBuilder->codeAppendf("%s = sum * %s + %s;", args.fOutputColor, gain,
bias); | 97 fragBuilder->codeAppendf("%s = sum * %s + %s;", args.fOutputColor, gain,
bias); |
94 fragBuilder->codeAppendf("%s.rgb = clamp(%s.rgb, 0.0, %s.a);", | 98 fragBuilder->codeAppendf("%s.rgb = clamp(%s.rgb, 0.0, %s.a);", |
95 args.fOutputColor, args.fOutputColor, args.fOut
putColor); | 99 args.fOutputColor, args.fOutputColor, args.fOut
putColor); |
96 } else { | 100 } else { |
97 fDomain.sampleTexture(fragBuilder, | 101 fDomain.sampleTexture(fragBuilder, |
| 102 uniformHandler, |
98 args.fGLSLCaps, | 103 args.fGLSLCaps, |
99 domain, | 104 domain, |
100 "c", | 105 "c", |
101 coords2D, | 106 coords2D, |
102 args.fSamplers[0]); | 107 args.fSamplers[0]); |
103 fragBuilder->codeAppendf("%s.a = c.a;", args.fOutputColor); | 108 fragBuilder->codeAppendf("%s.a = c.a;", args.fOutputColor); |
104 fragBuilder->codeAppendf("%s.rgb = sum.rgb * %s + %s;", args.fOutputColo
r, gain, bias); | 109 fragBuilder->codeAppendf("%s.rgb = sum.rgb * %s + %s;", args.fOutputColo
r, gain, bias); |
105 fragBuilder->codeAppendf("%s.rgb *= %s.a;", args.fOutputColor, args.fOut
putColor); | 110 fragBuilder->codeAppendf("%s.rgb *= %s.a;", args.fOutputColor, args.fOut
putColor); |
106 } | 111 } |
107 | 112 |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 return GrMatrixConvolutionEffect::Create(d->fTextures[texIdx], | 258 return GrMatrixConvolutionEffect::Create(d->fTextures[texIdx], |
254 bounds, | 259 bounds, |
255 kernelSize, | 260 kernelSize, |
256 kernel.get(), | 261 kernel.get(), |
257 gain, | 262 gain, |
258 bias, | 263 bias, |
259 kernelOffset, | 264 kernelOffset, |
260 tileMode, | 265 tileMode, |
261 convolveAlpha); | 266 convolveAlpha); |
262 } | 267 } |
OLD | NEW |