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

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

Issue 1271873002: Break LCD and Bitmap text dependency on hardcoded atlas values (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: tweak names Created 5 years, 4 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/GrBitmapTextGeoProc.cpp ('k') | no next file » | 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 "GrFontAtlasSizes.h" 9 #include "GrFontAtlasSizes.h"
10 #include "GrInvariantOutput.h" 10 #include "GrInvariantOutput.h"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, 70 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName,
71 args.fTransformsIn, args.fTransformsOut); 71 args.fTransformsIn, args.fTransformsOut);
72 72
73 // add varyings 73 // add varyings
74 GrGLVertToFrag recipScale(kFloat_GrSLType); 74 GrGLVertToFrag recipScale(kFloat_GrSLType);
75 GrGLVertToFrag st(kVec2f_GrSLType); 75 GrGLVertToFrag st(kVec2f_GrSLType);
76 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag); 76 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag);
77 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); 77 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
78 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor ds()->fName); 78 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor ds()->fName);
79 79
80 // compute numbers to be hardcoded to convert texture coordinates from i nt to float
81 SkASSERT(dfTexEffect.numTextures() == 1);
82 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture();
83 SkASSERT(atlas);
84 SkScalar recipWidth = 1.0f / atlas->width();
85 SkScalar recipHeight = 1.0f / atlas->height();
86
80 GrGLVertToFrag uv(kVec2f_GrSLType); 87 GrGLVertToFrag uv(kVec2f_GrSLType);
81 args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); 88 args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
82 // this is only used with text, so our texture bounds always match the g lyph atlas 89 vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(),
83 vsBuilder->codeAppendf("%s = vec2(" GR_FONT_ATLAS_A8_RECIP_WIDTH ", " 90 SK_FLT_DECIMAL_DIG, recipWidth,
84 GR_FONT_ATLAS_RECIP_HEIGHT ")*%s;", uv.vsOut(), 91 SK_FLT_DECIMAL_DIG, recipHeight,
85 dfTexEffect.inTextureCoords()->fName); 92 dfTexEffect.inTextureCoords()->fName);
86 93
87 // Use highp to work around aliasing issues 94 // Use highp to work around aliasing issues
88 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision , 95 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision ,
89 pb->ctxInfo().stand ard())); 96 pb->ctxInfo().stand ard()));
90 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); 97 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn());
91 98
92 fsBuilder->codeAppend("\tfloat texColor = "); 99 fsBuilder->codeAppend("\tfloat texColor = ");
93 fsBuilder->appendTextureLookup(args.fSamplers[0], 100 fsBuilder->appendTextureLookup(args.fSamplers[0],
94 "uv", 101 "uv",
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 static inline void GenKey(const GrGeometryProcessor& gp, 176 static inline void GenKey(const GrGeometryProcessor& gp,
170 const GrBatchTracker& bt, 177 const GrBatchTracker& bt,
171 const GrGLSLCaps&, 178 const GrGLSLCaps&,
172 GrProcessorKeyBuilder* b) { 179 GrProcessorKeyBuilder* b) {
173 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>(); 180 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>();
174 uint32_t key = dfTexEffect.getFlags(); 181 uint32_t key = dfTexEffect.getFlags();
175 key |= dfTexEffect.hasVertexColor() << 16; 182 key |= dfTexEffect.hasVertexColor() << 16;
176 key |= dfTexEffect.colorIgnored() << 17; 183 key |= dfTexEffect.colorIgnored() << 17;
177 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 184 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
178 b->add32(key); 185 b->add32(key);
186
187 // Currently we hardcode numbers to convert atlas coordinates to normali zed floating point
188 SkASSERT(gp.numTextures() == 1);
189 GrTexture* atlas = gp.textureAccess(0).getTexture();
190 SkASSERT(atlas);
191 b->add32(atlas->width());
192 b->add32(atlas->height());
179 } 193 }
180 194
181 private: 195 private:
182 SkMatrix fViewMatrix; 196 SkMatrix fViewMatrix;
183 GrColor fColor; 197 GrColor fColor;
184 UniformHandle fColorUniform; 198 UniformHandle fColorUniform;
185 UniformHandle fViewMatrixUniform; 199 UniformHandle fViewMatrixUniform;
186 #ifdef SK_GAMMA_APPLY_TO_A8 200 #ifdef SK_GAMMA_APPLY_TO_A8
187 float fDistanceAdjust; 201 float fDistanceAdjust;
188 UniformHandle fDistanceAdjustUni; 202 UniformHandle fDistanceAdjustUni;
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, 532 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName,
519 args.fTransformsIn, args.fTransformsOut); 533 args.fTransformsIn, args.fTransformsOut);
520 534
521 // set up varyings 535 // set up varyings
522 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di stanceFieldEffectMask); 536 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di stanceFieldEffectMask);
523 GrGLVertToFrag recipScale(kFloat_GrSLType); 537 GrGLVertToFrag recipScale(kFloat_GrSLType);
524 GrGLVertToFrag st(kVec2f_GrSLType); 538 GrGLVertToFrag st(kVec2f_GrSLType);
525 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); 539 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
526 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor ds()->fName); 540 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor ds()->fName);
527 541
542 // compute numbers to be hardcoded to convert texture coordinates from i nt to float
543 SkASSERT(dfTexEffect.numTextures() == 1);
544 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture();
545 SkASSERT(atlas);
546 SkScalar recipWidth = 1.0f / atlas->width();
547 SkScalar recipHeight = 1.0f / atlas->height();
548
528 GrGLVertToFrag uv(kVec2f_GrSLType); 549 GrGLVertToFrag uv(kVec2f_GrSLType);
529 args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); 550 args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
530 // this is only used with text, so our texture bounds always match the g lyph atlas 551 vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(),
531 vsBuilder->codeAppendf("%s = vec2(" GR_FONT_ATLAS_A8_RECIP_WIDTH ", " 552 SK_FLT_DECIMAL_DIG, recipWidth,
532 GR_FONT_ATLAS_RECIP_HEIGHT ")*%s;", uv.vsOut(), 553 SK_FLT_DECIMAL_DIG, recipHeight,
533 dfTexEffect.inTextureCoords()->fName); 554 dfTexEffect.inTextureCoords()->fName);
534 555
535 // add frag shader code 556 // add frag shader code
536 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 557 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
537 558
538 SkAssertResult(fsBuilder->enableFeature( 559 SkAssertResult(fsBuilder->enableFeature(
539 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); 560 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
540 561
541 // create LCD offset adjusted by inverse of transform 562 // create LCD offset adjusted by inverse of transform
542 // Use highp to work around aliasing issues 563 // Use highp to work around aliasing issues
543 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision , 564 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision ,
544 pb->ctxInfo().stand ard())); 565 pb->ctxInfo().stand ard()));
545 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); 566 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn());
546 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision , 567 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision ,
547 pb->ctxInfo().stand ard())); 568 pb->ctxInfo().stand ard()));
569
570 SkScalar lcdDelta = 1.0f / (3.0f * atlas->width());
548 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { 571 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) {
549 fsBuilder->codeAppend("float delta = -" GR_FONT_ATLAS_LCD_DELTA ";\n "); 572 fsBuilder->codeAppendf("float delta = -%.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta);
550 } else { 573 } else {
551 fsBuilder->codeAppend("float delta = " GR_FONT_ATLAS_LCD_DELTA ";\n" ); 574 fsBuilder->codeAppendf("float delta = %.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta);
552 } 575 }
553 if (isUniformScale) { 576 if (isUniformScale) {
554 fsBuilder->codeAppendf("float dy = abs(dFdy(%s.y));", st.fsIn()); 577 fsBuilder->codeAppendf("float dy = abs(dFdy(%s.y));", st.fsIn());
555 fsBuilder->codeAppend("vec2 offset = vec2(dy*delta, 0.0);"); 578 fsBuilder->codeAppend("vec2 offset = vec2(dy*delta, 0.0);");
556 } else { 579 } else {
557 fsBuilder->codeAppendf("vec2 st = %s;\n", st.fsIn()); 580 fsBuilder->codeAppendf("vec2 st = %s;\n", st.fsIn());
558 581
559 fsBuilder->codeAppend("vec2 Jdx = dFdx(st);"); 582 fsBuilder->codeAppend("vec2 Jdx = dFdx(st);");
560 fsBuilder->codeAppend("vec2 Jdy = dFdy(st);"); 583 fsBuilder->codeAppend("vec2 Jdy = dFdy(st);");
561 fsBuilder->codeAppend("vec2 offset = delta*Jdx;"); 584 fsBuilder->codeAppend("vec2 offset = delta*Jdx;");
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 static inline void GenKey(const GrGeometryProcessor& gp, 684 static inline void GenKey(const GrGeometryProcessor& gp,
662 const GrBatchTracker& bt, 685 const GrBatchTracker& bt,
663 const GrGLSLCaps&, 686 const GrGLSLCaps&,
664 GrProcessorKeyBuilder* b) { 687 GrProcessorKeyBuilder* b) {
665 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>(); 688 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>();
666 689
667 uint32_t key = dfTexEffect.getFlags(); 690 uint32_t key = dfTexEffect.getFlags();
668 key |= dfTexEffect.colorIgnored() << 16; 691 key |= dfTexEffect.colorIgnored() << 16;
669 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 692 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
670 b->add32(key); 693 b->add32(key);
694
695 // Currently we hardcode numbers to convert atlas coordinates to normali zed floating point
696 SkASSERT(gp.numTextures() == 1);
697 GrTexture* atlas = gp.textureAccess(0).getTexture();
698 SkASSERT(atlas);
699 b->add32(atlas->width());
700 b->add32(atlas->height());
671 } 701 }
672 702
673 private: 703 private:
674 SkMatrix fViewMatrix; 704 SkMatrix fViewMatrix;
675 GrColor fColor; 705 GrColor fColor;
676 UniformHandle fViewMatrixUniform; 706 UniformHandle fViewMatrixUniform;
677 UniformHandle fColorUniform; 707 UniformHandle fColorUniform;
678 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; 708 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust;
679 UniformHandle fDistanceAdjustUni; 709 UniformHandle fDistanceAdjustUni;
680 710
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; 767 uint32_t flags = kUseLCD_DistanceFieldEffectFlag;
738 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; 768 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0;
739 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; 769 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
740 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), 770 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom),
741 GrTest::TestMatrix(d->fRandom), 771 GrTest::TestMatrix(d->fRandom),
742 d->fTextures[texIdx], params, 772 d->fTextures[texIdx], params,
743 wa, 773 wa,
744 flags, 774 flags,
745 d->fRandom->nextBool()); 775 d->fRandom->nextBool());
746 } 776 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrBitmapTextGeoProc.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698