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 "gl/builders/GrGLProgramBuilder.h" |
7 #include "GrMatrixConvolutionEffect.h" | 8 #include "GrMatrixConvolutionEffect.h" |
8 #include "gl/GrGLShaderBuilder.h" | |
9 #include "gl/GrGLEffect.h" | 9 #include "gl/GrGLEffect.h" |
10 #include "gl/GrGLSL.h" | 10 #include "gl/GrGLSL.h" |
11 #include "gl/GrGLTexture.h" | 11 #include "gl/GrGLTexture.h" |
12 #include "GrTBackendEffectFactory.h" | 12 #include "GrTBackendEffectFactory.h" |
13 | 13 |
14 class GrGLMatrixConvolutionEffect : public GrGLEffect { | 14 class GrGLMatrixConvolutionEffect : public GrGLEffect { |
15 public: | 15 public: |
16 GrGLMatrixConvolutionEffect(const GrBackendEffectFactory& factory, | 16 GrGLMatrixConvolutionEffect(const GrBackendEffectFactory& factory, |
17 const GrDrawEffect& effect); | 17 const GrDrawEffect& effect); |
18 virtual void emitCode(GrGLShaderBuilder*, | 18 virtual void emitCode(GrGLProgramBuilder*, |
19 const GrDrawEffect&, | 19 const GrDrawEffect&, |
20 const GrEffectKey&, | 20 const GrEffectKey&, |
21 const char* outputColor, | 21 const char* outputColor, |
22 const char* inputColor, | 22 const char* inputColor, |
23 const TransformedCoordsArray&, | 23 const TransformedCoordsArray&, |
24 const TextureSamplerArray&) SK_OVERRIDE; | 24 const TextureSamplerArray&) SK_OVERRIDE; |
25 | 25 |
26 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyB
uilder*); | 26 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyB
uilder*); |
27 | 27 |
28 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_
OVERRIDE; | 28 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_
OVERRIDE; |
(...skipping 15 matching lines...) Expand all Loading... |
44 }; | 44 }; |
45 | 45 |
46 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendEffectFa
ctory& factory, | 46 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendEffectFa
ctory& factory, |
47 const GrDrawEffect& dra
wEffect) | 47 const GrDrawEffect& dra
wEffect) |
48 : INHERITED(factory) { | 48 : INHERITED(factory) { |
49 const GrMatrixConvolutionEffect& m = drawEffect.castEffect<GrMatrixConvoluti
onEffect>(); | 49 const GrMatrixConvolutionEffect& m = drawEffect.castEffect<GrMatrixConvoluti
onEffect>(); |
50 fKernelSize = m.kernelSize(); | 50 fKernelSize = m.kernelSize(); |
51 fConvolveAlpha = m.convolveAlpha(); | 51 fConvolveAlpha = m.convolveAlpha(); |
52 } | 52 } |
53 | 53 |
54 void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder, | 54 void GrGLMatrixConvolutionEffect::emitCode(GrGLProgramBuilder* builder, |
55 const GrDrawEffect& drawEffect, | 55 const GrDrawEffect& drawEffect, |
56 const GrEffectKey& key, | 56 const GrEffectKey& key, |
57 const char* outputColor, | 57 const char* outputColor, |
58 const char* inputColor, | 58 const char* inputColor, |
59 const TransformedCoordsArray& coords, | 59 const TransformedCoordsArray& coords, |
60 const TextureSamplerArray& samplers)
{ | 60 const TextureSamplerArray& samplers)
{ |
61 sk_ignore_unused_variable(inputColor); | 61 sk_ignore_unused_variable(inputColor); |
62 const GrTextureDomain& domain = drawEffect.castEffect<GrMatrixConvolutionEff
ect>().domain(); | 62 const GrTextureDomain& domain = drawEffect.castEffect<GrMatrixConvolutionEff
ect>().domain(); |
63 SkString coords2D = builder->ensureFSCoords2D(coords, 0); | 63 |
64 fBoundsUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, | 64 fBoundsUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
65 kVec4f_GrSLType, "Bounds"); | 65 kVec4f_GrSLType, "Bounds"); |
66 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibi
lity, | 66 fImageIncrementUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visib
ility, |
67 kVec2f_GrSLType, "ImageIncrement"); | 67 kVec2f_GrSLType, "ImageIncrement"); |
68 fKernelUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_Visibilit
y, | 68 fKernelUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibili
ty, |
69 kFloat_GrSLType, | 69 kFloat_GrSLType, |
70 "Kernel", | 70 "Kernel", |
71 fKernelSize.width() * fKernelSize.heig
ht()); | 71 fKernelSize.width() * fKernelSize.heig
ht()); |
72 fKernelOffsetUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibili
ty, | 72 fKernelOffsetUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibil
ity, |
73 kVec2f_GrSLType, "KernelOffset"); | 73 kVec2f_GrSLType, "KernelOffset"); |
74 fGainUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, | 74 fGainUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
75 kFloat_GrSLType, "Gain"); | 75 kFloat_GrSLType, "Gain"); |
76 fBiasUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, | 76 fBiasUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
77 kFloat_GrSLType, "Bias"); | 77 kFloat_GrSLType, "Bias"); |
78 | 78 |
79 const char* kernelOffset = builder->getUniformCStr(fKernelOffsetUni); | 79 const char* kernelOffset = builder->getUniformCStr(fKernelOffsetUni); |
80 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); | 80 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); |
81 const char* kernel = builder->getUniformCStr(fKernelUni); | 81 const char* kernel = builder->getUniformCStr(fKernelUni); |
82 const char* gain = builder->getUniformCStr(fGainUni); | 82 const char* gain = builder->getUniformCStr(fGainUni); |
83 const char* bias = builder->getUniformCStr(fBiasUni); | 83 const char* bias = builder->getUniformCStr(fBiasUni); |
84 int kWidth = fKernelSize.width(); | 84 int kWidth = fKernelSize.width(); |
85 int kHeight = fKernelSize.height(); | 85 int kHeight = fKernelSize.height(); |
86 | 86 |
87 builder->fsCodeAppend("vec4 sum = vec4(0, 0, 0, 0);"); | 87 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
88 builder->fsCodeAppendf("vec2 coord = %s - %s * %s;", coords2D.c_str(), kerne
lOffset, | 88 SkString coords2D = fsBuilder->ensureFSCoords2D(coords, 0); |
| 89 fsBuilder->codeAppend("vec4 sum = vec4(0, 0, 0, 0);"); |
| 90 fsBuilder->codeAppendf("vec2 coord = %s - %s * %s;", coords2D.c_str(), kerne
lOffset, |
89 imgInc); | 91 imgInc); |
90 builder->fsCodeAppend("vec4 c;"); | 92 fsBuilder->codeAppend("vec4 c;"); |
91 | 93 |
92 for (int y = 0; y < kHeight; y++) { | 94 for (int y = 0; y < kHeight; y++) { |
93 for (int x = 0; x < kWidth; x++) { | 95 for (int x = 0; x < kWidth; x++) { |
94 GrGLShaderBuilder::FSBlock block(builder); | 96 GrGLShaderBuilder::ShaderBlock block(fsBuilder); |
95 builder->fsCodeAppendf("float k = %s[%d * %d + %d];", kernel, y, kWi
dth, x); | 97 fsBuilder->codeAppendf("float k = %s[%d * %d + %d];", kernel, y, kWi
dth, x); |
96 SkString coord; | 98 SkString coord; |
97 coord.printf("coord + vec2(%d, %d) * %s", x, y, imgInc); | 99 coord.printf("coord + vec2(%d, %d) * %s", x, y, imgInc); |
98 fDomain.sampleTexture(builder, domain, "c", coord, samplers[0]); | 100 fDomain.sampleTexture(fsBuilder, domain, "c", coord, samplers[0]); |
99 if (!fConvolveAlpha) { | 101 if (!fConvolveAlpha) { |
100 builder->fsCodeAppend("c.rgb /= c.a;"); | 102 fsBuilder->codeAppend("c.rgb /= c.a;"); |
101 } | 103 } |
102 builder->fsCodeAppend("sum += c * k;"); | 104 fsBuilder->codeAppend("sum += c * k;"); |
103 } | 105 } |
104 } | 106 } |
105 if (fConvolveAlpha) { | 107 if (fConvolveAlpha) { |
106 builder->fsCodeAppendf("%s = sum * %s + %s;", outputColor, gain, bias); | 108 fsBuilder->codeAppendf("%s = sum * %s + %s;", outputColor, gain, bias); |
107 builder->fsCodeAppendf("%s.rgb = clamp(%s.rgb, 0.0, %s.a);", | 109 fsBuilder->codeAppendf("%s.rgb = clamp(%s.rgb, 0.0, %s.a);", |
108 outputColor, outputColor, outputColor); | 110 outputColor, outputColor, outputColor); |
109 } else { | 111 } else { |
110 fDomain.sampleTexture(builder, domain, "c", coords2D, samplers[0]); | 112 fDomain.sampleTexture(fsBuilder, domain, "c", coords2D, samplers[0]); |
111 builder->fsCodeAppendf("%s.a = c.a;", outputColor); | 113 fsBuilder->codeAppendf("%s.a = c.a;", outputColor); |
112 builder->fsCodeAppendf("%s.rgb = sum.rgb * %s + %s;", outputColor, gain,
bias); | 114 fsBuilder->codeAppendf("%s.rgb = sum.rgb * %s + %s;", outputColor, gain,
bias); |
113 builder->fsCodeAppendf("%s.rgb *= %s.a;", outputColor, outputColor); | 115 fsBuilder->codeAppendf("%s.rgb *= %s.a;", outputColor, outputColor); |
114 } | 116 } |
115 | 117 |
116 SkString modulate; | 118 SkString modulate; |
117 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); | 119 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
118 builder->fsCodeAppend(modulate.c_str()); | 120 fsBuilder->codeAppend(modulate.c_str()); |
119 } | 121 } |
120 | 122 |
121 void GrGLMatrixConvolutionEffect::GenKey(const GrDrawEffect& drawEffect, | 123 void GrGLMatrixConvolutionEffect::GenKey(const GrDrawEffect& drawEffect, |
122 const GrGLCaps&, GrEffectKeyBuilder* b)
{ | 124 const GrGLCaps&, GrEffectKeyBuilder* b)
{ |
123 const GrMatrixConvolutionEffect& m = drawEffect.castEffect<GrMatrixConvoluti
onEffect>(); | 125 const GrMatrixConvolutionEffect& m = drawEffect.castEffect<GrMatrixConvoluti
onEffect>(); |
124 SkASSERT(m.kernelSize().width() <= 0x7FFF && m.kernelSize().height() <= 0xFF
FF); | 126 SkASSERT(m.kernelSize().width() <= 0x7FFF && m.kernelSize().height() <= 0xFF
FF); |
125 uint32_t key = m.kernelSize().width() << 16 | m.kernelSize().height(); | 127 uint32_t key = m.kernelSize().width() << 16 | m.kernelSize().height(); |
126 key |= m.convolveAlpha() ? 1 << 31 : 0; | 128 key |= m.convolveAlpha() ? 1 << 31 : 0; |
127 b->add32(key); | 129 b->add32(key); |
128 b->add32(GrTextureDomain::GLDomain::DomainKey(m.domain())); | 130 b->add32(GrTextureDomain::GLDomain::DomainKey(m.domain())); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 return GrMatrixConvolutionEffect::Create(textures[texIdx], | 266 return GrMatrixConvolutionEffect::Create(textures[texIdx], |
265 bounds, | 267 bounds, |
266 kernelSize, | 268 kernelSize, |
267 kernel.get(), | 269 kernel.get(), |
268 gain, | 270 gain, |
269 bias, | 271 bias, |
270 kernelOffset, | 272 kernelOffset, |
271 tileMode, | 273 tileMode, |
272 convolveAlpha); | 274 convolveAlpha); |
273 } | 275 } |
OLD | NEW |