Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Side by Side Diff: src/gpu/effects/GrDashingEffect.cpp

Issue 746423007: Draft change to start pulling uniform color into GP (Closed) Base URL: https://skia.googlesource.com/skia.git@no_factories
Patch Set: rebase Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/effects/GrBitmapTextGeoProc.cpp ('k') | src/gpu/effects/GrDistanceFieldTextureEffect.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 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 "GrDashingEffect.h" 8 #include "GrDashingEffect.h"
9 9
10 #include "../GrAARectRenderer.h" 10 #include "../GrAARectRenderer.h"
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 434
435 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); 435 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer());
436 target->drawIndexedInstances(drawState, gp, kTriangles_GrPrimitiveType, tota lRectCnt, 4, 6); 436 target->drawIndexedInstances(drawState, gp, kTriangles_GrPrimitiveType, tota lRectCnt, 4, 6);
437 target->resetIndexSource(); 437 target->resetIndexSource();
438 return true; 438 return true;
439 } 439 }
440 440
441 ////////////////////////////////////////////////////////////////////////////// 441 //////////////////////////////////////////////////////////////////////////////
442 442
443 class GLDashingCircleEffect; 443 class GLDashingCircleEffect;
444
445 struct DashingCircleBatchTracker {
446 GrGPInput fInputColorType;
447 GrColor fColor;
448 };
449
444 /* 450 /*
445 * This effect will draw a dotted line (defined as a dashed lined with round cap s and no on 451 * This effect will draw a dotted line (defined as a dashed lined with round cap s and no on
446 * interval). The radius of the dots is given by the strokeWidth and the spacing by the DashInfo. 452 * interval). The radius of the dots is given by the strokeWidth and the spacing by the DashInfo.
447 * Both of the previous two parameters are in device space. This effect also req uires the setting of 453 * Both of the previous two parameters are in device space. This effect also req uires the setting of
448 * a vec2 vertex attribute for the the four corners of the bounding rect. This a ttribute is the 454 * a vec2 vertex attribute for the the four corners of the bounding rect. This a ttribute is the
449 * "dash position" of each vertex. In other words it is the vertex coords (in de vice space) if we 455 * "dash position" of each vertex. In other words it is the vertex coords (in de vice space) if we
450 * transform the line to be horizontal, with the start of line at the origin the n shifted to the 456 * transform the line to be horizontal, with the start of line at the origin the n shifted to the
451 * right by half the off interval. The line then goes in the positive x directio n. 457 * right by half the off interval. The line then goes in the positive x directio n.
452 */ 458 */
453 class DashingCircleEffect : public GrGeometryProcessor { 459 class DashingCircleEffect : public GrGeometryProcessor {
(...skipping 20 matching lines...) Expand all
474 SkScalar getCenterX() const { return fCenterX; } 480 SkScalar getCenterX() const { return fCenterX; }
475 481
476 SkScalar getIntervalLength() const { return fIntervalLength; } 482 SkScalar getIntervalLength() const { return fIntervalLength; }
477 483
478 virtual void getGLProcessorKey(const GrBatchTracker&, 484 virtual void getGLProcessorKey(const GrBatchTracker&,
479 const GrGLCaps&, 485 const GrGLCaps&,
480 GrProcessorKeyBuilder* b) const SK_OVERRIDE; 486 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
481 487
482 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker&) const SK_OVERRIDE; 488 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker&) const SK_OVERRIDE;
483 489
490 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR IDE;
491
492 bool onCanMakeEqual(const GrBatchTracker&, const GrBatchTracker&) const SK_O VERRIDE;
493
484 private: 494 private:
485 DashingCircleEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& i nfo, 495 DashingCircleEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& i nfo,
486 SkScalar radius); 496 SkScalar radius);
487 497
488 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; 498 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
489 499
490 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_O VERRIDE; 500 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_O VERRIDE;
491 501
492 GrPrimitiveEdgeType fEdgeType; 502 GrPrimitiveEdgeType fEdgeType;
493 const GrAttribute* fInPosition; 503 const GrAttribute* fInPosition;
(...skipping 14 matching lines...) Expand all
508 GLDashingCircleEffect(const GrGeometryProcessor&, const GrBatchTracker&); 518 GLDashingCircleEffect(const GrGeometryProcessor&, const GrBatchTracker&);
509 519
510 virtual void emitCode(const EmitArgs&) SK_OVERRIDE; 520 virtual void emitCode(const EmitArgs&) SK_OVERRIDE;
511 521
512 static inline void GenKey(const GrGeometryProcessor&, 522 static inline void GenKey(const GrGeometryProcessor&,
513 const GrBatchTracker&, 523 const GrBatchTracker&,
514 const GrGLCaps&, 524 const GrGLCaps&,
515 GrProcessorKeyBuilder*); 525 GrProcessorKeyBuilder*);
516 526
517 virtual void setData(const GrGLProgramDataManager&, 527 virtual void setData(const GrGLProgramDataManager&,
518 const GrGeometryProcessor&, 528 const GrPrimitiveProcessor&,
519 const GrBatchTracker&) SK_OVERRIDE; 529 const GrBatchTracker&) SK_OVERRIDE;
520 530
521 private: 531 private:
522 GrGLProgramDataManager::UniformHandle fParamUniform; 532 UniformHandle fParamUniform;
523 SkScalar fPrevRadius; 533 UniformHandle fColorUniform;
524 SkScalar fPrevCenterX; 534 GrColor fColor;
525 SkScalar fPrevIntervalLength; 535 SkScalar fPrevRadius;
536 SkScalar fPrevCenterX;
537 SkScalar fPrevIntervalLength;
526 typedef GrGLGeometryProcessor INHERITED; 538 typedef GrGLGeometryProcessor INHERITED;
527 }; 539 };
528 540
529 GLDashingCircleEffect::GLDashingCircleEffect(const GrGeometryProcessor&, 541 GLDashingCircleEffect::GLDashingCircleEffect(const GrGeometryProcessor&,
530 const GrBatchTracker&) { 542 const GrBatchTracker&) {
543 fColor = GrColor_ILLEGAL;
531 fPrevRadius = SK_ScalarMin; 544 fPrevRadius = SK_ScalarMin;
532 fPrevCenterX = SK_ScalarMin; 545 fPrevCenterX = SK_ScalarMin;
533 fPrevIntervalLength = SK_ScalarMax; 546 fPrevIntervalLength = SK_ScalarMax;
534 } 547 }
535 548
536 void GLDashingCircleEffect::emitCode(const EmitArgs& args) { 549 void GLDashingCircleEffect::emitCode(const EmitArgs& args) {
537 const DashingCircleEffect& dce = args.fGP.cast<DashingCircleEffect>(); 550 const DashingCircleEffect& dce = args.fGP.cast<DashingCircleEffect>();
551 const DashingCircleBatchTracker local = args.fBT.cast<DashingCircleBatchTrac ker>();
552 GrGLGPBuilder* pb = args.fPB;
538 const char *paramName; 553 const char *paramName;
539 // The param uniforms, xyz, refer to circle radius - 0.5, cicles center x co ord, and 554 // The param uniforms, xyz, refer to circle radius - 0.5, cicles center x co ord, and
540 // the total interval length of the dash. 555 // the total interval length of the dash.
541 fParamUniform = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibilit y, 556 fParamUniform = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibilit y,
542 kVec3f_GrSLType, kDefault_GrSLPrecision , 557 kVec3f_GrSLType, kDefault_GrSLPrecision ,
543 "params", &paramName); 558 "params", &paramName);
544 559
545 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 560 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
546 561
547 GrGLVertToFrag v(kVec2f_GrSLType); 562 GrGLVertToFrag v(kVec2f_GrSLType);
548 args.fPB->addVarying("Coord", &v); 563 args.fPB->addVarying("Coord", &v);
549 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dce.inCoord()->fName); 564 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dce.inCoord()->fName);
550 565
566 // Setup pass through color
567 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NU LL, &fColorUniform);
568
551 // setup coord outputs 569 // setup coord outputs
552 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), dce.inPositi on()->fName); 570 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), dce.inPositi on()->fName);
553 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), dce.inPosition( )->fName); 571 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), dce.inPosition( )->fName);
554 572
555 // setup position varying 573 // setup position varying
556 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), vs Builder->uViewM(), 574 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), vs Builder->uViewM(),
557 dce.inPosition()->fName); 575 dce.inPosition()->fName);
558 576
559 // transforms all points so that we can compare them to our test circle 577 // transforms all points so that we can compare them to our test circle
560 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 578 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
561 fsBuilder->codeAppendf("\t\tfloat xShifted = %s.x - floor(%s.x / %s.z) * %s. z;\n", 579 fsBuilder->codeAppendf("\t\tfloat xShifted = %s.x - floor(%s.x / %s.z) * %s. z;\n",
562 v.fsIn(), v.fsIn(), paramName, paramName); 580 v.fsIn(), v.fsIn(), paramName, paramName);
563 fsBuilder->codeAppendf("\t\tvec2 fragPosShifted = vec2(xShifted, %s.y);\n", v.fsIn()); 581 fsBuilder->codeAppendf("\t\tvec2 fragPosShifted = vec2(xShifted, %s.y);\n", v.fsIn());
564 fsBuilder->codeAppendf("\t\tvec2 center = vec2(%s.y, 0.0);\n", paramName); 582 fsBuilder->codeAppendf("\t\tvec2 center = vec2(%s.y, 0.0);\n", paramName);
565 fsBuilder->codeAppend("\t\tfloat dist = length(center - fragPosShifted);\n") ; 583 fsBuilder->codeAppend("\t\tfloat dist = length(center - fragPosShifted);\n") ;
566 if (GrProcessorEdgeTypeIsAA(dce.getEdgeType())) { 584 if (GrProcessorEdgeTypeIsAA(dce.getEdgeType())) {
567 fsBuilder->codeAppendf("\t\tfloat diff = dist - %s.x;\n", paramName); 585 fsBuilder->codeAppendf("\t\tfloat diff = dist - %s.x;\n", paramName);
568 fsBuilder->codeAppend("\t\tdiff = 1.0 - diff;\n"); 586 fsBuilder->codeAppend("\t\tdiff = 1.0 - diff;\n");
569 fsBuilder->codeAppend("\t\tfloat alpha = clamp(diff, 0.0, 1.0);\n"); 587 fsBuilder->codeAppend("\t\tfloat alpha = clamp(diff, 0.0, 1.0);\n");
570 } else { 588 } else {
571 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); 589 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n");
572 fsBuilder->codeAppendf("\t\talpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;\n", paramName); 590 fsBuilder->codeAppendf("\t\talpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;\n", paramName);
573 } 591 }
574 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); 592 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
575 } 593 }
576 594
577 void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman, 595 void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman,
578 const GrGeometryProcessor& processor, 596 const GrPrimitiveProcessor& processor,
579 const GrBatchTracker&) { 597 const GrBatchTracker& bt) {
580 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); 598 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>();
581 SkScalar radius = dce.getRadius(); 599 SkScalar radius = dce.getRadius();
582 SkScalar centerX = dce.getCenterX(); 600 SkScalar centerX = dce.getCenterX();
583 SkScalar intervalLength = dce.getIntervalLength(); 601 SkScalar intervalLength = dce.getIntervalLength();
584 if (radius != fPrevRadius || centerX != fPrevCenterX || intervalLength != fP revIntervalLength) { 602 if (radius != fPrevRadius || centerX != fPrevCenterX || intervalLength != fP revIntervalLength) {
585 pdman.set3f(fParamUniform, radius - 0.5f, centerX, intervalLength); 603 pdman.set3f(fParamUniform, radius - 0.5f, centerX, intervalLength);
586 fPrevRadius = radius; 604 fPrevRadius = radius;
587 fPrevCenterX = centerX; 605 fPrevCenterX = centerX;
588 fPrevIntervalLength = intervalLength; 606 fPrevIntervalLength = intervalLength;
589 } 607 }
608
609 const DashingCircleBatchTracker& local = bt.cast<DashingCircleBatchTracker>( );
610 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
611 GrGLfloat c[4];
612 GrColorToRGBAFloat(local.fColor, c);
613 pdman.set4fv(fColorUniform, 1, c);
614 fColor = local.fColor;
615 }
590 } 616 }
591 617
592 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& processor, 618 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& processor,
593 const GrBatchTracker&, 619 const GrBatchTracker& bt,
594 const GrGLCaps&, 620 const GrGLCaps&,
595 GrProcessorKeyBuilder* b) { 621 GrProcessorKeyBuilder* b) {
622 const DashingCircleBatchTracker& local = bt.cast<DashingCircleBatchTracker>( );
596 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); 623 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>();
597 b->add32(dce.getEdgeType()); 624 b->add32(dce.getEdgeType() << 16 | local.fInputColorType);
598 } 625 }
599 626
600 ////////////////////////////////////////////////////////////////////////////// 627 //////////////////////////////////////////////////////////////////////////////
601 628
602 GrGeometryProcessor* DashingCircleEffect::Create(GrColor color, 629 GrGeometryProcessor* DashingCircleEffect::Create(GrColor color,
603 GrPrimitiveEdgeType edgeType, 630 GrPrimitiveEdgeType edgeType,
604 const DashInfo& info, 631 const DashInfo& info,
605 SkScalar radius) { 632 SkScalar radius) {
606 if (info.fCount != 2 || info.fIntervals[0] != 0) { 633 if (info.fCount != 2 || info.fIntervals[0] != 0) {
607 return NULL; 634 return NULL;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 } 669 }
643 670
644 bool DashingCircleEffect::onIsEqual(const GrGeometryProcessor& other) const { 671 bool DashingCircleEffect::onIsEqual(const GrGeometryProcessor& other) const {
645 const DashingCircleEffect& dce = other.cast<DashingCircleEffect>(); 672 const DashingCircleEffect& dce = other.cast<DashingCircleEffect>();
646 return (fEdgeType == dce.fEdgeType && 673 return (fEdgeType == dce.fEdgeType &&
647 fIntervalLength == dce.fIntervalLength && 674 fIntervalLength == dce.fIntervalLength &&
648 fRadius == dce.fRadius && 675 fRadius == dce.fRadius &&
649 fCenterX == dce.fCenterX); 676 fCenterX == dce.fCenterX);
650 } 677 }
651 678
679 void DashingCircleEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& ini t) const {
680 DashingCircleBatchTracker* local = bt->cast<DashingCircleBatchTracker>();
681 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in it, false);
682 }
683
684 bool DashingCircleEffect::onCanMakeEqual(const GrBatchTracker& m, const GrBatchT racker& t) const {
685 const DashingCircleBatchTracker& mine = m.cast<DashingCircleBatchTracker>();
686 const DashingCircleBatchTracker& theirs = t.cast<DashingCircleBatchTracker>( );
687 return CanCombineOutput(mine.fInputColorType, mine.fColor,
688 theirs.fInputColorType, theirs.fColor);
689 }
690
652 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingCircleEffect); 691 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingCircleEffect);
653 692
654 GrGeometryProcessor* DashingCircleEffect::TestCreate(SkRandom* random, 693 GrGeometryProcessor* DashingCircleEffect::TestCreate(SkRandom* random,
655 GrContext*, 694 GrContext*,
656 const GrDrawTargetCaps& cap s, 695 const GrDrawTargetCaps& cap s,
657 GrTexture*[]) { 696 GrTexture*[]) {
658 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(random->next ULessThan( 697 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(random->next ULessThan(
659 kGrProcessorEdgeTypeCnt)); 698 kGrProcessorEdgeTypeCnt));
660 SkScalar strokeWidth = random->nextRangeScalar(0, 100.f); 699 SkScalar strokeWidth = random->nextRangeScalar(0, 100.f);
661 DashInfo info; 700 DashInfo info;
662 info.fCount = 2; 701 info.fCount = 2;
663 SkAutoTArray<SkScalar> intervals(info.fCount); 702 SkAutoTArray<SkScalar> intervals(info.fCount);
664 info.fIntervals = intervals.get(); 703 info.fIntervals = intervals.get();
665 info.fIntervals[0] = 0; 704 info.fIntervals[0] = 0;
666 info.fIntervals[1] = random->nextRangeScalar(0, 10.f); 705 info.fIntervals[1] = random->nextRangeScalar(0, 10.f);
667 info.fPhase = random->nextRangeScalar(0, info.fIntervals[1]); 706 info.fPhase = random->nextRangeScalar(0, info.fIntervals[1]);
668 707
669 return DashingCircleEffect::Create(GrRandomColor(random), edgeType, info, st rokeWidth); 708 return DashingCircleEffect::Create(GrRandomColor(random), edgeType, info, st rokeWidth);
670 } 709 }
671 710
672 ////////////////////////////////////////////////////////////////////////////// 711 //////////////////////////////////////////////////////////////////////////////
673 712
674 class GLDashingLineEffect; 713 class GLDashingLineEffect;
675 714
715 struct DashingLineBatchTracker {
716 GrGPInput fInputColorType;
717 GrColor fColor;
718 };
719
676 /* 720 /*
677 * This effect will draw a dashed line. The width of the dash is given by the st rokeWidth and the 721 * This effect will draw a dashed line. The width of the dash is given by the st rokeWidth and the
678 * length and spacing by the DashInfo. Both of the previous two parameters are i n device space. 722 * length and spacing by the DashInfo. Both of the previous two parameters are i n device space.
679 * This effect also requires the setting of a vec2 vertex attribute for the the four corners of the 723 * This effect also requires the setting of a vec2 vertex attribute for the the four corners of the
680 * bounding rect. This attribute is the "dash position" of each vertex. In other words it is the 724 * bounding rect. This attribute is the "dash position" of each vertex. In other words it is the
681 * vertex coords (in device space) if we transform the line to be horizontal, wi th the start of 725 * vertex coords (in device space) if we transform the line to be horizontal, wi th the start of
682 * line at the origin then shifted to the right by half the off interval. The li ne then goes in the 726 * line at the origin then shifted to the right by half the off interval. The li ne then goes in the
683 * positive x direction. 727 * positive x direction.
684 */ 728 */
685 class DashingLineEffect : public GrGeometryProcessor { 729 class DashingLineEffect : public GrGeometryProcessor {
(...skipping 18 matching lines...) Expand all
704 const SkRect& getRect() const { return fRect; } 748 const SkRect& getRect() const { return fRect; }
705 749
706 SkScalar getIntervalLength() const { return fIntervalLength; } 750 SkScalar getIntervalLength() const { return fIntervalLength; }
707 751
708 virtual void getGLProcessorKey(const GrBatchTracker& bt, 752 virtual void getGLProcessorKey(const GrBatchTracker& bt,
709 const GrGLCaps& caps, 753 const GrGLCaps& caps,
710 GrProcessorKeyBuilder* b) const SK_OVERRIDE; 754 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
711 755
712 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE; 756 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE;
713 757
758 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR IDE;
759
760 bool onCanMakeEqual(const GrBatchTracker&, const GrBatchTracker&) const SK_O VERRIDE;
761
714 private: 762 private:
715 DashingLineEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& inf o, 763 DashingLineEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& inf o,
716 SkScalar strokeWidth); 764 SkScalar strokeWidth);
717 765
718 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; 766 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
719 767
720 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_O VERRIDE; 768 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_O VERRIDE;
721 769
722 GrPrimitiveEdgeType fEdgeType; 770 GrPrimitiveEdgeType fEdgeType;
723 const GrAttribute* fInPosition; 771 const GrAttribute* fInPosition;
(...skipping 13 matching lines...) Expand all
737 GLDashingLineEffect(const GrGeometryProcessor&, const GrBatchTracker&); 785 GLDashingLineEffect(const GrGeometryProcessor&, const GrBatchTracker&);
738 786
739 virtual void emitCode(const EmitArgs&) SK_OVERRIDE; 787 virtual void emitCode(const EmitArgs&) SK_OVERRIDE;
740 788
741 static inline void GenKey(const GrGeometryProcessor&, 789 static inline void GenKey(const GrGeometryProcessor&,
742 const GrBatchTracker&, 790 const GrBatchTracker&,
743 const GrGLCaps&, 791 const GrGLCaps&,
744 GrProcessorKeyBuilder*); 792 GrProcessorKeyBuilder*);
745 793
746 virtual void setData(const GrGLProgramDataManager&, 794 virtual void setData(const GrGLProgramDataManager&,
747 const GrGeometryProcessor&, 795 const GrPrimitiveProcessor&,
748 const GrBatchTracker&) SK_OVERRIDE; 796 const GrBatchTracker&) SK_OVERRIDE;
749 797
750 private: 798 private:
751 GrGLProgramDataManager::UniformHandle fRectUniform; 799 GrColor fColor;
752 GrGLProgramDataManager::UniformHandle fIntervalUniform; 800 UniformHandle fRectUniform;
753 SkRect fPrevRect; 801 UniformHandle fIntervalUniform;
754 SkScalar fPrevIntervalLength; 802 UniformHandle fColorUniform;
803 SkRect fPrevRect;
804 SkScalar fPrevIntervalLength;
755 typedef GrGLGeometryProcessor INHERITED; 805 typedef GrGLGeometryProcessor INHERITED;
756 }; 806 };
757 807
758 GLDashingLineEffect::GLDashingLineEffect(const GrGeometryProcessor&, 808 GLDashingLineEffect::GLDashingLineEffect(const GrGeometryProcessor&,
759 const GrBatchTracker&) { 809 const GrBatchTracker&) {
810 fColor = GrColor_ILLEGAL;
760 fPrevRect.fLeft = SK_ScalarNaN; 811 fPrevRect.fLeft = SK_ScalarNaN;
761 fPrevIntervalLength = SK_ScalarMax; 812 fPrevIntervalLength = SK_ScalarMax;
762 } 813 }
763 814
764 void GLDashingLineEffect::emitCode(const EmitArgs& args) { 815 void GLDashingLineEffect::emitCode(const EmitArgs& args) {
765 const DashingLineEffect& de = args.fGP.cast<DashingLineEffect>(); 816 const DashingLineEffect& de = args.fGP.cast<DashingLineEffect>();
817 const DashingLineBatchTracker& local = args.fBT.cast<DashingLineBatchTracker >();
818 GrGLGPBuilder* pb = args.fPB;
766 const char *rectName; 819 const char *rectName;
767 // The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bot tom - 0.5), 820 // The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bot tom - 0.5),
768 // respectively. 821 // respectively.
769 fRectUniform = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility , 822 fRectUniform = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility ,
770 kVec4f_GrSLType, kDefault_GrSLPrecision, 823 kVec4f_GrSLType, kDefault_GrSLPrecision,
771 "rect", 824 "rect",
772 &rectName); 825 &rectName);
773 const char *intervalName; 826 const char *intervalName;
774 // The interval uniform's refers to the total length of the interval (on + o ff) 827 // The interval uniform's refers to the total length of the interval (on + o ff)
775 fIntervalUniform = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibi lity, 828 fIntervalUniform = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibi lity,
776 kFloat_GrSLType, kDefault_GrSLPrecis ion, 829 kFloat_GrSLType, kDefault_GrSLPrecis ion,
777 "interval", 830 "interval",
778 &intervalName); 831 &intervalName);
779 832
780 833
781 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 834 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
782 835
783 GrGLVertToFrag v(kVec2f_GrSLType); 836 GrGLVertToFrag v(kVec2f_GrSLType);
784 args.fPB->addVarying("Coord", &v); 837 args.fPB->addVarying("Coord", &v);
785 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), de.inCoord()->fName); 838 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), de.inCoord()->fName);
786 839
840 // Setup pass through color
841 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NU LL, &fColorUniform);
842
787 // setup coord outputs 843 // setup coord outputs
788 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), de.inPositio n()->fName); 844 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), de.inPositio n()->fName);
789 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), de.inPosition() ->fName); 845 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), de.inPosition() ->fName);
790 846
791 // setup position varying 847 // setup position varying
792 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), vs Builder->uViewM(), 848 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), vs Builder->uViewM(),
793 de.inPosition()->fName); 849 de.inPosition()->fName);
794 850
795 // transforms all points so that we can compare them to our test rect 851 // transforms all points so that we can compare them to our test rect
796 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 852 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
(...skipping 14 matching lines...) Expand all
811 } else { 867 } else {
812 // Assuming the bounding geometry is tight so no need to check y values 868 // Assuming the bounding geometry is tight so no need to check y values
813 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); 869 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n");
814 fsBuilder->codeAppendf("\t\talpha *= (fragPosShifted.x - %s.x) > -0.5 ? 1.0 : 0.0;\n", rectName); 870 fsBuilder->codeAppendf("\t\talpha *= (fragPosShifted.x - %s.x) > -0.5 ? 1.0 : 0.0;\n", rectName);
815 fsBuilder->codeAppendf("\t\talpha *= (%s.z - fragPosShifted.x) >= -0.5 ? 1.0 : 0.0;\n", rectName); 871 fsBuilder->codeAppendf("\t\talpha *= (%s.z - fragPosShifted.x) >= -0.5 ? 1.0 : 0.0;\n", rectName);
816 } 872 }
817 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); 873 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
818 } 874 }
819 875
820 void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman, 876 void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman,
821 const GrGeometryProcessor& processor, 877 const GrPrimitiveProcessor& processor,
822 const GrBatchTracker&) { 878 const GrBatchTracker& bt) {
823 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); 879 const DashingLineEffect& de = processor.cast<DashingLineEffect>();
824 const SkRect& rect = de.getRect(); 880 const SkRect& rect = de.getRect();
825 SkScalar intervalLength = de.getIntervalLength(); 881 SkScalar intervalLength = de.getIntervalLength();
826 if (rect != fPrevRect || intervalLength != fPrevIntervalLength) { 882 if (rect != fPrevRect || intervalLength != fPrevIntervalLength) {
827 pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f, 883 pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f,
828 rect.fRight - 0.5f, rect.fBottom - 0.5f); 884 rect.fRight - 0.5f, rect.fBottom - 0.5f);
829 pdman.set1f(fIntervalUniform, intervalLength); 885 pdman.set1f(fIntervalUniform, intervalLength);
830 fPrevRect = rect; 886 fPrevRect = rect;
831 fPrevIntervalLength = intervalLength; 887 fPrevIntervalLength = intervalLength;
832 } 888 }
889
890 const DashingLineBatchTracker& local = bt.cast<DashingLineBatchTracker>();
891 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
892 GrGLfloat c[4];
893 GrColorToRGBAFloat(local.fColor, c);
894 pdman.set4fv(fColorUniform, 1, c);
895 fColor = local.fColor;
896 }
833 } 897 }
834 898
835 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& processor, 899 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& processor,
836 const GrBatchTracker&, 900 const GrBatchTracker& bt,
837 const GrGLCaps&, 901 const GrGLCaps&,
838 GrProcessorKeyBuilder* b) { 902 GrProcessorKeyBuilder* b) {
903 const DashingLineBatchTracker& local = bt.cast<DashingLineBatchTracker>();
839 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); 904 const DashingLineEffect& de = processor.cast<DashingLineEffect>();
840 b->add32(de.getEdgeType()); 905 b->add32(de.getEdgeType() << 16 | local.fInputColorType);
841 } 906 }
842 907
843 ////////////////////////////////////////////////////////////////////////////// 908 //////////////////////////////////////////////////////////////////////////////
844 909
845 GrGeometryProcessor* DashingLineEffect::Create(GrColor color, 910 GrGeometryProcessor* DashingLineEffect::Create(GrColor color,
846 GrPrimitiveEdgeType edgeType, 911 GrPrimitiveEdgeType edgeType,
847 const DashInfo& info, 912 const DashInfo& info,
848 SkScalar strokeWidth) { 913 SkScalar strokeWidth) {
849 if (info.fCount != 2) { 914 if (info.fCount != 2) {
850 return NULL; 915 return NULL;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 fRect.set(halfOffLen, -halfStroke, halfOffLen + onLen, halfStroke); 950 fRect.set(halfOffLen, -halfStroke, halfOffLen + onLen, halfStroke);
886 } 951 }
887 952
888 bool DashingLineEffect::onIsEqual(const GrGeometryProcessor& other) const { 953 bool DashingLineEffect::onIsEqual(const GrGeometryProcessor& other) const {
889 const DashingLineEffect& de = other.cast<DashingLineEffect>(); 954 const DashingLineEffect& de = other.cast<DashingLineEffect>();
890 return (fEdgeType == de.fEdgeType && 955 return (fEdgeType == de.fEdgeType &&
891 fRect == de.fRect && 956 fRect == de.fRect &&
892 fIntervalLength == de.fIntervalLength); 957 fIntervalLength == de.fIntervalLength);
893 } 958 }
894 959
960 void DashingLineEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const {
961 DashingLineBatchTracker* local = bt->cast<DashingLineBatchTracker>();
962 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in it, false);
963 }
964
965 bool DashingLineEffect::onCanMakeEqual(const GrBatchTracker& m, const GrBatchTra cker& t) const {
966 const DashingLineBatchTracker& mine = m.cast<DashingLineBatchTracker>();
967 const DashingLineBatchTracker& theirs = t.cast<DashingLineBatchTracker>();
968 return CanCombineOutput(mine.fInputColorType, mine.fColor,
969 theirs.fInputColorType, theirs.fColor);
970 }
971
895 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingLineEffect); 972 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingLineEffect);
896 973
897 GrGeometryProcessor* DashingLineEffect::TestCreate(SkRandom* random, 974 GrGeometryProcessor* DashingLineEffect::TestCreate(SkRandom* random,
898 GrContext*, 975 GrContext*,
899 const GrDrawTargetCaps& caps, 976 const GrDrawTargetCaps& caps,
900 GrTexture*[]) { 977 GrTexture*[]) {
901 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(random->next ULessThan( 978 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(random->next ULessThan(
902 kGrProcessorEdgeTypeCnt)); 979 kGrProcessorEdgeTypeCnt));
903 SkScalar strokeWidth = random->nextRangeScalar(0, 100.f); 980 SkScalar strokeWidth = random->nextRangeScalar(0, 100.f);
904 DashInfo info; 981 DashInfo info;
(...skipping 17 matching lines...) Expand all
922 switch (cap) { 999 switch (cap) {
923 case GrDashingEffect::kRound_DashCap: 1000 case GrDashingEffect::kRound_DashCap:
924 return DashingCircleEffect::Create(color, edgeType, info, SkScalarHa lf(strokeWidth)); 1001 return DashingCircleEffect::Create(color, edgeType, info, SkScalarHa lf(strokeWidth));
925 case GrDashingEffect::kNonRound_DashCap: 1002 case GrDashingEffect::kNonRound_DashCap:
926 return DashingLineEffect::Create(color, edgeType, info, strokeWidth) ; 1003 return DashingLineEffect::Create(color, edgeType, info, strokeWidth) ;
927 default: 1004 default:
928 SkFAIL("Unexpected dashed cap."); 1005 SkFAIL("Unexpected dashed cap.");
929 } 1006 }
930 return NULL; 1007 return NULL;
931 } 1008 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrBitmapTextGeoProc.cpp ('k') | src/gpu/effects/GrDistanceFieldTextureEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698