| 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 "GrFontAtlasSizes.h" | 9 #include "GrFontAtlasSizes.h" |
| 10 #include "GrInvariantOutput.h" | 10 #include "GrInvariantOutput.h" |
| 11 #include "GrTexture.h" | 11 #include "GrTexture.h" |
| 12 | 12 |
| 13 #include "SkDistanceFieldGen.h" | 13 #include "SkDistanceFieldGen.h" |
| 14 | 14 |
| 15 #include "gl/GrGLProcessor.h" | 15 #include "gl/GrGLProcessor.h" |
| 16 #include "gl/GrGLSL.h" | 16 #include "gl/GrGLSL.h" |
| 17 #include "gl/GrGLTexture.h" | 17 #include "gl/GrGLTexture.h" |
| 18 #include "gl/GrGLGeometryProcessor.h" | 18 #include "gl/GrGLGeometryProcessor.h" |
| 19 #include "gl/builders/GrGLProgramBuilder.h" | 19 #include "gl/builders/GrGLProgramBuilder.h" |
| 20 | 20 |
| 21 // Assuming a radius of a little less than the diagonal of the fragment | 21 // Assuming a radius of a little less than the diagonal of the fragment |
| 22 #define SK_DistanceFieldAAFactor "0.65" | 22 #define SK_DistanceFieldAAFactor "0.65" |
| 23 | 23 |
| 24 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { | 24 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { |
| 25 public: | 25 public: |
| 26 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&, | 26 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&, |
| 27 const GrBatchTracker&) | 27 const GrBatchTracker&) |
| 28 : fColor(GrColor_ILLEGAL) | 28 : fViewMatrix(SkMatrix::InvalidMatrix()) |
| 29 , fColor(GrColor_ILLEGAL) |
| 29 #ifdef SK_GAMMA_APPLY_TO_A8 | 30 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 30 , fDistanceAdjust(-1.0f) | 31 , fDistanceAdjust(-1.0f) |
| 31 #endif | 32 #endif |
| 32 {} | 33 {} |
| 33 | 34 |
| 34 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 35 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
| 35 const GrDistanceFieldA8TextGeoProc& dfTexEffect = | 36 const GrDistanceFieldA8TextGeoProc& dfTexEffect = |
| 36 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); | 37 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); |
| 37 GrGLGPBuilder* pb = args.fPB; | 38 GrGLGPBuilder* pb = args.fPB; |
| 38 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 39 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 56 // Setup pass through color | 57 // Setup pass through color |
| 57 if (!dfTexEffect.colorIgnored()) { | 58 if (!dfTexEffect.colorIgnored()) { |
| 58 if (dfTexEffect.hasVertexColor()) { | 59 if (dfTexEffect.hasVertexColor()) { |
| 59 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC
olor); | 60 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC
olor); |
| 60 } else { | 61 } else { |
| 61 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); | 62 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
| 62 } | 63 } |
| 63 } | 64 } |
| 64 | 65 |
| 65 // Setup position | 66 // Setup position |
| 66 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf
fect.viewMatrix()); | 67 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf
fect.viewMatrix(), |
| 68 &fViewMatrixUniform); |
| 67 | 69 |
| 68 // emit transforms | 70 // emit transforms |
| 69 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit
ion()->fName, | 71 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit
ion()->fName, |
| 70 args.fTransformsIn, args.fTransformsOut); | 72 args.fTransformsIn, args.fTransformsOut); |
| 71 | 73 |
| 72 // add varyings | 74 // add varyings |
| 73 GrGLVertToFrag recipScale(kFloat_GrSLType); | 75 GrGLVertToFrag recipScale(kFloat_GrSLType); |
| 74 GrGLVertToFrag st(kVec2f_GrSLType); | 76 GrGLVertToFrag st(kVec2f_GrSLType); |
| 75 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); | 77 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); |
| 76 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); | 78 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 const GrPrimitiveProcessor& proc, | 143 const GrPrimitiveProcessor& proc, |
| 142 const GrBatchTracker& bt) override { | 144 const GrBatchTracker& bt) override { |
| 143 #ifdef SK_GAMMA_APPLY_TO_A8 | 145 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 144 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi
eldA8TextGeoProc>(); | 146 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi
eldA8TextGeoProc>(); |
| 145 float distanceAdjust = dfTexEffect.getDistanceAdjust(); | 147 float distanceAdjust = dfTexEffect.getDistanceAdjust(); |
| 146 if (distanceAdjust != fDistanceAdjust) { | 148 if (distanceAdjust != fDistanceAdjust) { |
| 147 pdman.set1f(fDistanceAdjustUni, distanceAdjust); | 149 pdman.set1f(fDistanceAdjustUni, distanceAdjust); |
| 148 fDistanceAdjust = distanceAdjust; | 150 fDistanceAdjust = distanceAdjust; |
| 149 } | 151 } |
| 150 #endif | 152 #endif |
| 153 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8
TextGeoProc>(); |
| 151 | 154 |
| 152 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8
TextGeoProc>(); | 155 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g
p.viewMatrix())) { |
| 153 this->setUniformViewMatrix(pdman, dfa8gp.viewMatrix()); | 156 fViewMatrix = dfa8gp.viewMatrix(); |
| 157 GrGLfloat viewMatrix[3 * 3]; |
| 158 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
| 159 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
| 160 } |
| 154 | 161 |
| 155 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { | 162 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { |
| 156 GrGLfloat c[4]; | 163 GrGLfloat c[4]; |
| 157 GrColorToRGBAFloat(dfa8gp.color(), c); | 164 GrColorToRGBAFloat(dfa8gp.color(), c); |
| 158 pdman.set4fv(fColorUniform, 1, c); | 165 pdman.set4fv(fColorUniform, 1, c); |
| 159 fColor = dfa8gp.color(); | 166 fColor = dfa8gp.color(); |
| 160 } | 167 } |
| 161 } | 168 } |
| 162 | 169 |
| 163 static inline void GenKey(const GrGeometryProcessor& gp, | 170 static inline void GenKey(const GrGeometryProcessor& gp, |
| 164 const GrBatchTracker& bt, | 171 const GrBatchTracker& bt, |
| 165 const GrGLSLCaps&, | 172 const GrGLSLCaps&, |
| 166 GrProcessorKeyBuilder* b) { | 173 GrProcessorKeyBuilder* b) { |
| 167 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel
dA8TextGeoProc>(); | 174 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel
dA8TextGeoProc>(); |
| 168 uint32_t key = dfTexEffect.getFlags(); | 175 uint32_t key = dfTexEffect.getFlags(); |
| 169 key |= dfTexEffect.hasVertexColor() << 16; | 176 key |= dfTexEffect.hasVertexColor() << 16; |
| 170 key |= dfTexEffect.colorIgnored() << 17; | 177 key |= dfTexEffect.colorIgnored() << 17; |
| 171 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 178 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
| 172 b->add32(key); | 179 b->add32(key); |
| 173 } | 180 } |
| 174 | 181 |
| 175 private: | 182 private: |
| 183 SkMatrix fViewMatrix; |
| 176 GrColor fColor; | 184 GrColor fColor; |
| 177 UniformHandle fColorUniform; | 185 UniformHandle fColorUniform; |
| 186 UniformHandle fViewMatrixUniform; |
| 178 #ifdef SK_GAMMA_APPLY_TO_A8 | 187 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 179 float fDistanceAdjust; | 188 float fDistanceAdjust; |
| 180 UniformHandle fDistanceAdjustUni; | 189 UniformHandle fDistanceAdjustUni; |
| 181 #endif | 190 #endif |
| 182 | 191 |
| 183 typedef GrGLGeometryProcessor INHERITED; | 192 typedef GrGLGeometryProcessor INHERITED; |
| 184 }; | 193 }; |
| 185 | 194 |
| 186 /////////////////////////////////////////////////////////////////////////////// | 195 /////////////////////////////////////////////////////////////////////////////// |
| 187 | 196 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 kSimilarity_DistanceFieldEff
ectFlag : 0, | 268 kSimilarity_DistanceFieldEff
ectFlag : 0, |
| 260 random->nextBool()); | 269 random->nextBool()); |
| 261 } | 270 } |
| 262 | 271 |
| 263 /////////////////////////////////////////////////////////////////////////////// | 272 /////////////////////////////////////////////////////////////////////////////// |
| 264 | 273 |
| 265 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { | 274 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { |
| 266 public: | 275 public: |
| 267 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&, | 276 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&, |
| 268 const GrBatchTracker&) | 277 const GrBatchTracker&) |
| 269 : fColor(GrColor_ILLEGAL), fTextureSize(SkISize::Make(-1, -1)) {} | 278 : fViewMatrix(SkMatrix::InvalidMatrix()) |
| 279 , fColor(GrColor_ILLEGAL) |
| 280 , fTextureSize(SkISize::Make(-1, -1)) {} |
| 270 | 281 |
| 271 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 282 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
| 272 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance
FieldPathGeoProc>(); | 283 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance
FieldPathGeoProc>(); |
| 273 | 284 |
| 274 GrGLGPBuilder* pb = args.fPB; | 285 GrGLGPBuilder* pb = args.fPB; |
| 275 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 286 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 276 SkAssertResult(fsBuilder->enableFeature( | 287 SkAssertResult(fsBuilder->enableFeature( |
| 277 GrGLFragmentShaderBuilder::kStandardDerivat
ives_GLSLFeature)); | 288 GrGLFragmentShaderBuilder::kStandardDerivat
ives_GLSLFeature)); |
| 278 | 289 |
| 279 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 290 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| 280 | 291 |
| 281 // emit attributes | 292 // emit attributes |
| 282 vsBuilder->emitAttributes(dfTexEffect); | 293 vsBuilder->emitAttributes(dfTexEffect); |
| 283 | 294 |
| 284 GrGLVertToFrag v(kVec2f_GrSLType); | 295 GrGLVertToFrag v(kVec2f_GrSLType); |
| 285 args.fPB->addVarying("TextureCoords", &v, kHigh_GrSLPrecision); | 296 args.fPB->addVarying("TextureCoords", &v, kHigh_GrSLPrecision); |
| 286 | 297 |
| 287 // setup pass through color | 298 // setup pass through color |
| 288 if (!dfTexEffect.colorIgnored()) { | 299 if (!dfTexEffect.colorIgnored()) { |
| 289 if (dfTexEffect.hasVertexColor()) { | 300 if (dfTexEffect.hasVertexColor()) { |
| 290 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC
olor); | 301 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC
olor); |
| 291 } else { | 302 } else { |
| 292 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); | 303 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
| 293 } | 304 } |
| 294 } | 305 } |
| 295 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord
s()->fName); | 306 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord
s()->fName); |
| 296 | 307 |
| 297 // Setup position | 308 // Setup position |
| 298 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf
fect.viewMatrix()); | 309 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf
fect.viewMatrix(), |
| 310 &fViewMatrixUniform); |
| 299 | 311 |
| 300 // emit transforms | 312 // emit transforms |
| 301 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit
ion()->fName, | 313 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit
ion()->fName, |
| 302 args.fTransformsIn, args.fTransformsOut); | 314 args.fTransformsIn, args.fTransformsOut); |
| 303 | 315 |
| 304 const char* textureSizeUniName = NULL; | 316 const char* textureSizeUniName = NULL; |
| 305 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 317 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, |
| 306 kVec2f_GrSLType, kDefault_GrSLPrec
ision, | 318 kVec2f_GrSLType, kDefault_GrSLPrec
ision, |
| 307 "TextureSize", &textureSizeUniName
); | 319 "TextureSize", &textureSizeUniName
); |
| 308 | 320 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 GrTexture* texture = proc.texture(0); | 377 GrTexture* texture = proc.texture(0); |
| 366 if (texture->width() != fTextureSize.width() || | 378 if (texture->width() != fTextureSize.width() || |
| 367 texture->height() != fTextureSize.height()) { | 379 texture->height() != fTextureSize.height()) { |
| 368 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 380 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
| 369 pdman.set2f(fTextureSizeUni, | 381 pdman.set2f(fTextureSizeUni, |
| 370 SkIntToScalar(fTextureSize.width()), | 382 SkIntToScalar(fTextureSize.width()), |
| 371 SkIntToScalar(fTextureSize.height())); | 383 SkIntToScalar(fTextureSize.height())); |
| 372 } | 384 } |
| 373 | 385 |
| 374 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG
eoProc>(); | 386 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG
eoProc>(); |
| 375 this->setUniformViewMatrix(pdman, dfpgp.viewMatrix()); | 387 |
| 388 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp.
viewMatrix())) { |
| 389 fViewMatrix = dfpgp.viewMatrix(); |
| 390 GrGLfloat viewMatrix[3 * 3]; |
| 391 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
| 392 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
| 393 } |
| 376 | 394 |
| 377 if (dfpgp.color() != fColor) { | 395 if (dfpgp.color() != fColor) { |
| 378 GrGLfloat c[4]; | 396 GrGLfloat c[4]; |
| 379 GrColorToRGBAFloat(dfpgp.color(), c); | 397 GrColorToRGBAFloat(dfpgp.color(), c); |
| 380 pdman.set4fv(fColorUniform, 1, c); | 398 pdman.set4fv(fColorUniform, 1, c); |
| 381 fColor = dfpgp.color(); | 399 fColor = dfpgp.color(); |
| 382 } | 400 } |
| 383 } | 401 } |
| 384 | 402 |
| 385 static inline void GenKey(const GrGeometryProcessor& gp, | 403 static inline void GenKey(const GrGeometryProcessor& gp, |
| 386 const GrBatchTracker& bt, | 404 const GrBatchTracker& bt, |
| 387 const GrGLSLCaps&, | 405 const GrGLSLCaps&, |
| 388 GrProcessorKeyBuilder* b) { | 406 GrProcessorKeyBuilder* b) { |
| 389 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP
athGeoProc>(); | 407 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP
athGeoProc>(); |
| 390 | 408 |
| 391 uint32_t key = dfTexEffect.getFlags(); | 409 uint32_t key = dfTexEffect.getFlags(); |
| 392 key |= dfTexEffect.colorIgnored() << 16; | 410 key |= dfTexEffect.colorIgnored() << 16; |
| 393 key |= dfTexEffect.hasVertexColor() << 17; | 411 key |= dfTexEffect.hasVertexColor() << 17; |
| 394 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 412 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
| 395 b->add32(key); | 413 b->add32(key); |
| 396 } | 414 } |
| 397 | 415 |
| 398 private: | 416 private: |
| 399 UniformHandle fColorUniform; | 417 UniformHandle fColorUniform; |
| 400 UniformHandle fTextureSizeUni; | 418 UniformHandle fTextureSizeUni; |
| 419 UniformHandle fViewMatrixUniform; |
| 420 SkMatrix fViewMatrix; |
| 401 GrColor fColor; | 421 GrColor fColor; |
| 402 SkISize fTextureSize; | 422 SkISize fTextureSize; |
| 403 | 423 |
| 404 typedef GrGLGeometryProcessor INHERITED; | 424 typedef GrGLGeometryProcessor INHERITED; |
| 405 }; | 425 }; |
| 406 | 426 |
| 407 /////////////////////////////////////////////////////////////////////////////// | 427 /////////////////////////////////////////////////////////////////////////////// |
| 408 | 428 |
| 409 GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( | 429 GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( |
| 410 GrColor color, | 430 GrColor color, |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 random->nextBool() ? | 491 random->nextBool() ? |
| 472 kSimilarity_DistanceFieldE
ffectFlag : 0, | 492 kSimilarity_DistanceFieldE
ffectFlag : 0, |
| 473 random->nextBool()); | 493 random->nextBool()); |
| 474 } | 494 } |
| 475 | 495 |
| 476 /////////////////////////////////////////////////////////////////////////////// | 496 /////////////////////////////////////////////////////////////////////////////// |
| 477 | 497 |
| 478 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { | 498 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { |
| 479 public: | 499 public: |
| 480 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra
cker&) | 500 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra
cker&) |
| 481 : fColor(GrColor_ILLEGAL) { | 501 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { |
| 482 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.
0f, 1.0f, 1.0f); | 502 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.
0f, 1.0f, 1.0f); |
| 483 } | 503 } |
| 484 | 504 |
| 485 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 505 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
| 486 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = | 506 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = |
| 487 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); | 507 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); |
| 488 GrGLGPBuilder* pb = args.fPB; | 508 GrGLGPBuilder* pb = args.fPB; |
| 489 | 509 |
| 490 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 510 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| 491 | 511 |
| 492 // emit attributes | 512 // emit attributes |
| 493 vsBuilder->emitAttributes(dfTexEffect); | 513 vsBuilder->emitAttributes(dfTexEffect); |
| 494 | 514 |
| 495 // setup pass through color | 515 // setup pass through color |
| 496 if (!dfTexEffect.colorIgnored()) { | 516 if (!dfTexEffect.colorIgnored()) { |
| 497 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); | 517 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
| 498 } | 518 } |
| 499 | 519 |
| 500 // Setup position | 520 // Setup position |
| 501 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf
fect.viewMatrix()); | 521 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf
fect.viewMatrix(), |
| 522 &fViewMatrixUniform); |
| 502 | 523 |
| 503 // emit transforms | 524 // emit transforms |
| 504 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit
ion()->fName, | 525 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit
ion()->fName, |
| 505 args.fTransformsIn, args.fTransformsOut); | 526 args.fTransformsIn, args.fTransformsOut); |
| 506 | 527 |
| 507 // set up varyings | 528 // set up varyings |
| 508 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di
stanceFieldEffectMask); | 529 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di
stanceFieldEffectMask); |
| 509 GrGLVertToFrag recipScale(kFloat_GrSLType); | 530 GrGLVertToFrag recipScale(kFloat_GrSLType); |
| 510 GrGLVertToFrag st(kVec2f_GrSLType); | 531 GrGLVertToFrag st(kVec2f_GrSLType); |
| 511 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); | 532 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth),
distance), 1.0);"); | 633 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth),
distance), 1.0);"); |
| 613 | 634 |
| 614 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 635 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
| 615 } | 636 } |
| 616 | 637 |
| 617 virtual void setData(const GrGLProgramDataManager& pdman, | 638 virtual void setData(const GrGLProgramDataManager& pdman, |
| 618 const GrPrimitiveProcessor& processor, | 639 const GrPrimitiveProcessor& processor, |
| 619 const GrBatchTracker& bt) override { | 640 const GrBatchTracker& bt) override { |
| 620 SkASSERT(fDistanceAdjustUni.isValid()); | 641 SkASSERT(fDistanceAdjustUni.isValid()); |
| 621 | 642 |
| 622 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = | 643 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi
eldLCDTextGeoProc>(); |
| 623 processor.cast<GrDistanceFieldLCDTextGeoProc>(); | 644 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju
st(); |
| 624 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dfTexEffect.getDistan
ceAdjust(); | |
| 625 if (wa != fDistanceAdjust) { | 645 if (wa != fDistanceAdjust) { |
| 626 pdman.set3f(fDistanceAdjustUni, | 646 pdman.set3f(fDistanceAdjustUni, |
| 627 wa.fR, | 647 wa.fR, |
| 628 wa.fG, | 648 wa.fG, |
| 629 wa.fB); | 649 wa.fB); |
| 630 fDistanceAdjust = wa; | 650 fDistanceAdjust = wa; |
| 631 } | 651 } |
| 632 | 652 |
| 633 this->setUniformViewMatrix(pdman, dfTexEffect.viewMatrix()); | 653 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd.
viewMatrix())) { |
| 654 fViewMatrix = dflcd.viewMatrix(); |
| 655 GrGLfloat viewMatrix[3 * 3]; |
| 656 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
| 657 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
| 658 } |
| 634 | 659 |
| 635 if (dfTexEffect.color() != fColor) { | 660 if (dflcd.color() != fColor) { |
| 636 GrGLfloat c[4]; | 661 GrGLfloat c[4]; |
| 637 GrColorToRGBAFloat(dfTexEffect.color(), c); | 662 GrColorToRGBAFloat(dflcd.color(), c); |
| 638 pdman.set4fv(fColorUniform, 1, c); | 663 pdman.set4fv(fColorUniform, 1, c); |
| 639 fColor = dfTexEffect.color(); | 664 fColor = dflcd.color(); |
| 640 } | 665 } |
| 641 } | 666 } |
| 642 | 667 |
| 643 static inline void GenKey(const GrGeometryProcessor& gp, | 668 static inline void GenKey(const GrGeometryProcessor& gp, |
| 644 const GrBatchTracker& bt, | 669 const GrBatchTracker& bt, |
| 645 const GrGLSLCaps&, | 670 const GrGLSLCaps&, |
| 646 GrProcessorKeyBuilder* b) { | 671 GrProcessorKeyBuilder* b) { |
| 647 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); | 672 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); |
| 648 | 673 |
| 649 uint32_t key = dfTexEffect.getFlags(); | 674 uint32_t key = dfTexEffect.getFlags(); |
| 650 key |= dfTexEffect.colorIgnored() << 16; | 675 key |= dfTexEffect.colorIgnored() << 16; |
| 651 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 676 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
| 652 b->add32(key); | 677 b->add32(key); |
| 653 } | 678 } |
| 654 | 679 |
| 655 private: | 680 private: |
| 681 SkMatrix fViewMatrix; |
| 656 GrColor fColor; | 682 GrColor fColor; |
| 683 UniformHandle fViewMatrixUniform; |
| 657 UniformHandle fColorUniform; | 684 UniformHandle fColorUniform; |
| 658 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; | 685 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; |
| 659 UniformHandle fDistanceAdjustUni; | 686 UniformHandle fDistanceAdjustUni; |
| 660 | 687 |
| 661 typedef GrGLGeometryProcessor INHERITED; | 688 typedef GrGLGeometryProcessor INHERITED; |
| 662 }; | 689 }; |
| 663 | 690 |
| 664 /////////////////////////////////////////////////////////////////////////////// | 691 /////////////////////////////////////////////////////////////////////////////// |
| 665 | 692 |
| 666 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( | 693 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 747 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
| 721 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 748 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
| 722 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 749 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
| 723 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(random), | 750 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(random), |
| 724 GrTest::TestMatrix(random), | 751 GrTest::TestMatrix(random), |
| 725 textures[texIdx], params, | 752 textures[texIdx], params, |
| 726 wa, | 753 wa, |
| 727 flags, | 754 flags, |
| 728 random->nextBool()); | 755 random->nextBool()); |
| 729 } | 756 } |
| OLD | NEW |