| 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 "GrBezierEffect.h" | 8 #include "GrBezierEffect.h" |
| 9 | 9 |
| 10 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
| 10 #include "glsl/GrGLSLGeometryProcessor.h" | 11 #include "glsl/GrGLSLGeometryProcessor.h" |
| 11 #include "glsl/GrGLSLProgramBuilder.h" | |
| 12 #include "glsl/GrGLSLProgramDataManager.h" | 12 #include "glsl/GrGLSLProgramDataManager.h" |
| 13 #include "glsl/GrGLSLUniformHandler.h" |
| 13 #include "glsl/GrGLSLUtil.h" | 14 #include "glsl/GrGLSLUtil.h" |
| 14 #include "glsl/GrGLSLVarying.h" | 15 #include "glsl/GrGLSLVarying.h" |
| 16 #include "glsl/GrGLSLVertexShaderBuilder.h" |
| 15 | 17 |
| 16 class GrGLConicEffect : public GrGLSLGeometryProcessor { | 18 class GrGLConicEffect : public GrGLSLGeometryProcessor { |
| 17 public: | 19 public: |
| 18 GrGLConicEffect(const GrGeometryProcessor&); | 20 GrGLConicEffect(const GrGeometryProcessor&); |
| 19 | 21 |
| 20 void onEmitCode(EmitArgs&, GrGPArgs*) override; | 22 void onEmitCode(EmitArgs&, GrGPArgs*) override; |
| 21 | 23 |
| 22 static inline void GenKey(const GrGeometryProcessor&, | 24 static inline void GenKey(const GrGeometryProcessor&, |
| 23 const GrGLSLCaps&, | 25 const GrGLSLCaps&, |
| 24 GrProcessorKeyBuilder*); | 26 GrProcessorKeyBuilder*); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 typedef GrGLSLGeometryProcessor INHERITED; | 68 typedef GrGLSLGeometryProcessor INHERITED; |
| 67 }; | 69 }; |
| 68 | 70 |
| 69 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) | 71 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) |
| 70 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { | 72 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { |
| 71 const GrConicEffect& ce = processor.cast<GrConicEffect>(); | 73 const GrConicEffect& ce = processor.cast<GrConicEffect>(); |
| 72 fEdgeType = ce.getEdgeType(); | 74 fEdgeType = ce.getEdgeType(); |
| 73 } | 75 } |
| 74 | 76 |
| 75 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 77 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
| 76 GrGLSLGPBuilder* pb = args.fPB; | |
| 77 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 78 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 78 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); | 79 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); |
| 79 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 80 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 81 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
| 80 | 82 |
| 81 // emit attributes | 83 // emit attributes |
| 82 varyingHandler->emitAttributes(gp); | 84 varyingHandler->emitAttributes(gp); |
| 83 | 85 |
| 84 GrGLSLVertToFrag v(kVec4f_GrSLType); | 86 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 85 varyingHandler->addVarying("ConicCoeffs", &v); | 87 varyingHandler->addVarying("ConicCoeffs", &v); |
| 86 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); | 88 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); |
| 87 | 89 |
| 88 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 90 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 89 // Setup pass through color | 91 // Setup pass through color |
| 90 if (!gp.colorIgnored()) { | 92 if (!gp.colorIgnored()) { |
| 91 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo
rUniform); | 93 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
&fColorUniform); |
| 92 } | 94 } |
| 93 | 95 |
| 94 // Setup position | 96 // Setup position |
| 95 this->setupPosition(pb, | 97 this->setupPosition(vertBuilder, |
| 96 vertBuilder, | 98 uniformHandler, |
| 97 gpArgs, | 99 gpArgs, |
| 98 gp.inPosition()->fName, | 100 gp.inPosition()->fName, |
| 99 gp.viewMatrix(), | 101 gp.viewMatrix(), |
| 100 &fViewMatrixUniform); | 102 &fViewMatrixUniform); |
| 101 | 103 |
| 102 // emit transforms with position | 104 // emit transforms with position |
| 103 this->emitTransforms(pb, | 105 this->emitTransforms(vertBuilder, |
| 104 vertBuilder, | |
| 105 varyingHandler, | 106 varyingHandler, |
| 107 uniformHandler, |
| 106 gpArgs->fPositionVar, | 108 gpArgs->fPositionVar, |
| 107 gp.inPosition()->fName, | 109 gp.inPosition()->fName, |
| 108 gp.localMatrix(), | 110 gp.localMatrix(), |
| 109 args.fTransformsIn, | 111 args.fTransformsIn, |
| 110 args.fTransformsOut); | 112 args.fTransformsOut); |
| 111 | 113 |
| 112 fragBuilder->codeAppend("float edgeAlpha;"); | 114 fragBuilder->codeAppend("float edgeAlpha;"); |
| 113 | 115 |
| 114 switch (fEdgeType) { | 116 switch (fEdgeType) { |
| 115 case kHairlineAA_GrProcessorEdgeType: { | 117 case kHairlineAA_GrProcessorEdgeType: { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); | 163 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); |
| 162 break; | 164 break; |
| 163 } | 165 } |
| 164 default: | 166 default: |
| 165 SkFAIL("Shouldn't get here"); | 167 SkFAIL("Shouldn't get here"); |
| 166 } | 168 } |
| 167 | 169 |
| 168 // TODO should we really be doing this? | 170 // TODO should we really be doing this? |
| 169 if (gp.coverageScale() != 0xff) { | 171 if (gp.coverageScale() != 0xff) { |
| 170 const char* coverageScale; | 172 const char* coverageScale; |
| 171 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, | 173 fCoverageScaleUniform = uniformHandler->addUniform( |
| 172 kFloat_GrSLType, | 174 GrGLSLUniformHandler::k
Fragment_Visibility, |
| 173 kDefault_GrSLPrecision, | 175 kFloat_GrSLType, |
| 174 "Coverage", | 176 kDefault_GrSLPrecision, |
| 175 &coverageScale); | 177 "Coverage", |
| 178 &coverageScale); |
| 176 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover
age, coverageScale); | 179 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover
age, coverageScale); |
| 177 } else { | 180 } else { |
| 178 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); | 181 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
| 179 } | 182 } |
| 180 } | 183 } |
| 181 | 184 |
| 182 void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp, | 185 void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp, |
| 183 const GrGLSLCaps&, | 186 const GrGLSLCaps&, |
| 184 GrProcessorKeyBuilder* b) { | 187 GrProcessorKeyBuilder* b) { |
| 185 const GrConicEffect& ce = gp.cast<GrConicEffect>(); | 188 const GrConicEffect& ce = gp.cast<GrConicEffect>(); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 typedef GrGLSLGeometryProcessor INHERITED; | 297 typedef GrGLSLGeometryProcessor INHERITED; |
| 295 }; | 298 }; |
| 296 | 299 |
| 297 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) | 300 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) |
| 298 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { | 301 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { |
| 299 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); | 302 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); |
| 300 fEdgeType = ce.getEdgeType(); | 303 fEdgeType = ce.getEdgeType(); |
| 301 } | 304 } |
| 302 | 305 |
| 303 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 306 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
| 304 GrGLSLGPBuilder* pb = args.fPB; | |
| 305 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 307 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 306 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); | 308 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); |
| 307 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 309 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 310 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
| 308 | 311 |
| 309 // emit attributes | 312 // emit attributes |
| 310 varyingHandler->emitAttributes(gp); | 313 varyingHandler->emitAttributes(gp); |
| 311 | 314 |
| 312 GrGLSLVertToFrag v(kVec4f_GrSLType); | 315 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 313 varyingHandler->addVarying("HairQuadEdge", &v); | 316 varyingHandler->addVarying("HairQuadEdge", &v); |
| 314 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); | 317 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); |
| 315 | 318 |
| 316 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 319 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 317 // Setup pass through color | 320 // Setup pass through color |
| 318 if (!gp.colorIgnored()) { | 321 if (!gp.colorIgnored()) { |
| 319 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo
rUniform); | 322 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
&fColorUniform); |
| 320 } | 323 } |
| 321 | 324 |
| 322 // Setup position | 325 // Setup position |
| 323 this->setupPosition(pb, | 326 this->setupPosition(vertBuilder, |
| 324 vertBuilder, | 327 uniformHandler, |
| 325 gpArgs, | 328 gpArgs, |
| 326 gp.inPosition()->fName, | 329 gp.inPosition()->fName, |
| 327 gp.viewMatrix(), | 330 gp.viewMatrix(), |
| 328 &fViewMatrixUniform); | 331 &fViewMatrixUniform); |
| 329 | 332 |
| 330 // emit transforms with position | 333 // emit transforms with position |
| 331 this->emitTransforms(pb, | 334 this->emitTransforms(vertBuilder, |
| 332 vertBuilder, | |
| 333 varyingHandler, | 335 varyingHandler, |
| 336 uniformHandler, |
| 334 gpArgs->fPositionVar, | 337 gpArgs->fPositionVar, |
| 335 gp.inPosition()->fName, | 338 gp.inPosition()->fName, |
| 336 gp.localMatrix(), | 339 gp.localMatrix(), |
| 337 args.fTransformsIn, | 340 args.fTransformsIn, |
| 338 args.fTransformsOut); | 341 args.fTransformsOut); |
| 339 | 342 |
| 340 fragBuilder->codeAppendf("float edgeAlpha;"); | 343 fragBuilder->codeAppendf("float edgeAlpha;"); |
| 341 | 344 |
| 342 switch (fEdgeType) { | 345 switch (fEdgeType) { |
| 343 case kHairlineAA_GrProcessorEdgeType: { | 346 case kHairlineAA_GrProcessorEdgeType: { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 v.fsIn(), v.fsIn(), v.fsIn()); | 380 v.fsIn(), v.fsIn(), v.fsIn()); |
| 378 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); | 381 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); |
| 379 break; | 382 break; |
| 380 } | 383 } |
| 381 default: | 384 default: |
| 382 SkFAIL("Shouldn't get here"); | 385 SkFAIL("Shouldn't get here"); |
| 383 } | 386 } |
| 384 | 387 |
| 385 if (0xff != gp.coverageScale()) { | 388 if (0xff != gp.coverageScale()) { |
| 386 const char* coverageScale; | 389 const char* coverageScale; |
| 387 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, | 390 fCoverageScaleUniform = uniformHandler->addUniform( |
| 388 kFloat_GrSLType, | 391 GrGLSLUniformHandler::k
Fragment_Visibility, |
| 389 kDefault_GrSLPrecision, | 392 kFloat_GrSLType, |
| 390 "Coverage", | 393 kDefault_GrSLPrecision, |
| 391 &coverageScale); | 394 "Coverage", |
| 395 &coverageScale); |
| 392 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover
age, coverageScale); | 396 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover
age, coverageScale); |
| 393 } else { | 397 } else { |
| 394 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); | 398 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
| 395 } | 399 } |
| 396 } | 400 } |
| 397 | 401 |
| 398 void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp, | 402 void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp, |
| 399 const GrGLSLCaps&, | 403 const GrGLSLCaps&, |
| 400 GrProcessorKeyBuilder* b) { | 404 GrProcessorKeyBuilder* b) { |
| 401 const GrQuadEffect& ce = gp.cast<GrQuadEffect>(); | 405 const GrQuadEffect& ce = gp.cast<GrQuadEffect>(); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) | 504 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) |
| 501 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { | 505 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { |
| 502 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); | 506 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); |
| 503 fEdgeType = ce.getEdgeType(); | 507 fEdgeType = ce.getEdgeType(); |
| 504 } | 508 } |
| 505 | 509 |
| 506 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 510 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
| 507 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 511 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 508 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); | 512 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); |
| 509 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 513 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 514 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
| 510 | 515 |
| 511 // emit attributes | 516 // emit attributes |
| 512 varyingHandler->emitAttributes(gp); | 517 varyingHandler->emitAttributes(gp); |
| 513 | 518 |
| 514 GrGLSLVertToFrag v(kVec4f_GrSLType); | 519 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 515 varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); | 520 varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); |
| 516 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); | 521 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); |
| 517 | 522 |
| 518 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 523 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 519 // Setup pass through color | 524 // Setup pass through color |
| 520 if (!gp.colorIgnored()) { | 525 if (!gp.colorIgnored()) { |
| 521 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo
rUniform); | 526 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
&fColorUniform); |
| 522 } | 527 } |
| 523 | 528 |
| 524 // Setup position | 529 // Setup position |
| 525 this->setupPosition(args.fPB, | 530 this->setupPosition(vertBuilder, |
| 526 vertBuilder, | 531 uniformHandler, |
| 527 gpArgs, | 532 gpArgs, |
| 528 gp.inPosition()->fName, | 533 gp.inPosition()->fName, |
| 529 gp.viewMatrix(), | 534 gp.viewMatrix(), |
| 530 &fViewMatrixUniform); | 535 &fViewMatrixUniform); |
| 531 | 536 |
| 532 // emit transforms with position | 537 // emit transforms with position |
| 533 this->emitTransforms(args.fPB, | 538 this->emitTransforms(vertBuilder, |
| 534 vertBuilder, | |
| 535 varyingHandler, | 539 varyingHandler, |
| 540 uniformHandler, |
| 536 gpArgs->fPositionVar, | 541 gpArgs->fPositionVar, |
| 537 gp.inPosition()->fName, | 542 gp.inPosition()->fName, |
| 538 args.fTransformsIn, | 543 args.fTransformsIn, |
| 539 args.fTransformsOut); | 544 args.fTransformsOut); |
| 540 | 545 |
| 541 | 546 |
| 542 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi
on); | 547 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi
on); |
| 543 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); | 548 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); |
| 544 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); | 549 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); |
| 545 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 550 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 672 do { | 677 do { |
| 673 GrPrimitiveEdgeType edgeType = | 678 GrPrimitiveEdgeType edgeType = |
| 674 static_cast<GrPrimitiveEdgeType>( | 679 static_cast<GrPrimitiveEdgeType>( |
| 675 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); | 680 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); |
| 676 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), | 681 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), |
| 677 GrTest::TestMatrix(d->fRandom), edgeType, *d-
>fCaps); | 682 GrTest::TestMatrix(d->fRandom), edgeType, *d-
>fCaps); |
| 678 } while (nullptr == gp); | 683 } while (nullptr == gp); |
| 679 return gp; | 684 return gp; |
| 680 } | 685 } |
| 681 | 686 |
| OLD | NEW |