OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "GrPLSPathRenderer.h" | 8 #include "GrPLSPathRenderer.h" |
9 | 9 |
10 #include "SkChunkAlloc.h" | 10 #include "SkChunkAlloc.h" |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 vsBuilder->codeAppendf("%s = vec2(%s.x - %s.x, %s.y - %s.y) * 0.5;", | 326 vsBuilder->codeAppendf("%s = vec2(%s.x - %s.x, %s.y - %s.y) * 0.5;", |
327 delta3.vsOut(), v3.vsOut(), v1.vsOut(), v1.vs
Out(), v3.vsOut()); | 327 delta3.vsOut(), v3.vsOut(), v1.vsOut(), v1.vs
Out(), v3.vsOut()); |
328 | 328 |
329 GrGLSLVertToFrag windings(kInt_GrSLType); | 329 GrGLSLVertToFrag windings(kInt_GrSLType); |
330 varyingHandler->addFlatVarying("windings", &windings, kLow_GrSLPreci
sion); | 330 varyingHandler->addFlatVarying("windings", &windings, kLow_GrSLPreci
sion); |
331 vsBuilder->codeAppendf("%s = %s;", | 331 vsBuilder->codeAppendf("%s = %s;", |
332 windings.vsOut(), te.inWindings()->fName); | 332 windings.vsOut(), te.inWindings()->fName); |
333 | 333 |
334 // emit transforms | 334 // emit transforms |
335 this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpAr
gs->fPositionVar, | 335 this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpAr
gs->fPositionVar, |
336 te.inPosition()->fName, te.localMatrix(), | 336 te.inPosition()->fName, te.localMatrix(), args.
fTransformsIn, |
337 args.fFPCoordTransformHandler); | 337 args.fTransformsOut); |
338 | 338 |
339 GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder; | 339 GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder; |
340 SkAssertResult(fsBuilder->enableFeature( | 340 SkAssertResult(fsBuilder->enableFeature( |
341 GrGLSLFragmentShaderBuilder::kPixelLocalStorage_GLSLF
eature)); | 341 GrGLSLFragmentShaderBuilder::kPixelLocalStorage_GLSLF
eature)); |
342 SkAssertResult(fsBuilder->enableFeature( | 342 SkAssertResult(fsBuilder->enableFeature( |
343 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 343 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
344 fsBuilder->declAppendf(GR_GL_PLS_PATH_DATA_DECL); | 344 fsBuilder->declAppendf(GR_GL_PLS_PATH_DATA_DECL); |
345 // Compute four subsamples, each shifted a quarter pixel along x and
y from | 345 // Compute four subsamples, each shifted a quarter pixel along x and
y from |
346 // gl_FragCoord. The oriented box positioning of the subsamples is o
f course not | 346 // gl_FragCoord. The oriented box positioning of the subsamples is o
f course not |
347 // optimal, but it greatly simplifies the math and this simplificati
on is necessary for | 347 // optimal, but it greatly simplifies the math and this simplificati
on is necessary for |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 | 384 |
385 static inline void GenKey(const GrGeometryProcessor& gp, | 385 static inline void GenKey(const GrGeometryProcessor& gp, |
386 const GrGLSLCaps&, | 386 const GrGLSLCaps&, |
387 GrProcessorKeyBuilder* b) { | 387 GrProcessorKeyBuilder* b) { |
388 const PLSAATriangleEffect& te = gp.cast<PLSAATriangleEffect>(); | 388 const PLSAATriangleEffect& te = gp.cast<PLSAATriangleEffect>(); |
389 uint32_t key = 0; | 389 uint32_t key = 0; |
390 key |= te.localMatrix().hasPerspective() ? 0x1 : 0x0; | 390 key |= te.localMatrix().hasPerspective() ? 0x1 : 0x0; |
391 b->add32(key); | 391 b->add32(key); |
392 } | 392 } |
393 | 393 |
394 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitivePro
cessor& gp, | 394 virtual void setData(const GrGLSLProgramDataManager& pdman, |
395 FPCoordTransformIter&& transformIter) override { | 395 const GrPrimitiveProcessor& gp) override { |
396 this->setTransformDataHelper(gp.cast<PLSAATriangleEffect>().fLocalMa
trix, pdman, | 396 } |
397 &transformIter); | 397 |
| 398 void setTransformData(const GrPrimitiveProcessor& primProc, |
| 399 const GrGLSLProgramDataManager& pdman, |
| 400 int index, |
| 401 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { |
| 402 this->setTransformDataHelper(primProc.cast<PLSAATriangleEffect>().fL
ocalMatrix, pdman, |
| 403 index, transforms); |
398 } | 404 } |
399 | 405 |
400 private: | 406 private: |
401 typedef GrGLSLGeometryProcessor INHERITED; | 407 typedef GrGLSLGeometryProcessor INHERITED; |
402 }; | 408 }; |
403 | 409 |
404 virtual void getGLSLProcessorKey(const GrGLSLCaps& caps, | 410 virtual void getGLSLProcessorKey(const GrGLSLCaps& caps, |
405 GrProcessorKeyBuilder* b) const override { | 411 GrProcessorKeyBuilder* b) const override { |
406 GLSLProcessor::GenKey(*this, caps, b); | 412 GLSLProcessor::GenKey(*this, caps, b); |
407 } | 413 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 GrGLSLVertToFrag windings(kInt_GrSLType); | 515 GrGLSLVertToFrag windings(kInt_GrSLType); |
510 varyingHandler->addFlatVarying("windings", &windings, kLow_GrSLPreci
sion); | 516 varyingHandler->addFlatVarying("windings", &windings, kLow_GrSLPreci
sion); |
511 vsBuilder->codeAppendf("%s = %s;", | 517 vsBuilder->codeAppendf("%s = %s;", |
512 windings.vsOut(), qe.inWindings()->fName); | 518 windings.vsOut(), qe.inWindings()->fName); |
513 | 519 |
514 // Setup position | 520 // Setup position |
515 this->setupPosition(vsBuilder, gpArgs, qe.inPosition()->fName); | 521 this->setupPosition(vsBuilder, gpArgs, qe.inPosition()->fName); |
516 | 522 |
517 // emit transforms | 523 // emit transforms |
518 this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpAr
gs->fPositionVar, | 524 this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpAr
gs->fPositionVar, |
519 qe.inPosition()->fName, qe.localMatrix(), | 525 qe.inPosition()->fName, qe.localMatrix(), args.
fTransformsIn, |
520 args.fFPCoordTransformHandler); | 526 args.fTransformsOut); |
521 | 527 |
522 GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder; | 528 GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder; |
523 SkAssertResult(fsBuilder->enableFeature( | 529 SkAssertResult(fsBuilder->enableFeature( |
524 GrGLSLFragmentShaderBuilder::kPixelLocalStorage_GLSLF
eature)); | 530 GrGLSLFragmentShaderBuilder::kPixelLocalStorage_GLSLF
eature)); |
525 SkAssertResult(fsBuilder->enableFeature( | 531 SkAssertResult(fsBuilder->enableFeature( |
526 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 532 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
527 static const int QUAD_ARGS = 2; | 533 static const int QUAD_ARGS = 2; |
528 GrGLSLShaderVar inQuadArgs[QUAD_ARGS] = { | 534 GrGLSLShaderVar inQuadArgs[QUAD_ARGS] = { |
529 GrGLSLShaderVar("dot", kFloat_GrSLType, 0, kHigh_GrSLPrecision), | 535 GrGLSLShaderVar("dot", kFloat_GrSLType, 0, kHigh_GrSLPrecision), |
530 GrGLSLShaderVar("uv", kVec2f_GrSLType, 0, kHigh_GrSLPrecision) | 536 GrGLSLShaderVar("uv", kVec2f_GrSLType, 0, kHigh_GrSLPrecision) |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 | 574 |
569 static inline void GenKey(const GrGeometryProcessor& gp, | 575 static inline void GenKey(const GrGeometryProcessor& gp, |
570 const GrGLSLCaps&, | 576 const GrGLSLCaps&, |
571 GrProcessorKeyBuilder* b) { | 577 GrProcessorKeyBuilder* b) { |
572 const PLSQuadEdgeEffect& qee = gp.cast<PLSQuadEdgeEffect>(); | 578 const PLSQuadEdgeEffect& qee = gp.cast<PLSQuadEdgeEffect>(); |
573 uint32_t key = 0; | 579 uint32_t key = 0; |
574 key |= qee.usesLocalCoords() && qee.localMatrix().hasPerspective() ?
0x1 : 0x0; | 580 key |= qee.usesLocalCoords() && qee.localMatrix().hasPerspective() ?
0x1 : 0x0; |
575 b->add32(key); | 581 b->add32(key); |
576 } | 582 } |
577 | 583 |
578 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitivePro
cessor& gp, | 584 virtual void setData(const GrGLSLProgramDataManager& pdman, |
579 FPCoordTransformIter&& transformIter) override { | 585 const GrPrimitiveProcessor& gp) override { |
580 this->setTransformDataHelper(gp.cast<PLSQuadEdgeEffect>().fLocalMatr
ix, pdman, | 586 } |
581 &transformIter); | 587 |
| 588 void setTransformData(const GrPrimitiveProcessor& primProc, |
| 589 const GrGLSLProgramDataManager& pdman, |
| 590 int index, |
| 591 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { |
| 592 this->setTransformDataHelper(primProc.cast<PLSQuadEdgeEffect>().fLoc
alMatrix, pdman, |
| 593 index, transforms); |
582 } | 594 } |
583 | 595 |
584 private: | 596 private: |
585 typedef GrGLSLGeometryProcessor INHERITED; | 597 typedef GrGLSLGeometryProcessor INHERITED; |
586 }; | 598 }; |
587 | 599 |
588 virtual void getGLSLProcessorKey(const GrGLSLCaps& caps, | 600 virtual void getGLSLProcessorKey(const GrGLSLCaps& caps, |
589 GrProcessorKeyBuilder* b) const override { | 601 GrProcessorKeyBuilder* b) const override { |
590 GLSLProcessor::GenKey(*this, caps, b); | 602 GLSLProcessor::GenKey(*this, caps, b); |
591 } | 603 } |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; | 673 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
662 | 674 |
663 fUseEvenOdd = uniformHandler->addUniform(kFragment_GrShaderFlag, | 675 fUseEvenOdd = uniformHandler->addUniform(kFragment_GrShaderFlag, |
664 kFloat_GrSLType, kLow_GrSLPr
ecision, | 676 kFloat_GrSLType, kLow_GrSLPr
ecision, |
665 "useEvenOdd"); | 677 "useEvenOdd"); |
666 const char* useEvenOdd = uniformHandler->getUniformCStr(fUseEvenOdd)
; | 678 const char* useEvenOdd = uniformHandler->getUniformCStr(fUseEvenOdd)
; |
667 | 679 |
668 varyingHandler->emitAttributes(fe); | 680 varyingHandler->emitAttributes(fe); |
669 this->setupPosition(vsBuilder, gpArgs, fe.inPosition()->fName); | 681 this->setupPosition(vsBuilder, gpArgs, fe.inPosition()->fName); |
670 this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpAr
gs->fPositionVar, | 682 this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpAr
gs->fPositionVar, |
671 fe.inPosition()->fName, fe.localMatrix(), | 683 fe.inPosition()->fName, fe.localMatrix(), args.
fTransformsIn, |
672 args.fFPCoordTransformHandler); | 684 args.fTransformsOut); |
673 | 685 |
674 GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder; | 686 GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder; |
675 SkAssertResult(fsBuilder->enableFeature( | 687 SkAssertResult(fsBuilder->enableFeature( |
676 GrGLSLFragmentShaderBuilder::kPixelLocalStorage_GLSLF
eature)); | 688 GrGLSLFragmentShaderBuilder::kPixelLocalStorage_GLSLF
eature)); |
677 fsBuilder->declAppendf(GR_GL_PLS_PATH_DATA_DECL); | 689 fsBuilder->declAppendf(GR_GL_PLS_PATH_DATA_DECL); |
678 fsBuilder->codeAppend("float coverage;"); | 690 fsBuilder->codeAppend("float coverage;"); |
679 fsBuilder->codeAppendf("if (%s != 0.0) {", useEvenOdd); | 691 fsBuilder->codeAppendf("if (%s != 0.0) {", useEvenOdd); |
680 fsBuilder->codeAppend("coverage = float(abs(pls.windings[0]) % 2) *
0.25;"); | 692 fsBuilder->codeAppend("coverage = float(abs(pls.windings[0]) % 2) *
0.25;"); |
681 fsBuilder->codeAppend("coverage += float(abs(pls.windings[1]) % 2) *
0.25;"); | 693 fsBuilder->codeAppend("coverage += float(abs(pls.windings[1]) % 2) *
0.25;"); |
682 fsBuilder->codeAppend("coverage += float(abs(pls.windings[2]) % 2) *
0.25;"); | 694 fsBuilder->codeAppend("coverage += float(abs(pls.windings[2]) % 2) *
0.25;"); |
(...skipping 14 matching lines...) Expand all Loading... |
697 | 709 |
698 static inline void GenKey(const GrGeometryProcessor& gp, | 710 static inline void GenKey(const GrGeometryProcessor& gp, |
699 const GrGLSLCaps&, | 711 const GrGLSLCaps&, |
700 GrProcessorKeyBuilder* b) { | 712 GrProcessorKeyBuilder* b) { |
701 const PLSFinishEffect& fe = gp.cast<PLSFinishEffect>(); | 713 const PLSFinishEffect& fe = gp.cast<PLSFinishEffect>(); |
702 uint32_t key = 0; | 714 uint32_t key = 0; |
703 key |= fe.usesLocalCoords() && fe.localMatrix().hasPerspective() ? 0
x1 : 0x0; | 715 key |= fe.usesLocalCoords() && fe.localMatrix().hasPerspective() ? 0
x1 : 0x0; |
704 b->add32(key); | 716 b->add32(key); |
705 } | 717 } |
706 | 718 |
707 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitivePro
cessor& gp, | 719 virtual void setData(const GrGLSLProgramDataManager& pdman, |
708 FPCoordTransformIter&& transformIter) override { | 720 const GrPrimitiveProcessor& gp) override { |
709 const PLSFinishEffect& fe = gp.cast<PLSFinishEffect>(); | 721 const PLSFinishEffect& fe = gp.cast<PLSFinishEffect>(); |
710 pdman.set1f(fUseEvenOdd, fe.fUseEvenOdd); | 722 pdman.set1f(fUseEvenOdd, fe.fUseEvenOdd); |
711 if (fe.color() != fColor && !fe.colorIgnored()) { | 723 if (fe.color() != fColor && !fe.colorIgnored()) { |
712 GrGLfloat c[4]; | 724 GrGLfloat c[4]; |
713 GrColorToRGBAFloat(fe.color(), c); | 725 GrColorToRGBAFloat(fe.color(), c); |
714 pdman.set4fv(fColorUniform, 1, c); | 726 pdman.set4fv(fColorUniform, 1, c); |
715 fColor = fe.color(); | 727 fColor = fe.color(); |
716 } | 728 } |
717 this->setTransformDataHelper(fe.fLocalMatrix, pdman, &transformIter)
; | 729 } |
| 730 |
| 731 void setTransformData(const GrPrimitiveProcessor& primProc, |
| 732 const GrGLSLProgramDataManager& pdman, |
| 733 int index, |
| 734 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { |
| 735 this->setTransformDataHelper(primProc.cast<PLSFinishEffect>().fLocal
Matrix, pdman, |
| 736 index, transforms); |
718 } | 737 } |
719 | 738 |
720 private: | 739 private: |
721 GrColor fColor; | 740 GrColor fColor; |
722 UniformHandle fColorUniform; | 741 UniformHandle fColorUniform; |
723 UniformHandle fUseEvenOdd; | 742 UniformHandle fUseEvenOdd; |
724 | 743 |
725 typedef GrGLSLGeometryProcessor INHERITED; | 744 typedef GrGLSLGeometryProcessor INHERITED; |
726 }; | 745 }; |
727 | 746 |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
950 | 969 |
951 DRAW_BATCH_TEST_DEFINE(PLSPathBatch) { | 970 DRAW_BATCH_TEST_DEFINE(PLSPathBatch) { |
952 GrColor color = GrRandomColor(random); | 971 GrColor color = GrRandomColor(random); |
953 SkMatrix vm = GrTest::TestMatrixInvertible(random); | 972 SkMatrix vm = GrTest::TestMatrixInvertible(random); |
954 SkPath path = GrTest::TestPathConvex(random); | 973 SkPath path = GrTest::TestPathConvex(random); |
955 | 974 |
956 return new PLSPathBatch(color, path, vm); | 975 return new PLSPathBatch(color, path, vm); |
957 } | 976 } |
958 | 977 |
959 #endif | 978 #endif |
OLD | NEW |