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

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

Issue 664193002: Oval and stroke AA rect now batch (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 6 years, 2 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
« src/gpu/GrGpu.cpp ('K') | « src/gpu/GrOvalRenderer.h ('k') | no next file » | 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 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 "GrOvalRenderer.h" 8 #include "GrOvalRenderer.h"
9 9
10 #include "gl/builders/GrGLProgramBuilder.h" 10 #include "gl/builders/GrGLProgramBuilder.h"
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 490
491 if (!useCoverageAA) { 491 if (!useCoverageAA) {
492 return false; 492 return false;
493 } 493 }
494 494
495 const SkMatrix& vm = context->getMatrix(); 495 const SkMatrix& vm = context->getMatrix();
496 496
497 // we can draw circles 497 // we can draw circles
498 if (SkScalarNearlyEqual(oval.width(), oval.height()) 498 if (SkScalarNearlyEqual(oval.width(), oval.height())
499 && circle_stays_circle(vm)) { 499 && circle_stays_circle(vm)) {
500 this->drawCircle(target, useCoverageAA, oval, stroke); 500 this->drawCircle(target, context, useCoverageAA, oval, stroke);
501 // if we have shader derivative support, render as device-independent 501 // if we have shader derivative support, render as device-independent
502 } else if (target->caps()->shaderDerivativeSupport()) { 502 } else if (target->caps()->shaderDerivativeSupport()) {
503 return this->drawDIEllipse(target, useCoverageAA, oval, stroke); 503 return this->drawDIEllipse(target, context, useCoverageAA, oval, stroke) ;
504 // otherwise axis-aligned ellipses only 504 // otherwise axis-aligned ellipses only
505 } else if (vm.rectStaysRect()) { 505 } else if (vm.rectStaysRect()) {
506 return this->drawEllipse(target, useCoverageAA, oval, stroke); 506 return this->drawEllipse(target, context, useCoverageAA, oval, stroke);
507 } else { 507 } else {
508 return false; 508 return false;
509 } 509 }
510 510
511 return true; 511 return true;
512 } 512 }
513 513
514 /////////////////////////////////////////////////////////////////////////////// 514 ///////////////////////////////////////////////////////////////////////////////
515 515
516 // position + edge 516 // position + edge
517 extern const GrVertexAttrib gCircleVertexAttribs[] = { 517 extern const GrVertexAttrib gCircleVertexAttribs[] = {
518 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding }, 518 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding },
519 {kVec4f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexAttr ibBinding} 519 {kVec4f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexAttr ibBinding}
520 }; 520 };
521 521
522 void GrOvalRenderer::drawCircle(GrDrawTarget* target, 522 void GrOvalRenderer::drawCircle(GrDrawTarget* target,
523 const GrContext* context,
523 bool useCoverageAA, 524 bool useCoverageAA,
524 const SkRect& circle, 525 const SkRect& circle,
525 const SkStrokeRec& stroke) 526 const SkStrokeRec& stroke)
526 { 527 {
527 GrDrawState* drawState = target->drawState(); 528 GrDrawState* drawState = target->drawState();
528 529
529 const SkMatrix& vm = drawState->getViewMatrix(); 530 const SkMatrix& vm = drawState->getViewMatrix();
530 SkPoint center = SkPoint::Make(circle.centerX(), circle.centerY()); 531 SkPoint center = SkPoint::Make(circle.centerX(), circle.centerY());
531 vm.mapPoints(&center, 1); 532 vm.mapPoints(&center, 1);
532 SkScalar radius = vm.mapRadius(SkScalarHalf(circle.width())); 533 SkScalar radius = vm.mapRadius(SkScalarHalf(circle.width()));
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 center.fY - outerRadius, 585 center.fY - outerRadius,
585 center.fX + outerRadius, 586 center.fX + outerRadius,
586 center.fY + outerRadius 587 center.fY + outerRadius
587 ); 588 );
588 589
589 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); 590 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop);
590 verts[0].fOffset = SkPoint::Make(-outerRadius, -outerRadius); 591 verts[0].fOffset = SkPoint::Make(-outerRadius, -outerRadius);
591 verts[0].fOuterRadius = outerRadius; 592 verts[0].fOuterRadius = outerRadius;
592 verts[0].fInnerRadius = innerRadius; 593 verts[0].fInnerRadius = innerRadius;
593 594
594 verts[1].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); 595 verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
595 verts[1].fOffset = SkPoint::Make(outerRadius, -outerRadius); 596 verts[1].fOffset = SkPoint::Make(-outerRadius, outerRadius);
596 verts[1].fOuterRadius = outerRadius; 597 verts[1].fOuterRadius = outerRadius;
597 verts[1].fInnerRadius = innerRadius; 598 verts[1].fInnerRadius = innerRadius;
598 599
599 verts[2].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); 600 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
600 verts[2].fOffset = SkPoint::Make(-outerRadius, outerRadius); 601 verts[2].fOffset = SkPoint::Make(outerRadius, outerRadius);
601 verts[2].fOuterRadius = outerRadius; 602 verts[2].fOuterRadius = outerRadius;
602 verts[2].fInnerRadius = innerRadius; 603 verts[2].fInnerRadius = innerRadius;
603 604
604 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); 605 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
605 verts[3].fOffset = SkPoint::Make(outerRadius, outerRadius); 606 verts[3].fOffset = SkPoint::Make(outerRadius, -outerRadius);
606 verts[3].fOuterRadius = outerRadius; 607 verts[3].fOuterRadius = outerRadius;
607 verts[3].fInnerRadius = innerRadius; 608 verts[3].fInnerRadius = innerRadius;
608 609
609 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds); 610 target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer());
611 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
612 target->resetIndexSource();
610 } 613 }
611 614
612 /////////////////////////////////////////////////////////////////////////////// 615 ///////////////////////////////////////////////////////////////////////////////
613 616
614 // position + offset + 1/radii 617 // position + offset + 1/radii
615 extern const GrVertexAttrib gEllipseVertexAttribs[] = { 618 extern const GrVertexAttrib gEllipseVertexAttribs[] = {
616 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindi ng}, 619 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindi ng},
617 {kVec2f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexAt tribBinding}, 620 {kVec2f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexAt tribBinding},
618 {kVec4f_GrVertexAttribType, 2*sizeof(SkPoint), kGeometryProcessor_GrVertexAt tribBinding} 621 {kVec4f_GrVertexAttribType, 2*sizeof(SkPoint), kGeometryProcessor_GrVertexAt tribBinding}
619 }; 622 };
620 623
621 // position + offsets 624 // position + offsets
622 extern const GrVertexAttrib gDIEllipseVertexAttribs[] = { 625 extern const GrVertexAttrib gDIEllipseVertexAttribs[] = {
623 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindi ng}, 626 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindi ng},
624 {kVec2f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexAt tribBinding}, 627 {kVec2f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexAt tribBinding},
625 {kVec2f_GrVertexAttribType, 2*sizeof(SkPoint), kGeometryProcessor_GrVertexAt tribBinding}, 628 {kVec2f_GrVertexAttribType, 2*sizeof(SkPoint), kGeometryProcessor_GrVertexAt tribBinding},
626 }; 629 };
627 630
628 bool GrOvalRenderer::drawEllipse(GrDrawTarget* target, 631 bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
632 const GrContext* context,
629 bool useCoverageAA, 633 bool useCoverageAA,
630 const SkRect& ellipse, 634 const SkRect& ellipse,
631 const SkStrokeRec& stroke) 635 const SkStrokeRec& stroke)
632 { 636 {
633 GrDrawState* drawState = target->drawState(); 637 GrDrawState* drawState = target->drawState();
634 #ifdef SK_DEBUG 638 #ifdef SK_DEBUG
635 { 639 {
636 // we should have checked for this previously 640 // we should have checked for this previously
637 bool isAxisAlignedEllipse = drawState->getViewMatrix().rectStaysRect(); 641 bool isAxisAlignedEllipse = drawState->getViewMatrix().rectStaysRect();
638 SkASSERT(useCoverageAA && isAxisAlignedEllipse); 642 SkASSERT(useCoverageAA && isAxisAlignedEllipse);
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 center.fY - yRadius, 734 center.fY - yRadius,
731 center.fX + xRadius, 735 center.fX + xRadius,
732 center.fY + yRadius 736 center.fY + yRadius
733 ); 737 );
734 738
735 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); 739 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop);
736 verts[0].fOffset = SkPoint::Make(-xRadius, -yRadius); 740 verts[0].fOffset = SkPoint::Make(-xRadius, -yRadius);
737 verts[0].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); 741 verts[0].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
738 verts[0].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); 742 verts[0].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
739 743
740 verts[1].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); 744 verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
741 verts[1].fOffset = SkPoint::Make(xRadius, -yRadius); 745 verts[1].fOffset = SkPoint::Make(-xRadius, yRadius);
742 verts[1].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); 746 verts[1].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
743 verts[1].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); 747 verts[1].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
744 748
745 verts[2].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); 749 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
746 verts[2].fOffset = SkPoint::Make(-xRadius, yRadius); 750 verts[2].fOffset = SkPoint::Make(xRadius, yRadius);
747 verts[2].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); 751 verts[2].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
748 verts[2].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); 752 verts[2].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
749 753
750 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); 754 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
751 verts[3].fOffset = SkPoint::Make(xRadius, yRadius); 755 verts[3].fOffset = SkPoint::Make(xRadius, -yRadius);
752 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); 756 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
753 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); 757 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
754 758
755 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds); 759 target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer());
760 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
761 target->resetIndexSource();
756 762
757 return true; 763 return true;
758 } 764 }
759 765
760 bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target, 766 bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
767 const GrContext* context,
761 bool useCoverageAA, 768 bool useCoverageAA,
762 const SkRect& ellipse, 769 const SkRect& ellipse,
763 const SkStrokeRec& stroke) 770 const SkStrokeRec& stroke)
764 { 771 {
765 GrDrawState* drawState = target->drawState(); 772 GrDrawState* drawState = target->drawState();
766 const SkMatrix& vm = drawState->getViewMatrix(); 773 const SkMatrix& vm = drawState->getViewMatrix();
767 774
768 SkPoint center = SkPoint::Make(ellipse.centerX(), ellipse.centerY()); 775 SkPoint center = SkPoint::Make(ellipse.centerX(), ellipse.centerY());
769 SkScalar xRadius = SkScalarHalf(ellipse.width()); 776 SkScalar xRadius = SkScalarHalf(ellipse.width());
770 SkScalar yRadius = SkScalarHalf(ellipse.height()); 777 SkScalar yRadius = SkScalarHalf(ellipse.height());
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 center.fX - xRadius - geoDx, 851 center.fX - xRadius - geoDx,
845 center.fY - yRadius - geoDy, 852 center.fY - yRadius - geoDy,
846 center.fX + xRadius + geoDx, 853 center.fX + xRadius + geoDx,
847 center.fY + yRadius + geoDy 854 center.fY + yRadius + geoDy
848 ); 855 );
849 856
850 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); 857 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop);
851 verts[0].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, -1.0f - offsetDy); 858 verts[0].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, -1.0f - offsetDy);
852 verts[0].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, -innerRatioY - offsetDy); 859 verts[0].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, -innerRatioY - offsetDy);
853 860
854 verts[1].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); 861 verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
855 verts[1].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offsetDy); 862 verts[1].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, 1.0f + offsetDy);
856 verts[1].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -innerRatioY - offsetDy); 863 verts[1].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, innerRatioY + offsetDy);
857 864
858 verts[2].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); 865 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
859 verts[2].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, 1.0f + offsetDy); 866 verts[2].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offsetDy);
860 verts[2].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, innerRatioY + offsetDy); 867 verts[2].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerRatioY + offsetDy);
861 868
862 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); 869 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
863 verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offsetDy); 870 verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offsetDy);
864 verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerRatioY + offsetDy); 871 verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -innerRatioY - offsetDy);
865 872
866 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds); 873 target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer());
874 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
875 target->resetIndexSource();
867 876
868 return true; 877 return true;
869 } 878 }
870 879
871 /////////////////////////////////////////////////////////////////////////////// 880 ///////////////////////////////////////////////////////////////////////////////
872 881
873 static const uint16_t gRRectIndices[] = { 882 static const uint16_t gRRectIndices[] = {
874 // corners 883 // corners
875 0, 1, 5, 0, 5, 4, 884 0, 1, 5, 0, 5, 4,
876 2, 3, 7, 2, 7, 6, 885 2, 3, 7, 2, 7, 6,
877 8, 9, 13, 8, 13, 12, 886 8, 9, 13, 8, 13, 12,
878 10, 11, 15, 10, 15, 14, 887 10, 11, 15, 10, 15, 14,
879 888
880 // edges 889 // edges
881 1, 2, 6, 1, 6, 5, 890 1, 2, 6, 1, 6, 5,
882 4, 5, 9, 4, 9, 8, 891 4, 5, 9, 4, 9, 8,
883 6, 7, 11, 6, 11, 10, 892 6, 7, 11, 6, 11, 10,
884 9, 10, 14, 9, 14, 13, 893 9, 10, 14, 9, 14, 13,
885 894
886 // center 895 // center
887 // we place this at the end so that we can ignore these indices when renderi ng stroke-only 896 // we place this at the end so that we can ignore these indices when renderi ng stroke-only
888 5, 6, 10, 5, 10, 9 897 5, 6, 10, 5, 10, 9
889 }; 898 };
890 899
900 static const int kIndicesPerStrokeRRect = SK_ARRAY_COUNT(gRRectIndices) - 6;
901 static const int kIndicesPerRRect = SK_ARRAY_COUNT(gRRectIndices);
902 static const int kVertsPerRRect = 16;
903 static const int kNumRRectsInIndexBuffer = 256;
891 904
892 GrIndexBuffer* GrOvalRenderer::rRectIndexBuffer(GrGpu* gpu) { 905 GrIndexBuffer* GrOvalRenderer::rRectIndexBuffer(bool isStrokeOnly, GrGpu* gpu) {
893 if (NULL == fRRectIndexBuffer) { 906 if (isStrokeOnly) {
894 fRRectIndexBuffer = 907 if (NULL == fStrokeRRectIndexBuffer) {
895 gpu->createIndexBuffer(sizeof(gRRectIndices), false); 908 fStrokeRRectIndexBuffer = gpu->createIndexBufferPattern(gRRectIndice s,
896 if (fRRectIndexBuffer) { 909 kIndicesPerS trokeRRect,
897 #ifdef SK_DEBUG 910 kNumRRectsIn IndexBuffer,
898 bool updated = 911 kVertsPerRRe ct);
899 #endif
900 fRRectIndexBuffer->updateData(gRRectIndices,
901 sizeof(gRRectIndices));
902 GR_DEBUGASSERT(updated);
903 } 912 }
913 return fStrokeRRectIndexBuffer;
914 } else {
915 if (NULL == fRRectIndexBuffer) {
916 fRRectIndexBuffer = gpu->createIndexBufferPattern(gRRectIndices,
917 kIndicesPerRRect,
918 kNumRRectsInIndexB uffer,
919 kVertsPerRRect);
920 }
921 return fRRectIndexBuffer;
904 } 922 }
905 return fRRectIndexBuffer;
906 } 923 }
907 924
908 bool GrOvalRenderer::drawDRRect(GrDrawTarget* target, GrContext* context, bool u seAA, 925 bool GrOvalRenderer::drawDRRect(GrDrawTarget* target, GrContext* context, bool u seAA,
909 const SkRRect& origOuter, const SkRRect& origInn er) { 926 const SkRRect& origOuter, const SkRRect& origInn er) {
910 bool applyAA = useAA && 927 bool applyAA = useAA &&
911 !target->getDrawState().getRenderTarget()->isMultisampled() & & 928 !target->getDrawState().getRenderTarget()->isMultisampled() & &
912 !target->shouldDisableCoverageAAForBlend(); 929 !target->shouldDisableCoverageAAForBlend();
913 GrDrawState::AutoRestoreEffects are; 930 GrDrawState::AutoRestoreEffects are;
914 if (!origInner.isEmpty()) { 931 if (!origInner.isEmpty()) {
915 SkTCopyOnFirstWrite<SkRRect> inner(origInner); 932 SkTCopyOnFirstWrite<SkRRect> inner(origInner);
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 return false; 1047 return false;
1031 } 1048 }
1032 1049
1033 // reset to device coordinates 1050 // reset to device coordinates
1034 GrDrawState* drawState = target->drawState(); 1051 GrDrawState* drawState = target->drawState();
1035 GrDrawState::AutoViewMatrixRestore avmr; 1052 GrDrawState::AutoViewMatrixRestore avmr;
1036 if (!avmr.setIdentity(drawState)) { 1053 if (!avmr.setIdentity(drawState)) {
1037 return false; 1054 return false;
1038 } 1055 }
1039 1056
1040 GrIndexBuffer* indexBuffer = this->rRectIndexBuffer(context->getGpu()); 1057 GrIndexBuffer* indexBuffer = this->rRectIndexBuffer(isStrokeOnly, context->g etGpu());
1041 if (NULL == indexBuffer) { 1058 if (NULL == indexBuffer) {
1042 GrPrintf("Failed to create index buffer!\n"); 1059 GrPrintf("Failed to create index buffer!\n");
1043 return false; 1060 return false;
1044 } 1061 }
1045 1062
1046 // if the corners are circles, use the circle renderer 1063 // if the corners are circles, use the circle renderer
1047 if ((!hasStroke || scaledStroke.fX == scaledStroke.fY) && xRadius == yRadius ) { 1064 if ((!hasStroke || scaledStroke.fX == scaledStroke.fY) && xRadius == yRadius ) {
1048 drawState->setVertexAttribs<gCircleVertexAttribs>(SK_ARRAY_COUNT(gCircle VertexAttribs), 1065 drawState->setVertexAttribs<gCircleVertexAttribs>(SK_ARRAY_COUNT(gCircle VertexAttribs),
1049 sizeof(CircleVertex)); 1066 sizeof(CircleVertex));
1050 1067
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1122 verts->fOffset = SkPoint::Make(outerRadius, yOuterRadii[i]); 1139 verts->fOffset = SkPoint::Make(outerRadius, yOuterRadii[i]);
1123 verts->fOuterRadius = outerRadius; 1140 verts->fOuterRadius = outerRadius;
1124 verts->fInnerRadius = innerRadius; 1141 verts->fInnerRadius = innerRadius;
1125 verts++; 1142 verts++;
1126 } 1143 }
1127 1144
1128 // drop out the middle quad if we're stroked 1145 // drop out the middle quad if we're stroked
1129 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : 1146 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
1130 SK_ARRAY_COUNT(gRRectIndices); 1147 SK_ARRAY_COUNT(gRRectIndices);
1131 target->setIndexSourceToBuffer(indexBuffer); 1148 target->setIndexSourceToBuffer(indexBuffer);
1132 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou nds); 1149 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 16, indexCnt , &bounds);
1133 1150
1134 // otherwise we use the ellipse renderer 1151 // otherwise we use the ellipse renderer
1135 } else { 1152 } else {
1136 drawState->setVertexAttribs<gEllipseVertexAttribs>(SK_ARRAY_COUNT(gEllip seVertexAttribs), 1153 drawState->setVertexAttribs<gEllipseVertexAttribs>(SK_ARRAY_COUNT(gEllip seVertexAttribs),
1137 sizeof(EllipseVertex) ); 1154 sizeof(EllipseVertex) );
1138 1155
1139 SkScalar innerXRadius = 0.0f; 1156 SkScalar innerXRadius = 0.0f;
1140 SkScalar innerYRadius = 0.0f; 1157 SkScalar innerYRadius = 0.0f;
1141 if (hasStroke) { 1158 if (hasStroke) {
1142 if (SkScalarNearlyZero(scaledStroke.length())) { 1159 if (SkScalarNearlyZero(scaledStroke.length())) {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1229 verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]); 1246 verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]);
1230 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); 1247 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
1231 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); 1248 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
1232 verts++; 1249 verts++;
1233 } 1250 }
1234 1251
1235 // drop out the middle quad if we're stroked 1252 // drop out the middle quad if we're stroked
1236 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : 1253 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
1237 SK_ARRAY_COUNT(gRRectIndices); 1254 SK_ARRAY_COUNT(gRRectIndices);
1238 target->setIndexSourceToBuffer(indexBuffer); 1255 target->setIndexSourceToBuffer(indexBuffer);
1239 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou nds); 1256 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 16, indexCnt , &bounds);
1240 } 1257 }
1241 1258
1259 target->resetIndexSource();
1242 return true; 1260 return true;
1243 } 1261 }
OLDNEW
« src/gpu/GrGpu.cpp ('K') | « src/gpu/GrOvalRenderer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698