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

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

Issue 772513002: create and thread batch tracker object (Closed) Base URL: https://skia.googlesource.com/skia.git@2_vertex_attr
Patch Set: rebase Created 6 years 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/gl/GrGLGeometryProcessor.h » ('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 "GrDistanceFieldTextureEffect.h" 8 #include "GrDistanceFieldTextureEffect.h"
9 #include "GrInvariantOutput.h" 9 #include "GrInvariantOutput.h"
10 #include "gl/builders/GrGLProgramBuilder.h" 10 #include "gl/builders/GrGLProgramBuilder.h"
11 #include "gl/GrGLProcessor.h" 11 #include "gl/GrGLProcessor.h"
12 #include "gl/GrGLSL.h" 12 #include "gl/GrGLSL.h"
13 #include "gl/GrGLTexture.h" 13 #include "gl/GrGLTexture.h"
14 #include "gl/GrGLGeometryProcessor.h" 14 #include "gl/GrGLGeometryProcessor.h"
15 #include "GrTBackendProcessorFactory.h" 15 #include "GrTBackendProcessorFactory.h"
16 #include "GrTexture.h" 16 #include "GrTexture.h"
17 17
18 #include "SkDistanceFieldGen.h" 18 #include "SkDistanceFieldGen.h"
19 19
20 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/ 2 20 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/ 2
21 #define SK_DistanceFieldAAFactor "0.7071" 21 #define SK_DistanceFieldAAFactor "0.7071"
22 22
23 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor { 23 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor {
24 public: 24 public:
25 GrGLDistanceFieldTextureEffect(const GrBackendProcessorFactory& factory, 25 GrGLDistanceFieldTextureEffect(const GrBackendProcessorFactory& factory,
26 const GrProcessor&) 26 const GrGeometryProcessor&,
27 const GrBatchTracker&)
27 : INHERITED (factory) 28 : INHERITED (factory)
28 , fTextureSize(SkISize::Make(-1,-1)) 29 , fTextureSize(SkISize::Make(-1,-1))
29 #ifdef SK_GAMMA_APPLY_TO_A8 30 #ifdef SK_GAMMA_APPLY_TO_A8
30 , fLuminance(-1.0f) 31 , fLuminance(-1.0f)
31 #endif 32 #endif
32 {} 33 {}
33 34
34 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { 35 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
35 const GrDistanceFieldTextureEffect& dfTexEffect = 36 const GrDistanceFieldTextureEffect& dfTexEffect =
36 args.fGP.cast<GrDistanceFieldTextureEffect>(); 37 args.fGP.cast<GrDistanceFieldTextureEffect>();
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 fsBuilder->codeAppend("\tvec4 gammaColor = "); 118 fsBuilder->codeAppend("\tvec4 gammaColor = ");
118 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType) ; 119 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType) ;
119 fsBuilder->codeAppend(";\n"); 120 fsBuilder->codeAppend(";\n");
120 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); 121 fsBuilder->codeAppend("\tval = gammaColor.r;\n");
121 #endif 122 #endif
122 123
123 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 124 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
124 } 125 }
125 126
126 virtual void setData(const GrGLProgramDataManager& pdman, 127 virtual void setData(const GrGLProgramDataManager& pdman,
127 const GrProcessor& effect) SK_OVERRIDE { 128 const GrGeometryProcessor& proc,
129 const GrBatchTracker&) SK_OVERRIDE {
128 SkASSERT(fTextureSizeUni.isValid()); 130 SkASSERT(fTextureSizeUni.isValid());
129 131
130 GrTexture* texture = effect.texture(0); 132 GrTexture* texture = proc.texture(0);
131 if (texture->width() != fTextureSize.width() || 133 if (texture->width() != fTextureSize.width() ||
132 texture->height() != fTextureSize.height()) { 134 texture->height() != fTextureSize.height()) {
133 fTextureSize = SkISize::Make(texture->width(), texture->height()); 135 fTextureSize = SkISize::Make(texture->width(), texture->height());
134 pdman.set2f(fTextureSizeUni, 136 pdman.set2f(fTextureSizeUni,
135 SkIntToScalar(fTextureSize.width()), 137 SkIntToScalar(fTextureSize.width()),
136 SkIntToScalar(fTextureSize.height())); 138 SkIntToScalar(fTextureSize.height()));
137 } 139 }
138 #ifdef SK_GAMMA_APPLY_TO_A8 140 #ifdef SK_GAMMA_APPLY_TO_A8
139 const GrDistanceFieldTextureEffect& dfTexEffect = 141 const GrDistanceFieldTextureEffect& dfTexEffect =
140 effect.cast<GrDistanceFieldTextureEffect>(); 142 proc.cast<GrDistanceFieldTextureEffect>();
141 float luminance = dfTexEffect.getLuminance(); 143 float luminance = dfTexEffect.getLuminance();
142 if (luminance != fLuminance) { 144 if (luminance != fLuminance) {
143 pdman.set1f(fLuminanceUni, luminance); 145 pdman.set1f(fLuminanceUni, luminance);
144 fLuminance = luminance; 146 fLuminance = luminance;
145 } 147 }
146 #endif 148 #endif
147 } 149 }
148 150
149 static inline void GenKey(const GrProcessor& processor, const GrGLCaps&, 151 static inline void GenKey(const GrGeometryProcessor& processor,
152 const GrBatchTracker&,
153 const GrGLCaps&,
150 GrProcessorKeyBuilder* b) { 154 GrProcessorKeyBuilder* b) {
151 const GrDistanceFieldTextureEffect& dfTexEffect = 155 const GrDistanceFieldTextureEffect& dfTexEffect =
152 processor.cast<GrDistanceFieldTextureEffect>(); 156 processor.cast<GrDistanceFieldTextureEffect>();
153 157
154 b->add32(dfTexEffect.getFlags()); 158 b->add32(dfTexEffect.getFlags());
155 } 159 }
156 160
157 private: 161 private:
158 GrGLProgramDataManager::UniformHandle fTextureSizeUni; 162 GrGLProgramDataManager::UniformHandle fTextureSizeUni;
159 SkISize fTextureSize; 163 SkISize fTextureSize;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 #endif 252 #endif
249 random->nextBool() ? 253 random->nextBool() ?
250 kSimilarity_DistanceFieldEff ectFlag : 0); 254 kSimilarity_DistanceFieldEff ectFlag : 0);
251 } 255 }
252 256
253 /////////////////////////////////////////////////////////////////////////////// 257 ///////////////////////////////////////////////////////////////////////////////
254 258
255 class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor { 259 class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor {
256 public: 260 public:
257 GrGLDistanceFieldNoGammaTextureEffect(const GrBackendProcessorFactory& facto ry, 261 GrGLDistanceFieldNoGammaTextureEffect(const GrBackendProcessorFactory& facto ry,
258 const GrProcessor& effect) 262 const GrGeometryProcessor&,
263 const GrBatchTracker&)
259 : INHERITED(factory) 264 : INHERITED(factory)
260 , fTextureSize(SkISize::Make(-1, -1)) {} 265 , fTextureSize(SkISize::Make(-1, -1)) {}
261 266
262 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { 267 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
263 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = 268 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect =
264 args.fGP.cast<GrDistanceFieldNoGammaTextureEffect>(); 269 args.fGP.cast<GrDistanceFieldNoGammaTextureEffect>();
265 270
266 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 271 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
267 SkAssertResult(fsBuilder->enableFeature( 272 SkAssertResult(fsBuilder->enableFeature(
268 GrGLFragmentShaderBuilder::kStandardDerivat ives_GLSLFeature)); 273 GrGLFragmentShaderBuilder::kStandardDerivat ives_GLSLFeature));
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 336
332 // this gives us a smooth step across approximately one fragment 337 // this gives us a smooth step across approximately one fragment
333 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length (grad);"); 338 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length (grad);");
334 } 339 }
335 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc e);"); 340 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc e);");
336 341
337 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 342 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
338 } 343 }
339 344
340 virtual void setData(const GrGLProgramDataManager& pdman, 345 virtual void setData(const GrGLProgramDataManager& pdman,
341 const GrProcessor& effect) SK_OVERRIDE { 346 const GrGeometryProcessor& proc,
347 const GrBatchTracker&) SK_OVERRIDE {
342 SkASSERT(fTextureSizeUni.isValid()); 348 SkASSERT(fTextureSizeUni.isValid());
343 349
344 GrTexture* texture = effect.texture(0); 350 GrTexture* texture = proc.texture(0);
345 if (texture->width() != fTextureSize.width() || 351 if (texture->width() != fTextureSize.width() ||
346 texture->height() != fTextureSize.height()) { 352 texture->height() != fTextureSize.height()) {
347 fTextureSize = SkISize::Make(texture->width(), texture->height()); 353 fTextureSize = SkISize::Make(texture->width(), texture->height());
348 pdman.set2f(fTextureSizeUni, 354 pdman.set2f(fTextureSizeUni,
349 SkIntToScalar(fTextureSize.width()), 355 SkIntToScalar(fTextureSize.width()),
350 SkIntToScalar(fTextureSize.height())); 356 SkIntToScalar(fTextureSize.height()));
351 } 357 }
352 } 358 }
353 359
354 static inline void GenKey(const GrProcessor& effect, const GrGLCaps&, 360 static inline void GenKey(const GrGeometryProcessor& proc,
361 const GrBatchTracker&,
362 const GrGLCaps&,
355 GrProcessorKeyBuilder* b) { 363 GrProcessorKeyBuilder* b) {
356 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = 364 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect =
357 effect.cast<GrDistanceFieldNoGammaTextureEffect>(); 365 proc.cast<GrDistanceFieldNoGammaTextureEffect>();
358 366
359 b->add32(dfTexEffect.getFlags()); 367 b->add32(dfTexEffect.getFlags());
360 } 368 }
361 369
362 private: 370 private:
363 GrGLProgramDataManager::UniformHandle fTextureSizeUni; 371 GrGLProgramDataManager::UniformHandle fTextureSizeUni;
364 SkISize fTextureSize; 372 SkISize fTextureSize;
365 373
366 typedef GrGLGeometryProcessor INHERITED; 374 typedef GrGLGeometryProcessor INHERITED;
367 }; 375 };
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 431
424 return GrDistanceFieldNoGammaTextureEffect::Create(textures[texIdx], params, 432 return GrDistanceFieldNoGammaTextureEffect::Create(textures[texIdx], params,
425 random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0); 433 random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0);
426 } 434 }
427 435
428 /////////////////////////////////////////////////////////////////////////////// 436 ///////////////////////////////////////////////////////////////////////////////
429 437
430 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { 438 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor {
431 public: 439 public:
432 GrGLDistanceFieldLCDTextureEffect(const GrBackendProcessorFactory& factory, 440 GrGLDistanceFieldLCDTextureEffect(const GrBackendProcessorFactory& factory,
433 const GrProcessor&) 441 const GrGeometryProcessor&,
442 const GrBatchTracker&)
434 : INHERITED (factory) 443 : INHERITED (factory)
435 , fTextureSize(SkISize::Make(-1,-1)) 444 , fTextureSize(SkISize::Make(-1,-1))
436 , fTextColor(GrColor_ILLEGAL) {} 445 , fTextColor(GrColor_ILLEGAL) {}
437 446
438 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { 447 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
439 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 448 const GrDistanceFieldLCDTextureEffect& dfTexEffect =
440 args.fGP.cast<GrDistanceFieldLCDTextureEffect>(); 449 args.fGP.cast<GrDistanceFieldLCDTextureEffect>();
441 450
442 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 451 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
443 GrGLVertToFrag v(kVec2f_GrSLType); 452 GrGLVertToFrag v(kVec2f_GrSLType);
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 fsBuilder->codeAppendf("\tuv = vec2(val.z, %s.z);\n", textColorUniName); 565 fsBuilder->codeAppendf("\tuv = vec2(val.z, %s.z);\n", textColorUniName);
557 fsBuilder->codeAppend("\tgammaColor = "); 566 fsBuilder->codeAppend("\tgammaColor = ");
558 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType) ; 567 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType) ;
559 fsBuilder->codeAppend(";\n"); 568 fsBuilder->codeAppend(";\n");
560 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n"); 569 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n");
561 570
562 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 571 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
563 } 572 }
564 573
565 virtual void setData(const GrGLProgramDataManager& pdman, 574 virtual void setData(const GrGLProgramDataManager& pdman,
566 const GrProcessor& processor) SK_OVERRIDE { 575 const GrGeometryProcessor& processor,
576 const GrBatchTracker&) SK_OVERRIDE {
567 SkASSERT(fTextureSizeUni.isValid()); 577 SkASSERT(fTextureSizeUni.isValid());
568 SkASSERT(fTextColorUni.isValid()); 578 SkASSERT(fTextColorUni.isValid());
569 579
570 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 580 const GrDistanceFieldLCDTextureEffect& dfTexEffect =
571 processor.cast<GrDistanceFieldLCDTextureEffect>(); 581 processor.cast<GrDistanceFieldLCDTextureEffect>();
572 GrTexture* texture = processor.texture(0); 582 GrTexture* texture = processor.texture(0);
573 if (texture->width() != fTextureSize.width() || 583 if (texture->width() != fTextureSize.width() ||
574 texture->height() != fTextureSize.height()) { 584 texture->height() != fTextureSize.height()) {
575 fTextureSize = SkISize::Make(texture->width(), texture->height()); 585 fTextureSize = SkISize::Make(texture->width(), texture->height());
576 float delta = 1.0f/(3.0f*texture->width()); 586 float delta = 1.0f/(3.0f*texture->width());
(...skipping 10 matching lines...) Expand all
587 if (textColor != fTextColor) { 597 if (textColor != fTextColor) {
588 static const float ONE_OVER_255 = 1.f / 255.f; 598 static const float ONE_OVER_255 = 1.f / 255.f;
589 pdman.set3f(fTextColorUni, 599 pdman.set3f(fTextColorUni,
590 GrColorUnpackR(textColor) * ONE_OVER_255, 600 GrColorUnpackR(textColor) * ONE_OVER_255,
591 GrColorUnpackG(textColor) * ONE_OVER_255, 601 GrColorUnpackG(textColor) * ONE_OVER_255,
592 GrColorUnpackB(textColor) * ONE_OVER_255); 602 GrColorUnpackB(textColor) * ONE_OVER_255);
593 fTextColor = textColor; 603 fTextColor = textColor;
594 } 604 }
595 } 605 }
596 606
597 static inline void GenKey(const GrProcessor& processor, const GrGLCaps&, 607 static inline void GenKey(const GrGeometryProcessor& processor,
608 const GrBatchTracker&,
609 const GrGLCaps&,
598 GrProcessorKeyBuilder* b) { 610 GrProcessorKeyBuilder* b) {
599 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 611 const GrDistanceFieldLCDTextureEffect& dfTexEffect =
600 processor.cast<GrDistanceFieldLCDTextureEffect>(); 612 processor.cast<GrDistanceFieldLCDTextureEffect>();
601 613
602 b->add32(dfTexEffect.getFlags()); 614 b->add32(dfTexEffect.getFlags());
603 } 615 }
604 616
605 private: 617 private:
606 GrGLProgramDataManager::UniformHandle fTextureSizeUni; 618 GrGLProgramDataManager::UniformHandle fTextureSizeUni;
607 SkISize fTextureSize; 619 SkISize fTextureSize;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 random->nextULessThan(256), 686 random->nextULessThan(256),
675 random->nextULessThan(256)); 687 random->nextULessThan(256));
676 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; 688 uint32_t flags = kUseLCD_DistanceFieldEffectFlag;
677 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; 689 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0;
678 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; 690 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
679 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, 691 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params,
680 textures[texIdx2], params2, 692 textures[texIdx2], params2,
681 textColor, 693 textColor,
682 flags); 694 flags);
683 } 695 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrDashingEffect.cpp ('k') | src/gpu/gl/GrGLGeometryProcessor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698