OLD | NEW |
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 "GrBatch.h" | 10 #include "GrBatch.h" |
(...skipping 848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
859 | 859 |
860 // x refers to circle radius - 0.5, y refers to cicle's center x coord | 860 // x refers to circle radius - 0.5, y refers to cicle's center x coord |
861 GrGLVertToFrag circleParams(kVec2f_GrSLType); | 861 GrGLVertToFrag circleParams(kVec2f_GrSLType); |
862 args.fPB->addVarying("CircleParams", &circleParams); | 862 args.fPB->addVarying("CircleParams", &circleParams); |
863 vsBuilder->codeAppendf("%s = %s;", circleParams.vsOut(), dce.inCircleParams(
)->fName); | 863 vsBuilder->codeAppendf("%s = %s;", circleParams.vsOut(), dce.inCircleParams(
)->fName); |
864 | 864 |
865 // Setup pass through color | 865 // Setup pass through color |
866 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NU
LL, &fColorUniform); | 866 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NU
LL, &fColorUniform); |
867 | 867 |
868 // Setup position | 868 // Setup position |
869 this->setupPosition(pb, gpArgs, dce.inPosition()->fName, dce.viewMatrix()); | 869 this->setupPosition(pb, gpArgs, dce.inPosition()->fName); |
870 | 870 |
871 // emit transforms | 871 // emit transforms |
872 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dce.inPosition()->fName
, dce.localMatrix(), | 872 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dce.inPosition()->fName
, dce.localMatrix(), |
873 args.fTransformsIn, args.fTransformsOut); | 873 args.fTransformsIn, args.fTransformsOut); |
874 | 874 |
875 // transforms all points so that we can compare them to our test circle | 875 // transforms all points so that we can compare them to our test circle |
876 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 876 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
877 fsBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;", | 877 fsBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;", |
878 dashParams.fsIn(), dashParams.fsIn(), dashParams.fsIn
(), | 878 dashParams.fsIn(), dashParams.fsIn(), dashParams.fsIn
(), |
879 dashParams.fsIn()); | 879 dashParams.fsIn()); |
880 fsBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", dashPa
rams.fsIn()); | 880 fsBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", dashPa
rams.fsIn()); |
881 fsBuilder->codeAppendf("vec2 center = vec2(%s.y, 0.0);", circleParams.fsIn()
); | 881 fsBuilder->codeAppendf("vec2 center = vec2(%s.y, 0.0);", circleParams.fsIn()
); |
882 fsBuilder->codeAppend("float dist = length(center - fragPosShifted);"); | 882 fsBuilder->codeAppend("float dist = length(center - fragPosShifted);"); |
883 if (dce.aaMode() != kBW_DashAAMode) { | 883 if (dce.aaMode() != kBW_DashAAMode) { |
884 fsBuilder->codeAppendf("float diff = dist - %s.x;", circleParams.fsIn())
; | 884 fsBuilder->codeAppendf("float diff = dist - %s.x;", circleParams.fsIn())
; |
885 fsBuilder->codeAppend("diff = 1.0 - diff;"); | 885 fsBuilder->codeAppend("diff = 1.0 - diff;"); |
886 fsBuilder->codeAppend("float alpha = clamp(diff, 0.0, 1.0);"); | 886 fsBuilder->codeAppend("float alpha = clamp(diff, 0.0, 1.0);"); |
887 } else { | 887 } else { |
888 fsBuilder->codeAppendf("float alpha = 1.0;"); | 888 fsBuilder->codeAppendf("float alpha = 1.0;"); |
889 fsBuilder->codeAppendf("alpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;", circl
eParams.fsIn()); | 889 fsBuilder->codeAppendf("alpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;", circl
eParams.fsIn()); |
890 } | 890 } |
891 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | 891 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
892 } | 892 } |
893 | 893 |
894 void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman, | 894 void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman, |
895 const GrPrimitiveProcessor& processor, | 895 const GrPrimitiveProcessor& processor, |
896 const GrBatchTracker& bt) { | 896 const GrBatchTracker& bt) { |
897 this->setUniformViewMatrix(pdman, processor.viewMatrix()); | |
898 | |
899 const DashingCircleBatchTracker& local = bt.cast<DashingCircleBatchTracker>(
); | 897 const DashingCircleBatchTracker& local = bt.cast<DashingCircleBatchTracker>(
); |
900 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { | 898 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
901 GrGLfloat c[4]; | 899 GrGLfloat c[4]; |
902 GrColorToRGBAFloat(local.fColor, c); | 900 GrColorToRGBAFloat(local.fColor, c); |
903 pdman.set4fv(fColorUniform, 1, c); | 901 pdman.set4fv(fColorUniform, 1, c); |
904 fColor = local.fColor; | 902 fColor = local.fColor; |
905 } | 903 } |
906 } | 904 } |
907 | 905 |
908 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& gp, | 906 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& gp, |
909 const GrBatchTracker& bt, | 907 const GrBatchTracker& bt, |
910 const GrGLSLCaps&, | 908 const GrGLSLCaps&, |
911 GrProcessorKeyBuilder* b) { | 909 GrProcessorKeyBuilder* b) { |
912 const DashingCircleBatchTracker& local = bt.cast<DashingCircleBatchTracker>(
); | 910 const DashingCircleBatchTracker& local = bt.cast<DashingCircleBatchTracker>(
); |
913 const DashingCircleEffect& dce = gp.cast<DashingCircleEffect>(); | 911 const DashingCircleEffect& dce = gp.cast<DashingCircleEffect>(); |
914 uint32_t key = 0; | 912 uint32_t key = 0; |
915 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 : 0
x0; | 913 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 : 0
x0; |
916 key |= ComputePosKey(gp.viewMatrix()) << 1; | |
917 key |= dce.aaMode() << 8; | 914 key |= dce.aaMode() << 8; |
918 b->add32(key << 16 | local.fInputColorType); | 915 b->add32(key << 16 | local.fInputColorType); |
919 } | 916 } |
920 | 917 |
921 ////////////////////////////////////////////////////////////////////////////// | 918 ////////////////////////////////////////////////////////////////////////////// |
922 | 919 |
923 GrGeometryProcessor* DashingCircleEffect::Create(GrColor color, | 920 GrGeometryProcessor* DashingCircleEffect::Create(GrColor color, |
924 DashAAMode aaMode, | 921 DashAAMode aaMode, |
925 const SkMatrix& localMatrix) { | 922 const SkMatrix& localMatrix) { |
926 return SkNEW_ARGS(DashingCircleEffect, (color, aaMode, localMatrix)); | 923 return SkNEW_ARGS(DashingCircleEffect, (color, aaMode, localMatrix)); |
927 } | 924 } |
928 | 925 |
929 void DashingCircleEffect::getGLProcessorKey(const GrBatchTracker& bt, | 926 void DashingCircleEffect::getGLProcessorKey(const GrBatchTracker& bt, |
930 const GrGLSLCaps& caps, | 927 const GrGLSLCaps& caps, |
931 GrProcessorKeyBuilder* b) const { | 928 GrProcessorKeyBuilder* b) const { |
932 GLDashingCircleEffect::GenKey(*this, bt, caps, b); | 929 GLDashingCircleEffect::GenKey(*this, bt, caps, b); |
933 } | 930 } |
934 | 931 |
935 GrGLPrimitiveProcessor* DashingCircleEffect::createGLInstance(const GrBatchTrack
er& bt, | 932 GrGLPrimitiveProcessor* DashingCircleEffect::createGLInstance(const GrBatchTrack
er& bt, |
936 const GrGLSLCaps&)
const { | 933 const GrGLSLCaps&)
const { |
937 return SkNEW_ARGS(GLDashingCircleEffect, (*this, bt)); | 934 return SkNEW_ARGS(GLDashingCircleEffect, (*this, bt)); |
938 } | 935 } |
939 | 936 |
940 DashingCircleEffect::DashingCircleEffect(GrColor color, | 937 DashingCircleEffect::DashingCircleEffect(GrColor color, |
941 DashAAMode aaMode, | 938 DashAAMode aaMode, |
942 const SkMatrix& localMatrix) | 939 const SkMatrix& localMatrix) |
943 : INHERITED(SkMatrix::I(), localMatrix) | 940 : INHERITED(localMatrix) |
944 , fColor(color) | 941 , fColor(color) |
945 , fAAMode(aaMode) { | 942 , fAAMode(aaMode) { |
946 this->initClassID<DashingCircleEffect>(); | 943 this->initClassID<DashingCircleEffect>(); |
947 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); | 944 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); |
948 fInDashParams = &this->addVertexAttrib(Attribute("inDashParams", kVec3f_GrVe
rtexAttribType)); | 945 fInDashParams = &this->addVertexAttrib(Attribute("inDashParams", kVec3f_GrVe
rtexAttribType)); |
949 fInCircleParams = &this->addVertexAttrib(Attribute("inCircleParams", | 946 fInCircleParams = &this->addVertexAttrib(Attribute("inCircleParams", |
950 kVec2f_GrVertexAttribType
)); | 947 kVec2f_GrVertexAttribType
)); |
951 } | 948 } |
952 | 949 |
953 void DashingCircleEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineI
nfo& init) const { | 950 void DashingCircleEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineI
nfo& init) const { |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1075 // The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bot
tom - 0.5), | 1072 // The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bot
tom - 0.5), |
1076 // respectively. | 1073 // respectively. |
1077 GrGLVertToFrag inRectParams(kVec4f_GrSLType); | 1074 GrGLVertToFrag inRectParams(kVec4f_GrSLType); |
1078 args.fPB->addVarying("RectParams", &inRectParams); | 1075 args.fPB->addVarying("RectParams", &inRectParams); |
1079 vsBuilder->codeAppendf("%s = %s;", inRectParams.vsOut(), de.inRectParams()->
fName); | 1076 vsBuilder->codeAppendf("%s = %s;", inRectParams.vsOut(), de.inRectParams()->
fName); |
1080 | 1077 |
1081 // Setup pass through color | 1078 // Setup pass through color |
1082 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NU
LL, &fColorUniform); | 1079 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NU
LL, &fColorUniform); |
1083 | 1080 |
1084 // Setup position | 1081 // Setup position |
1085 this->setupPosition(pb, gpArgs, de.inPosition()->fName, de.viewMatrix()); | 1082 this->setupPosition(pb, gpArgs, de.inPosition()->fName); |
1086 | 1083 |
1087 // emit transforms | 1084 // emit transforms |
1088 this->emitTransforms(args.fPB, gpArgs->fPositionVar, de.inPosition()->fName,
de.localMatrix(), | 1085 this->emitTransforms(args.fPB, gpArgs->fPositionVar, de.inPosition()->fName,
de.localMatrix(), |
1089 args.fTransformsIn, args.fTransformsOut); | 1086 args.fTransformsIn, args.fTransformsOut); |
1090 | 1087 |
1091 // transforms all points so that we can compare them to our test rect | 1088 // transforms all points so that we can compare them to our test rect |
1092 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 1089 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
1093 fsBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;", | 1090 fsBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;", |
1094 inDashParams.fsIn(), inDashParams.fsIn(), inDashParam
s.fsIn(), | 1091 inDashParams.fsIn(), inDashParams.fsIn(), inDashParam
s.fsIn(), |
1095 inDashParams.fsIn()); | 1092 inDashParams.fsIn()); |
(...skipping 24 matching lines...) Expand all Loading... |
1120 inRectParams.fsIn()); | 1117 inRectParams.fsIn()); |
1121 fsBuilder->codeAppendf("alpha *= (%s.z - fragPosShifted.x) >= -0.5 ? 1.0
: 0.0;", | 1118 fsBuilder->codeAppendf("alpha *= (%s.z - fragPosShifted.x) >= -0.5 ? 1.0
: 0.0;", |
1122 inRectParams.fsIn()); | 1119 inRectParams.fsIn()); |
1123 } | 1120 } |
1124 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | 1121 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
1125 } | 1122 } |
1126 | 1123 |
1127 void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman, | 1124 void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman, |
1128 const GrPrimitiveProcessor& processor, | 1125 const GrPrimitiveProcessor& processor, |
1129 const GrBatchTracker& bt) { | 1126 const GrBatchTracker& bt) { |
1130 this->setUniformViewMatrix(pdman, processor.viewMatrix()); | |
1131 | |
1132 const DashingLineBatchTracker& local = bt.cast<DashingLineBatchTracker>(); | 1127 const DashingLineBatchTracker& local = bt.cast<DashingLineBatchTracker>(); |
1133 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { | 1128 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
1134 GrGLfloat c[4]; | 1129 GrGLfloat c[4]; |
1135 GrColorToRGBAFloat(local.fColor, c); | 1130 GrColorToRGBAFloat(local.fColor, c); |
1136 pdman.set4fv(fColorUniform, 1, c); | 1131 pdman.set4fv(fColorUniform, 1, c); |
1137 fColor = local.fColor; | 1132 fColor = local.fColor; |
1138 } | 1133 } |
1139 } | 1134 } |
1140 | 1135 |
1141 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& gp, | 1136 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& gp, |
1142 const GrBatchTracker& bt, | 1137 const GrBatchTracker& bt, |
1143 const GrGLSLCaps&, | 1138 const GrGLSLCaps&, |
1144 GrProcessorKeyBuilder* b) { | 1139 GrProcessorKeyBuilder* b) { |
1145 const DashingLineBatchTracker& local = bt.cast<DashingLineBatchTracker>(); | 1140 const DashingLineBatchTracker& local = bt.cast<DashingLineBatchTracker>(); |
1146 const DashingLineEffect& de = gp.cast<DashingLineEffect>(); | 1141 const DashingLineEffect& de = gp.cast<DashingLineEffect>(); |
1147 uint32_t key = 0; | 1142 uint32_t key = 0; |
1148 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 : 0
x0; | 1143 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 : 0
x0; |
1149 key |= ComputePosKey(gp.viewMatrix()) << 1; | |
1150 key |= de.aaMode() << 8; | 1144 key |= de.aaMode() << 8; |
1151 b->add32(key << 16 | local.fInputColorType); | 1145 b->add32(key << 16 | local.fInputColorType); |
1152 } | 1146 } |
1153 | 1147 |
1154 ////////////////////////////////////////////////////////////////////////////// | 1148 ////////////////////////////////////////////////////////////////////////////// |
1155 | 1149 |
1156 GrGeometryProcessor* DashingLineEffect::Create(GrColor color, | 1150 GrGeometryProcessor* DashingLineEffect::Create(GrColor color, |
1157 DashAAMode aaMode, | 1151 DashAAMode aaMode, |
1158 const SkMatrix& localMatrix) { | 1152 const SkMatrix& localMatrix) { |
1159 return SkNEW_ARGS(DashingLineEffect, (color, aaMode, localMatrix)); | 1153 return SkNEW_ARGS(DashingLineEffect, (color, aaMode, localMatrix)); |
1160 } | 1154 } |
1161 | 1155 |
1162 void DashingLineEffect::getGLProcessorKey(const GrBatchTracker& bt, | 1156 void DashingLineEffect::getGLProcessorKey(const GrBatchTracker& bt, |
1163 const GrGLSLCaps& caps, | 1157 const GrGLSLCaps& caps, |
1164 GrProcessorKeyBuilder* b) const { | 1158 GrProcessorKeyBuilder* b) const { |
1165 GLDashingLineEffect::GenKey(*this, bt, caps, b); | 1159 GLDashingLineEffect::GenKey(*this, bt, caps, b); |
1166 } | 1160 } |
1167 | 1161 |
1168 GrGLPrimitiveProcessor* DashingLineEffect::createGLInstance(const GrBatchTracker
& bt, | 1162 GrGLPrimitiveProcessor* DashingLineEffect::createGLInstance(const GrBatchTracker
& bt, |
1169 const GrGLSLCaps&) c
onst { | 1163 const GrGLSLCaps&) c
onst { |
1170 return SkNEW_ARGS(GLDashingLineEffect, (*this, bt)); | 1164 return SkNEW_ARGS(GLDashingLineEffect, (*this, bt)); |
1171 } | 1165 } |
1172 | 1166 |
1173 DashingLineEffect::DashingLineEffect(GrColor color, | 1167 DashingLineEffect::DashingLineEffect(GrColor color, |
1174 DashAAMode aaMode, | 1168 DashAAMode aaMode, |
1175 const SkMatrix& localMatrix) | 1169 const SkMatrix& localMatrix) |
1176 : INHERITED(SkMatrix::I(), localMatrix) | 1170 : INHERITED(localMatrix) |
1177 , fColor(color) | 1171 , fColor(color) |
1178 , fAAMode(aaMode) { | 1172 , fAAMode(aaMode) { |
1179 this->initClassID<DashingLineEffect>(); | 1173 this->initClassID<DashingLineEffect>(); |
1180 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); | 1174 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); |
1181 fInDashParams = &this->addVertexAttrib(Attribute("inDashParams", kVec3f_GrVe
rtexAttribType)); | 1175 fInDashParams = &this->addVertexAttrib(Attribute("inDashParams", kVec3f_GrVe
rtexAttribType)); |
1182 fInRectParams = &this->addVertexAttrib(Attribute("inRect", kVec4f_GrVertexAt
tribType)); | 1176 fInRectParams = &this->addVertexAttrib(Attribute("inRect", kVec4f_GrVertexAt
tribType)); |
1183 } | 1177 } |
1184 | 1178 |
1185 void DashingLineEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInf
o& init) const { | 1179 void DashingLineEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInf
o& init) const { |
1186 DashingLineBatchTracker* local = bt->cast<DashingLineBatchTracker>(); | 1180 DashingLineBatchTracker* local = bt->cast<DashingLineBatchTracker>(); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1289 info.fIntervals = intervals; | 1283 info.fIntervals = intervals; |
1290 info.fCount = 2; | 1284 info.fCount = 2; |
1291 info.fPhase = phase; | 1285 info.fPhase = phase; |
1292 SkDEBUGCODE(bool success = ) strokeInfo.setDashInfo(info); | 1286 SkDEBUGCODE(bool success = ) strokeInfo.setDashInfo(info); |
1293 SkASSERT(success); | 1287 SkASSERT(success); |
1294 | 1288 |
1295 return create_batch(color, viewMatrix, pts, useAA, strokeInfo, msaaRT); | 1289 return create_batch(color, viewMatrix, pts, useAA, strokeInfo, msaaRT); |
1296 } | 1290 } |
1297 | 1291 |
1298 #endif | 1292 #endif |
OLD | NEW |