OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 "InstanceProcessor.h" | 8 #include "InstanceProcessor.h" |
9 | 9 |
10 #include "GrContext.h" | 10 #include "GrContext.h" |
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 | 554 |
555 void onEmitCode(GrGLSLVertexBuilder*, GrGLSLPPFragmentBuilder*, const char*, | 555 void onEmitCode(GrGLSLVertexBuilder*, GrGLSLPPFragmentBuilder*, const char*, |
556 const char*) override; | 556 const char*) override; |
557 | 557 |
558 typedef Backend INHERITED; | 558 typedef Backend INHERITED; |
559 }; | 559 }; |
560 | 560 |
561 void GLSLInstanceProcessor::BackendNonAA::onInit(GrGLSLVaryingHandler* varyingHa
ndler, | 561 void GLSLInstanceProcessor::BackendNonAA::onInit(GrGLSLVaryingHandler* varyingHa
ndler, |
562 GrGLSLVertexBuilder*) { | 562 GrGLSLVertexBuilder*) { |
563 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { | 563 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { |
564 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, kHigh_G
rSLPrecision); | 564 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, kLow_Gr
SLPrecision); |
565 varyingHandler->addVarying("arcCoords", &fArcCoords, kMedium_GrSLPrecisi
on); | 565 varyingHandler->addVarying("arcCoords", &fArcCoords, kMedium_GrSLPrecisi
on); |
566 } | 566 } |
567 } | 567 } |
568 | 568 |
569 void GLSLInstanceProcessor::BackendNonAA::setupRect(GrGLSLVertexBuilder* v) { | 569 void GLSLInstanceProcessor::BackendNonAA::setupRect(GrGLSLVertexBuilder* v) { |
570 if (fTriangleIsArc.vsOut()) { | 570 if (fTriangleIsArc.vsOut()) { |
571 v->codeAppendf("%s = 0;", fTriangleIsArc.vsOut()); | 571 v->codeAppendf("%s = 0;", fTriangleIsArc.vsOut()); |
572 } | 572 } |
573 } | 573 } |
574 | 574 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
731 kLow_GrSLPrecision); | 731 kLow_GrSLPrecision); |
732 if (kRect_ShapeFlag == fBatchInfo.fShapeTypes) { | 732 if (kRect_ShapeFlag == fBatchInfo.fShapeTypes) { |
733 fColor = fColorTimesRectCoverage; | 733 fColor = fColorTimesRectCoverage; |
734 } | 734 } |
735 } else { | 735 } else { |
736 varyingHandler->addVarying("rectCoverage", &fRectCoverage, kLow_GrSL
Precision); | 736 varyingHandler->addVarying("rectCoverage", &fRectCoverage, kLow_GrSL
Precision); |
737 } | 737 } |
738 v->codeAppend("float rectCoverage = 0.0;"); | 738 v->codeAppend("float rectCoverage = 0.0;"); |
739 } | 739 } |
740 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { | 740 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { |
741 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, kHigh_G
rSLPrecision); | 741 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, kLow_Gr
SLPrecision); |
742 if (!fShapeIsCircle) { | 742 if (!fShapeIsCircle) { |
743 varyingHandler->addVarying("ellipseCoords", &fEllipseCoords, kHigh_G
rSLPrecision); | 743 varyingHandler->addVarying("ellipseCoords", &fEllipseCoords, kMedium
_GrSLPrecision); |
744 varyingHandler->addFlatVarying("ellipseName", &fEllipseName, kHigh_G
rSLPrecision); | 744 varyingHandler->addFlatVarying("ellipseName", &fEllipseName, kHigh_G
rSLPrecision); |
745 } else { | 745 } else { |
746 varyingHandler->addVarying("circleCoords", &fEllipseCoords, kMedium_
GrSLPrecision); | 746 varyingHandler->addVarying("circleCoords", &fEllipseCoords, kMedium_
GrSLPrecision); |
747 varyingHandler->addFlatVarying("bloatedRadius", &fBloatedRadius, kMe
dium_GrSLPrecision); | 747 varyingHandler->addFlatVarying("bloatedRadius", &fBloatedRadius, kMe
dium_GrSLPrecision); |
748 } | 748 } |
749 } | 749 } |
750 } | 750 } |
751 | 751 |
752 void GLSLInstanceProcessor::BackendCoverage::setupRect(GrGLSLVertexBuilder* v) { | 752 void GLSLInstanceProcessor::BackendCoverage::setupRect(GrGLSLVertexBuilder* v) { |
753 // Make the border one pixel wide. Inner vs outer is indicated by coordAttrs
. | 753 // Make the border one pixel wide. Inner vs outer is indicated by coordAttrs
. |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
838 fEllipseName.vsOut()); | 838 fEllipseName.vsOut()); |
839 } | 839 } |
840 | 840 |
841 void GLSLInstanceProcessor::BackendCoverage::onInitInnerShape(GrGLSLVaryingHandl
er* varyingHandler, | 841 void GLSLInstanceProcessor::BackendCoverage::onInitInnerShape(GrGLSLVaryingHandl
er* varyingHandler, |
842 GrGLSLVertexBuilde
r* v) { | 842 GrGLSLVertexBuilde
r* v) { |
843 v->codeAppend("vec2 innerShapeHalfSize = shapeHalfSize / outer2Inner.xy;"); | 843 v->codeAppend("vec2 innerShapeHalfSize = shapeHalfSize / outer2Inner.xy;"); |
844 | 844 |
845 if (kOval_ShapeFlag == fBatchInfo.fInnerShapeTypes) { | 845 if (kOval_ShapeFlag == fBatchInfo.fInnerShapeTypes) { |
846 varyingHandler->addVarying("innerEllipseCoords", &fInnerEllipseCoords, | 846 varyingHandler->addVarying("innerEllipseCoords", &fInnerEllipseCoords, |
847 kMedium_GrSLPrecision); | 847 kMedium_GrSLPrecision); |
848 varyingHandler->addFlatVarying("innerEllipseName", &fInnerEllipseName, | 848 varyingHandler->addFlatVarying("innerEllipseName", &fInnerEllipseName, k
High_GrSLPrecision); |
849 kMedium_GrSLPrecision); | |
850 } else { | 849 } else { |
851 varyingHandler->addVarying("distanceToInnerEdge", &fDistanceToInnerEdge, | 850 varyingHandler->addVarying("distanceToInnerEdge", &fDistanceToInnerEdge, |
852 kMedium_GrSLPrecision); | 851 kMedium_GrSLPrecision); |
853 varyingHandler->addFlatVarying("innerShapeBloatedHalfSize", &fInnerShape
BloatedHalfSize, | 852 varyingHandler->addFlatVarying("innerShapeBloatedHalfSize", &fInnerShape
BloatedHalfSize, |
854 kMedium_GrSLPrecision); | 853 kMedium_GrSLPrecision); |
855 if (kRect_ShapeFlag != fBatchInfo.fInnerShapeTypes) { | 854 if (kRect_ShapeFlag != fBatchInfo.fInnerShapeTypes) { |
856 varyingHandler->addVarying("innerShapeCoords", &fInnerShapeCoords, k
High_GrSLPrecision); | 855 varyingHandler->addVarying("innerShapeCoords", &fInnerShapeCoords, |
| 856 kMedium_GrSLPrecision); |
857 varyingHandler->addFlatVarying("innerEllipseName", &fInnerEllipseNam
e, | 857 varyingHandler->addFlatVarying("innerEllipseName", &fInnerEllipseNam
e, |
858 kMedium_GrSLPrecision); | 858 kHigh_GrSLPrecision); |
859 varyingHandler->addFlatVarying("innerRRect", &fInnerRRect, kHigh_GrS
LPrecision); | 859 varyingHandler->addFlatVarying("innerRRect", &fInnerRRect, kMedium_G
rSLPrecision); |
860 } | 860 } |
861 } | 861 } |
862 } | 862 } |
863 | 863 |
864 void GLSLInstanceProcessor::BackendCoverage::setupInnerRect(GrGLSLVertexBuilder*
v) { | 864 void GLSLInstanceProcessor::BackendCoverage::setupInnerRect(GrGLSLVertexBuilder*
v) { |
865 if (fInnerRRect.vsOut()) { | 865 if (fInnerRRect.vsOut()) { |
866 // The fragment shader will generalize every inner shape as a round rect
. Since this one | 866 // The fragment shader will generalize every inner shape as a round rect
. Since this one |
867 // is a rect, we simply emit bogus parameters for the round rect (effect
ively negative | 867 // is a rect, we simply emit bogus parameters for the round rect (effect
ively negative |
868 // radii) that ensure the fragment shader always takes the "emitRect" co
depath. | 868 // radii) that ensure the fragment shader always takes the "emitRect" co
depath. |
869 v->codeAppendf("%s.xy = abs(outer2Inner.xy) * (1.0 + bloat) + abs(outer2
Inner.zw);", | 869 v->codeAppendf("%s.xy = abs(outer2Inner.xy) * (1.0 + bloat) + abs(outer2
Inner.zw);", |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
945 innerCoverageDecl.c_str()); | 945 innerCoverageDecl.c_str()); |
946 } else { | 946 } else { |
947 v->codeAppendf("%s = innerShapeCoords * innerShapeHalfSize;", | 947 v->codeAppendf("%s = innerShapeCoords * innerShapeHalfSize;", |
948 fDistanceToInnerEdge.vsOut()); | 948 fDistanceToInnerEdge.vsOut()); |
949 v->codeAppendf("%s = innerShapeHalfSize + 0.5;", fInnerShapeBloatedH
alfSize.vsOut()); | 949 v->codeAppendf("%s = innerShapeHalfSize + 0.5;", fInnerShapeBloatedH
alfSize.vsOut()); |
950 | 950 |
951 if (kRect_ShapeFlag == fBatchInfo.fInnerShapeTypes) { | 951 if (kRect_ShapeFlag == fBatchInfo.fInnerShapeTypes) { |
952 this->emitInnerRect(f, innerCoverageDecl.c_str()); | 952 this->emitInnerRect(f, innerCoverageDecl.c_str()); |
953 } else { | 953 } else { |
954 f->codeAppendf("%s = 0.0;", innerCoverageDecl.c_str()); | 954 f->codeAppendf("%s = 0.0;", innerCoverageDecl.c_str()); |
| 955 f->appendPrecisionModifier(kMedium_GrSLPrecision); |
955 f->codeAppendf("vec2 distanceToArcEdge = abs(%s) - %s.xy;", | 956 f->codeAppendf("vec2 distanceToArcEdge = abs(%s) - %s.xy;", |
956 fInnerShapeCoords.fsIn(), fInnerRRect.fsIn()); | 957 fInnerShapeCoords.fsIn(), fInnerRRect.fsIn()); |
957 f->codeAppend ("if (any(lessThan(distanceToArcEdge, vec2(1e-5)))
) {"); | 958 f->codeAppend ("if (any(lessThan(distanceToArcEdge, vec2(1e-5)))
) {"); |
958 this->emitInnerRect(f, "innerCoverage"); | 959 this->emitInnerRect(f, "innerCoverage"); |
959 f->codeAppend ("} else {"); | 960 f->codeAppend ("} else {"); |
| 961 f->appendPrecisionModifier(kMedium_GrSLPrecision); |
960 f->codeAppendf( "vec2 ellipseCoords = distanceToArcEdge * %s.
zw;", | 962 f->codeAppendf( "vec2 ellipseCoords = distanceToArcEdge * %s.
zw;", |
961 fInnerRRect.fsIn()); | 963 fInnerRRect.fsIn()); |
962 this->emitArc(f, "ellipseCoords", fInnerEllipseName.fsIn(), | 964 this->emitArc(f, "ellipseCoords", fInnerEllipseName.fsIn(), |
963 false /*ellipseCoordsNeedClamp*/, | 965 false /*ellipseCoordsNeedClamp*/, |
964 false /*ellipseCoordsMayBeNegative*/, "innerCovera
ge"); | 966 false /*ellipseCoordsMayBeNegative*/, "innerCovera
ge"); |
965 f->codeAppend ("}"); | 967 f->codeAppend ("}"); |
966 } | 968 } |
967 } | 969 } |
968 f->codeAppendf("%s = vec4(max(coverage - innerCoverage, 0.0));", outCove
rage); | 970 f->codeAppendf("%s = vec4(max(coverage - innerCoverage, 0.0));", outCove
rage); |
969 } else if (!fTweakAlphaForCoverage) { | 971 } else if (!fTweakAlphaForCoverage) { |
(...skipping 13 matching lines...) Expand all Loading... |
983 f->codeAppendf("%s = %s;", outCoverage, fRectCoverage.fsIn()); | 985 f->codeAppendf("%s = %s;", outCoverage, fRectCoverage.fsIn()); |
984 } else { | 986 } else { |
985 f->codeAppendf("%s = 1.0;", outCoverage); | 987 f->codeAppendf("%s = 1.0;", outCoverage); |
986 } | 988 } |
987 } | 989 } |
988 | 990 |
989 void GLSLInstanceProcessor::BackendCoverage::emitCircle(GrGLSLPPFragmentBuilder*
f, | 991 void GLSLInstanceProcessor::BackendCoverage::emitCircle(GrGLSLPPFragmentBuilder*
f, |
990 const char* outCoverage)
{ | 992 const char* outCoverage)
{ |
991 // TODO: circleCoords = max(circleCoords, 0) if we decide to do this optimiz
ation on rrects. | 993 // TODO: circleCoords = max(circleCoords, 0) if we decide to do this optimiz
ation on rrects. |
992 SkASSERT(!(kRRect_ShapesMask & fBatchInfo.fShapeTypes)); | 994 SkASSERT(!(kRRect_ShapesMask & fBatchInfo.fShapeTypes)); |
| 995 f->appendPrecisionModifier(kLow_GrSLPrecision); |
993 f->codeAppendf("float distanceToEdge = %s - length(%s);", | 996 f->codeAppendf("float distanceToEdge = %s - length(%s);", |
994 fBloatedRadius.fsIn(), fEllipseCoords.fsIn()); | 997 fBloatedRadius.fsIn(), fEllipseCoords.fsIn()); |
995 f->codeAppendf("%s = clamp(distanceToEdge, 0.0, 1.0);", outCoverage); | 998 f->codeAppendf("%s = clamp(distanceToEdge, 0.0, 1.0);", outCoverage); |
996 } | 999 } |
997 | 1000 |
998 void GLSLInstanceProcessor::BackendCoverage::emitArc(GrGLSLPPFragmentBuilder* f, | 1001 void GLSLInstanceProcessor::BackendCoverage::emitArc(GrGLSLPPFragmentBuilder* f, |
999 const char* ellipseCoords, | 1002 const char* ellipseCoords, |
1000 const char* ellipseName, | 1003 const char* ellipseName, |
1001 bool ellipseCoordsNeedClamp
, | 1004 bool ellipseCoordsNeedClamp
, |
1002 bool ellipseCoordsMayBeNega
tive, | 1005 bool ellipseCoordsMayBeNega
tive, |
1003 const char* outCoverage) { | 1006 const char* outCoverage) { |
1004 SkASSERT(!ellipseCoordsMayBeNegative || ellipseCoordsNeedClamp); | 1007 SkASSERT(!ellipseCoordsMayBeNegative || ellipseCoordsNeedClamp); |
1005 if (ellipseCoordsNeedClamp) { | 1008 if (ellipseCoordsNeedClamp) { |
1006 // This serves two purposes: | 1009 // This serves two purposes: |
1007 // - To restrict the arcs of rounded rects to their positive quadrants. | 1010 // - To restrict the arcs of rounded rects to their positive quadrants. |
1008 // - To avoid inversesqrt(0) in the ellipse formula. | 1011 // - To avoid inversesqrt(0) in the ellipse formula. |
| 1012 f->appendPrecisionModifier(kMedium_GrSLPrecision); |
1009 if (ellipseCoordsMayBeNegative) { | 1013 if (ellipseCoordsMayBeNegative) { |
1010 f->codeAppendf("vec2 ellipseClampedCoords = max(abs(%s), vec2(1e-4))
;", ellipseCoords); | 1014 f->codeAppendf("vec2 ellipseClampedCoords = max(abs(%s), vec2(1e-4))
;", ellipseCoords); |
1011 } else { | 1015 } else { |
1012 f->codeAppendf("vec2 ellipseClampedCoords = max(%s, vec2(1e-4));", e
llipseCoords); | 1016 f->codeAppendf("vec2 ellipseClampedCoords = max(%s, vec2(1e-4));", e
llipseCoords); |
1013 } | 1017 } |
1014 ellipseCoords = "ellipseClampedCoords"; | 1018 ellipseCoords = "ellipseClampedCoords"; |
1015 } | 1019 } |
1016 // ellipseCoords are in pixel space and ellipseName is 1 / rx^2, 1 / ry^2. | 1020 // ellipseCoords are in pixel space and ellipseName is 1 / rx^2, 1 / ry^2. |
| 1021 f->appendPrecisionModifier(kHigh_GrSLPrecision); |
1017 f->codeAppendf("vec2 Z = %s * %s;", ellipseCoords, ellipseName); | 1022 f->codeAppendf("vec2 Z = %s * %s;", ellipseCoords, ellipseName); |
1018 // implicit is the evaluation of (x/rx)^2 + (y/ry)^2 - 1. | 1023 // implicit is the evaluation of (x/rx)^2 + (y/ry)^2 - 1. |
| 1024 f->appendPrecisionModifier(kHigh_GrSLPrecision); |
1019 f->codeAppendf("float implicit = dot(Z, %s) - 1.0;", ellipseCoords); | 1025 f->codeAppendf("float implicit = dot(Z, %s) - 1.0;", ellipseCoords); |
1020 // gradDot is the squared length of the gradient of the implicit. | 1026 // gradDot is the squared length of the gradient of the implicit. |
| 1027 f->appendPrecisionModifier(kHigh_GrSLPrecision); |
1021 f->codeAppendf("float gradDot = 4.0 * dot(Z, Z);"); | 1028 f->codeAppendf("float gradDot = 4.0 * dot(Z, Z);"); |
1022 f->appendPrecisionModifier(kLow_GrSLPrecision); | 1029 f->appendPrecisionModifier(kMedium_GrSLPrecision); |
1023 f->codeAppend ("float approxDist = implicit * inversesqrt(gradDot);"); | 1030 f->codeAppend ("float approxDist = implicit * inversesqrt(gradDot);"); |
1024 f->codeAppendf("%s = clamp(0.5 - approxDist, 0.0, 1.0);", outCoverage); | 1031 f->codeAppendf("%s = clamp(0.5 - approxDist, 0.0, 1.0);", outCoverage); |
1025 } | 1032 } |
1026 | 1033 |
1027 void GLSLInstanceProcessor::BackendCoverage::emitInnerRect(GrGLSLPPFragmentBuild
er* f, | 1034 void GLSLInstanceProcessor::BackendCoverage::emitInnerRect(GrGLSLPPFragmentBuild
er* f, |
1028 const char* outCovera
ge) { | 1035 const char* outCovera
ge) { |
1029 f->appendPrecisionModifier(kLow_GrSLPrecision); | 1036 f->appendPrecisionModifier(kLow_GrSLPrecision); |
1030 f->codeAppendf("vec2 c = %s - abs(%s);", | 1037 f->codeAppendf("vec2 c = %s - abs(%s);", |
1031 fInnerShapeBloatedHalfSize.fsIn(), fDistanceToInnerEdge.fsIn(
)); | 1038 fInnerShapeBloatedHalfSize.fsIn(), fDistanceToInnerEdge.fsIn(
)); |
1032 f->codeAppendf("%s = clamp(min(c.x, c.y), 0.0, 1.0);", outCoverage); | 1039 f->codeAppendf("%s = clamp(min(c.x, c.y), 0.0, 1.0);", outCoverage); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 GrGLSLVertToFrag fFragInnerShapeHalfSpan; | 1112 GrGLSLVertToFrag fFragInnerShapeHalfSpan; |
1106 SkString fSquareFun; | 1113 SkString fSquareFun; |
1107 | 1114 |
1108 typedef Backend INHERITED; | 1115 typedef Backend INHERITED; |
1109 }; | 1116 }; |
1110 | 1117 |
1111 void GLSLInstanceProcessor::BackendMultisample::onInit(GrGLSLVaryingHandler* var
yingHandler, | 1118 void GLSLInstanceProcessor::BackendMultisample::onInit(GrGLSLVaryingHandler* var
yingHandler, |
1112 GrGLSLVertexBuilder* v) { | 1119 GrGLSLVertexBuilder* v) { |
1113 if (!this->isMixedSampled()) { | 1120 if (!this->isMixedSampled()) { |
1114 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { | 1121 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { |
1115 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, | 1122 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, kLo
w_GrSLPrecision); |
1116 kHigh_GrSLPrecision); | |
1117 varyingHandler->addVarying("arcCoords", &fArcCoords, kHigh_GrSLPreci
sion); | 1123 varyingHandler->addVarying("arcCoords", &fArcCoords, kHigh_GrSLPreci
sion); |
1118 if (!fBatchInfo.fHasPerspective) { | 1124 if (!fBatchInfo.fHasPerspective) { |
1119 varyingHandler->addFlatVarying("arcInverseMatrix", &fArcInverseM
atrix, | 1125 varyingHandler->addFlatVarying("arcInverseMatrix", &fArcInverseM
atrix, |
1120 kHigh_GrSLPrecision); | 1126 kHigh_GrSLPrecision); |
1121 varyingHandler->addFlatVarying("fragArcHalfSpan", &fFragArcHalfS
pan, | 1127 varyingHandler->addFlatVarying("fragArcHalfSpan", &fFragArcHalfS
pan, |
1122 kHigh_GrSLPrecision); | 1128 kHigh_GrSLPrecision); |
1123 } | 1129 } |
1124 } else if (!fBatchInfo.fInnerShapeTypes) { | 1130 } else if (!fBatchInfo.fInnerShapeTypes) { |
1125 return; | 1131 return; |
1126 } | 1132 } |
(...skipping 13 matching lines...) Expand all Loading... |
1140 kHigh_GrSLPrecision); | 1146 kHigh_GrSLPrecision); |
1141 varyingHandler->addFlatVarying("fragArcHalfSpan", &fFragArcHalfS
pan, | 1147 varyingHandler->addFlatVarying("fragArcHalfSpan", &fFragArcHalfS
pan, |
1142 kHigh_GrSLPrecision); | 1148 kHigh_GrSLPrecision); |
1143 } | 1149 } |
1144 } else if (fBatchInfo.fShapeTypes & kOval_ShapeFlag) { | 1150 } else if (fBatchInfo.fShapeTypes & kOval_ShapeFlag) { |
1145 fArcCoords = fShapeCoords; | 1151 fArcCoords = fShapeCoords; |
1146 fArcInverseMatrix = fShapeInverseMatrix; | 1152 fArcInverseMatrix = fShapeInverseMatrix; |
1147 fFragArcHalfSpan = fFragShapeHalfSpan; | 1153 fFragArcHalfSpan = fFragShapeHalfSpan; |
1148 if (fBatchInfo.fShapeTypes & kRect_ShapeFlag) { | 1154 if (fBatchInfo.fShapeTypes & kRect_ShapeFlag) { |
1149 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, | 1155 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, |
1150 kHigh_GrSLPrecision); | 1156 kLow_GrSLPrecision); |
1151 } | 1157 } |
1152 } | 1158 } |
1153 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { | 1159 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { |
1154 v->definef("SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1)
; | 1160 v->definef("SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1)
; |
1155 varyingHandler->addFlatVarying("earlyAccept", &fEarlyAccept, kHigh_Gr
SLPrecision); | 1161 varyingHandler->addFlatVarying("earlyAccept", &fEarlyAccept, kHigh_Gr
SLPrecision); |
1156 } | 1162 } |
1157 } | 1163 } |
1158 if (!fBatchInfo.fHasPerspective) { | 1164 if (!fBatchInfo.fHasPerspective) { |
1159 v->codeAppend("mat2 shapeInverseMatrix = inverse(mat2(shapeMatrix));"); | 1165 v->codeAppend("mat2 shapeInverseMatrix = inverse(mat2(shapeMatrix));"); |
1160 v->codeAppend("vec2 fragShapeSpan = abs(vec4(shapeInverseMatrix).xz) + " | 1166 v->codeAppend("vec2 fragShapeSpan = abs(vec4(shapeInverseMatrix).xz) + " |
(...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2087 | 2093 |
2088 case kCorneredRect_FirstIndex: return "basic_round_rect"; | 2094 case kCorneredRect_FirstIndex: return "basic_round_rect"; |
2089 case kCorneredFramedRect_FirstIndex: return "coverage_round_rect"; | 2095 case kCorneredFramedRect_FirstIndex: return "coverage_round_rect"; |
2090 case kCorneredRectFanned_FirstIndex: return "mixed_samples_round_rect"; | 2096 case kCorneredRectFanned_FirstIndex: return "mixed_samples_round_rect"; |
2091 | 2097 |
2092 default: return "unknown"; | 2098 default: return "unknown"; |
2093 } | 2099 } |
2094 } | 2100 } |
2095 | 2101 |
2096 } | 2102 } |
OLD | NEW |