OLD | NEW |
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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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.fTransformsIn, |
77 args.fTransformsOut); | 77 args.fTransformsOut); |
78 | 78 |
79 // add varyings | 79 // add varyings |
80 GrGLSLVertToFrag recipScale(kFloat_GrSLType); | 80 GrGLSLVertToFrag recipScale(kFloat_GrSLType); |
81 GrGLSLVertToFrag st(kVec2f_GrSLType); | 81 GrGLSLVertToFrag uv(kVec2f_GrSLType); |
82 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); | 82 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); |
83 varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision)
; | 83 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); |
84 vertBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCo
ords()->fName); | 84 vertBuilder->codeAppendf("%s = %s;", uv.vsOut(), dfTexEffect.inTextureCo
ords()->fName); |
85 | 85 |
86 // compute numbers to be hardcoded to convert texture coordinates from i
nt to float | 86 // compute numbers to be hardcoded to convert texture coordinates from i
nt to float |
87 SkASSERT(dfTexEffect.numTextures() == 1); | 87 SkASSERT(dfTexEffect.numTextures() == 1); |
88 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); | 88 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); |
89 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()))
; | 89 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()))
; |
90 SkScalar recipWidth = 1.0f / atlas->width(); | |
91 SkScalar recipHeight = 1.0f / atlas->height(); | |
92 | 90 |
93 GrGLSLVertToFrag uv(kVec2f_GrSLType); | 91 GrGLSLVertToFrag st(kVec2f_GrSLType); |
94 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); | 92 varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision)
; |
95 vertBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(), | 93 vertBuilder->codeAppendf("%s = vec2(%d, %d) * %s;", st.vsOut(), |
96 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipWidth, | 94 atlas->width(), atlas->height(), |
97 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipHeight, | |
98 dfTexEffect.inTextureCoords()->fName); | 95 dfTexEffect.inTextureCoords()->fName); |
99 | 96 |
100 // Use highp to work around aliasing issues | 97 // Use highp to work around aliasing issues |
101 fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, | 98 fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, |
102 kHigh_GrSLPreci
sion)); | 99 kHigh_GrSLPreci
sion)); |
103 fragBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); | 100 fragBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); |
104 | 101 |
105 fragBuilder->codeAppend("\tfloat texColor = "); | 102 fragBuilder->codeAppend("\tfloat texColor = "); |
106 fragBuilder->appendTextureLookup(args.fSamplers[0], | 103 fragBuilder->appendTextureLookup(args.fSamplers[0], |
107 "uv", | 104 "uv", |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 #endif | 214 #endif |
218 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) | 215 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) |
219 , fInColor(nullptr) | 216 , fInColor(nullptr) |
220 , fUsesLocalCoords(usesLocalCoords) { | 217 , fUsesLocalCoords(usesLocalCoords) { |
221 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); | 218 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); |
222 this->initClassID<GrDistanceFieldA8TextGeoProc>(); | 219 this->initClassID<GrDistanceFieldA8TextGeoProc>(); |
223 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, | 220 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, |
224 kHigh_GrSLPrecision)); | 221 kHigh_GrSLPrecision)); |
225 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttri
bType)); | 222 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttri
bType)); |
226 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 223 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
227 kVec2s_GrVertexAttribT
ype)); | 224 kVec2us_GrVertexAttribTy
pe, |
| 225 kHigh_GrSLPrecision)); |
228 this->addTextureAccess(&fTextureAccess); | 226 this->addTextureAccess(&fTextureAccess); |
229 } | 227 } |
230 | 228 |
231 void GrDistanceFieldA8TextGeoProc::getGLSLProcessorKey(const GrGLSLCaps& caps, | 229 void GrDistanceFieldA8TextGeoProc::getGLSLProcessorKey(const GrGLSLCaps& caps, |
232 GrProcessorKeyBuilder* b)
const { | 230 GrProcessorKeyBuilder* b)
const { |
233 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, caps, b); | 231 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, caps, b); |
234 } | 232 } |
235 | 233 |
236 GrGLSLPrimitiveProcessor* GrDistanceFieldA8TextGeoProc::createGLSLInstance(const
GrGLSLCaps&) const { | 234 GrGLSLPrimitiveProcessor* GrDistanceFieldA8TextGeoProc::createGLSLInstance(const
GrGLSLCaps&) const { |
237 return new GrGLDistanceFieldA8TextGeoProc(); | 235 return new GrGLDistanceFieldA8TextGeoProc(); |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 varyingHandler, | 513 varyingHandler, |
516 uniformHandler, | 514 uniformHandler, |
517 gpArgs->fPositionVar, | 515 gpArgs->fPositionVar, |
518 dfTexEffect.inPosition()->fName, | 516 dfTexEffect.inPosition()->fName, |
519 args.fTransformsIn, | 517 args.fTransformsIn, |
520 args.fTransformsOut); | 518 args.fTransformsOut); |
521 | 519 |
522 // set up varyings | 520 // set up varyings |
523 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di
stanceFieldEffectMask); | 521 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di
stanceFieldEffectMask); |
524 GrGLSLVertToFrag recipScale(kFloat_GrSLType); | 522 GrGLSLVertToFrag recipScale(kFloat_GrSLType); |
525 GrGLSLVertToFrag st(kVec2f_GrSLType); | 523 GrGLSLVertToFrag uv(kVec2f_GrSLType); |
526 varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision)
; | 524 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); |
527 vertBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCo
ords()->fName); | 525 vertBuilder->codeAppendf("%s = %s;", uv.vsOut(), dfTexEffect.inTextureCo
ords()->fName); |
528 | 526 |
529 // compute numbers to be hardcoded to convert texture coordinates from i
nt to float | 527 // compute numbers to be hardcoded to convert texture coordinates from i
nt to float |
530 SkASSERT(dfTexEffect.numTextures() == 1); | 528 SkASSERT(dfTexEffect.numTextures() == 1); |
531 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); | 529 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); |
532 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()))
; | 530 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()))
; |
533 SkScalar recipWidth = 1.0f / atlas->width(); | |
534 SkScalar recipHeight = 1.0f / atlas->height(); | |
535 | 531 |
536 GrGLSLVertToFrag uv(kVec2f_GrSLType); | 532 GrGLSLVertToFrag st(kVec2f_GrSLType); |
537 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); | 533 varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision)
; |
538 vertBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(), | 534 vertBuilder->codeAppendf("%s = vec2(%d, %d) * %s;", st.vsOut(), |
539 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipWidth, | 535 atlas->width(), atlas->height(), |
540 GR_SIGNIFICANT_POW2_DECIMAL_DIG, recipHeight, | |
541 dfTexEffect.inTextureCoords()->fName); | 536 dfTexEffect.inTextureCoords()->fName); |
542 | 537 |
543 // add frag shader code | 538 // add frag shader code |
544 | 539 |
545 SkAssertResult(fragBuilder->enableFeature( | 540 SkAssertResult(fragBuilder->enableFeature( |
546 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); | 541 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); |
547 | 542 |
548 // create LCD offset adjusted by inverse of transform | 543 // create LCD offset adjusted by inverse of transform |
549 // Use highp to work around aliasing issues | 544 // Use highp to work around aliasing issues |
550 fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, | 545 fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 , fTextureAccess(texture, params) | 696 , fTextureAccess(texture, params) |
702 , fDistanceAdjust(distanceAdjust) | 697 , fDistanceAdjust(distanceAdjust) |
703 , fFlags(flags & kLCD_DistanceFieldEffectMask) | 698 , fFlags(flags & kLCD_DistanceFieldEffectMask) |
704 , fUsesLocalCoords(usesLocalCoords) { | 699 , fUsesLocalCoords(usesLocalCoords) { |
705 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); | 700 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); |
706 this->initClassID<GrDistanceFieldLCDTextGeoProc>(); | 701 this->initClassID<GrDistanceFieldLCDTextGeoProc>(); |
707 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, | 702 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, |
708 kHigh_GrSLPrecision)); | 703 kHigh_GrSLPrecision)); |
709 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttri
bType)); | 704 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttri
bType)); |
710 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 705 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
711 kVec2s_GrVertexAttribTyp
e)); | 706 kVec2us_GrVertexAttribTy
pe, |
| 707 kHigh_GrSLPrecision)); |
712 this->addTextureAccess(&fTextureAccess); | 708 this->addTextureAccess(&fTextureAccess); |
713 } | 709 } |
714 | 710 |
715 void GrDistanceFieldLCDTextGeoProc::getGLSLProcessorKey(const GrGLSLCaps& caps, | 711 void GrDistanceFieldLCDTextGeoProc::getGLSLProcessorKey(const GrGLSLCaps& caps, |
716 GrProcessorKeyBuilder* b
) const { | 712 GrProcessorKeyBuilder* b
) const { |
717 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, caps, b); | 713 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, caps, b); |
718 } | 714 } |
719 | 715 |
720 GrGLSLPrimitiveProcessor* GrDistanceFieldLCDTextGeoProc::createGLSLInstance(cons
t GrGLSLCaps&) const { | 716 GrGLSLPrimitiveProcessor* GrDistanceFieldLCDTextGeoProc::createGLSLInstance(cons
t GrGLSLCaps&) const { |
721 return new GrGLDistanceFieldLCDTextGeoProc(); | 717 return new GrGLDistanceFieldLCDTextGeoProc(); |
(...skipping 21 matching lines...) Expand all Loading... |
743 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 739 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
744 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 740 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
745 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 741 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
746 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), | 742 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), |
747 GrTest::TestMatrix(d->fRandom), | 743 GrTest::TestMatrix(d->fRandom), |
748 d->fTextures[texIdx], params, | 744 d->fTextures[texIdx], params, |
749 wa, | 745 wa, |
750 flags, | 746 flags, |
751 d->fRandom->nextBool()); | 747 d->fRandom->nextBool()); |
752 } | 748 } |
OLD | NEW |