| 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" |
| 11 | 11 |
| 12 #include "SkDistanceFieldGen.h" | 12 #include "SkDistanceFieldGen.h" |
| 13 | 13 |
| 14 #include "gl/GrGLFragmentProcessor.h" | 14 #include "gl/GrGLFragmentProcessor.h" |
| 15 #include "gl/GrGLTexture.h" | 15 #include "gl/GrGLTexture.h" |
| 16 #include "gl/GrGLGeometryProcessor.h" | 16 #include "gl/GrGLGeometryProcessor.h" |
| 17 #include "gl/builders/GrGLProgramBuilder.h" | 17 #include "gl/builders/GrGLProgramBuilder.h" |
| 18 | 18 |
| 19 // Assuming a radius of a little less than the diagonal of the fragment | 19 // Assuming a radius of a little less than the diagonal of the fragment |
| 20 #define SK_DistanceFieldAAFactor "0.65" | 20 #define SK_DistanceFieldAAFactor "0.65" |
| 21 | 21 |
| 22 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { | 22 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { |
| 23 public: | 23 public: |
| 24 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&, | 24 GrGLDistanceFieldA8TextGeoProc() |
| 25 const GrBatchTracker&) | |
| 26 : fViewMatrix(SkMatrix::InvalidMatrix()) | 25 : fViewMatrix(SkMatrix::InvalidMatrix()) |
| 27 , fColor(GrColor_ILLEGAL) | 26 , fColor(GrColor_ILLEGAL) |
| 28 #ifdef SK_GAMMA_APPLY_TO_A8 | 27 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 29 , fDistanceAdjust(-1.0f) | 28 , fDistanceAdjust(-1.0f) |
| 30 #endif | 29 #endif |
| 31 {} | 30 {} |
| 32 | 31 |
| 33 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 32 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
| 34 const GrDistanceFieldA8TextGeoProc& dfTexEffect = | 33 const GrDistanceFieldA8TextGeoProc& dfTexEffect = |
| 35 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); | 34 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra
d.y*Jdy.y);"); | 136 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra
d.y*Jdy.y);"); |
| 138 | 137 |
| 139 // this gives us a smooth step across approximately one fragment | 138 // this gives us a smooth step across approximately one fragment |
| 140 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); | 139 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); |
| 141 } | 140 } |
| 142 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); | 141 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); |
| 143 | 142 |
| 144 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 143 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
| 145 } | 144 } |
| 146 | 145 |
| 147 virtual void setData(const GrGLProgramDataManager& pdman, | 146 void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor
& proc) override { |
| 148 const GrPrimitiveProcessor& proc, | |
| 149 const GrBatchTracker& bt) override { | |
| 150 #ifdef SK_GAMMA_APPLY_TO_A8 | 147 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 151 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi
eldA8TextGeoProc>(); | 148 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi
eldA8TextGeoProc>(); |
| 152 float distanceAdjust = dfTexEffect.getDistanceAdjust(); | 149 float distanceAdjust = dfTexEffect.getDistanceAdjust(); |
| 153 if (distanceAdjust != fDistanceAdjust) { | 150 if (distanceAdjust != fDistanceAdjust) { |
| 154 pdman.set1f(fDistanceAdjustUni, distanceAdjust); | 151 pdman.set1f(fDistanceAdjustUni, distanceAdjust); |
| 155 fDistanceAdjust = distanceAdjust; | 152 fDistanceAdjust = distanceAdjust; |
| 156 } | 153 } |
| 157 #endif | 154 #endif |
| 158 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8
TextGeoProc>(); | 155 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8
TextGeoProc>(); |
| 159 | 156 |
| 160 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g
p.viewMatrix())) { | 157 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g
p.viewMatrix())) { |
| 161 fViewMatrix = dfa8gp.viewMatrix(); | 158 fViewMatrix = dfa8gp.viewMatrix(); |
| 162 GrGLfloat viewMatrix[3 * 3]; | 159 GrGLfloat viewMatrix[3 * 3]; |
| 163 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); | 160 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
| 164 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | 161 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
| 165 } | 162 } |
| 166 | 163 |
| 167 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { | 164 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { |
| 168 GrGLfloat c[4]; | 165 GrGLfloat c[4]; |
| 169 GrColorToRGBAFloat(dfa8gp.color(), c); | 166 GrColorToRGBAFloat(dfa8gp.color(), c); |
| 170 pdman.set4fv(fColorUniform, 1, c); | 167 pdman.set4fv(fColorUniform, 1, c); |
| 171 fColor = dfa8gp.color(); | 168 fColor = dfa8gp.color(); |
| 172 } | 169 } |
| 173 } | 170 } |
| 174 | 171 |
| 175 static inline void GenKey(const GrGeometryProcessor& gp, | 172 static inline void GenKey(const GrGeometryProcessor& gp, |
| 176 const GrBatchTracker& bt, | |
| 177 const GrGLSLCaps&, | 173 const GrGLSLCaps&, |
| 178 GrProcessorKeyBuilder* b) { | 174 GrProcessorKeyBuilder* b) { |
| 179 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel
dA8TextGeoProc>(); | 175 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel
dA8TextGeoProc>(); |
| 180 uint32_t key = dfTexEffect.getFlags(); | 176 uint32_t key = dfTexEffect.getFlags(); |
| 181 key |= dfTexEffect.hasVertexColor() << 16; | 177 key |= dfTexEffect.hasVertexColor() << 16; |
| 182 key |= dfTexEffect.colorIgnored() << 17; | 178 key |= dfTexEffect.colorIgnored() << 17; |
| 183 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 179 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
| 184 b->add32(key); | 180 b->add32(key); |
| 185 | 181 |
| 186 // Currently we hardcode numbers to convert atlas coordinates to normali
zed floating point | 182 // Currently we hardcode numbers to convert atlas coordinates to normali
zed floating point |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, | 225 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, |
| 230 kHigh_GrSLPrecision)); | 226 kHigh_GrSLPrecision)); |
| 231 if (flags & kColorAttr_DistanceFieldEffectFlag) { | 227 if (flags & kColorAttr_DistanceFieldEffectFlag) { |
| 232 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); | 228 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); |
| 233 } | 229 } |
| 234 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 230 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
| 235 kVec2s_GrVertexAttribT
ype)); | 231 kVec2s_GrVertexAttribT
ype)); |
| 236 this->addTextureAccess(&fTextureAccess); | 232 this->addTextureAccess(&fTextureAccess); |
| 237 } | 233 } |
| 238 | 234 |
| 239 void GrDistanceFieldA8TextGeoProc::getGLProcessorKey(const GrBatchTracker& bt, | 235 void GrDistanceFieldA8TextGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, |
| 240 const GrGLSLCaps& caps, | |
| 241 GrProcessorKeyBuilder* b) c
onst { | 236 GrProcessorKeyBuilder* b) c
onst { |
| 242 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, bt, caps, b); | 237 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, caps, b); |
| 243 } | 238 } |
| 244 | 239 |
| 245 GrGLPrimitiveProcessor* | 240 GrGLPrimitiveProcessor* GrDistanceFieldA8TextGeoProc::createGLInstance(const GrG
LSLCaps&) const { |
| 246 GrDistanceFieldA8TextGeoProc::createGLInstance(const GrBatchTracker& bt, | 241 return new GrGLDistanceFieldA8TextGeoProc(); |
| 247 const GrGLSLCaps&) const { | |
| 248 return new GrGLDistanceFieldA8TextGeoProc(*this, bt); | |
| 249 } | 242 } |
| 250 | 243 |
| 251 /////////////////////////////////////////////////////////////////////////////// | 244 /////////////////////////////////////////////////////////////////////////////// |
| 252 | 245 |
| 253 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc); | 246 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc); |
| 254 | 247 |
| 255 const GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT
estData* d) { | 248 const GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT
estData* d) { |
| 256 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: | 249 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: |
| 257 GrProcessorUnitTest::kAlphaTextureIdx; | 250 GrProcessorUnitTest::kAlphaTextureIdx; |
| 258 static const SkShader::TileMode kTileModes[] = { | 251 static const SkShader::TileMode kTileModes[] = { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 275 #endif | 268 #endif |
| 276 d->fRandom->nextBool() ? | 269 d->fRandom->nextBool() ? |
| 277 kSimilarity_DistanceFieldEff
ectFlag : 0, | 270 kSimilarity_DistanceFieldEff
ectFlag : 0, |
| 278 d->fRandom->nextBool()); | 271 d->fRandom->nextBool()); |
| 279 } | 272 } |
| 280 | 273 |
| 281 /////////////////////////////////////////////////////////////////////////////// | 274 /////////////////////////////////////////////////////////////////////////////// |
| 282 | 275 |
| 283 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { | 276 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { |
| 284 public: | 277 public: |
| 285 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&, | 278 GrGLDistanceFieldPathGeoProc() |
| 286 const GrBatchTracker&) | |
| 287 : fViewMatrix(SkMatrix::InvalidMatrix()) | 279 : fViewMatrix(SkMatrix::InvalidMatrix()) |
| 288 , fColor(GrColor_ILLEGAL) | 280 , fColor(GrColor_ILLEGAL) |
| 289 , fTextureSize(SkISize::Make(-1, -1)) {} | 281 , fTextureSize(SkISize::Make(-1, -1)) {} |
| 290 | 282 |
| 291 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 283 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
| 292 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance
FieldPathGeoProc>(); | 284 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance
FieldPathGeoProc>(); |
| 293 | 285 |
| 294 GrGLGPBuilder* pb = args.fPB; | 286 GrGLGPBuilder* pb = args.fPB; |
| 295 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 287 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 296 SkAssertResult(fsBuilder->enableFeature( | 288 SkAssertResult(fsBuilder->enableFeature( |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra
d.y*Jdy.y);"); | 363 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra
d.y*Jdy.y);"); |
| 372 | 364 |
| 373 // this gives us a smooth step across approximately one fragment | 365 // this gives us a smooth step across approximately one fragment |
| 374 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); | 366 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); |
| 375 } | 367 } |
| 376 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); | 368 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); |
| 377 | 369 |
| 378 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 370 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
| 379 } | 371 } |
| 380 | 372 |
| 381 virtual void setData(const GrGLProgramDataManager& pdman, | 373 void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor
& proc) override { |
| 382 const GrPrimitiveProcessor& proc, | |
| 383 const GrBatchTracker& bt) override { | |
| 384 SkASSERT(fTextureSizeUni.isValid()); | 374 SkASSERT(fTextureSizeUni.isValid()); |
| 385 | 375 |
| 386 GrTexture* texture = proc.texture(0); | 376 GrTexture* texture = proc.texture(0); |
| 387 if (texture->width() != fTextureSize.width() || | 377 if (texture->width() != fTextureSize.width() || |
| 388 texture->height() != fTextureSize.height()) { | 378 texture->height() != fTextureSize.height()) { |
| 389 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 379 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
| 390 pdman.set2f(fTextureSizeUni, | 380 pdman.set2f(fTextureSizeUni, |
| 391 SkIntToScalar(fTextureSize.width()), | 381 SkIntToScalar(fTextureSize.width()), |
| 392 SkIntToScalar(fTextureSize.height())); | 382 SkIntToScalar(fTextureSize.height())); |
| 393 } | 383 } |
| 394 | 384 |
| 395 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG
eoProc>(); | 385 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG
eoProc>(); |
| 396 | 386 |
| 397 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp.
viewMatrix())) { | 387 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp.
viewMatrix())) { |
| 398 fViewMatrix = dfpgp.viewMatrix(); | 388 fViewMatrix = dfpgp.viewMatrix(); |
| 399 GrGLfloat viewMatrix[3 * 3]; | 389 GrGLfloat viewMatrix[3 * 3]; |
| 400 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); | 390 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
| 401 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | 391 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
| 402 } | 392 } |
| 403 | 393 |
| 404 if (dfpgp.color() != fColor) { | 394 if (dfpgp.color() != fColor) { |
| 405 GrGLfloat c[4]; | 395 GrGLfloat c[4]; |
| 406 GrColorToRGBAFloat(dfpgp.color(), c); | 396 GrColorToRGBAFloat(dfpgp.color(), c); |
| 407 pdman.set4fv(fColorUniform, 1, c); | 397 pdman.set4fv(fColorUniform, 1, c); |
| 408 fColor = dfpgp.color(); | 398 fColor = dfpgp.color(); |
| 409 } | 399 } |
| 410 } | 400 } |
| 411 | 401 |
| 412 static inline void GenKey(const GrGeometryProcessor& gp, | 402 static inline void GenKey(const GrGeometryProcessor& gp, |
| 413 const GrBatchTracker& bt, | |
| 414 const GrGLSLCaps&, | 403 const GrGLSLCaps&, |
| 415 GrProcessorKeyBuilder* b) { | 404 GrProcessorKeyBuilder* b) { |
| 416 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP
athGeoProc>(); | 405 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP
athGeoProc>(); |
| 417 | 406 |
| 418 uint32_t key = dfTexEffect.getFlags(); | 407 uint32_t key = dfTexEffect.getFlags(); |
| 419 key |= dfTexEffect.colorIgnored() << 16; | 408 key |= dfTexEffect.colorIgnored() << 16; |
| 420 key |= dfTexEffect.hasVertexColor() << 17; | 409 key |= dfTexEffect.hasVertexColor() << 17; |
| 421 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 410 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
| 422 b->add32(key); | 411 b->add32(key); |
| 423 } | 412 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 453 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, | 442 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, |
| 454 kHigh_GrSLPrecision)); | 443 kHigh_GrSLPrecision)); |
| 455 if (flags & kColorAttr_DistanceFieldEffectFlag) { | 444 if (flags & kColorAttr_DistanceFieldEffectFlag) { |
| 456 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); | 445 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); |
| 457 } | 446 } |
| 458 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 447 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
| 459 kVec2f_GrVertexAttribTyp
e)); | 448 kVec2f_GrVertexAttribTyp
e)); |
| 460 this->addTextureAccess(&fTextureAccess); | 449 this->addTextureAccess(&fTextureAccess); |
| 461 } | 450 } |
| 462 | 451 |
| 463 void GrDistanceFieldPathGeoProc::getGLProcessorKey(const GrBatchTracker& bt, | 452 void GrDistanceFieldPathGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, |
| 464 const GrGLSLCaps& caps, | |
| 465 GrProcessorKeyBuilder* b) con
st { | 453 GrProcessorKeyBuilder* b) con
st { |
| 466 GrGLDistanceFieldPathGeoProc::GenKey(*this, bt, caps, b); | 454 GrGLDistanceFieldPathGeoProc::GenKey(*this, caps, b); |
| 467 } | 455 } |
| 468 | 456 |
| 469 GrGLPrimitiveProcessor* | 457 GrGLPrimitiveProcessor* GrDistanceFieldPathGeoProc::createGLInstance(const GrGLS
LCaps&) const { |
| 470 GrDistanceFieldPathGeoProc::createGLInstance(const GrBatchTracker& bt, const GrG
LSLCaps&) const { | 458 return new GrGLDistanceFieldPathGeoProc(); |
| 471 return new GrGLDistanceFieldPathGeoProc(*this, bt); | |
| 472 } | 459 } |
| 473 | 460 |
| 474 /////////////////////////////////////////////////////////////////////////////// | 461 /////////////////////////////////////////////////////////////////////////////// |
| 475 | 462 |
| 476 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc); | 463 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc); |
| 477 | 464 |
| 478 const GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes
tData* d) { | 465 const GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes
tData* d) { |
| 479 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx | 466 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx |
| 480 : GrProcessorUnitTest::kAlphaTextureIdx; | 467 : GrProcessorUnitTest::kAlphaTextureIdx; |
| 481 static const SkShader::TileMode kTileModes[] = { | 468 static const SkShader::TileMode kTileModes[] = { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 496 params, | 483 params, |
| 497 d->fRandom->nextBool() ? | 484 d->fRandom->nextBool() ? |
| 498 kSimilarity_DistanceFieldE
ffectFlag : 0, | 485 kSimilarity_DistanceFieldE
ffectFlag : 0, |
| 499 d->fRandom->nextBool()); | 486 d->fRandom->nextBool()); |
| 500 } | 487 } |
| 501 | 488 |
| 502 /////////////////////////////////////////////////////////////////////////////// | 489 /////////////////////////////////////////////////////////////////////////////// |
| 503 | 490 |
| 504 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { | 491 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { |
| 505 public: | 492 public: |
| 506 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra
cker&) | 493 GrGLDistanceFieldLCDTextGeoProc() |
| 507 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { | 494 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { |
| 508 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.
0f, 1.0f, 1.0f); | 495 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.
0f, 1.0f, 1.0f); |
| 509 } | 496 } |
| 510 | 497 |
| 511 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 498 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
| 512 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = | 499 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = |
| 513 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); | 500 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); |
| 514 GrGLGPBuilder* pb = args.fPB; | 501 GrGLGPBuilder* pb = args.fPB; |
| 515 | 502 |
| 516 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 503 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 // this gives us a smooth step across approximately one fragment | 630 // this gives us a smooth step across approximately one fragment |
| 644 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); | 631 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); |
| 645 } | 632 } |
| 646 | 633 |
| 647 fsBuilder->codeAppend( | 634 fsBuilder->codeAppend( |
| 648 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth),
distance), 1.0);"); | 635 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth),
distance), 1.0);"); |
| 649 | 636 |
| 650 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 637 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
| 651 } | 638 } |
| 652 | 639 |
| 653 virtual void setData(const GrGLProgramDataManager& pdman, | 640 void setData(const GrGLProgramDataManager& pdman, |
| 654 const GrPrimitiveProcessor& processor, | 641 const GrPrimitiveProcessor& processor) override { |
| 655 const GrBatchTracker& bt) override { | |
| 656 SkASSERT(fDistanceAdjustUni.isValid()); | 642 SkASSERT(fDistanceAdjustUni.isValid()); |
| 657 | 643 |
| 658 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi
eldLCDTextGeoProc>(); | 644 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi
eldLCDTextGeoProc>(); |
| 659 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju
st(); | 645 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju
st(); |
| 660 if (wa != fDistanceAdjust) { | 646 if (wa != fDistanceAdjust) { |
| 661 pdman.set3f(fDistanceAdjustUni, | 647 pdman.set3f(fDistanceAdjustUni, |
| 662 wa.fR, | 648 wa.fR, |
| 663 wa.fG, | 649 wa.fG, |
| 664 wa.fB); | 650 wa.fB); |
| 665 fDistanceAdjust = wa; | 651 fDistanceAdjust = wa; |
| 666 } | 652 } |
| 667 | 653 |
| 668 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd.
viewMatrix())) { | 654 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd.
viewMatrix())) { |
| 669 fViewMatrix = dflcd.viewMatrix(); | 655 fViewMatrix = dflcd.viewMatrix(); |
| 670 GrGLfloat viewMatrix[3 * 3]; | 656 GrGLfloat viewMatrix[3 * 3]; |
| 671 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); | 657 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
| 672 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | 658 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
| 673 } | 659 } |
| 674 | 660 |
| 675 if (dflcd.color() != fColor) { | 661 if (dflcd.color() != fColor) { |
| 676 GrGLfloat c[4]; | 662 GrGLfloat c[4]; |
| 677 GrColorToRGBAFloat(dflcd.color(), c); | 663 GrColorToRGBAFloat(dflcd.color(), c); |
| 678 pdman.set4fv(fColorUniform, 1, c); | 664 pdman.set4fv(fColorUniform, 1, c); |
| 679 fColor = dflcd.color(); | 665 fColor = dflcd.color(); |
| 680 } | 666 } |
| 681 } | 667 } |
| 682 | 668 |
| 683 static inline void GenKey(const GrGeometryProcessor& gp, | 669 static inline void GenKey(const GrGeometryProcessor& gp, |
| 684 const GrBatchTracker& bt, | |
| 685 const GrGLSLCaps&, | 670 const GrGLSLCaps&, |
| 686 GrProcessorKeyBuilder* b) { | 671 GrProcessorKeyBuilder* b) { |
| 687 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); | 672 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); |
| 688 | 673 |
| 689 uint32_t key = dfTexEffect.getFlags(); | 674 uint32_t key = dfTexEffect.getFlags(); |
| 690 key |= dfTexEffect.colorIgnored() << 16; | 675 key |= dfTexEffect.colorIgnored() << 16; |
| 691 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 676 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
| 692 b->add32(key); | 677 b->add32(key); |
| 693 | 678 |
| 694 // Currently we hardcode numbers to convert atlas coordinates to normali
zed floating point | 679 // Currently we hardcode numbers to convert atlas coordinates to normali
zed floating point |
| (...skipping 30 matching lines...) Expand all Loading... |
| 725 , fUsesLocalCoords(usesLocalCoords) { | 710 , fUsesLocalCoords(usesLocalCoords) { |
| 726 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); | 711 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); |
| 727 this->initClassID<GrDistanceFieldLCDTextGeoProc>(); | 712 this->initClassID<GrDistanceFieldLCDTextGeoProc>(); |
| 728 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, | 713 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, |
| 729 kHigh_GrSLPrecision)); | 714 kHigh_GrSLPrecision)); |
| 730 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 715 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
| 731 kVec2s_GrVertexAttribTyp
e)); | 716 kVec2s_GrVertexAttribTyp
e)); |
| 732 this->addTextureAccess(&fTextureAccess); | 717 this->addTextureAccess(&fTextureAccess); |
| 733 } | 718 } |
| 734 | 719 |
| 735 void GrDistanceFieldLCDTextGeoProc::getGLProcessorKey(const GrBatchTracker& bt, | 720 void GrDistanceFieldLCDTextGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, |
| 736 const GrGLSLCaps& caps, | |
| 737 GrProcessorKeyBuilder* b)
const { | 721 GrProcessorKeyBuilder* b)
const { |
| 738 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, bt, caps, b); | 722 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, caps, b); |
| 739 } | 723 } |
| 740 | 724 |
| 741 GrGLPrimitiveProcessor* | 725 GrGLPrimitiveProcessor* GrDistanceFieldLCDTextGeoProc::createGLInstance(const Gr
GLSLCaps&) const { |
| 742 GrDistanceFieldLCDTextGeoProc::createGLInstance(const GrBatchTracker& bt, | 726 return new GrGLDistanceFieldLCDTextGeoProc(); |
| 743 const GrGLSLCaps&) const { | |
| 744 return new GrGLDistanceFieldLCDTextGeoProc(*this, bt); | |
| 745 } | 727 } |
| 746 | 728 |
| 747 /////////////////////////////////////////////////////////////////////////////// | 729 /////////////////////////////////////////////////////////////////////////////// |
| 748 | 730 |
| 749 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc); | 731 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc); |
| 750 | 732 |
| 751 const GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessor
TestData* d) { | 733 const GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessor
TestData* d) { |
| 752 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: | 734 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: |
| 753 GrProcessorUnitTest::kAlphaTextureIdx; | 735 GrProcessorUnitTest::kAlphaTextureIdx; |
| 754 static const SkShader::TileMode kTileModes[] = { | 736 static const SkShader::TileMode kTileModes[] = { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 766 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 748 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
| 767 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 749 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
| 768 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 750 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
| 769 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), | 751 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), |
| 770 GrTest::TestMatrix(d->fRandom), | 752 GrTest::TestMatrix(d->fRandom), |
| 771 d->fTextures[texIdx], params, | 753 d->fTextures[texIdx], params, |
| 772 wa, | 754 wa, |
| 773 flags, | 755 flags, |
| 774 d->fRandom->nextBool()); | 756 d->fRandom->nextBool()); |
| 775 } | 757 } |
| OLD | NEW |