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 "gl/GrGLFragmentProcessor.h" | 8 #include "glsl/GrGLSLFragmentProcessor.h" |
9 #include "gl/GrGLTexture.h" | 9 #include "glsl/GrGLSLProgramBuilder.h" |
10 #include "gl/builders/GrGLProgramBuilder.h" | |
11 #include "glsl/GrGLSLProgramDataManager.h" | 10 #include "glsl/GrGLSLProgramDataManager.h" |
12 | 11 |
13 class GrGLMatrixConvolutionEffect : public GrGLFragmentProcessor { | 12 class GrGLMatrixConvolutionEffect : public GrGLSLFragmentProcessor { |
14 public: | 13 public: |
15 GrGLMatrixConvolutionEffect(const GrProcessor&); | 14 GrGLMatrixConvolutionEffect(const GrProcessor&); |
16 virtual void emitCode(EmitArgs&) override; | 15 virtual void emitCode(EmitArgs&) override; |
17 | 16 |
18 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); | 17 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); |
19 | 18 |
20 protected: | 19 protected: |
21 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; | 20 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
22 | 21 |
23 private: | 22 private: |
24 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; | 23 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
25 SkISize fKernelSize; | 24 SkISize fKernelSize; |
26 bool fConvolveAlpha; | 25 bool fConvolveAlpha; |
27 | 26 |
28 UniformHandle fKernelUni; | 27 UniformHandle fKernelUni; |
29 UniformHandle fImageIncrementUni; | 28 UniformHandle fImageIncrementUni; |
30 UniformHandle fKernelOffsetUni; | 29 UniformHandle fKernelOffsetUni; |
31 UniformHandle fGainUni; | 30 UniformHandle fGainUni; |
32 UniformHandle fBiasUni; | 31 UniformHandle fBiasUni; |
33 GrTextureDomain::GLDomain fDomain; | 32 GrTextureDomain::GLDomain fDomain; |
34 | 33 |
35 typedef GrGLFragmentProcessor INHERITED; | 34 typedef GrGLSLFragmentProcessor INHERITED; |
36 }; | 35 }; |
37 | 36 |
38 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrProcessor& proc
essor) { | 37 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrProcessor& proc
essor) { |
39 const GrMatrixConvolutionEffect& m = processor.cast<GrMatrixConvolutionEffec
t>(); | 38 const GrMatrixConvolutionEffect& m = processor.cast<GrMatrixConvolutionEffec
t>(); |
40 fKernelSize = m.kernelSize(); | 39 fKernelSize = m.kernelSize(); |
41 fConvolveAlpha = m.convolveAlpha(); | 40 fConvolveAlpha = m.convolveAlpha(); |
42 } | 41 } |
43 | 42 |
44 void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) { | 43 void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) { |
45 const GrTextureDomain& domain = args.fFp.cast<GrMatrixConvolutionEffect>().d
omain(); | 44 const GrTextureDomain& domain = args.fFp.cast<GrMatrixConvolutionEffect>().d
omain(); |
46 fImageIncrementUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment
_Visibility, | 45 fImageIncrementUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragme
nt_Visibility, |
47 kVec2f_GrSLType, kDefault_GrSLPreci
sion, | 46 kVec2f_GrSLType, kDefault_GrSLPreci
sion, |
48 "ImageIncrement"); | 47 "ImageIncrement"); |
49 fKernelUni = args.fBuilder->addUniformArray(GrGLProgramBuilder::kFragment_Vi
sibility, | 48 fKernelUni = args.fBuilder->addUniformArray(GrGLSLProgramBuilder::kFragment_
Visibility, |
50 kFloat_GrSLType, kDefault_GrSLPrecisio
n, | 49 kFloat_GrSLType, kDefault_GrSLPrecisio
n, |
51 "Kernel", | 50 "Kernel", |
52 fKernelSize.width() * fKernelSize.heig
ht()); | 51 fKernelSize.width() * fKernelSize.heig
ht()); |
53 fKernelOffsetUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_V
isibility, | 52 fKernelOffsetUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment
_Visibility, |
54 kVec2f_GrSLType, kDefault_GrSLPrecisi
on, "KernelOffset"); | 53 kVec2f_GrSLType, kDefault_GrSLPrecisi
on, "KernelOffset"); |
55 fGainUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibilit
y, | 54 fGainUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibil
ity, |
56 kFloat_GrSLType, kDefault_GrSLPrecision, "Gai
n"); | 55 kFloat_GrSLType, kDefault_GrSLPrecision, "Gai
n"); |
57 fBiasUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibilit
y, | 56 fBiasUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibil
ity, |
58 kFloat_GrSLType, kDefault_GrSLPrecision, "Bia
s"); | 57 kFloat_GrSLType, kDefault_GrSLPrecision, "Bia
s"); |
59 | 58 |
60 const char* kernelOffset = args.fBuilder->getUniformCStr(fKernelOffsetUni); | 59 const char* kernelOffset = args.fBuilder->getUniformCStr(fKernelOffsetUni); |
61 const char* imgInc = args.fBuilder->getUniformCStr(fImageIncrementUni); | 60 const char* imgInc = args.fBuilder->getUniformCStr(fImageIncrementUni); |
62 const char* kernel = args.fBuilder->getUniformCStr(fKernelUni); | 61 const char* kernel = args.fBuilder->getUniformCStr(fKernelUni); |
63 const char* gain = args.fBuilder->getUniformCStr(fGainUni); | 62 const char* gain = args.fBuilder->getUniformCStr(fGainUni); |
64 const char* bias = args.fBuilder->getUniformCStr(fBiasUni); | 63 const char* bias = args.fBuilder->getUniformCStr(fBiasUni); |
65 int kWidth = fKernelSize.width(); | 64 int kWidth = fKernelSize.width(); |
66 int kHeight = fKernelSize.height(); | 65 int kHeight = fKernelSize.height(); |
67 | 66 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 } | 153 } |
155 | 154 |
156 GrMatrixConvolutionEffect::~GrMatrixConvolutionEffect() { | 155 GrMatrixConvolutionEffect::~GrMatrixConvolutionEffect() { |
157 } | 156 } |
158 | 157 |
159 void GrMatrixConvolutionEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, | 158 void GrMatrixConvolutionEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, |
160 GrProcessorKeyBuilder* b) cons
t { | 159 GrProcessorKeyBuilder* b) cons
t { |
161 GrGLMatrixConvolutionEffect::GenKey(*this, caps, b); | 160 GrGLMatrixConvolutionEffect::GenKey(*this, caps, b); |
162 } | 161 } |
163 | 162 |
164 GrGLFragmentProcessor* GrMatrixConvolutionEffect::onCreateGLInstance() const { | 163 GrGLSLFragmentProcessor* GrMatrixConvolutionEffect::onCreateGLInstance() const
{ |
165 return new GrGLMatrixConvolutionEffect(*this); | 164 return new GrGLMatrixConvolutionEffect(*this); |
166 } | 165 } |
167 | 166 |
168 bool GrMatrixConvolutionEffect::onIsEqual(const GrFragmentProcessor& sBase) cons
t { | 167 bool GrMatrixConvolutionEffect::onIsEqual(const GrFragmentProcessor& sBase) cons
t { |
169 const GrMatrixConvolutionEffect& s = sBase.cast<GrMatrixConvolutionEffect>()
; | 168 const GrMatrixConvolutionEffect& s = sBase.cast<GrMatrixConvolutionEffect>()
; |
170 return fKernelSize == s.kernelSize() && | 169 return fKernelSize == s.kernelSize() && |
171 !memcmp(fKernel, s.kernel(), | 170 !memcmp(fKernel, s.kernel(), |
172 fKernelSize.width() * fKernelSize.height() * sizeof(float)) &
& | 171 fKernelSize.width() * fKernelSize.height() * sizeof(float)) &
& |
173 fGain == s.gain() && | 172 fGain == s.gain() && |
174 fBias == s.bias() && | 173 fBias == s.bias() && |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 return GrMatrixConvolutionEffect::Create(d->fTextures[texIdx], | 244 return GrMatrixConvolutionEffect::Create(d->fTextures[texIdx], |
246 bounds, | 245 bounds, |
247 kernelSize, | 246 kernelSize, |
248 kernel.get(), | 247 kernel.get(), |
249 gain, | 248 gain, |
250 bias, | 249 bias, |
251 kernelOffset, | 250 kernelOffset, |
252 tileMode, | 251 tileMode, |
253 convolveAlpha); | 252 convolveAlpha); |
254 } | 253 } |
OLD | NEW |