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

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

Issue 1414373002: Move shader precision modifier check onto GLSLCaps (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 5 years, 2 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/GrConvexPolyEffect.cpp ('k') | src/gpu/effects/GrTextureDomain.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 "GrDistanceFieldGeoProc.h" 8 #include "GrDistanceFieldGeoProc.h"
9 #include "GrInvariantOutput.h" 9 #include "GrInvariantOutput.h"
10 #include "GrTexture.h" 10 #include "GrTexture.h"
(...skipping 15 matching lines...) Expand all
26 , fColor(GrColor_ILLEGAL) 26 , fColor(GrColor_ILLEGAL)
27 #ifdef SK_GAMMA_APPLY_TO_A8 27 #ifdef SK_GAMMA_APPLY_TO_A8
28 , fDistanceAdjust(-1.0f) 28 , fDistanceAdjust(-1.0f)
29 #endif 29 #endif
30 {} 30 {}
31 31
32 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 32 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
33 const GrDistanceFieldA8TextGeoProc& dfTexEffect = 33 const GrDistanceFieldA8TextGeoProc& dfTexEffect =
34 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); 34 args.fGP.cast<GrDistanceFieldA8TextGeoProc>();
35 GrGLGPBuilder* pb = args.fPB; 35 GrGLGPBuilder* pb = args.fPB;
36 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 36 GrGLFragmentBuilder* fsBuilder = pb->getFragmentShaderBuilder();
37 SkAssertResult(fsBuilder->enableFeature( 37 SkAssertResult(fsBuilder->enableFeature(
38 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); 38 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
39 39
40 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 40 GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder();
41 41
42 // emit attributes 42 // emit attributes
43 vsBuilder->emitAttributes(dfTexEffect); 43 vsBuilder->emitAttributes(dfTexEffect);
44 44
45 #ifdef SK_GAMMA_APPLY_TO_A8 45 #ifdef SK_GAMMA_APPLY_TO_A8
46 // adjust based on gamma 46 // adjust based on gamma
47 const char* distanceAdjustUniName = nullptr; 47 const char* distanceAdjustUniName = nullptr;
48 // width, height, 1/(3*width) 48 // width, height, 1/(3*width)
49 fDistanceAdjustUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_ Visibility, 49 fDistanceAdjustUni = pb->addUniform(GrGLProgramBuilder::kFragment_Visibi lity,
50 kFloat_GrSLType, kDefault_GrSLPrecision, 50 kFloat_GrSLType, kDefault_GrSLPrecision,
51 "DistanceAdjust", &distanceAdjustUniName); 51 "DistanceAdjust", &distanceAdjustUniName);
52 #endif 52 #endif
53 53
54 // Setup pass through color 54 // Setup pass through color
55 if (!dfTexEffect.colorIgnored()) { 55 if (!dfTexEffect.colorIgnored()) {
56 if (dfTexEffect.hasVertexColor()) { 56 if (dfTexEffect.hasVertexColor()) {
57 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor); 57 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor);
58 } else { 58 } else {
59 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 59 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
60 } 60 }
61 } 61 }
62 62
63 // Setup position 63 // Setup position
64 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(), 64 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(),
65 &fViewMatrixUniform); 65 &fViewMatrixUniform);
66 66
67 // emit transforms 67 // emit transforms
68 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, 68 this->emitTransforms(pb, gpArgs->fPositionVar, dfTexEffect.inPosition()- >fName,
69 args.fTransformsIn, args.fTransformsOut); 69 args.fTransformsIn, args.fTransformsOut);
70 70
71 // add varyings 71 // add varyings
72 GrGLVertToFrag recipScale(kFloat_GrSLType); 72 GrGLVertToFrag recipScale(kFloat_GrSLType);
73 GrGLVertToFrag st(kVec2f_GrSLType); 73 GrGLVertToFrag st(kVec2f_GrSLType);
74 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag); 74 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag);
75 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); 75 pb->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
76 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor ds()->fName); 76 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor ds()->fName);
77 77
78 // compute numbers to be hardcoded to convert texture coordinates from i nt to float 78 // compute numbers to be hardcoded to convert texture coordinates from i nt to float
79 SkASSERT(dfTexEffect.numTextures() == 1); 79 SkASSERT(dfTexEffect.numTextures() == 1);
80 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); 80 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture();
81 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height())) ; 81 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height())) ;
82 SkScalar recipWidth = 1.0f / atlas->width(); 82 SkScalar recipWidth = 1.0f / atlas->width();
83 SkScalar recipHeight = 1.0f / atlas->height(); 83 SkScalar recipHeight = 1.0f / atlas->height();
84 84
85 GrGLVertToFrag uv(kVec2f_GrSLType); 85 GrGLVertToFrag uv(kVec2f_GrSLType);
86 args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); 86 pb->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
87 vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(), 87 vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(),
88 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipWidth, 88 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipWidth,
89 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipHeight, 89 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipHeight,
90 dfTexEffect.inTextureCoords()->fName); 90 dfTexEffect.inTextureCoords()->fName);
91 91
92 // Use highp to work around aliasing issues 92 // Use highp to work around aliasing issues
93 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision , 93 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(pb->glslCaps(), kHi gh_GrSLPrecision));
94 pb->ctxInfo().stand ard()));
95 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); 94 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn());
96 95
97 fsBuilder->codeAppend("\tfloat texColor = "); 96 fsBuilder->codeAppend("\tfloat texColor = ");
98 fsBuilder->appendTextureLookup(args.fSamplers[0], 97 fsBuilder->appendTextureLookup(args.fSamplers[0],
99 "uv", 98 "uv",
100 kVec2f_GrSLType); 99 kVec2f_GrSLType);
101 fsBuilder->codeAppend(".r;\n"); 100 fsBuilder->codeAppend(".r;\n");
102 fsBuilder->codeAppend("\tfloat distance = " 101 fsBuilder->codeAppend("\tfloat distance = "
103 SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFie ldThreshold ");"); 102 SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFie ldThreshold ");");
104 #ifdef SK_GAMMA_APPLY_TO_A8 103 #ifdef SK_GAMMA_APPLY_TO_A8
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 public: 276 public:
278 GrGLDistanceFieldPathGeoProc() 277 GrGLDistanceFieldPathGeoProc()
279 : fViewMatrix(SkMatrix::InvalidMatrix()) 278 : fViewMatrix(SkMatrix::InvalidMatrix())
280 , fColor(GrColor_ILLEGAL) 279 , fColor(GrColor_ILLEGAL)
281 , fTextureSize(SkISize::Make(-1, -1)) {} 280 , fTextureSize(SkISize::Make(-1, -1)) {}
282 281
283 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 282 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
284 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance FieldPathGeoProc>(); 283 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance FieldPathGeoProc>();
285 284
286 GrGLGPBuilder* pb = args.fPB; 285 GrGLGPBuilder* pb = args.fPB;
287 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 286 GrGLFragmentBuilder* fsBuilder = pb->getFragmentShaderBuilder();
288 SkAssertResult(fsBuilder->enableFeature( 287 SkAssertResult(fsBuilder->enableFeature(
289 GrGLFragmentShaderBuilder::kStandardDerivat ives_GLSLFeature)); 288 GrGLFragmentShaderBuilder::kStandardDerivat ives_GLSLFeature));
290 289
291 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 290 GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder();
292 291
293 // emit attributes 292 // emit attributes
294 vsBuilder->emitAttributes(dfTexEffect); 293 vsBuilder->emitAttributes(dfTexEffect);
295 294
296 GrGLVertToFrag v(kVec2f_GrSLType); 295 GrGLVertToFrag v(kVec2f_GrSLType);
297 args.fPB->addVarying("TextureCoords", &v, kHigh_GrSLPrecision); 296 pb->addVarying("TextureCoords", &v, kHigh_GrSLPrecision);
298 297
299 // setup pass through color 298 // setup pass through color
300 if (!dfTexEffect.colorIgnored()) { 299 if (!dfTexEffect.colorIgnored()) {
301 if (dfTexEffect.hasVertexColor()) { 300 if (dfTexEffect.hasVertexColor()) {
302 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor); 301 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor);
303 } else { 302 } else {
304 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 303 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
305 } 304 }
306 } 305 }
307 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord s()->fName); 306 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord s()->fName);
308 307
309 // Setup position 308 // Setup position
310 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(), 309 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(),
311 &fViewMatrixUniform); 310 &fViewMatrixUniform);
312 311
313 // emit transforms 312 // emit transforms
314 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, 313 this->emitTransforms(pb, gpArgs->fPositionVar, dfTexEffect.inPosition()- >fName,
315 args.fTransformsIn, args.fTransformsOut); 314 args.fTransformsIn, args.fTransformsOut);
316 315
317 const char* textureSizeUniName = nullptr; 316 const char* textureSizeUniName = nullptr;
318 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis ibility, 317 fTextureSizeUni = pb->addUniform(GrGLProgramBuilder::kFragment_Visibilit y,
319 kVec2f_GrSLType, kDefault_GrSLPrec ision, 318 kVec2f_GrSLType, kDefault_GrSLPrecision ,
320 "TextureSize", &textureSizeUniName ); 319 "TextureSize", &textureSizeUniName);
321 320
322 // Use highp to work around aliasing issues 321 // Use highp to work around aliasing issues
323 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision , 322 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(pb->glslCaps(), kHi gh_GrSLPrecision));
324 pb->ctxInfo().stand ard()));
325 fsBuilder->codeAppendf("vec2 uv = %s;", v.fsIn()); 323 fsBuilder->codeAppendf("vec2 uv = %s;", v.fsIn());
326 324
327 fsBuilder->codeAppend("float texColor = "); 325 fsBuilder->codeAppend("float texColor = ");
328 fsBuilder->appendTextureLookup(args.fSamplers[0], 326 fsBuilder->appendTextureLookup(args.fSamplers[0],
329 "uv", 327 "uv",
330 kVec2f_GrSLType); 328 kVec2f_GrSLType);
331 fsBuilder->codeAppend(".r;"); 329 fsBuilder->codeAppend(".r;");
332 fsBuilder->codeAppend("float distance = " 330 fsBuilder->codeAppend("float distance = "
333 SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold ");"); 331 SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold ");");
334 332
335 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision , 333 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(pb->glslCaps(), kHi gh_GrSLPrecision));
336 pb->ctxInfo().stand ard()));
337 fsBuilder->codeAppendf("vec2 st = uv*%s;", textureSizeUniName); 334 fsBuilder->codeAppendf("vec2 st = uv*%s;", textureSizeUniName);
338 fsBuilder->codeAppend("float afwidth;"); 335 fsBuilder->codeAppend("float afwidth;");
339 if (dfTexEffect.getFlags() & kSimilarity_DistanceFieldEffectFlag) { 336 if (dfTexEffect.getFlags() & kSimilarity_DistanceFieldEffectFlag) {
340 // For uniform scale, we adjust for the effect of the transformation on the distance 337 // For uniform scale, we adjust for the effect of the transformation on the distance
341 // by using the length of the gradient of the texture coordinates. W e use st coordinates 338 // by using the length of the gradient of the texture coordinates. W e use st coordinates
342 // to ensure we're mapping 1:1 from texel space to pixel space. 339 // to ensure we're mapping 1:1 from texel space to pixel space.
343 340
344 // this gives us a smooth step across approximately one fragment 341 // this gives us a smooth step across approximately one fragment
345 fsBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*dF dy(st.y));"); 342 fsBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*dF dy(st.y));");
346 } else { 343 } else {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 GrGLDistanceFieldLCDTextGeoProc() 490 GrGLDistanceFieldLCDTextGeoProc()
494 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { 491 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {
495 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1. 0f, 1.0f, 1.0f); 492 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1. 0f, 1.0f, 1.0f);
496 } 493 }
497 494
498 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 495 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
499 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = 496 const GrDistanceFieldLCDTextGeoProc& dfTexEffect =
500 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); 497 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>();
501 GrGLGPBuilder* pb = args.fPB; 498 GrGLGPBuilder* pb = args.fPB;
502 499
503 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 500 GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder();
504 501
505 // emit attributes 502 // emit attributes
506 vsBuilder->emitAttributes(dfTexEffect); 503 vsBuilder->emitAttributes(dfTexEffect);
507 504
508 // setup pass through color 505 // setup pass through color
509 if (!dfTexEffect.colorIgnored()) { 506 if (!dfTexEffect.colorIgnored()) {
510 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 507 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
511 } 508 }
512 509
513 // Setup position 510 // Setup position
514 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(), 511 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(),
515 &fViewMatrixUniform); 512 &fViewMatrixUniform);
516 513
517 // emit transforms 514 // emit transforms
518 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, 515 this->emitTransforms(pb, gpArgs->fPositionVar, dfTexEffect.inPosition()- >fName,
519 args.fTransformsIn, args.fTransformsOut); 516 args.fTransformsIn, args.fTransformsOut);
520 517
521 // set up varyings 518 // set up varyings
522 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di stanceFieldEffectMask); 519 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di stanceFieldEffectMask);
523 GrGLVertToFrag recipScale(kFloat_GrSLType); 520 GrGLVertToFrag recipScale(kFloat_GrSLType);
524 GrGLVertToFrag st(kVec2f_GrSLType); 521 GrGLVertToFrag st(kVec2f_GrSLType);
525 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); 522 pb->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
526 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor ds()->fName); 523 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor ds()->fName);
527 524
528 // compute numbers to be hardcoded to convert texture coordinates from i nt to float 525 // compute numbers to be hardcoded to convert texture coordinates from i nt to float
529 SkASSERT(dfTexEffect.numTextures() == 1); 526 SkASSERT(dfTexEffect.numTextures() == 1);
530 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); 527 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture();
531 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height())) ; 528 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height())) ;
532 SkScalar recipWidth = 1.0f / atlas->width(); 529 SkScalar recipWidth = 1.0f / atlas->width();
533 SkScalar recipHeight = 1.0f / atlas->height(); 530 SkScalar recipHeight = 1.0f / atlas->height();
534 531
535 GrGLVertToFrag uv(kVec2f_GrSLType); 532 GrGLVertToFrag uv(kVec2f_GrSLType);
536 args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); 533 pb->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
537 vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(), 534 vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(),
538 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipWidth, 535 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipWidth,
539 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipHeight, 536 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipHeight,
540 dfTexEffect.inTextureCoords()->fName); 537 dfTexEffect.inTextureCoords()->fName);
541 538
542 // add frag shader code 539 // add frag shader code
543 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 540 GrGLFragmentBuilder* fsBuilder = pb->getFragmentShaderBuilder();
544 541
545 SkAssertResult(fsBuilder->enableFeature( 542 SkAssertResult(fsBuilder->enableFeature(
546 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); 543 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
547 544
548 // create LCD offset adjusted by inverse of transform 545 // create LCD offset adjusted by inverse of transform
549 // Use highp to work around aliasing issues 546 // Use highp to work around aliasing issues
550 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision , 547 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(pb->glslCaps(), kHi gh_GrSLPrecision));
551 pb->ctxInfo().stand ard()));
552 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); 548 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn());
553 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision , 549 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(pb->glslCaps(), kHi gh_GrSLPrecision));
554 pb->ctxInfo().stand ard()));
555 550
556 SkScalar lcdDelta = 1.0f / (3.0f * atlas->width()); 551 SkScalar lcdDelta = 1.0f / (3.0f * atlas->width());
557 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { 552 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) {
558 fsBuilder->codeAppendf("float delta = -%.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta); 553 fsBuilder->codeAppendf("float delta = -%.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta);
559 } else { 554 } else {
560 fsBuilder->codeAppendf("float delta = %.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta); 555 fsBuilder->codeAppendf("float delta = %.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta);
561 } 556 }
562 if (isUniformScale) { 557 if (isUniformScale) {
563 fsBuilder->codeAppendf("float dy = abs(dFdy(%s.y));", st.fsIn()); 558 fsBuilder->codeAppendf("float dy = abs(dFdy(%s.y));", st.fsIn());
564 fsBuilder->codeAppend("vec2 offset = vec2(dy*delta, 0.0);"); 559 fsBuilder->codeAppend("vec2 offset = vec2(dy*delta, 0.0);");
(...skipping 22 matching lines...) Expand all
587 fsBuilder->codeAppend("\ttexColor = "); 582 fsBuilder->codeAppend("\ttexColor = ");
588 fsBuilder->appendTextureLookup(args.fSamplers[0], "uv_adjusted", kVec2f_ GrSLType); 583 fsBuilder->appendTextureLookup(args.fSamplers[0], "uv_adjusted", kVec2f_ GrSLType);
589 fsBuilder->codeAppend(";\n"); 584 fsBuilder->codeAppend(";\n");
590 fsBuilder->codeAppend("\tdistance.z = texColor.r;\n"); 585 fsBuilder->codeAppend("\tdistance.z = texColor.r;\n");
591 586
592 fsBuilder->codeAppend("\tdistance = " 587 fsBuilder->codeAppend("\tdistance = "
593 "vec3(" SK_DistanceFieldMultiplier ")*(distance - vec3(" SK_DistanceF ieldThreshold"));"); 588 "vec3(" SK_DistanceFieldMultiplier ")*(distance - vec3(" SK_DistanceF ieldThreshold"));");
594 589
595 // adjust width based on gamma 590 // adjust width based on gamma
596 const char* distanceAdjustUniName = nullptr; 591 const char* distanceAdjustUniName = nullptr;
597 fDistanceAdjustUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_ Visibility, 592 fDistanceAdjustUni = pb->addUniform(GrGLProgramBuilder::kFragment_Visibi lity,
598 kVec3f_GrSLType, kDefault_GrSLPrecision, 593 kVec3f_GrSLType, kDefault_GrSLPrecision,
599 "DistanceAdjust", &distanceAdjustUniName); 594 "DistanceAdjust", &distanceAdjustUniName);
600 fsBuilder->codeAppendf("distance -= %s;", distanceAdjustUniName); 595 fsBuilder->codeAppendf("distance -= %s;", distanceAdjustUniName);
601 596
602 // To be strictly correct, we should compute the anti-aliasing factor se parately 597 // To be strictly correct, we should compute the anti-aliasing factor se parately
603 // for each color component. However, this is only important when using perspective 598 // for each color component. However, this is only important when using perspective
604 // transformations, and even then using a single factor seems like a rea sonable 599 // transformations, and even then using a single factor seems like a rea sonable
605 // trade-off between quality and speed. 600 // trade-off between quality and speed.
606 fsBuilder->codeAppend("float afwidth;"); 601 fsBuilder->codeAppend("float afwidth;");
607 if (isUniformScale) { 602 if (isUniformScale) {
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; 745 uint32_t flags = kUseLCD_DistanceFieldEffectFlag;
751 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; 746 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0;
752 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; 747 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
753 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), 748 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom),
754 GrTest::TestMatrix(d->fRandom), 749 GrTest::TestMatrix(d->fRandom),
755 d->fTextures[texIdx], params, 750 d->fTextures[texIdx], params,
756 wa, 751 wa,
757 flags, 752 flags,
758 d->fRandom->nextBool()); 753 d->fRandom->nextBool());
759 } 754 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrConvexPolyEffect.cpp ('k') | src/gpu/effects/GrTextureDomain.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698