blob: 1c6d469033a0b8c6a25257166452c89f18b1ff41 [file] [log] [blame]
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrBezierEffect.h"
9
joshualittb0a8a372014-09-23 09:50:21 -070010#include "gl/GrGLProcessor.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000011#include "gl/GrGLSL.h"
joshualitt249af152014-09-15 11:41:13 -070012#include "gl/GrGLGeometryProcessor.h"
joshualitteb2a6762014-12-04 11:35:33 -080013#include "gl/builders/GrGLProgramBuilder.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000014
joshualitt9b989322014-12-15 14:16:27 -080015struct ConicBatchTracker {
16 GrGPInput fInputColorType;
17 GrColor fColor;
18 uint8_t fCoverageScale;
joshualitt290c09b2014-12-19 13:45:20 -080019 bool fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -080020};
21
joshualitt249af152014-09-15 11:41:13 -070022class GrGLConicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000023public:
joshualitteb2a6762014-12-04 11:35:33 -080024 GrGLConicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -080025 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000026
robertphillips46d36f02015-01-18 08:14:14 -080027 void onEmitCode(EmitArgs&, GrGPArgs*) SK_OVERRIDE;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000028
joshualitt87f48d92014-12-04 10:41:40 -080029 static inline void GenKey(const GrGeometryProcessor&,
30 const GrBatchTracker&,
31 const GrGLCaps&,
32 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000033
joshualitt9b989322014-12-15 14:16:27 -080034 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -080035 const GrPrimitiveProcessor& primProc,
joshualitt9b989322014-12-15 14:16:27 -080036 const GrBatchTracker& bt) SK_OVERRIDE {
joshualittee2af952014-12-30 09:04:15 -080037 this->setUniformViewMatrix(pdman, primProc.viewMatrix());
38
joshualitt9b989322014-12-15 14:16:27 -080039 const ConicBatchTracker& local = bt.cast<ConicBatchTracker>();
40 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
41 GrGLfloat c[4];
42 GrColorToRGBAFloat(local.fColor, c);
43 pdman.set4fv(fColorUniform, 1, c);
44 fColor = local.fColor;
45 }
46 if (0xff != local.fCoverageScale && fCoverageScale != local.fCoverageScale) {
47 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale));
48 fCoverageScale = local.fCoverageScale;
49 }
50 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000051
52private:
joshualitt9b989322014-12-15 14:16:27 -080053 GrColor fColor;
54 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -070055 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -080056 UniformHandle fColorUniform;
57 UniformHandle fCoverageScaleUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000058
joshualitt249af152014-09-15 11:41:13 -070059 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000060};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +000061
joshualitteb2a6762014-12-04 11:35:33 -080062GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -080063 const GrBatchTracker& bt)
64 : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -080065 const GrConicEffect& ce = processor.cast<GrConicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000066 fEdgeType = ce.getEdgeType();
67}
68
robertphillips46d36f02015-01-18 08:14:14 -080069void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualitt9b989322014-12-15 14:16:27 -080070 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -080071 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
72 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>();
joshualitt9b989322014-12-15 14:16:27 -080073 const ConicBatchTracker& local = args.fBT.cast<ConicBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -080074
joshualittabb52a12015-01-13 15:02:10 -080075 // emit attributes
76 vsBuilder->emitAttributes(gp);
77
joshualitt74077b92014-10-24 11:26:03 -070078 GrGLVertToFrag v(kVec4f_GrSLType);
79 args.fPB->addVarying("ConicCoeffs", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -080080 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000081
joshualitt9b989322014-12-15 14:16:27 -080082 // Setup pass through color
83 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
84 &fColorUniform);
85
joshualittee2af952014-12-30 09:04:15 -080086 // setup uniform viewMatrix
87 this->addUniformViewMatrix(pb);
88
joshualittabb52a12015-01-13 15:02:10 -080089 // Setup position
robertphillips46d36f02015-01-18 08:14:14 -080090 SetupPosition(vsBuilder, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), this->uViewM());
joshualitt4973d9d2014-11-08 09:24:25 -080091
joshualittabb52a12015-01-13 15:02:10 -080092 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -080093 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -080094 args.fTransformsIn, args.fTransformsOut);
95
joshualittc369e7c2014-10-22 10:56:26 -070096 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -070097 fsBuilder->codeAppend("float edgeAlpha;");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000098
99 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700100 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700101 SkAssertResult(fsBuilder->enableFeature(
102 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700103 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
104 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700105 fsBuilder->codeAppendf("float dfdx ="
106 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700107 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700108 fsBuilder->codeAppendf("float dfdy ="
109 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700110 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700111 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
112 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700113 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn(), v.fsIn(),
114 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700115 fsBuilder->codeAppend("func = abs(func);");
116 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
117 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000118 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700119 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000120 break;
121 }
joshualittb0a8a372014-09-23 09:50:21 -0700122 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700123 SkAssertResult(fsBuilder->enableFeature(
124 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700125 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
126 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700127 fsBuilder->codeAppendf("float dfdx ="
128 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700129 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700130 fsBuilder->codeAppendf("float dfdy ="
131 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700132 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700133 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
134 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700135 fsBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
136 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700137 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
138 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000139 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700140 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000141 break;
142 }
joshualittb0a8a372014-09-23 09:50:21 -0700143 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700144 fsBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
145 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700146 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000147 break;
148 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000149 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000150 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000151 }
152
joshualitt9b989322014-12-15 14:16:27 -0800153 if (0xff != local.fCoverageScale) {
154 const char* coverageScale;
155 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
156 kFloat_GrSLType,
157 kDefault_GrSLPrecision,
158 "Coverage",
159 &coverageScale);
160 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
161 } else {
162 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
163 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000164}
165
robertphillips46d36f02015-01-18 08:14:14 -0800166void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800167 const GrBatchTracker& bt,
joshualitt87f48d92014-12-04 10:41:40 -0800168 const GrGLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700169 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800170 const GrConicEffect& ce = gp.cast<GrConicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800171 const ConicBatchTracker& local = bt.cast<ConicBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700172 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800173 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0;
174 key |= 0xff != local.fCoverageScale ? 0x8 : 0x0;
robertphillips46d36f02015-01-18 08:14:14 -0800175 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x10 : 0x0;
176 key |= ComputePosKey(gp.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700177 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000178}
179
180//////////////////////////////////////////////////////////////////////////////
181
182GrConicEffect::~GrConicEffect() {}
183
joshualitteb2a6762014-12-04 11:35:33 -0800184void GrConicEffect::getGLProcessorKey(const GrBatchTracker& bt,
185 const GrGLCaps& caps,
186 GrProcessorKeyBuilder* b) const {
187 GrGLConicEffect::GenKey(*this, bt, caps, b);
188}
189
joshualittabb52a12015-01-13 15:02:10 -0800190GrGLPrimitiveProcessor* GrConicEffect::createGLInstance(const GrBatchTracker& bt,
191 const GrGLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800192 return SkNEW_ARGS(GrGLConicEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000193}
194
joshualitt8059eb92014-12-29 15:10:07 -0800195GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
196 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix)
197 : INHERITED(color, viewMatrix, localMatrix)
198 , fCoverageScale(coverage)
199 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800200 this->initClassID<GrConicEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800201 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
202 fInConicCoeffs = &this->addVertexAttrib(Attribute("inConicCoeffs",
joshualitt2dd1ae02014-12-03 06:24:10 -0800203 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000204}
205
bsalomon0e08fc12014-10-15 08:19:04 -0700206bool GrConicEffect::onIsEqual(const GrGeometryProcessor& other) const {
joshualitt49586be2014-09-16 08:21:41 -0700207 const GrConicEffect& ce = other.cast<GrConicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000208 return (ce.fEdgeType == fEdgeType);
209}
210
joshualitt9b989322014-12-15 14:16:27 -0800211void GrConicEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const {
212 ConicBatchTracker* local = bt->cast<ConicBatchTracker>();
213 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
214 local->fCoverageScale = fCoverageScale;
joshualitt290c09b2014-12-19 13:45:20 -0800215 local->fUsesLocalCoords = init.fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800216}
217
joshualitt290c09b2014-12-19 13:45:20 -0800218bool GrConicEffect::onCanMakeEqual(const GrBatchTracker& m,
219 const GrGeometryProcessor& that,
220 const GrBatchTracker& t) const {
joshualitt9b989322014-12-15 14:16:27 -0800221 const ConicBatchTracker& mine = m.cast<ConicBatchTracker>();
222 const ConicBatchTracker& theirs = t.cast<ConicBatchTracker>();
joshualitt290c09b2014-12-19 13:45:20 -0800223 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords,
224 that, theirs.fUsesLocalCoords) &&
225 CanCombineOutput(mine.fInputColorType, mine.fColor,
joshualitt9b989322014-12-15 14:16:27 -0800226 theirs.fInputColorType, theirs.fColor) &&
227 mine.fCoverageScale == theirs.fCoverageScale;
228}
229
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000230//////////////////////////////////////////////////////////////////////////////
231
joshualittb0a8a372014-09-23 09:50:21 -0700232GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000233
joshualittb0a8a372014-09-23 09:50:21 -0700234GrGeometryProcessor* GrConicEffect::TestCreate(SkRandom* random,
235 GrContext*,
236 const GrDrawTargetCaps& caps,
237 GrTexture*[]) {
238 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000239 do {
joshualittb0a8a372014-09-23 09:50:21 -0700240 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
241 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800242 gp = GrConicEffect::Create(GrRandomColor(random), GrProcessorUnitTest::TestMatrix(random),
243 edgeType, caps,
joshualittd27f73e2014-12-29 07:43:36 -0800244 GrProcessorUnitTest::TestMatrix(random));
joshualittb0a8a372014-09-23 09:50:21 -0700245 } while (NULL == gp);
246 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000247}
248
249//////////////////////////////////////////////////////////////////////////////
250// Quad
251//////////////////////////////////////////////////////////////////////////////
252
joshualitt9b989322014-12-15 14:16:27 -0800253struct QuadBatchTracker {
254 GrGPInput fInputColorType;
255 GrColor fColor;
256 uint8_t fCoverageScale;
joshualitt290c09b2014-12-19 13:45:20 -0800257 bool fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800258};
259
joshualitt249af152014-09-15 11:41:13 -0700260class GrGLQuadEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000261public:
joshualitteb2a6762014-12-04 11:35:33 -0800262 GrGLQuadEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800263 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000264
robertphillips46d36f02015-01-18 08:14:14 -0800265 void onEmitCode(EmitArgs&, GrGPArgs*) SK_OVERRIDE;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000266
joshualitt87f48d92014-12-04 10:41:40 -0800267 static inline void GenKey(const GrGeometryProcessor&,
268 const GrBatchTracker&,
269 const GrGLCaps&,
270 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000271
joshualitt9b989322014-12-15 14:16:27 -0800272 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800273 const GrPrimitiveProcessor& primProc,
joshualitt9b989322014-12-15 14:16:27 -0800274 const GrBatchTracker& bt) SK_OVERRIDE {
joshualittee2af952014-12-30 09:04:15 -0800275 this->setUniformViewMatrix(pdman, primProc.viewMatrix());
276
joshualitt9b989322014-12-15 14:16:27 -0800277 const QuadBatchTracker& local = bt.cast<QuadBatchTracker>();
278 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
279 GrGLfloat c[4];
280 GrColorToRGBAFloat(local.fColor, c);
281 pdman.set4fv(fColorUniform, 1, c);
282 fColor = local.fColor;
283 }
284 if (0xff != local.fCoverageScale && local.fCoverageScale != fCoverageScale) {
285 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale));
286 fCoverageScale = local.fCoverageScale;
287 }
288 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000289
290private:
joshualitt9b989322014-12-15 14:16:27 -0800291 GrColor fColor;
292 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700293 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800294 UniformHandle fColorUniform;
295 UniformHandle fCoverageScaleUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000296
joshualitt249af152014-09-15 11:41:13 -0700297 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000298};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000299
joshualitteb2a6762014-12-04 11:35:33 -0800300GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800301 const GrBatchTracker& bt)
302 : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800303 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000304 fEdgeType = ce.getEdgeType();
305}
306
robertphillips46d36f02015-01-18 08:14:14 -0800307void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualitt9b989322014-12-15 14:16:27 -0800308 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -0800309 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
310 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800311 const QuadBatchTracker& local = args.fBT.cast<QuadBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800312
joshualittabb52a12015-01-13 15:02:10 -0800313 // emit attributes
314 vsBuilder->emitAttributes(gp);
315
joshualitt74077b92014-10-24 11:26:03 -0700316 GrGLVertToFrag v(kVec4f_GrSLType);
317 args.fPB->addVarying("HairQuadEdge", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -0800318 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000319
joshualitt9b989322014-12-15 14:16:27 -0800320 // Setup pass through color
321 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
322 &fColorUniform);
323
joshualittee2af952014-12-30 09:04:15 -0800324 // setup uniform viewMatrix
325 this->addUniformViewMatrix(pb);
326
joshualittabb52a12015-01-13 15:02:10 -0800327 // Setup position
robertphillips46d36f02015-01-18 08:14:14 -0800328 SetupPosition(vsBuilder, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), this->uViewM());
joshualitt4973d9d2014-11-08 09:24:25 -0800329
joshualittabb52a12015-01-13 15:02:10 -0800330 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -0800331 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -0800332 args.fTransformsIn, args.fTransformsOut);
333
joshualittc369e7c2014-10-22 10:56:26 -0700334 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -0700335 fsBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700336
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000337 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700338 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700339 SkAssertResult(fsBuilder->enableFeature(
340 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700341 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
342 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700343 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
344 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700345 v.fsIn(), v.fsIn());
346 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700347 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
348 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000349 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700350 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000351 break;
352 }
joshualittb0a8a372014-09-23 09:50:21 -0700353 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700354 SkAssertResult(fsBuilder->enableFeature(
355 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700356 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
357 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700358 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
359 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700360 v.fsIn(), v.fsIn());
361 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700362 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
363 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000364 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700365 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000366 break;
367 }
joshualittb0a8a372014-09-23 09:50:21 -0700368 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700369 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700370 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000371 break;
372 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000373 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000374 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000375 }
376
joshualitt9b989322014-12-15 14:16:27 -0800377 if (0xff != local.fCoverageScale) {
378 const char* coverageScale;
379 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
380 kFloat_GrSLType,
381 kDefault_GrSLPrecision,
382 "Coverage",
383 &coverageScale);
384 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
385 } else {
386 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
387 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000388}
389
robertphillips46d36f02015-01-18 08:14:14 -0800390void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800391 const GrBatchTracker& bt,
joshualitt87f48d92014-12-04 10:41:40 -0800392 const GrGLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700393 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800394 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800395 const QuadBatchTracker& local = bt.cast<QuadBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700396 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800397 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0;
398 key |= 0xff != local.fCoverageScale ? 0x8 : 0x0;
robertphillips46d36f02015-01-18 08:14:14 -0800399 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x10 : 0x0;
400 key |= ComputePosKey(gp.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700401 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000402}
403
404//////////////////////////////////////////////////////////////////////////////
405
406GrQuadEffect::~GrQuadEffect() {}
407
joshualitteb2a6762014-12-04 11:35:33 -0800408void GrQuadEffect::getGLProcessorKey(const GrBatchTracker& bt,
409 const GrGLCaps& caps,
410 GrProcessorKeyBuilder* b) const {
411 GrGLQuadEffect::GenKey(*this, bt, caps, b);
412}
413
joshualittabb52a12015-01-13 15:02:10 -0800414GrGLPrimitiveProcessor* GrQuadEffect::createGLInstance(const GrBatchTracker& bt,
415 const GrGLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800416 return SkNEW_ARGS(GrGLQuadEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000417}
418
joshualitt8059eb92014-12-29 15:10:07 -0800419GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
420 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix)
421 : INHERITED(color, viewMatrix, localMatrix)
422 , fCoverageScale(coverage)
423 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800424 this->initClassID<GrQuadEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800425 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
426 fInHairQuadEdge = &this->addVertexAttrib(Attribute("inHairQuadEdge",
joshualitt2dd1ae02014-12-03 06:24:10 -0800427 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000428}
429
bsalomon0e08fc12014-10-15 08:19:04 -0700430bool GrQuadEffect::onIsEqual(const GrGeometryProcessor& other) const {
joshualitt49586be2014-09-16 08:21:41 -0700431 const GrQuadEffect& ce = other.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000432 return (ce.fEdgeType == fEdgeType);
433}
434
joshualitt9b989322014-12-15 14:16:27 -0800435void GrQuadEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const {
436 QuadBatchTracker* local = bt->cast<QuadBatchTracker>();
437 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
438 local->fCoverageScale = fCoverageScale;
joshualitt290c09b2014-12-19 13:45:20 -0800439 local->fUsesLocalCoords = init.fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800440}
441
joshualitt290c09b2014-12-19 13:45:20 -0800442bool GrQuadEffect::onCanMakeEqual(const GrBatchTracker& m,
443 const GrGeometryProcessor& that,
444 const GrBatchTracker& t) const {
joshualitt9b989322014-12-15 14:16:27 -0800445 const QuadBatchTracker& mine = m.cast<QuadBatchTracker>();
446 const QuadBatchTracker& theirs = t.cast<QuadBatchTracker>();
joshualitt290c09b2014-12-19 13:45:20 -0800447 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords,
448 that, theirs.fUsesLocalCoords) &&
449 CanCombineOutput(mine.fInputColorType, mine.fColor,
joshualitt9b989322014-12-15 14:16:27 -0800450 theirs.fInputColorType, theirs.fColor) &&
451 mine.fCoverageScale == theirs.fCoverageScale;
452}
453
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000454//////////////////////////////////////////////////////////////////////////////
455
joshualittb0a8a372014-09-23 09:50:21 -0700456GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000457
joshualittb0a8a372014-09-23 09:50:21 -0700458GrGeometryProcessor* GrQuadEffect::TestCreate(SkRandom* random,
459 GrContext*,
460 const GrDrawTargetCaps& caps,
461 GrTexture*[]) {
462 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000463 do {
joshualittb0a8a372014-09-23 09:50:21 -0700464 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
465 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800466 gp = GrQuadEffect::Create(GrRandomColor(random),
467 GrProcessorUnitTest::TestMatrix(random),
468 edgeType, caps,
joshualittd27f73e2014-12-29 07:43:36 -0800469 GrProcessorUnitTest::TestMatrix(random));
joshualittb0a8a372014-09-23 09:50:21 -0700470 } while (NULL == gp);
471 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000472}
473
474//////////////////////////////////////////////////////////////////////////////
475// Cubic
476//////////////////////////////////////////////////////////////////////////////
477
joshualitt9b989322014-12-15 14:16:27 -0800478struct CubicBatchTracker {
479 GrGPInput fInputColorType;
480 GrColor fColor;
joshualitt290c09b2014-12-19 13:45:20 -0800481 bool fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800482};
483
joshualitt249af152014-09-15 11:41:13 -0700484class GrGLCubicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000485public:
joshualitteb2a6762014-12-04 11:35:33 -0800486 GrGLCubicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800487 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000488
robertphillips46d36f02015-01-18 08:14:14 -0800489 void onEmitCode(EmitArgs&, GrGPArgs*) SK_OVERRIDE;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000490
joshualitt87f48d92014-12-04 10:41:40 -0800491 static inline void GenKey(const GrGeometryProcessor&,
492 const GrBatchTracker&,
493 const GrGLCaps&,
494 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000495
joshualitt9b989322014-12-15 14:16:27 -0800496 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800497 const GrPrimitiveProcessor& primProc,
joshualitt9b989322014-12-15 14:16:27 -0800498 const GrBatchTracker& bt) SK_OVERRIDE {
joshualittee2af952014-12-30 09:04:15 -0800499 this->setUniformViewMatrix(pdman, primProc.viewMatrix());
500
joshualitt9b989322014-12-15 14:16:27 -0800501 const CubicBatchTracker& local = bt.cast<CubicBatchTracker>();
502 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
503 GrGLfloat c[4];
504 GrColorToRGBAFloat(local.fColor, c);
505 pdman.set4fv(fColorUniform, 1, c);
506 fColor = local.fColor;
507 }
508 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000509
510private:
joshualitt9b989322014-12-15 14:16:27 -0800511 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700512 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800513 UniformHandle fColorUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000514
joshualitt249af152014-09-15 11:41:13 -0700515 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000516};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000517
joshualitteb2a6762014-12-04 11:35:33 -0800518GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800519 const GrBatchTracker&)
520 : fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700521 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000522 fEdgeType = ce.getEdgeType();
523}
524
robertphillips46d36f02015-01-18 08:14:14 -0800525void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualittc369e7c2014-10-22 10:56:26 -0700526 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
joshualitt2dd1ae02014-12-03 06:24:10 -0800527 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800528 const CubicBatchTracker& local = args.fBT.cast<CubicBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800529
joshualittabb52a12015-01-13 15:02:10 -0800530 // emit attributes
531 vsBuilder->emitAttributes(gp);
532
joshualitt2dd1ae02014-12-03 06:24:10 -0800533 GrGLVertToFrag v(kVec4f_GrSLType);
bsalomonc0bd6482014-12-09 10:04:14 -0800534 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
joshualitt2dd1ae02014-12-03 06:24:10 -0800535 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
536
joshualitt9b989322014-12-15 14:16:27 -0800537 // Setup pass through color
538 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
539 &fColorUniform);
540
joshualittee2af952014-12-30 09:04:15 -0800541 // setup uniform viewMatrix
542 this->addUniformViewMatrix(args.fPB);
543
joshualittabb52a12015-01-13 15:02:10 -0800544 // Setup position
robertphillips46d36f02015-01-18 08:14:14 -0800545 SetupPosition(vsBuilder, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), this->uViewM());
joshualitt4973d9d2014-11-08 09:24:25 -0800546
joshualittabb52a12015-01-13 15:02:10 -0800547 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -0800548 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -0800549 args.fTransformsIn, args.fTransformsOut);
550
joshualittc369e7c2014-10-22 10:56:26 -0700551 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -0700552
bsalomonc0bd6482014-12-09 10:04:14 -0800553 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
554 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
555 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
556 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
557 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
558 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
559 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
560 GrGLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700561
562 fsBuilder->declAppend(edgeAlpha);
563 fsBuilder->declAppend(dklmdx);
564 fsBuilder->declAppend(dklmdy);
565 fsBuilder->declAppend(dfdx);
566 fsBuilder->declAppend(dfdy);
567 fsBuilder->declAppend(gF);
568 fsBuilder->declAppend(gFM);
569 fsBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000570
571 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700572 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700573 SkAssertResult(fsBuilder->enableFeature(
574 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700575 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
576 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700577 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700578 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
579 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700580 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700581 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
582 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700583 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
584 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
585 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700586 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700587 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
588 fsBuilder->codeAppendf("%s = %s / %s;",
589 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
590 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
591 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000592 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700593 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
594 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
595 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000596 break;
597 }
joshualittb0a8a372014-09-23 09:50:21 -0700598 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700599 SkAssertResult(fsBuilder->enableFeature(
600 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700601 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
602 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700603 fsBuilder->codeAppendf("%s ="
604 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700605 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
606 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700607 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700608 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
609 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700610 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
611 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
612 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700613 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700614 fsBuilder->codeAppendf("%s = %s / %s;",
615 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
616 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
617 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000618 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700619 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
620 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
621 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000622 break;
623 }
joshualittb0a8a372014-09-23 09:50:21 -0700624 case kFillBW_GrProcessorEdgeType: {
egdaniel9bd5bbf2014-08-29 11:12:30 -0700625 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700626 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700627 fsBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000628 break;
629 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000630 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000631 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000632 }
633
joshualitt2dd1ae02014-12-03 06:24:10 -0800634
635 fsBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000636}
637
robertphillips46d36f02015-01-18 08:14:14 -0800638void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800639 const GrBatchTracker& bt,
joshualitt87f48d92014-12-04 10:41:40 -0800640 const GrGLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700641 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800642 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800643 const CubicBatchTracker& local = bt.cast<CubicBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700644 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800645 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x8;
robertphillips46d36f02015-01-18 08:14:14 -0800646 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x10 : 0x0;
647 key |= ComputePosKey(gp.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700648 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000649}
650
651//////////////////////////////////////////////////////////////////////////////
652
653GrCubicEffect::~GrCubicEffect() {}
654
joshualitteb2a6762014-12-04 11:35:33 -0800655void GrCubicEffect::getGLProcessorKey(const GrBatchTracker& bt,
656 const GrGLCaps& caps,
657 GrProcessorKeyBuilder* b) const {
658 GrGLCubicEffect::GenKey(*this, bt, caps, b);
659}
660
joshualittabb52a12015-01-13 15:02:10 -0800661GrGLPrimitiveProcessor* GrCubicEffect::createGLInstance(const GrBatchTracker& bt,
662 const GrGLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800663 return SkNEW_ARGS(GrGLCubicEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000664}
665
joshualitt8059eb92014-12-29 15:10:07 -0800666GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
667 GrPrimitiveEdgeType edgeType)
668 : INHERITED(color, viewMatrix), fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800669 this->initClassID<GrCubicEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800670 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
671 fInCubicCoeffs = &this->addVertexAttrib(Attribute("inCubicCoeffs",
joshualitt2dd1ae02014-12-03 06:24:10 -0800672 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000673}
674
bsalomon0e08fc12014-10-15 08:19:04 -0700675bool GrCubicEffect::onIsEqual(const GrGeometryProcessor& other) const {
joshualitt49586be2014-09-16 08:21:41 -0700676 const GrCubicEffect& ce = other.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000677 return (ce.fEdgeType == fEdgeType);
678}
679
joshualitt9b989322014-12-15 14:16:27 -0800680void GrCubicEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const {
681 CubicBatchTracker* local = bt->cast<CubicBatchTracker>();
682 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
joshualitt290c09b2014-12-19 13:45:20 -0800683 local->fUsesLocalCoords = init.fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800684}
685
joshualitt290c09b2014-12-19 13:45:20 -0800686bool GrCubicEffect::onCanMakeEqual(const GrBatchTracker& m,
687 const GrGeometryProcessor& that,
688 const GrBatchTracker& t) const {
joshualitt9b989322014-12-15 14:16:27 -0800689 const CubicBatchTracker& mine = m.cast<CubicBatchTracker>();
690 const CubicBatchTracker& theirs = t.cast<CubicBatchTracker>();
joshualitt290c09b2014-12-19 13:45:20 -0800691 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords,
692 that, theirs.fUsesLocalCoords) &&
693 CanCombineOutput(mine.fInputColorType, mine.fColor,
joshualitt9b989322014-12-15 14:16:27 -0800694 theirs.fInputColorType, theirs.fColor);
695}
696
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000697//////////////////////////////////////////////////////////////////////////////
698
joshualittb0a8a372014-09-23 09:50:21 -0700699GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000700
joshualittb0a8a372014-09-23 09:50:21 -0700701GrGeometryProcessor* GrCubicEffect::TestCreate(SkRandom* random,
702 GrContext*,
703 const GrDrawTargetCaps& caps,
704 GrTexture*[]) {
705 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000706 do {
joshualittb0a8a372014-09-23 09:50:21 -0700707 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
708 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800709 gp = GrCubicEffect::Create(GrRandomColor(random),
710 GrProcessorUnitTest::TestMatrix(random), edgeType, caps);
joshualittb0a8a372014-09-23 09:50:21 -0700711 } while (NULL == gp);
712 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000713}
egdaniel9bd5bbf2014-08-29 11:12:30 -0700714