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

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

Issue 2339203002: Stop flattening GrCoordTransforms in parent GrFragmentProcessors. (Closed)
Patch Set: Fix issue of taking ref to a temporary Created 4 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/gl/GrGLProgram.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 "GrDistanceFieldGeoProc.h" 8 #include "GrDistanceFieldGeoProc.h"
9 #include "GrInvariantOutput.h" 9 #include "GrInvariantOutput.h"
10 #include "GrTexture.h" 10 #include "GrTexture.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 dfTexEffect.inPosition()->fName, 66 dfTexEffect.inPosition()->fName,
67 dfTexEffect.viewMatrix(), 67 dfTexEffect.viewMatrix(),
68 &fViewMatrixUniform); 68 &fViewMatrixUniform);
69 69
70 // emit transforms 70 // emit transforms
71 this->emitTransforms(vertBuilder, 71 this->emitTransforms(vertBuilder,
72 varyingHandler, 72 varyingHandler,
73 uniformHandler, 73 uniformHandler,
74 gpArgs->fPositionVar, 74 gpArgs->fPositionVar,
75 dfTexEffect.inPosition()->fName, 75 dfTexEffect.inPosition()->fName,
76 args.fTransformsIn, 76 args.fFPCoordTransformHandler);
77 args.fTransformsOut);
78 77
79 // add varyings 78 // add varyings
80 GrGLSLVertToFrag recipScale(kFloat_GrSLType); 79 GrGLSLVertToFrag recipScale(kFloat_GrSLType);
81 GrGLSLVertToFrag uv(kVec2f_GrSLType); 80 GrGLSLVertToFrag uv(kVec2f_GrSLType);
82 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi eldEffectMask) == 81 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi eldEffectMask) ==
83 kUniformScale_DistanceFieldEffectMask; 82 kUniformScale_DistanceFieldEffectMask;
84 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag); 83 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag);
85 bool isGammaCorrect = 84 bool isGammaCorrect =
86 SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectF lag); 85 SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectF lag);
87 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); 86 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 if (isGammaCorrect) { 171 if (isGammaCorrect) {
173 fragBuilder->codeAppend( 172 fragBuilder->codeAppend(
174 "float val = clamp(distance + afwidth / (2.0 * afwidth), 0.0, 1. 0);"); 173 "float val = clamp(distance + afwidth / (2.0 * afwidth), 0.0, 1. 0);");
175 } else { 174 } else {
176 fragBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, d istance);"); 175 fragBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, d istance);");
177 } 176 }
178 177
179 fragBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 178 fragBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
180 } 179 }
181 180
182 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess or& proc) override { 181 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess or& proc,
182 FPCoordTransformIter&& transformIter) override {
183 #ifdef SK_GAMMA_APPLY_TO_A8 183 #ifdef SK_GAMMA_APPLY_TO_A8
184 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi eldA8TextGeoProc>(); 184 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi eldA8TextGeoProc>();
185 float distanceAdjust = dfTexEffect.getDistanceAdjust(); 185 float distanceAdjust = dfTexEffect.getDistanceAdjust();
186 if (distanceAdjust != fDistanceAdjust) { 186 if (distanceAdjust != fDistanceAdjust) {
187 pdman.set1f(fDistanceAdjustUni, distanceAdjust); 187 pdman.set1f(fDistanceAdjustUni, distanceAdjust);
188 fDistanceAdjust = distanceAdjust; 188 fDistanceAdjust = distanceAdjust;
189 } 189 }
190 #endif 190 #endif
191 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8 TextGeoProc>(); 191 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8 TextGeoProc>();
192 192
193 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g p.viewMatrix())) { 193 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g p.viewMatrix())) {
194 fViewMatrix = dfa8gp.viewMatrix(); 194 fViewMatrix = dfa8gp.viewMatrix();
195 float viewMatrix[3 * 3]; 195 float viewMatrix[3 * 3];
196 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); 196 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
197 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 197 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
198 } 198 }
199 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
199 } 200 }
200 201
201 static inline void GenKey(const GrGeometryProcessor& gp, 202 static inline void GenKey(const GrGeometryProcessor& gp,
202 const GrGLSLCaps&, 203 const GrGLSLCaps&,
203 GrProcessorKeyBuilder* b) { 204 GrProcessorKeyBuilder* b) {
204 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>(); 205 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>();
205 uint32_t key = dfTexEffect.getFlags(); 206 uint32_t key = dfTexEffect.getFlags();
206 key |= dfTexEffect.colorIgnored() << 16; 207 key |= dfTexEffect.colorIgnored() << 16;
207 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 208 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
208 b->add32(key); 209 b->add32(key);
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 dfTexEffect.inPosition()->fName, 339 dfTexEffect.inPosition()->fName,
339 dfTexEffect.viewMatrix(), 340 dfTexEffect.viewMatrix(),
340 &fViewMatrixUniform); 341 &fViewMatrixUniform);
341 342
342 // emit transforms 343 // emit transforms
343 this->emitTransforms(vertBuilder, 344 this->emitTransforms(vertBuilder,
344 varyingHandler, 345 varyingHandler,
345 uniformHandler, 346 uniformHandler,
346 gpArgs->fPositionVar, 347 gpArgs->fPositionVar,
347 dfTexEffect.inPosition()->fName, 348 dfTexEffect.inPosition()->fName,
348 args.fTransformsIn, 349 args.fFPCoordTransformHandler);
349 args.fTransformsOut);
350 350
351 const char* textureSizeUniName = nullptr; 351 const char* textureSizeUniName = nullptr;
352 fTextureSizeUni = uniformHandler->addUniform(kFragment_GrShaderFlag, 352 fTextureSizeUni = uniformHandler->addUniform(kFragment_GrShaderFlag,
353 kVec2f_GrSLType, kDefault_G rSLPrecision, 353 kVec2f_GrSLType, kDefault_G rSLPrecision,
354 "TextureSize", &textureSize UniName); 354 "TextureSize", &textureSize UniName);
355 355
356 // Use highp to work around aliasing issues 356 // Use highp to work around aliasing issues
357 fragBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); 357 fragBuilder->appendPrecisionModifier(kHigh_GrSLPrecision);
358 fragBuilder->codeAppendf("vec2 uv = %s;", v.fsIn()); 358 fragBuilder->codeAppendf("vec2 uv = %s;", v.fsIn());
359 359
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 if (isGammaCorrect) { 426 if (isGammaCorrect) {
427 fragBuilder->codeAppend( 427 fragBuilder->codeAppend(
428 "float val = clamp(distance + afwidth / (2.0 * afwidth), 0.0, 1. 0);"); 428 "float val = clamp(distance + afwidth / (2.0 * afwidth), 0.0, 1. 0);");
429 } else { 429 } else {
430 fragBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, d istance);"); 430 fragBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, d istance);");
431 } 431 }
432 432
433 fragBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 433 fragBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
434 } 434 }
435 435
436 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess or& proc) override { 436 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess or& proc,
437 FPCoordTransformIter&& transformIter) override {
437 SkASSERT(fTextureSizeUni.isValid()); 438 SkASSERT(fTextureSizeUni.isValid());
438 439
439 GrTexture* texture = proc.texture(0); 440 GrTexture* texture = proc.texture(0);
440 if (texture->width() != fTextureSize.width() || 441 if (texture->width() != fTextureSize.width() ||
441 texture->height() != fTextureSize.height()) { 442 texture->height() != fTextureSize.height()) {
442 fTextureSize = SkISize::Make(texture->width(), texture->height()); 443 fTextureSize = SkISize::Make(texture->width(), texture->height());
443 pdman.set2f(fTextureSizeUni, 444 pdman.set2f(fTextureSizeUni,
444 SkIntToScalar(fTextureSize.width()), 445 SkIntToScalar(fTextureSize.width()),
445 SkIntToScalar(fTextureSize.height())); 446 SkIntToScalar(fTextureSize.height()));
446 } 447 }
447 448
448 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG eoProc>(); 449 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG eoProc>();
449 450
450 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp. viewMatrix())) { 451 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp. viewMatrix())) {
451 fViewMatrix = dfpgp.viewMatrix(); 452 fViewMatrix = dfpgp.viewMatrix();
452 float viewMatrix[3 * 3]; 453 float viewMatrix[3 * 3];
453 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); 454 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
454 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 455 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
455 } 456 }
457 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
456 } 458 }
457 459
458 static inline void GenKey(const GrGeometryProcessor& gp, 460 static inline void GenKey(const GrGeometryProcessor& gp,
459 const GrGLSLCaps&, 461 const GrGLSLCaps&,
460 GrProcessorKeyBuilder* b) { 462 GrProcessorKeyBuilder* b) {
461 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP athGeoProc>(); 463 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP athGeoProc>();
462 464
463 uint32_t key = dfTexEffect.getFlags(); 465 uint32_t key = dfTexEffect.getFlags();
464 key |= dfTexEffect.colorIgnored() << 16; 466 key |= dfTexEffect.colorIgnored() << 16;
465 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 467 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 dfTexEffect.inPosition()->fName, 577 dfTexEffect.inPosition()->fName,
576 dfTexEffect.viewMatrix(), 578 dfTexEffect.viewMatrix(),
577 &fViewMatrixUniform); 579 &fViewMatrixUniform);
578 580
579 // emit transforms 581 // emit transforms
580 this->emitTransforms(vertBuilder, 582 this->emitTransforms(vertBuilder,
581 varyingHandler, 583 varyingHandler,
582 uniformHandler, 584 uniformHandler,
583 gpArgs->fPositionVar, 585 gpArgs->fPositionVar,
584 dfTexEffect.inPosition()->fName, 586 dfTexEffect.inPosition()->fName,
585 args.fTransformsIn, 587 args.fFPCoordTransformHandler);
586 args.fTransformsOut);
587 588
588 // set up varyings 589 // set up varyings
589 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi eldEffectMask) == 590 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi eldEffectMask) ==
590 kUniformScale_DistanceFieldEffectMask; 591 kUniformScale_DistanceFieldEffectMask;
591 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag); 592 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag);
592 bool isGammaCorrect = 593 bool isGammaCorrect =
593 SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectF lag); 594 SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectF lag);
594 GrGLSLVertToFrag recipScale(kFloat_GrSLType); 595 GrGLSLVertToFrag recipScale(kFloat_GrSLType);
595 GrGLSLVertToFrag uv(kVec2f_GrSLType); 596 GrGLSLVertToFrag uv(kVec2f_GrSLType);
596 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); 597 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 fragBuilder->codeAppend( 726 fragBuilder->codeAppend(
726 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), dista nce), 1.0);"); 727 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), dista nce), 1.0);");
727 } 728 }
728 729
729 // set alpha to be max of rgb coverage 730 // set alpha to be max of rgb coverage
730 fragBuilder->codeAppend("val.a = max(max(val.r, val.g), val.b);"); 731 fragBuilder->codeAppend("val.a = max(max(val.r, val.g), val.b);");
731 732
732 fragBuilder->codeAppendf("%s = val;", args.fOutputCoverage); 733 fragBuilder->codeAppendf("%s = val;", args.fOutputCoverage);
733 } 734 }
734 735
735 void setData(const GrGLSLProgramDataManager& pdman, 736 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess or& processor,
736 const GrPrimitiveProcessor& processor) override { 737 FPCoordTransformIter&& transformIter) override {
737 SkASSERT(fDistanceAdjustUni.isValid()); 738 SkASSERT(fDistanceAdjustUni.isValid());
738 739
739 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi eldLCDTextGeoProc>(); 740 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi eldLCDTextGeoProc>();
740 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju st(); 741 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju st();
741 if (wa != fDistanceAdjust) { 742 if (wa != fDistanceAdjust) {
742 pdman.set3f(fDistanceAdjustUni, 743 pdman.set3f(fDistanceAdjustUni,
743 wa.fR, 744 wa.fR,
744 wa.fG, 745 wa.fG,
745 wa.fB); 746 wa.fB);
746 fDistanceAdjust = wa; 747 fDistanceAdjust = wa;
747 } 748 }
748 749
749 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd. viewMatrix())) { 750 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd. viewMatrix())) {
750 fViewMatrix = dflcd.viewMatrix(); 751 fViewMatrix = dflcd.viewMatrix();
751 float viewMatrix[3 * 3]; 752 float viewMatrix[3 * 3];
752 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); 753 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
753 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 754 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
754 } 755 }
756 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
755 } 757 }
756 758
757 static inline void GenKey(const GrGeometryProcessor& gp, 759 static inline void GenKey(const GrGeometryProcessor& gp,
758 const GrGLSLCaps&, 760 const GrGLSLCaps&,
759 GrProcessorKeyBuilder* b) { 761 GrProcessorKeyBuilder* b) {
760 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>(); 762 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>();
761 763
762 uint32_t key = dfTexEffect.getFlags(); 764 uint32_t key = dfTexEffect.getFlags();
763 key |= dfTexEffect.colorIgnored() << 16; 765 key |= dfTexEffect.colorIgnored() << 16;
764 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 766 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0 ; 841 flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0 ;
840 } 842 }
841 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; 843 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
842 return GrDistanceFieldLCDTextGeoProc::Make(GrRandomColor(d->fRandom), 844 return GrDistanceFieldLCDTextGeoProc::Make(GrRandomColor(d->fRandom),
843 GrTest::TestMatrix(d->fRandom), 845 GrTest::TestMatrix(d->fRandom),
844 d->fTextures[texIdx], params, 846 d->fTextures[texIdx], params,
845 wa, 847 wa,
846 flags, 848 flags,
847 d->fRandom->nextBool()); 849 d->fRandom->nextBool());
848 } 850 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrDashingEffect.cpp ('k') | src/gpu/gl/GrGLProgram.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698