OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 | 7 |
8 #include "GrTextureDomain.h" | 8 #include "GrTextureDomain.h" |
9 #include "GrInvariantOutput.h" | 9 #include "GrInvariantOutput.h" |
10 #include "GrSimpleTextureEffect.h" | 10 #include "GrSimpleTextureEffect.h" |
11 #include "SkFloatingPoint.h" | 11 #include "SkFloatingPoint.h" |
12 #include "gl/GrGLContext.h" | 12 #include "gl/GrGLContext.h" |
13 #include "gl/GrGLFragmentProcessor.h" | 13 #include "gl/GrGLFragmentProcessor.h" |
14 #include "gl/builders/GrGLProgramBuilder.h" | 14 #include "gl/builders/GrGLProgramBuilder.h" |
| 15 #include "glsl/GrGLSLProgramDataManager.h" |
15 | 16 |
16 GrTextureDomain::GrTextureDomain(const SkRect& domain, Mode mode, int index) | 17 GrTextureDomain::GrTextureDomain(const SkRect& domain, Mode mode, int index) |
17 : fIndex(index) { | 18 : fIndex(index) { |
18 | 19 |
19 static const SkRect kFullRect = {0, 0, SK_Scalar1, SK_Scalar1}; | 20 static const SkRect kFullRect = {0, 0, SK_Scalar1, SK_Scalar1}; |
20 if (domain.contains(kFullRect) && kClamp_Mode == mode) { | 21 if (domain.contains(kFullRect) && kClamp_Mode == mode) { |
21 fMode = kIgnore_Mode; | 22 fMode = kIgnore_Mode; |
22 } else { | 23 } else { |
23 fMode = mode; | 24 fMode = mode; |
24 } | 25 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 | 136 |
136 builder->codeAppendf("%s = ", outColor); | 137 builder->codeAppendf("%s = ", outColor); |
137 builder->appendTextureLookupAndModulate(inModulateColor, sampler, | 138 builder->appendTextureLookupAndModulate(inModulateColor, sampler, |
138 clampedCoords.c_str()); | 139 clampedCoords.c_str()); |
139 builder->codeAppend(";"); | 140 builder->codeAppend(";"); |
140 break; | 141 break; |
141 } | 142 } |
142 } | 143 } |
143 } | 144 } |
144 | 145 |
145 void GrTextureDomain::GLDomain::setData(const GrGLProgramDataManager& pdman, | 146 void GrTextureDomain::GLDomain::setData(const GrGLSLProgramDataManager& pdman, |
146 const GrTextureDomain& textureDomain, | 147 const GrTextureDomain& textureDomain, |
147 GrSurfaceOrigin textureOrigin) { | 148 GrSurfaceOrigin textureOrigin) { |
148 SkASSERT(textureDomain.mode() == fMode); | 149 SkASSERT(textureDomain.mode() == fMode); |
149 if (kIgnore_Mode != textureDomain.mode()) { | 150 if (kIgnore_Mode != textureDomain.mode()) { |
150 GrGLfloat values[kPrevDomainCount] = { | 151 float values[kPrevDomainCount] = { |
151 SkScalarToFloat(textureDomain.domain().left()), | 152 SkScalarToFloat(textureDomain.domain().left()), |
152 SkScalarToFloat(textureDomain.domain().top()), | 153 SkScalarToFloat(textureDomain.domain().top()), |
153 SkScalarToFloat(textureDomain.domain().right()), | 154 SkScalarToFloat(textureDomain.domain().right()), |
154 SkScalarToFloat(textureDomain.domain().bottom()) | 155 SkScalarToFloat(textureDomain.domain().bottom()) |
155 }; | 156 }; |
156 // vertical flip if necessary | 157 // vertical flip if necessary |
157 if (kBottomLeft_GrSurfaceOrigin == textureOrigin) { | 158 if (kBottomLeft_GrSurfaceOrigin == textureOrigin) { |
158 values[1] = 1.0f - values[1]; | 159 values[1] = 1.0f - values[1]; |
159 values[3] = 1.0f - values[3]; | 160 values[3] = 1.0f - values[3]; |
160 // The top and bottom were just flipped, so correct the ordering | 161 // The top and bottom were just flipped, so correct the ordering |
161 // of elements so that values = (l, t, r, b). | 162 // of elements so that values = (l, t, r, b). |
162 SkTSwap(values[1], values[3]); | 163 SkTSwap(values[1], values[3]); |
163 } | 164 } |
164 if (0 != memcmp(values, fPrevDomain, kPrevDomainCount * sizeof(GrGLfloat
))) { | 165 if (0 != memcmp(values, fPrevDomain, kPrevDomainCount * sizeof(float)))
{ |
165 pdman.set4fv(fDomainUni, 1, values); | 166 pdman.set4fv(fDomainUni, 1, values); |
166 memcpy(fPrevDomain, values, kPrevDomainCount * sizeof(GrGLfloat)); | 167 memcpy(fPrevDomain, values, kPrevDomainCount * sizeof(float)); |
167 } | 168 } |
168 } | 169 } |
169 } | 170 } |
170 | 171 |
171 | 172 |
172 ////////////////////////////////////////////////////////////////////////////// | 173 ////////////////////////////////////////////////////////////////////////////// |
173 | 174 |
174 class GrGLTextureDomainEffect : public GrGLFragmentProcessor { | 175 class GrGLTextureDomainEffect : public GrGLFragmentProcessor { |
175 public: | 176 public: |
176 GrGLTextureDomainEffect(const GrProcessor&); | 177 GrGLTextureDomainEffect(const GrProcessor&); |
177 | 178 |
178 virtual void emitCode(EmitArgs&) override; | 179 virtual void emitCode(EmitArgs&) override; |
179 | 180 |
180 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); | 181 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); |
181 | 182 |
182 protected: | 183 protected: |
183 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 184 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
184 | 185 |
185 private: | 186 private: |
186 GrTextureDomain::GLDomain fGLDomain; | 187 GrTextureDomain::GLDomain fGLDomain; |
187 typedef GrGLFragmentProcessor INHERITED; | 188 typedef GrGLFragmentProcessor INHERITED; |
188 }; | 189 }; |
189 | 190 |
190 GrGLTextureDomainEffect::GrGLTextureDomainEffect(const GrProcessor&) { | 191 GrGLTextureDomainEffect::GrGLTextureDomainEffect(const GrProcessor&) { |
191 } | 192 } |
192 | 193 |
193 void GrGLTextureDomainEffect::emitCode(EmitArgs& args) { | 194 void GrGLTextureDomainEffect::emitCode(EmitArgs& args) { |
194 const GrTextureDomainEffect& textureDomainEffect = args.fFp.cast<GrTextureDo
mainEffect>(); | 195 const GrTextureDomainEffect& textureDomainEffect = args.fFp.cast<GrTextureDo
mainEffect>(); |
195 const GrTextureDomain& domain = textureDomainEffect.textureDomain(); | 196 const GrTextureDomain& domain = textureDomainEffect.textureDomain(); |
196 | 197 |
197 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); | 198 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); |
198 SkString coords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 0); | 199 SkString coords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 0); |
199 fGLDomain.sampleTexture(fsBuilder, domain, args.fOutputColor, coords2D, args
.fSamplers[0], | 200 fGLDomain.sampleTexture(fsBuilder, domain, args.fOutputColor, coords2D, args
.fSamplers[0], |
200 args.fInputColor); | 201 args.fInputColor); |
201 } | 202 } |
202 | 203 |
203 void GrGLTextureDomainEffect::onSetData(const GrGLProgramDataManager& pdman, | 204 void GrGLTextureDomainEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
204 const GrProcessor& processor) { | 205 const GrProcessor& processor) { |
205 const GrTextureDomainEffect& textureDomainEffect = processor.cast<GrTextureD
omainEffect>(); | 206 const GrTextureDomainEffect& textureDomainEffect = processor.cast<GrTextureD
omainEffect>(); |
206 const GrTextureDomain& domain = textureDomainEffect.textureDomain(); | 207 const GrTextureDomain& domain = textureDomainEffect.textureDomain(); |
207 fGLDomain.setData(pdman, domain, processor.texture(0)->origin()); | 208 fGLDomain.setData(pdman, domain, processor.texture(0)->origin()); |
208 } | 209 } |
209 | 210 |
210 void GrGLTextureDomainEffect::GenKey(const GrProcessor& processor, const GrGLSLC
aps&, | 211 void GrGLTextureDomainEffect::GenKey(const GrProcessor& processor, const GrGLSLC
aps&, |
211 GrProcessorKeyBuilder* b) { | 212 GrProcessorKeyBuilder* b) { |
212 const GrTextureDomain& domain = processor.cast<GrTextureDomainEffect>().text
ureDomain(); | 213 const GrTextureDomain& domain = processor.cast<GrTextureDomainEffect>().text
ureDomain(); |
213 b->add32(GrTextureDomain::GLDomain::DomainKey(domain)); | 214 b->add32(GrTextureDomain::GLDomain::DomainKey(domain)); |
214 } | 215 } |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 bool bilerp = mode != GrTextureDomain::kRepeat_Mode ? d->fRandom->nextBool()
: false; | 291 bool bilerp = mode != GrTextureDomain::kRepeat_Mode ? d->fRandom->nextBool()
: false; |
291 GrCoordSet coords = d->fRandom->nextBool() ? kLocal_GrCoordSet : kDevice_GrC
oordSet; | 292 GrCoordSet coords = d->fRandom->nextBool() ? kLocal_GrCoordSet : kDevice_GrC
oordSet; |
292 return GrTextureDomainEffect::Create( | 293 return GrTextureDomainEffect::Create( |
293 d->fTextures[texIdx], | 294 d->fTextures[texIdx], |
294 matrix, | 295 matrix, |
295 domain, | 296 domain, |
296 mode, | 297 mode, |
297 bilerp ? GrTextureParams::kBilerp_FilterMode : GrTextureParams::kNone_Fi
lterMode, | 298 bilerp ? GrTextureParams::kBilerp_FilterMode : GrTextureParams::kNone_Fi
lterMode, |
298 coords); | 299 coords); |
299 } | 300 } |
OLD | NEW |