Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: src/gpu/effects/GrDistanceFieldTextureEffect.cpp

Issue 571163002: removing GrDrawEffect (Closed) Base URL: https://skia.googlesource.com/skia.git@gp3
Patch Set: rebase Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 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 "gl/builders/GrGLProgramBuilder.h" 8 #include "gl/builders/GrGLProgramBuilder.h"
9 #include "GrDistanceFieldTextureEffect.h" 9 #include "GrDistanceFieldTextureEffect.h"
10 #include "gl/GrGLEffect.h" 10 #include "gl/GrGLEffect.h"
(...skipping 14 matching lines...) Expand all
25 #define SK_DistanceFieldLCDFactor "0.05" 25 #define SK_DistanceFieldLCDFactor "0.05"
26 #define SK_DistanceFieldNonLCDFactor "0.05" 26 #define SK_DistanceFieldNonLCDFactor "0.05"
27 #endif 27 #endif
28 28
29 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/ 2 29 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/ 2
30 #define SK_DistanceFieldAAFactor "0.7071" 30 #define SK_DistanceFieldAAFactor "0.7071"
31 31
32 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor { 32 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor {
33 public: 33 public:
34 GrGLDistanceFieldTextureEffect(const GrBackendEffectFactory& factory, 34 GrGLDistanceFieldTextureEffect(const GrBackendEffectFactory& factory,
35 const GrDrawEffect& drawEffect) 35 const GrEffect& effect)
36 : INHERITED (factory) 36 : INHERITED (factory)
37 , fTextureSize(SkISize::Make(-1,-1)) {} 37 , fTextureSize(SkISize::Make(-1,-1)) {}
38 38
39 virtual void emitCode(GrGLFullProgramBuilder* builder, 39 virtual void emitCode(GrGLFullProgramBuilder* builder,
40 const GrDrawEffect& drawEffect, 40 const GrEffect& effect,
41 const GrEffectKey& key, 41 const GrEffectKey& key,
42 const char* outputColor, 42 const char* outputColor,
43 const char* inputColor, 43 const char* inputColor,
44 const TransformedCoordsArray&, 44 const TransformedCoordsArray&,
45 const TextureSamplerArray& samplers) SK_OVERRIDE { 45 const TextureSamplerArray& samplers) SK_OVERRIDE {
46 const GrDistanceFieldTextureEffect& dfTexEffect = 46 const GrDistanceFieldTextureEffect& dfTexEffect =
47 drawEffect.castEffect<GrDistanceFi eldTextureEffect>(); 47 GrEffect::CastEffect<GrDistanceFieldTextureEffect>(effect);
48 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); 48 SkASSERT(1 == dfTexEffect.getVertexAttribs().count());
49 49
50 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder (); 50 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder ();
51 SkAssertResult(fsBuilder->enableFeature( 51 SkAssertResult(fsBuilder->enableFeature(
52 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); 52 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
53 53
54 SkString fsCoordName; 54 SkString fsCoordName;
55 const char* vsCoordName; 55 const char* vsCoordName;
56 const char* fsCoordNamePtr; 56 const char* fsCoordNamePtr;
57 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC oordNamePtr); 57 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC oordNamePtr);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); 120 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType);
121 fsBuilder->codeAppend(";\n"); 121 fsBuilder->codeAppend(";\n");
122 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); 122 fsBuilder->codeAppend("\tval = gammaColor.r;\n");
123 #endif 123 #endif
124 124
125 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, 125 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor,
126 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("val") ).c_str()); 126 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("val") ).c_str());
127 } 127 }
128 128
129 virtual void setData(const GrGLProgramDataManager& pdman, 129 virtual void setData(const GrGLProgramDataManager& pdman,
130 const GrDrawEffect& drawEffect) SK_OVERRIDE { 130 const GrEffect& effect) SK_OVERRIDE {
131 SkASSERT(fTextureSizeUni.isValid()); 131 SkASSERT(fTextureSizeUni.isValid());
132 132
133 GrTexture* texture = drawEffect.effect()->texture(0); 133 GrTexture* texture = effect.texture(0);
134 if (texture->width() != fTextureSize.width() || 134 if (texture->width() != fTextureSize.width() ||
135 texture->height() != fTextureSize.height()) { 135 texture->height() != fTextureSize.height()) {
136 fTextureSize = SkISize::Make(texture->width(), texture->height()); 136 fTextureSize = SkISize::Make(texture->width(), texture->height());
137 pdman.set2f(fTextureSizeUni, 137 pdman.set2f(fTextureSizeUni,
138 SkIntToScalar(fTextureSize.width()), 138 SkIntToScalar(fTextureSize.width()),
139 SkIntToScalar(fTextureSize.height())); 139 SkIntToScalar(fTextureSize.height()));
140 } 140 }
141 #ifdef SK_GAMMA_APPLY_TO_A8 141 #ifdef SK_GAMMA_APPLY_TO_A8
142 const GrDistanceFieldTextureEffect& dfTexEffect = 142 const GrDistanceFieldTextureEffect& dfTexEffect =
143 drawEffect.castEffect<GrDistanceFi eldTextureEffect>(); 143 GrEffect::CastEffect<GrDistanceFie ldTextureEffect>(effect);
144 float luminance = dfTexEffect.getLuminance(); 144 float luminance = dfTexEffect.getLuminance();
145 if (luminance != fLuminance) { 145 if (luminance != fLuminance) {
146 pdman.set1f(fLuminanceUni, luminance); 146 pdman.set1f(fLuminanceUni, luminance);
147 fLuminance = luminance; 147 fLuminance = luminance;
148 } 148 }
149 #endif 149 #endif
150 } 150 }
151 151
152 static inline void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, 152 static inline void GenKey(const GrEffect& effect, const GrGLCaps&,
153 GrEffectKeyBuilder* b) { 153 GrEffectKeyBuilder* b) {
154 const GrDistanceFieldTextureEffect& dfTexEffect = 154 const GrDistanceFieldTextureEffect& dfTexEffect =
155 drawEffect.castEffect<GrDistanceFi eldTextureEffect>(); 155 GrEffect::CastEffect<GrDistanceFieldTextureEffect>(effect);
156 156
157 b->add32(dfTexEffect.getFlags()); 157 b->add32(dfTexEffect.getFlags());
158 } 158 }
159 159
160 private: 160 private:
161 GrGLProgramDataManager::UniformHandle fTextureSizeUni; 161 GrGLProgramDataManager::UniformHandle fTextureSizeUni;
162 SkISize fTextureSize; 162 SkISize fTextureSize;
163 GrGLProgramDataManager::UniformHandle fLuminanceUni; 163 GrGLProgramDataManager::UniformHandle fLuminanceUni;
164 float fLuminance; 164 float fLuminance;
165 165
(...skipping 20 matching lines...) Expand all
186 kVec2f_GrSLType, 186 kVec2f_GrSLType,
187 GrShaderVar::kAttribute _TypeModifier))) { 187 GrShaderVar::kAttribute _TypeModifier))) {
188 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); 188 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
189 this->addTextureAccess(&fTextureAccess); 189 this->addTextureAccess(&fTextureAccess);
190 #ifdef SK_GAMMA_APPLY_TO_A8 190 #ifdef SK_GAMMA_APPLY_TO_A8
191 this->addTextureAccess(&fGammaTextureAccess); 191 this->addTextureAccess(&fGammaTextureAccess);
192 #endif 192 #endif
193 } 193 }
194 194
195 bool GrDistanceFieldTextureEffect::onIsEqual(const GrEffect& other) const { 195 bool GrDistanceFieldTextureEffect::onIsEqual(const GrEffect& other) const {
196 const GrDistanceFieldTextureEffect& cte = CastEffect<GrDistanceFieldTextureE ffect>(other); 196 const GrDistanceFieldTextureEffect& cte =
197 GrEffect::CastEffect<GrDistanceFieldTextureEffect>(other);
197 return fTextureAccess == cte.fTextureAccess && 198 return fTextureAccess == cte.fTextureAccess &&
198 #ifdef SK_GAMMA_APPLY_TO_A8 199 #ifdef SK_GAMMA_APPLY_TO_A8
199 fGammaTextureAccess == cte.fGammaTextureAccess && 200 fGammaTextureAccess == cte.fGammaTextureAccess &&
200 fLuminance == cte.fLuminance && 201 fLuminance == cte.fLuminance &&
201 #endif 202 #endif
202 fFlags == cte.fFlags; 203 fFlags == cte.fFlags;
203 } 204 }
204 205
205 void GrDistanceFieldTextureEffect::getConstantColorComponents(GrColor* color, 206 void GrDistanceFieldTextureEffect::getConstantColorComponents(GrColor* color,
206 uint32_t* validFlag s) const { 207 uint32_t* validFlag s) const {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 #endif 254 #endif
254 random->nextBool() ? 255 random->nextBool() ?
255 kSimilarity_DistanceFieldEff ectFlag : 0); 256 kSimilarity_DistanceFieldEff ectFlag : 0);
256 } 257 }
257 258
258 /////////////////////////////////////////////////////////////////////////////// 259 ///////////////////////////////////////////////////////////////////////////////
259 260
260 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { 261 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor {
261 public: 262 public:
262 GrGLDistanceFieldLCDTextureEffect(const GrBackendEffectFactory& factory, 263 GrGLDistanceFieldLCDTextureEffect(const GrBackendEffectFactory& factory,
263 const GrDrawEffect& drawEffect) 264 const GrEffect& effect)
264 : INHERITED (factory) 265 : INHERITED (factory)
265 , fTextureSize(SkISize::Make(-1,-1)) {} 266 , fTextureSize(SkISize::Make(-1,-1)) {}
266 267
267 virtual void emitCode(GrGLFullProgramBuilder* builder, 268 virtual void emitCode(GrGLFullProgramBuilder* builder,
268 const GrDrawEffect& drawEffect, 269 const GrEffect& effect,
269 const GrEffectKey& key, 270 const GrEffectKey& key,
270 const char* outputColor, 271 const char* outputColor,
271 const char* inputColor, 272 const char* inputColor,
272 const TransformedCoordsArray&, 273 const TransformedCoordsArray&,
273 const TextureSamplerArray& samplers) SK_OVERRIDE { 274 const TextureSamplerArray& samplers) SK_OVERRIDE {
274 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 275 const GrDistanceFieldLCDTextureEffect& dfTexEffect =
275 drawEffect.castEffect<GrDistanceField LCDTextureEffect>(); 276 GrEffect::CastEffect<GrDistanceFieldLCDTextureEffect>(effect);
276 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); 277 SkASSERT(1 == dfTexEffect.getVertexAttribs().count());
277 278
278 SkString fsCoordName; 279 SkString fsCoordName;
279 const char* vsCoordName; 280 const char* vsCoordName;
280 const char* fsCoordNamePtr; 281 const char* fsCoordNamePtr;
281 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC oordNamePtr); 282 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC oordNamePtr);
282 fsCoordName = fsCoordNamePtr; 283 fsCoordName = fsCoordNamePtr;
283 284
284 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); 285 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
285 vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dfTexEffect.inTextur eCoords().c_str()); 286 vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dfTexEffect.inTextur eCoords().c_str());
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 fsBuilder->codeAppend("\tgammaColor = "); 389 fsBuilder->codeAppend("\tgammaColor = ");
389 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); 390 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType);
390 fsBuilder->codeAppend(";\n"); 391 fsBuilder->codeAppend(";\n");
391 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n"); 392 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n");
392 393
393 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, 394 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor,
394 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("val")).c_ str()); 395 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("val")).c_ str());
395 } 396 }
396 397
397 virtual void setData(const GrGLProgramDataManager& pdman, 398 virtual void setData(const GrGLProgramDataManager& pdman,
398 const GrDrawEffect& drawEffect) SK_OVERRIDE { 399 const GrEffect& effect) SK_OVERRIDE {
399 SkASSERT(fTextureSizeUni.isValid()); 400 SkASSERT(fTextureSizeUni.isValid());
400 SkASSERT(fTextColorUni.isValid()); 401 SkASSERT(fTextColorUni.isValid());
401 402
402 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 403 const GrDistanceFieldLCDTextureEffect& dfTexEffect =
403 drawEffect.castEffect<GrDistanceFieldLCDText ureEffect>(); 404 GrEffect::CastEffect<GrDistanceFieldLCDTextu reEffect>(effect);
404 GrTexture* texture = drawEffect.effect()->texture(0); 405 GrTexture* texture = effect.texture(0);
405 if (texture->width() != fTextureSize.width() || 406 if (texture->width() != fTextureSize.width() ||
406 texture->height() != fTextureSize.height()) { 407 texture->height() != fTextureSize.height()) {
407 fTextureSize = SkISize::Make(texture->width(), texture->height()); 408 fTextureSize = SkISize::Make(texture->width(), texture->height());
408 float delta = 1.0f/(3.0f*texture->width()); 409 float delta = 1.0f/(3.0f*texture->width());
409 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { 410 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) {
410 delta = -delta; 411 delta = -delta;
411 } 412 }
412 pdman.set3f(fTextureSizeUni, 413 pdman.set3f(fTextureSizeUni,
413 SkIntToScalar(fTextureSize.width()), 414 SkIntToScalar(fTextureSize.width()),
414 SkIntToScalar(fTextureSize.height()), 415 SkIntToScalar(fTextureSize.height()),
415 delta); 416 delta);
416 } 417 }
417 418
418 GrColor textColor = dfTexEffect.getTextColor(); 419 GrColor textColor = dfTexEffect.getTextColor();
419 if (textColor != fTextColor) { 420 if (textColor != fTextColor) {
420 static const float ONE_OVER_255 = 1.f / 255.f; 421 static const float ONE_OVER_255 = 1.f / 255.f;
421 pdman.set3f(fTextColorUni, 422 pdman.set3f(fTextColorUni,
422 GrColorUnpackR(textColor) * ONE_OVER_255, 423 GrColorUnpackR(textColor) * ONE_OVER_255,
423 GrColorUnpackG(textColor) * ONE_OVER_255, 424 GrColorUnpackG(textColor) * ONE_OVER_255,
424 GrColorUnpackB(textColor) * ONE_OVER_255); 425 GrColorUnpackB(textColor) * ONE_OVER_255);
425 fTextColor = textColor; 426 fTextColor = textColor;
426 } 427 }
427 } 428 }
428 429
429 static inline void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, 430 static inline void GenKey(const GrEffect& effect, const GrGLCaps&,
430 GrEffectKeyBuilder* b) { 431 GrEffectKeyBuilder* b) {
431 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 432 const GrDistanceFieldLCDTextureEffect& dfTexEffect =
432 drawEffect.castEffect<GrDistanceField LCDTextureEffect>(); 433 GrEffect::CastEffect<GrDistanceFieldLCDTextureEffect>(effect);
433 434
434 b->add32(dfTexEffect.getFlags()); 435 b->add32(dfTexEffect.getFlags());
435 } 436 }
436 437
437 private: 438 private:
438 GrGLProgramDataManager::UniformHandle fTextureSizeUni; 439 GrGLProgramDataManager::UniformHandle fTextureSizeUni;
439 SkISize fTextureSize; 440 SkISize fTextureSize;
440 GrGLProgramDataManager::UniformHandle fTextColorUni; 441 GrGLProgramDataManager::UniformHandle fTextColorUni;
441 SkColor fTextColor; 442 SkColor fTextColor;
442 443
(...skipping 15 matching lines...) Expand all
458 kVec2f_GrSLType, 459 kVec2f_GrSLType,
459 GrShaderVar::kAttribute _TypeModifier))) { 460 GrShaderVar::kAttribute _TypeModifier))) {
460 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan ceFieldEffectFlag)); 461 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan ceFieldEffectFlag));
461 462
462 this->addTextureAccess(&fTextureAccess); 463 this->addTextureAccess(&fTextureAccess);
463 this->addTextureAccess(&fGammaTextureAccess); 464 this->addTextureAccess(&fGammaTextureAccess);
464 } 465 }
465 466
466 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrEffect& other) const { 467 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrEffect& other) const {
467 const GrDistanceFieldLCDTextureEffect& cte = 468 const GrDistanceFieldLCDTextureEffect& cte =
468 CastEffect<GrDistanceFieldLCDTexture Effect>(other); 469 GrEffect::CastEffect<GrDistanceFieldLCDTextureEffect>(other);
469 return (fTextureAccess == cte.fTextureAccess && 470 return (fTextureAccess == cte.fTextureAccess &&
470 fGammaTextureAccess == cte.fGammaTextureAccess && 471 fGammaTextureAccess == cte.fGammaTextureAccess &&
471 fTextColor == cte.fTextColor && 472 fTextColor == cte.fTextColor &&
472 fFlags == cte.fFlags); 473 fFlags == cte.fFlags);
473 } 474 }
474 475
475 void GrDistanceFieldLCDTextureEffect::getConstantColorComponents(GrColor* color, 476 void GrDistanceFieldLCDTextureEffect::getConstantColorComponents(GrColor* color,
476 uint32_t* valid Flags) const { 477 uint32_t* valid Flags) const {
477 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color ) && 478 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color ) &&
478 GrPixelConfigIsOpaque(this->texture(0)->config())) { 479 GrPixelConfigIsOpaque(this->texture(0)->config())) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 random->nextULessThan(256), 517 random->nextULessThan(256),
517 random->nextULessThan(256)); 518 random->nextULessThan(256));
518 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; 519 uint32_t flags = kUseLCD_DistanceFieldEffectFlag;
519 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; 520 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0;
520 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; 521 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
521 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, 522 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params,
522 textures[texIdx2], params2, 523 textures[texIdx2], params2,
523 textColor, 524 textColor,
524 flags); 525 flags);
525 } 526 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698