blob: f6743457284786f970ec8e49eb733e2813e4f526 [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
joshualittabb52a12015-01-13 15:02:10 -080027 void onEmitCode(EmitArgs&) 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
joshualittabb52a12015-01-13 15:02:10 -080069void GrGLConicEffect::onEmitCode(EmitArgs& args) {
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
90 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", this->position(), this->uViewM(),
joshualitt2dd1ae02014-12-03 06:24:10 -080091 gp.inPosition()->fName);
joshualitt4973d9d2014-11-08 09:24:25 -080092
joshualittabb52a12015-01-13 15:02:10 -080093 // emit transforms with position
94 this->emitTransforms(pb, this->position(), gp.inPosition()->fName, gp.localMatrix(),
95 args.fTransformsIn, args.fTransformsOut);
96
joshualittc369e7c2014-10-22 10:56:26 -070097 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -070098 fsBuilder->codeAppend("float edgeAlpha;");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000099
100 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700101 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700102 SkAssertResult(fsBuilder->enableFeature(
103 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700104 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
105 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700106 fsBuilder->codeAppendf("float dfdx ="
107 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700108 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700109 fsBuilder->codeAppendf("float dfdy ="
110 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700111 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700112 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
113 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700114 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn(), v.fsIn(),
115 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700116 fsBuilder->codeAppend("func = abs(func);");
117 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
118 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000119 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700120 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000121 break;
122 }
joshualittb0a8a372014-09-23 09:50:21 -0700123 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700124 SkAssertResult(fsBuilder->enableFeature(
125 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700126 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
127 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700128 fsBuilder->codeAppendf("float dfdx ="
129 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700130 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700131 fsBuilder->codeAppendf("float dfdy ="
132 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700133 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700134 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
135 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700136 fsBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
137 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700138 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
139 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000140 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700141 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000142 break;
143 }
joshualittb0a8a372014-09-23 09:50:21 -0700144 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700145 fsBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
146 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700147 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000148 break;
149 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000150 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000151 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000152 }
153
joshualitt9b989322014-12-15 14:16:27 -0800154 if (0xff != local.fCoverageScale) {
155 const char* coverageScale;
156 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
157 kFloat_GrSLType,
158 kDefault_GrSLPrecision,
159 "Coverage",
160 &coverageScale);
161 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
162 } else {
163 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
164 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000165}
166
joshualitt87f48d92014-12-04 10:41:40 -0800167void GrGLConicEffect::GenKey(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800168 const GrBatchTracker& bt,
joshualitt87f48d92014-12-04 10:41:40 -0800169 const GrGLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700170 GrProcessorKeyBuilder* b) {
171 const GrConicEffect& ce = processor.cast<GrConicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800172 const ConicBatchTracker& local = bt.cast<ConicBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700173 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800174 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0;
175 key |= 0xff != local.fCoverageScale ? 0x8 : 0x0;
joshualitt8fc6c2d2014-12-22 15:27:05 -0800176 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspective() ? 0x10 : 0x0;
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>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800201 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
202 fInConicCoeffs = &this->addVertexAttrib(GrAttribute("inConicCoeffs",
203 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
joshualittabb52a12015-01-13 15:02:10 -0800265 void onEmitCode(EmitArgs&) 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
joshualittabb52a12015-01-13 15:02:10 -0800307void GrGLQuadEffect::onEmitCode(EmitArgs& args) {
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
328 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", this->position(), this->uViewM(),
joshualitt2dd1ae02014-12-03 06:24:10 -0800329 gp.inPosition()->fName);
joshualitt4973d9d2014-11-08 09:24:25 -0800330
joshualittabb52a12015-01-13 15:02:10 -0800331 // emit transforms with position
332 this->emitTransforms(pb, this->position(), gp.inPosition()->fName, gp.localMatrix(),
333 args.fTransformsIn, args.fTransformsOut);
334
joshualittc369e7c2014-10-22 10:56:26 -0700335 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -0700336 fsBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700337
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000338 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700339 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700340 SkAssertResult(fsBuilder->enableFeature(
341 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700342 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
343 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700344 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
345 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700346 v.fsIn(), v.fsIn());
347 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700348 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
349 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000350 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700351 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000352 break;
353 }
joshualittb0a8a372014-09-23 09:50:21 -0700354 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700355 SkAssertResult(fsBuilder->enableFeature(
356 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700357 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
358 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700359 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
360 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700361 v.fsIn(), v.fsIn());
362 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700363 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
364 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000365 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700366 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000367 break;
368 }
joshualittb0a8a372014-09-23 09:50:21 -0700369 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700370 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700371 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000372 break;
373 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000374 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000375 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000376 }
377
joshualitt9b989322014-12-15 14:16:27 -0800378 if (0xff != local.fCoverageScale) {
379 const char* coverageScale;
380 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
381 kFloat_GrSLType,
382 kDefault_GrSLPrecision,
383 "Coverage",
384 &coverageScale);
385 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
386 } else {
387 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
388 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000389}
390
joshualitt87f48d92014-12-04 10:41:40 -0800391void GrGLQuadEffect::GenKey(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800392 const GrBatchTracker& bt,
joshualitt87f48d92014-12-04 10:41:40 -0800393 const GrGLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700394 GrProcessorKeyBuilder* b) {
395 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800396 const QuadBatchTracker& local = bt.cast<QuadBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700397 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800398 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0;
399 key |= 0xff != local.fCoverageScale ? 0x8 : 0x0;
joshualitt8fc6c2d2014-12-22 15:27:05 -0800400 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspective() ? 0x10 : 0x0;
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>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800425 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
426 fInHairQuadEdge = &this->addVertexAttrib(GrAttribute("inHairQuadEdge",
427 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
joshualittabb52a12015-01-13 15:02:10 -0800489 void onEmitCode(EmitArgs&) 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
joshualittabb52a12015-01-13 15:02:10 -0800525void GrGLCubicEffect::onEmitCode(EmitArgs& args) {
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
545 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", this->position(), this->uViewM(),
joshualitt2dd1ae02014-12-03 06:24:10 -0800546 gp.inPosition()->fName);
joshualitt4973d9d2014-11-08 09:24:25 -0800547
joshualittabb52a12015-01-13 15:02:10 -0800548 // emit transforms with position
549 this->emitTransforms(args.fPB, this->position(), gp.inPosition()->fName, gp.localMatrix(),
550 args.fTransformsIn, args.fTransformsOut);
551
joshualittc369e7c2014-10-22 10:56:26 -0700552 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -0700553
bsalomonc0bd6482014-12-09 10:04:14 -0800554 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
555 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
556 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
557 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
558 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
559 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
560 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
561 GrGLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700562
563 fsBuilder->declAppend(edgeAlpha);
564 fsBuilder->declAppend(dklmdx);
565 fsBuilder->declAppend(dklmdy);
566 fsBuilder->declAppend(dfdx);
567 fsBuilder->declAppend(dfdy);
568 fsBuilder->declAppend(gF);
569 fsBuilder->declAppend(gFM);
570 fsBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000571
572 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700573 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700574 SkAssertResult(fsBuilder->enableFeature(
575 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700576 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
577 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700578 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 -0700579 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
580 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700581 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 -0700582 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
583 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700584 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
585 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
586 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700587 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700588 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
589 fsBuilder->codeAppendf("%s = %s / %s;",
590 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
591 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
592 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000593 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700594 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
595 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
596 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000597 break;
598 }
joshualittb0a8a372014-09-23 09:50:21 -0700599 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700600 SkAssertResult(fsBuilder->enableFeature(
601 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700602 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
603 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700604 fsBuilder->codeAppendf("%s ="
605 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700606 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
607 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700608 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 -0700609 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
610 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700611 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
612 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
613 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700614 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700615 fsBuilder->codeAppendf("%s = %s / %s;",
616 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
617 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
618 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000619 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700620 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
621 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
622 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000623 break;
624 }
joshualittb0a8a372014-09-23 09:50:21 -0700625 case kFillBW_GrProcessorEdgeType: {
egdaniel9bd5bbf2014-08-29 11:12:30 -0700626 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700627 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700628 fsBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000629 break;
630 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000631 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000632 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000633 }
634
joshualitt2dd1ae02014-12-03 06:24:10 -0800635
636 fsBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000637}
638
joshualitt87f48d92014-12-04 10:41:40 -0800639void GrGLCubicEffect::GenKey(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800640 const GrBatchTracker& bt,
joshualitt87f48d92014-12-04 10:41:40 -0800641 const GrGLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700642 GrProcessorKeyBuilder* b) {
643 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800644 const CubicBatchTracker& local = bt.cast<CubicBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700645 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800646 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x8;
joshualitt8fc6c2d2014-12-22 15:27:05 -0800647 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspective() ? 0x10 : 0x0;
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>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800670 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
671 fInCubicCoeffs = &this->addVertexAttrib(GrAttribute("inCubicCoeffs",
672 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