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

Side by Side Diff: src/gpu/GrAAConvexPathRenderer.cpp

Issue 815553003: Move ViewMatrix off of drawstate (Closed) Base URL: https://skia.googlesource.com/skia.git@remove-fragment-stage
Patch Set: more claenup Created 5 years, 11 months 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
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2012 Google Inc. 3 * Copyright 2012 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "GrAAConvexPathRenderer.h" 9 #include "GrAAConvexPathRenderer.h"
10 10
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 * distance with negative being inside, positive outside. The edge is specified in 498 * distance with negative being inside, positive outside. The edge is specified in
499 * window space (y-down). If either the third or fourth component of the interpo lated 499 * window space (y-down). If either the third or fourth component of the interpo lated
500 * vertex coord is > 0 then the pixel is considered outside the edge. This is us ed to 500 * vertex coord is > 0 then the pixel is considered outside the edge. This is us ed to
501 * attempt to trim to a portion of the infinite quad. 501 * attempt to trim to a portion of the infinite quad.
502 * Requires shader derivative instruction support. 502 * Requires shader derivative instruction support.
503 */ 503 */
504 504
505 class QuadEdgeEffect : public GrGeometryProcessor { 505 class QuadEdgeEffect : public GrGeometryProcessor {
506 public: 506 public:
507 507
508 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& localMatri x) { 508 static GrGeometryProcessor* Create(GrColor color,
509 return SkNEW_ARGS(QuadEdgeEffect, (color, localMatrix)); 509 const SkMatrix& viewMatrix,
510 const SkMatrix& localMatrix) {
511 return SkNEW_ARGS(QuadEdgeEffect, (color, viewMatrix, localMatrix));
510 } 512 }
511 513
512 virtual ~QuadEdgeEffect() {} 514 virtual ~QuadEdgeEffect() {}
513 515
514 virtual const char* name() const SK_OVERRIDE { return "QuadEdge"; } 516 virtual const char* name() const SK_OVERRIDE { return "QuadEdge"; }
515 517
516 const GrAttribute* inPosition() const { return fInPosition; } 518 const GrAttribute* inPosition() const { return fInPosition; }
517 const GrAttribute* inQuadEdge() const { return fInQuadEdge; } 519 const GrAttribute* inQuadEdge() const { return fInQuadEdge; }
518 520
519 class GLProcessor : public GrGLGeometryProcessor { 521 class GLProcessor : public GrGLGeometryProcessor {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 const GrBatchTracker& t) const SK_OVERRIDE { 621 const GrBatchTracker& t) const SK_OVERRIDE {
620 const BatchTracker& mine = m.cast<BatchTracker>(); 622 const BatchTracker& mine = m.cast<BatchTracker>();
621 const BatchTracker& theirs = t.cast<BatchTracker>(); 623 const BatchTracker& theirs = t.cast<BatchTracker>();
622 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, 624 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords,
623 that, theirs.fUsesLocalCoords) && 625 that, theirs.fUsesLocalCoords) &&
624 CanCombineOutput(mine.fInputColorType, mine.fColor, 626 CanCombineOutput(mine.fInputColorType, mine.fColor,
625 theirs.fInputColorType, theirs.fColor); 627 theirs.fInputColorType, theirs.fColor);
626 } 628 }
627 629
628 private: 630 private:
629 QuadEdgeEffect(GrColor color, const SkMatrix& localMatrix) 631 QuadEdgeEffect(GrColor color, const SkMatrix& viewMatrix, const SkMatrix& lo calMatrix)
630 : INHERITED(color, false, localMatrix) { 632 : INHERITED(color, viewMatrix, localMatrix) {
631 this->initClassID<QuadEdgeEffect>(); 633 this->initClassID<QuadEdgeEffect>();
632 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr VertexAttribType)); 634 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr VertexAttribType));
633 fInQuadEdge = &this->addVertexAttrib(GrAttribute("inQuadEdge", kVec4f_Gr VertexAttribType)); 635 fInQuadEdge = &this->addVertexAttrib(GrAttribute("inQuadEdge", kVec4f_Gr VertexAttribType));
634 } 636 }
635 637
636 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { 638 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE {
637 return true; 639 return true;
638 } 640 }
639 641
640 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE { 642 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE {
(...skipping 16 matching lines...) Expand all
657 659
658 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(QuadEdgeEffect); 660 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(QuadEdgeEffect);
659 661
660 GrGeometryProcessor* QuadEdgeEffect::TestCreate(SkRandom* random, 662 GrGeometryProcessor* QuadEdgeEffect::TestCreate(SkRandom* random,
661 GrContext*, 663 GrContext*,
662 const GrDrawTargetCaps& caps, 664 const GrDrawTargetCaps& caps,
663 GrTexture*[]) { 665 GrTexture*[]) {
664 // Doesn't work without derivative instructions. 666 // Doesn't work without derivative instructions.
665 return caps.shaderDerivativeSupport() ? 667 return caps.shaderDerivativeSupport() ?
666 QuadEdgeEffect::Create(GrRandomColor(random), 668 QuadEdgeEffect::Create(GrRandomColor(random),
669 GrProcessorUnitTest::TestMatrix(random),
667 GrProcessorUnitTest::TestMatrix(random)) : NUL L; 670 GrProcessorUnitTest::TestMatrix(random)) : NUL L;
668 } 671 }
669 672
670 /////////////////////////////////////////////////////////////////////////////// 673 ///////////////////////////////////////////////////////////////////////////////
671 674
672 bool GrAAConvexPathRenderer::canDrawPath(const GrDrawTarget* target, 675 bool GrAAConvexPathRenderer::canDrawPath(const GrDrawTarget* target,
673 const GrDrawState*, 676 const GrDrawState*,
677 const SkMatrix& viewMatrix,
674 const SkPath& path, 678 const SkPath& path,
675 const SkStrokeRec& stroke, 679 const SkStrokeRec& stroke,
676 bool antiAlias) const { 680 bool antiAlias) const {
677 return (target->caps()->shaderDerivativeSupport() && antiAlias && 681 return (target->caps()->shaderDerivativeSupport() && antiAlias &&
678 stroke.isFillStyle() && !path.isInverseFillType() && path.isConvex() ); 682 stroke.isFillStyle() && !path.isInverseFillType() && path.isConvex() );
679 } 683 }
680 684
681 bool GrAAConvexPathRenderer::onDrawPath(GrDrawTarget* target, 685 bool GrAAConvexPathRenderer::onDrawPath(GrDrawTarget* target,
682 GrDrawState* drawState, 686 GrDrawState* drawState,
683 GrColor color, 687 GrColor color,
688 const SkMatrix& vm,
684 const SkPath& origPath, 689 const SkPath& origPath,
685 const SkStrokeRec&, 690 const SkStrokeRec&,
686 bool antiAlias) { 691 bool antiAlias) {
687 692
688 const SkPath* path = &origPath; 693 const SkPath* path = &origPath;
689 if (path->isEmpty()) { 694 if (path->isEmpty()) {
690 return true; 695 return true;
691 } 696 }
692 697
693 SkMatrix viewMatrix = drawState->getViewMatrix(); 698 SkMatrix viewMatrix = vm;
694 SkMatrix invert; 699 SkMatrix invert;
695 if (!viewMatrix.invert(&invert)) { 700 if (!viewMatrix.invert(&invert)) {
696 return false; 701 return false;
697 } 702 }
698 703
699 GrDrawState::AutoViewMatrixRestore avmr(drawState);
700
701 // We use the fact that SkPath::transform path does subdivision based on 704 // We use the fact that SkPath::transform path does subdivision based on
702 // perspective. Otherwise, we apply the view matrix when copying to the 705 // perspective. Otherwise, we apply the view matrix when copying to the
703 // segment representation. 706 // segment representation.
704 SkPath tmpPath; 707 SkPath tmpPath;
705 if (viewMatrix.hasPerspective()) { 708 if (viewMatrix.hasPerspective()) {
706 origPath.transform(viewMatrix, &tmpPath); 709 origPath.transform(viewMatrix, &tmpPath);
707 path = &tmpPath; 710 path = &tmpPath;
708 viewMatrix = SkMatrix::I(); 711 viewMatrix = SkMatrix::I();
709 } 712 }
710 713
(...skipping 12 matching lines...) Expand all
723 // We can't simply use the path bounds because we may degenerate cubics to q uads which produces 726 // We can't simply use the path bounds because we may degenerate cubics to q uads which produces
724 // new control points outside the original convex hull. 727 // new control points outside the original convex hull.
725 SkRect devBounds; 728 SkRect devBounds;
726 if (!get_segments(*path, viewMatrix, &segments, &fanPt, &vCount, &iCount, &d evBounds)) { 729 if (!get_segments(*path, viewMatrix, &segments, &fanPt, &vCount, &iCount, &d evBounds)) {
727 return false; 730 return false;
728 } 731 }
729 732
730 // Our computed verts should all be within one pixel of the segment control points. 733 // Our computed verts should all be within one pixel of the segment control points.
731 devBounds.outset(SK_Scalar1, SK_Scalar1); 734 devBounds.outset(SK_Scalar1, SK_Scalar1);
732 735
733 SkAutoTUnref<GrGeometryProcessor> quadProcessor(QuadEdgeEffect::Create(color , invert)); 736 SkAutoTUnref<GrGeometryProcessor> quadProcessor(QuadEdgeEffect::Create(color ,
737 SkMat rix::I(),
738 inver t));
734 739
735 GrDrawTarget::AutoReleaseGeometry arg(target, vCount, quadProcessor->getVert exStride(), iCount); 740 GrDrawTarget::AutoReleaseGeometry arg(target, vCount, quadProcessor->getVert exStride(), iCount);
736 SkASSERT(quadProcessor->getVertexStride() == sizeof(QuadVertex)); 741 SkASSERT(quadProcessor->getVertexStride() == sizeof(QuadVertex));
737 if (!arg.succeeded()) { 742 if (!arg.succeeded()) {
738 return false; 743 return false;
739 } 744 }
740 verts = reinterpret_cast<QuadVertex*>(arg.vertices()); 745 verts = reinterpret_cast<QuadVertex*>(arg.vertices());
741 idxs = reinterpret_cast<uint16_t*>(arg.indices()); 746 idxs = reinterpret_cast<uint16_t*>(arg.indices());
742 747
743 SkSTArray<kPreallocDrawCnt, Draw, true> draws; 748 SkSTArray<kPreallocDrawCnt, Draw, true> draws;
(...skipping 20 matching lines...) Expand all
764 vOffset, // start vertex 769 vOffset, // start vertex
765 0, // start index 770 0, // start index
766 draw.fVertexCnt, 771 draw.fVertexCnt,
767 draw.fIndexCnt, 772 draw.fIndexCnt,
768 &devBounds); 773 &devBounds);
769 vOffset += draw.fVertexCnt; 774 vOffset += draw.fVertexCnt;
770 } 775 }
771 776
772 return true; 777 return true;
773 } 778 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698