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

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 after revert 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
« no previous file with comments | « src/gpu/effects/GrDashingEffect.cpp ('k') | src/gpu/effects/GrDitherEffect.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #ifdef SK_GAMMA_APPLY_TO_A8 38 #ifdef SK_GAMMA_APPLY_TO_A8
39 , fLuminance(-1.0f) 39 , fLuminance(-1.0f)
40 #endif 40 #endif
41 {} 41 {}
42 42
43 virtual void emitCode(GrGLFullProgramBuilder* builder, 43 virtual void emitCode(GrGLFullProgramBuilder* builder,
44 const GrDrawEffect& drawEffect, 44 const GrEffect& effect,
45 const GrEffectKey& key, 45 const GrEffectKey& key,
46 const char* outputColor, 46 const char* outputColor,
47 const char* inputColor, 47 const char* inputColor,
48 const TransformedCoordsArray&, 48 const TransformedCoordsArray&,
49 const TextureSamplerArray& samplers) SK_OVERRIDE { 49 const TextureSamplerArray& samplers) SK_OVERRIDE {
50 const GrDistanceFieldTextureEffect& dfTexEffect = 50 const GrDistanceFieldTextureEffect& dfTexEffect =
51 drawEffect.castEffect<GrDistanceFi eldTextureEffect>(); 51 effect.cast<GrDistanceFieldTextureEffect>();
52 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); 52 SkASSERT(1 == dfTexEffect.getVertexAttribs().count());
53 53
54 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder (); 54 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder ();
55 SkAssertResult(fsBuilder->enableFeature( 55 SkAssertResult(fsBuilder->enableFeature(
56 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); 56 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
57 57
58 SkString fsCoordName; 58 SkString fsCoordName;
59 const char* vsCoordName; 59 const char* vsCoordName;
60 const char* fsCoordNamePtr; 60 const char* fsCoordNamePtr;
61 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC oordNamePtr); 61 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC oordNamePtr);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); 124 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType);
125 fsBuilder->codeAppend(";\n"); 125 fsBuilder->codeAppend(";\n");
126 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); 126 fsBuilder->codeAppend("\tval = gammaColor.r;\n");
127 #endif 127 #endif
128 128
129 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, 129 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor,
130 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("val") ).c_str()); 130 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("val") ).c_str());
131 } 131 }
132 132
133 virtual void setData(const GrGLProgramDataManager& pdman, 133 virtual void setData(const GrGLProgramDataManager& pdman,
134 const GrDrawEffect& drawEffect) SK_OVERRIDE { 134 const GrEffect& effect) SK_OVERRIDE {
135 SkASSERT(fTextureSizeUni.isValid()); 135 SkASSERT(fTextureSizeUni.isValid());
136 136
137 GrTexture* texture = drawEffect.effect()->texture(0); 137 GrTexture* texture = effect.texture(0);
138 if (texture->width() != fTextureSize.width() || 138 if (texture->width() != fTextureSize.width() ||
139 texture->height() != fTextureSize.height()) { 139 texture->height() != fTextureSize.height()) {
140 fTextureSize = SkISize::Make(texture->width(), texture->height()); 140 fTextureSize = SkISize::Make(texture->width(), texture->height());
141 pdman.set2f(fTextureSizeUni, 141 pdman.set2f(fTextureSizeUni,
142 SkIntToScalar(fTextureSize.width()), 142 SkIntToScalar(fTextureSize.width()),
143 SkIntToScalar(fTextureSize.height())); 143 SkIntToScalar(fTextureSize.height()));
144 } 144 }
145 #ifdef SK_GAMMA_APPLY_TO_A8 145 #ifdef SK_GAMMA_APPLY_TO_A8
146 const GrDistanceFieldTextureEffect& dfTexEffect = 146 const GrDistanceFieldTextureEffect& dfTexEffect =
147 drawEffect.castEffect<GrDistanceFi eldTextureEffect>(); 147 effect.cast<GrDistanceFieldTexture Effect>();
148 float luminance = dfTexEffect.getLuminance(); 148 float luminance = dfTexEffect.getLuminance();
149 if (luminance != fLuminance) { 149 if (luminance != fLuminance) {
150 pdman.set1f(fLuminanceUni, luminance); 150 pdman.set1f(fLuminanceUni, luminance);
151 fLuminance = luminance; 151 fLuminance = luminance;
152 } 152 }
153 #endif 153 #endif
154 } 154 }
155 155
156 static inline void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, 156 static inline void GenKey(const GrEffect& effect, const GrGLCaps&,
157 GrEffectKeyBuilder* b) { 157 GrEffectKeyBuilder* b) {
158 const GrDistanceFieldTextureEffect& dfTexEffect = 158 const GrDistanceFieldTextureEffect& dfTexEffect =
159 drawEffect.castEffect<GrDistanceFi eldTextureEffect>(); 159 effect.cast<GrDistanceFieldTextureEffect>();
160 160
161 b->add32(dfTexEffect.getFlags()); 161 b->add32(dfTexEffect.getFlags());
162 } 162 }
163 163
164 private: 164 private:
165 GrGLProgramDataManager::UniformHandle fTextureSizeUni; 165 GrGLProgramDataManager::UniformHandle fTextureSizeUni;
166 SkISize fTextureSize; 166 SkISize fTextureSize;
167 GrGLProgramDataManager::UniformHandle fLuminanceUni; 167 GrGLProgramDataManager::UniformHandle fLuminanceUni;
168 float fLuminance; 168 float fLuminance;
169 169
(...skipping 20 matching lines...) Expand all
190 kVec2f_GrSLType, 190 kVec2f_GrSLType,
191 GrShaderVar::kAttribute _TypeModifier))) { 191 GrShaderVar::kAttribute _TypeModifier))) {
192 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); 192 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
193 this->addTextureAccess(&fTextureAccess); 193 this->addTextureAccess(&fTextureAccess);
194 #ifdef SK_GAMMA_APPLY_TO_A8 194 #ifdef SK_GAMMA_APPLY_TO_A8
195 this->addTextureAccess(&fGammaTextureAccess); 195 this->addTextureAccess(&fGammaTextureAccess);
196 #endif 196 #endif
197 } 197 }
198 198
199 bool GrDistanceFieldTextureEffect::onIsEqual(const GrEffect& other) const { 199 bool GrDistanceFieldTextureEffect::onIsEqual(const GrEffect& other) const {
200 const GrDistanceFieldTextureEffect& cte = CastEffect<GrDistanceFieldTextureE ffect>(other); 200 const GrDistanceFieldTextureEffect& cte = other.cast<GrDistanceFieldTextureE ffect>();
201 return fTextureAccess == cte.fTextureAccess && 201 return fTextureAccess == cte.fTextureAccess &&
202 #ifdef SK_GAMMA_APPLY_TO_A8 202 #ifdef SK_GAMMA_APPLY_TO_A8
203 fGammaTextureAccess == cte.fGammaTextureAccess && 203 fGammaTextureAccess == cte.fGammaTextureAccess &&
204 fLuminance == cte.fLuminance && 204 fLuminance == cte.fLuminance &&
205 #endif 205 #endif
206 fFlags == cte.fFlags; 206 fFlags == cte.fFlags;
207 } 207 }
208 208
209 void GrDistanceFieldTextureEffect::getConstantColorComponents(GrColor* color, 209 void GrDistanceFieldTextureEffect::getConstantColorComponents(GrColor* color,
210 uint32_t* validFlag s) const { 210 uint32_t* validFlag s) const {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 #endif 257 #endif
258 random->nextBool() ? 258 random->nextBool() ?
259 kSimilarity_DistanceFieldEff ectFlag : 0); 259 kSimilarity_DistanceFieldEff ectFlag : 0);
260 } 260 }
261 261
262 /////////////////////////////////////////////////////////////////////////////// 262 ///////////////////////////////////////////////////////////////////////////////
263 263
264 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { 264 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor {
265 public: 265 public:
266 GrGLDistanceFieldLCDTextureEffect(const GrBackendEffectFactory& factory, 266 GrGLDistanceFieldLCDTextureEffect(const GrBackendEffectFactory& factory,
267 const GrDrawEffect& drawEffect) 267 const GrEffect& effect)
268 : INHERITED (factory) 268 : INHERITED (factory)
269 , fTextureSize(SkISize::Make(-1,-1)) 269 , fTextureSize(SkISize::Make(-1,-1))
270 , fTextColor(GrColor_ILLEGAL) {} 270 , fTextColor(GrColor_ILLEGAL) {}
271 271
272 virtual void emitCode(GrGLFullProgramBuilder* builder, 272 virtual void emitCode(GrGLFullProgramBuilder* builder,
273 const GrDrawEffect& drawEffect, 273 const GrEffect& effect,
274 const GrEffectKey& key, 274 const GrEffectKey& key,
275 const char* outputColor, 275 const char* outputColor,
276 const char* inputColor, 276 const char* inputColor,
277 const TransformedCoordsArray&, 277 const TransformedCoordsArray&,
278 const TextureSamplerArray& samplers) SK_OVERRIDE { 278 const TextureSamplerArray& samplers) SK_OVERRIDE {
279 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 279 const GrDistanceFieldLCDTextureEffect& dfTexEffect =
280 drawEffect.castEffect<GrDistanceField LCDTextureEffect>(); 280 effect.cast<GrDistanceFieldLCDTextureEffect>();
281 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); 281 SkASSERT(1 == dfTexEffect.getVertexAttribs().count());
282 282
283 SkString fsCoordName; 283 SkString fsCoordName;
284 const char* vsCoordName; 284 const char* vsCoordName;
285 const char* fsCoordNamePtr; 285 const char* fsCoordNamePtr;
286 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC oordNamePtr); 286 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC oordNamePtr);
287 fsCoordName = fsCoordNamePtr; 287 fsCoordName = fsCoordNamePtr;
288 288
289 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); 289 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
290 vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dfTexEffect.inTextur eCoords().c_str()); 290 vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dfTexEffect.inTextur eCoords().c_str());
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 fsBuilder->codeAppend("\tgammaColor = "); 393 fsBuilder->codeAppend("\tgammaColor = ");
394 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); 394 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType);
395 fsBuilder->codeAppend(";\n"); 395 fsBuilder->codeAppend(";\n");
396 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n"); 396 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n");
397 397
398 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, 398 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor,
399 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("val")).c_ str()); 399 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("val")).c_ str());
400 } 400 }
401 401
402 virtual void setData(const GrGLProgramDataManager& pdman, 402 virtual void setData(const GrGLProgramDataManager& pdman,
403 const GrDrawEffect& drawEffect) SK_OVERRIDE { 403 const GrEffect& effect) SK_OVERRIDE {
404 SkASSERT(fTextureSizeUni.isValid()); 404 SkASSERT(fTextureSizeUni.isValid());
405 SkASSERT(fTextColorUni.isValid()); 405 SkASSERT(fTextColorUni.isValid());
406 406
407 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 407 const GrDistanceFieldLCDTextureEffect& dfTexEffect =
408 drawEffect.castEffect<GrDistanceFieldLCDText ureEffect>(); 408 effect.cast<GrDistanceFieldLCDTextureEffect>();
409 GrTexture* texture = drawEffect.effect()->texture(0); 409 GrTexture* texture = effect.texture(0);
410 if (texture->width() != fTextureSize.width() || 410 if (texture->width() != fTextureSize.width() ||
411 texture->height() != fTextureSize.height()) { 411 texture->height() != fTextureSize.height()) {
412 fTextureSize = SkISize::Make(texture->width(), texture->height()); 412 fTextureSize = SkISize::Make(texture->width(), texture->height());
413 float delta = 1.0f/(3.0f*texture->width()); 413 float delta = 1.0f/(3.0f*texture->width());
414 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { 414 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) {
415 delta = -delta; 415 delta = -delta;
416 } 416 }
417 pdman.set3f(fTextureSizeUni, 417 pdman.set3f(fTextureSizeUni,
418 SkIntToScalar(fTextureSize.width()), 418 SkIntToScalar(fTextureSize.width()),
419 SkIntToScalar(fTextureSize.height()), 419 SkIntToScalar(fTextureSize.height()),
420 delta); 420 delta);
421 } 421 }
422 422
423 GrColor textColor = dfTexEffect.getTextColor(); 423 GrColor textColor = dfTexEffect.getTextColor();
424 if (textColor != fTextColor) { 424 if (textColor != fTextColor) {
425 static const float ONE_OVER_255 = 1.f / 255.f; 425 static const float ONE_OVER_255 = 1.f / 255.f;
426 pdman.set3f(fTextColorUni, 426 pdman.set3f(fTextColorUni,
427 GrColorUnpackR(textColor) * ONE_OVER_255, 427 GrColorUnpackR(textColor) * ONE_OVER_255,
428 GrColorUnpackG(textColor) * ONE_OVER_255, 428 GrColorUnpackG(textColor) * ONE_OVER_255,
429 GrColorUnpackB(textColor) * ONE_OVER_255); 429 GrColorUnpackB(textColor) * ONE_OVER_255);
430 fTextColor = textColor; 430 fTextColor = textColor;
431 } 431 }
432 } 432 }
433 433
434 static inline void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, 434 static inline void GenKey(const GrEffect& effect, const GrGLCaps&,
435 GrEffectKeyBuilder* b) { 435 GrEffectKeyBuilder* b) {
436 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 436 const GrDistanceFieldLCDTextureEffect& dfTexEffect =
437 drawEffect.castEffect<GrDistanceField LCDTextureEffect>(); 437 effect.cast<GrDistanceFieldLCDTextureEffect>();
438 438
439 b->add32(dfTexEffect.getFlags()); 439 b->add32(dfTexEffect.getFlags());
440 } 440 }
441 441
442 private: 442 private:
443 GrGLProgramDataManager::UniformHandle fTextureSizeUni; 443 GrGLProgramDataManager::UniformHandle fTextureSizeUni;
444 SkISize fTextureSize; 444 SkISize fTextureSize;
445 GrGLProgramDataManager::UniformHandle fTextColorUni; 445 GrGLProgramDataManager::UniformHandle fTextColorUni;
446 SkColor fTextColor; 446 SkColor fTextColor;
447 447
(...skipping 14 matching lines...) Expand all
462 , fInTextureCoords(this->addVertexAttrib(GrShaderVar("inTextureCoords", 462 , fInTextureCoords(this->addVertexAttrib(GrShaderVar("inTextureCoords",
463 kVec2f_GrSLType, 463 kVec2f_GrSLType,
464 GrShaderVar::kAttribute _TypeModifier))) { 464 GrShaderVar::kAttribute _TypeModifier))) {
465 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan ceFieldEffectFlag)); 465 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan ceFieldEffectFlag));
466 466
467 this->addTextureAccess(&fTextureAccess); 467 this->addTextureAccess(&fTextureAccess);
468 this->addTextureAccess(&fGammaTextureAccess); 468 this->addTextureAccess(&fGammaTextureAccess);
469 } 469 }
470 470
471 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrEffect& other) const { 471 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrEffect& other) const {
472 const GrDistanceFieldLCDTextureEffect& cte = 472 const GrDistanceFieldLCDTextureEffect& cte = other.cast<GrDistanceFieldLCDTe xtureEffect>();
473 CastEffect<GrDistanceFieldLCDTexture Effect>(other);
474 return (fTextureAccess == cte.fTextureAccess && 473 return (fTextureAccess == cte.fTextureAccess &&
475 fGammaTextureAccess == cte.fGammaTextureAccess && 474 fGammaTextureAccess == cte.fGammaTextureAccess &&
476 fTextColor == cte.fTextColor && 475 fTextColor == cte.fTextColor &&
477 fFlags == cte.fFlags); 476 fFlags == cte.fFlags);
478 } 477 }
479 478
480 void GrDistanceFieldLCDTextureEffect::getConstantColorComponents(GrColor* color, 479 void GrDistanceFieldLCDTextureEffect::getConstantColorComponents(GrColor* color,
481 uint32_t* valid Flags) const { 480 uint32_t* valid Flags) const {
482 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color ) && 481 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color ) &&
483 GrPixelConfigIsOpaque(this->texture(0)->config())) { 482 GrPixelConfigIsOpaque(this->texture(0)->config())) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 random->nextULessThan(256), 520 random->nextULessThan(256),
522 random->nextULessThan(256)); 521 random->nextULessThan(256));
523 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; 522 uint32_t flags = kUseLCD_DistanceFieldEffectFlag;
524 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; 523 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0;
525 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; 524 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
526 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, 525 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params,
527 textures[texIdx2], params2, 526 textures[texIdx2], params2,
528 textColor, 527 textColor,
529 flags); 528 flags);
530 } 529 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrDashingEffect.cpp ('k') | src/gpu/effects/GrDitherEffect.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698