blob: 7948e94643e442860a64fb08478ab73e49aac706 [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
mtklein36352bf2015-03-25 18:17:31 -070027 void onEmitCode(EmitArgs&, GrGPArgs*) 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&,
jvanverthcfc18862015-04-28 08:48:20 -070031 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -080032 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,
mtklein36352bf2015-03-25 18:17:31 -070036 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -070037 const GrConicEffect& ce = primProc.cast<GrConicEffect>();
38 this->setUniformViewMatrix(pdman, ce.viewMatrix());
joshualittee2af952014-12-30 09:04:15 -080039
joshualitt9b989322014-12-15 14:16:27 -080040 const ConicBatchTracker& local = bt.cast<ConicBatchTracker>();
41 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
42 GrGLfloat c[4];
43 GrColorToRGBAFloat(local.fColor, c);
44 pdman.set4fv(fColorUniform, 1, c);
45 fColor = local.fColor;
46 }
47 if (0xff != local.fCoverageScale && fCoverageScale != local.fCoverageScale) {
48 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale));
49 fCoverageScale = local.fCoverageScale;
50 }
51 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000052
53private:
joshualitt9b989322014-12-15 14:16:27 -080054 GrColor fColor;
55 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -070056 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -080057 UniformHandle fColorUniform;
58 UniformHandle fCoverageScaleUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000059
joshualitt249af152014-09-15 11:41:13 -070060 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000061};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +000062
joshualitteb2a6762014-12-04 11:35:33 -080063GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -080064 const GrBatchTracker& bt)
65 : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -080066 const GrConicEffect& ce = processor.cast<GrConicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000067 fEdgeType = ce.getEdgeType();
68}
69
robertphillips46d36f02015-01-18 08:14:14 -080070void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualitt9b989322014-12-15 14:16:27 -080071 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -080072 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
73 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>();
joshualitt9b989322014-12-15 14:16:27 -080074 const ConicBatchTracker& local = args.fBT.cast<ConicBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -080075
joshualittabb52a12015-01-13 15:02:10 -080076 // emit attributes
77 vsBuilder->emitAttributes(gp);
78
joshualitt74077b92014-10-24 11:26:03 -070079 GrGLVertToFrag v(kVec4f_GrSLType);
80 args.fPB->addVarying("ConicCoeffs", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -080081 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000082
joshualitt9b989322014-12-15 14:16:27 -080083 // Setup pass through color
84 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
85 &fColorUniform);
86
joshualittabb52a12015-01-13 15:02:10 -080087 // Setup position
joshualittdd219872015-02-12 14:48:42 -080088 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix());
joshualitt4973d9d2014-11-08 09:24:25 -080089
joshualittabb52a12015-01-13 15:02:10 -080090 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -080091 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -080092 args.fTransformsIn, args.fTransformsOut);
93
egdaniel29bee0f2015-04-29 11:54:42 -070094 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -070095 fsBuilder->codeAppend("float edgeAlpha;");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000096
97 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -070098 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -070099 SkAssertResult(fsBuilder->enableFeature(
100 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700101 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
102 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700103 fsBuilder->codeAppendf("float dfdx ="
104 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700105 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700106 fsBuilder->codeAppendf("float dfdy ="
107 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700108 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700109 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
110 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700111 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn(), v.fsIn(),
112 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700113 fsBuilder->codeAppend("func = abs(func);");
114 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
115 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000116 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700117 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000118 break;
119 }
joshualittb0a8a372014-09-23 09:50:21 -0700120 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700121 SkAssertResult(fsBuilder->enableFeature(
122 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700123 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
124 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700125 fsBuilder->codeAppendf("float dfdx ="
126 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700127 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700128 fsBuilder->codeAppendf("float dfdy ="
129 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700130 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700131 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
132 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700133 fsBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
134 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700135 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
136 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000137 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700138 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000139 break;
140 }
joshualittb0a8a372014-09-23 09:50:21 -0700141 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700142 fsBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
143 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700144 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000145 break;
146 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000147 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000148 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000149 }
150
joshualitt9b989322014-12-15 14:16:27 -0800151 if (0xff != local.fCoverageScale) {
152 const char* coverageScale;
153 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
joshualittdd219872015-02-12 14:48:42 -0800154 kFloat_GrSLType,
155 kDefault_GrSLPrecision,
156 "Coverage",
157 &coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800158 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
159 } else {
160 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
161 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000162}
163
robertphillips46d36f02015-01-18 08:14:14 -0800164void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800165 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700166 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700167 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800168 const GrConicEffect& ce = gp.cast<GrConicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800169 const ConicBatchTracker& local = bt.cast<ConicBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700170 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800171 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0;
172 key |= 0xff != local.fCoverageScale ? 0x8 : 0x0;
robertphillips46d36f02015-01-18 08:14:14 -0800173 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700174 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700175 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000176}
177
178//////////////////////////////////////////////////////////////////////////////
179
180GrConicEffect::~GrConicEffect() {}
181
joshualitteb2a6762014-12-04 11:35:33 -0800182void GrConicEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700183 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800184 GrProcessorKeyBuilder* b) const {
185 GrGLConicEffect::GenKey(*this, bt, caps, b);
186}
187
joshualittabb52a12015-01-13 15:02:10 -0800188GrGLPrimitiveProcessor* GrConicEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700189 const GrGLSLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800190 return SkNEW_ARGS(GrGLConicEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000191}
192
joshualitt8059eb92014-12-29 15:10:07 -0800193GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
194 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix)
joshualitte578a952015-05-14 10:09:13 -0700195 : INHERITED(localMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700196 , fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700197 , fViewMatrix(viewMatrix)
joshualitt8059eb92014-12-29 15:10:07 -0800198 , 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
joshualitt4d8da812015-01-28 12:53:54 -0800206void GrConicEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const {
joshualitt9b989322014-12-15 14:16:27 -0800207 ConicBatchTracker* local = bt->cast<ConicBatchTracker>();
208 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
209 local->fCoverageScale = fCoverageScale;
joshualitt290c09b2014-12-19 13:45:20 -0800210 local->fUsesLocalCoords = init.fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800211}
212
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000213//////////////////////////////////////////////////////////////////////////////
214
joshualittb0a8a372014-09-23 09:50:21 -0700215GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000216
joshualittb0a8a372014-09-23 09:50:21 -0700217GrGeometryProcessor* GrConicEffect::TestCreate(SkRandom* random,
218 GrContext*,
219 const GrDrawTargetCaps& caps,
220 GrTexture*[]) {
221 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000222 do {
joshualittb0a8a372014-09-23 09:50:21 -0700223 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
224 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt4eaf9ce2015-04-28 13:31:18 -0700225 gp = GrConicEffect::Create(GrRandomColor(random), GrTest::TestMatrix(random),
joshualitt8059eb92014-12-29 15:10:07 -0800226 edgeType, caps,
joshualitt4eaf9ce2015-04-28 13:31:18 -0700227 GrTest::TestMatrix(random));
joshualittb0a8a372014-09-23 09:50:21 -0700228 } while (NULL == gp);
229 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000230}
231
232//////////////////////////////////////////////////////////////////////////////
233// Quad
234//////////////////////////////////////////////////////////////////////////////
235
joshualitt9b989322014-12-15 14:16:27 -0800236struct QuadBatchTracker {
237 GrGPInput fInputColorType;
238 GrColor fColor;
239 uint8_t fCoverageScale;
joshualitt290c09b2014-12-19 13:45:20 -0800240 bool fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800241};
242
joshualitt249af152014-09-15 11:41:13 -0700243class GrGLQuadEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000244public:
joshualitteb2a6762014-12-04 11:35:33 -0800245 GrGLQuadEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800246 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000247
mtklein36352bf2015-03-25 18:17:31 -0700248 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000249
joshualitt87f48d92014-12-04 10:41:40 -0800250 static inline void GenKey(const GrGeometryProcessor&,
251 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -0700252 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800253 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000254
joshualitt9b989322014-12-15 14:16:27 -0800255 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800256 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -0700257 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -0700258 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
259 this->setUniformViewMatrix(pdman, qe.viewMatrix());
joshualittee2af952014-12-30 09:04:15 -0800260
joshualitt9b989322014-12-15 14:16:27 -0800261 const QuadBatchTracker& local = bt.cast<QuadBatchTracker>();
262 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
263 GrGLfloat c[4];
264 GrColorToRGBAFloat(local.fColor, c);
265 pdman.set4fv(fColorUniform, 1, c);
266 fColor = local.fColor;
267 }
268 if (0xff != local.fCoverageScale && local.fCoverageScale != fCoverageScale) {
269 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale));
270 fCoverageScale = local.fCoverageScale;
271 }
272 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000273
274private:
joshualitt9b989322014-12-15 14:16:27 -0800275 GrColor fColor;
276 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700277 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800278 UniformHandle fColorUniform;
279 UniformHandle fCoverageScaleUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000280
joshualitt249af152014-09-15 11:41:13 -0700281 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000282};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000283
joshualitteb2a6762014-12-04 11:35:33 -0800284GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800285 const GrBatchTracker& bt)
286 : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800287 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000288 fEdgeType = ce.getEdgeType();
289}
290
robertphillips46d36f02015-01-18 08:14:14 -0800291void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualitt9b989322014-12-15 14:16:27 -0800292 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -0800293 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
294 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800295 const QuadBatchTracker& local = args.fBT.cast<QuadBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800296
joshualittabb52a12015-01-13 15:02:10 -0800297 // emit attributes
298 vsBuilder->emitAttributes(gp);
299
joshualitt74077b92014-10-24 11:26:03 -0700300 GrGLVertToFrag v(kVec4f_GrSLType);
301 args.fPB->addVarying("HairQuadEdge", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -0800302 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000303
joshualitt9b989322014-12-15 14:16:27 -0800304 // Setup pass through color
305 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
306 &fColorUniform);
307
joshualittabb52a12015-01-13 15:02:10 -0800308 // Setup position
joshualittdd219872015-02-12 14:48:42 -0800309 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix());
joshualitt4973d9d2014-11-08 09:24:25 -0800310
joshualittabb52a12015-01-13 15:02:10 -0800311 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -0800312 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -0800313 args.fTransformsIn, args.fTransformsOut);
314
egdaniel29bee0f2015-04-29 11:54:42 -0700315 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -0700316 fsBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700317
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000318 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700319 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700320 SkAssertResult(fsBuilder->enableFeature(
321 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700322 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
323 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700324 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
325 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700326 v.fsIn(), v.fsIn());
327 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700328 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
329 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000330 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700331 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000332 break;
333 }
joshualittb0a8a372014-09-23 09:50:21 -0700334 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700335 SkAssertResult(fsBuilder->enableFeature(
336 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700337 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
338 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700339 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
340 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700341 v.fsIn(), v.fsIn());
342 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700343 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
344 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000345 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700346 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000347 break;
348 }
joshualittb0a8a372014-09-23 09:50:21 -0700349 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700350 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700351 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000352 break;
353 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000354 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000355 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000356 }
357
joshualitt9b989322014-12-15 14:16:27 -0800358 if (0xff != local.fCoverageScale) {
359 const char* coverageScale;
360 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
361 kFloat_GrSLType,
362 kDefault_GrSLPrecision,
363 "Coverage",
364 &coverageScale);
365 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
366 } else {
367 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
368 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000369}
370
robertphillips46d36f02015-01-18 08:14:14 -0800371void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800372 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700373 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700374 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800375 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800376 const QuadBatchTracker& local = bt.cast<QuadBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700377 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800378 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0;
379 key |= 0xff != local.fCoverageScale ? 0x8 : 0x0;
robertphillips46d36f02015-01-18 08:14:14 -0800380 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700381 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700382 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000383}
384
385//////////////////////////////////////////////////////////////////////////////
386
387GrQuadEffect::~GrQuadEffect() {}
388
joshualitteb2a6762014-12-04 11:35:33 -0800389void GrQuadEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700390 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800391 GrProcessorKeyBuilder* b) const {
392 GrGLQuadEffect::GenKey(*this, bt, caps, b);
393}
394
joshualittabb52a12015-01-13 15:02:10 -0800395GrGLPrimitiveProcessor* GrQuadEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700396 const GrGLSLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800397 return SkNEW_ARGS(GrGLQuadEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000398}
399
joshualitt8059eb92014-12-29 15:10:07 -0800400GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
401 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix)
joshualitte578a952015-05-14 10:09:13 -0700402 : INHERITED(localMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700403 , fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700404 , fViewMatrix(viewMatrix)
joshualitt8059eb92014-12-29 15:10:07 -0800405 , fCoverageScale(coverage)
406 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800407 this->initClassID<GrQuadEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800408 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
409 fInHairQuadEdge = &this->addVertexAttrib(Attribute("inHairQuadEdge",
joshualitt2dd1ae02014-12-03 06:24:10 -0800410 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000411}
412
joshualitt4d8da812015-01-28 12:53:54 -0800413void GrQuadEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const {
joshualitt9b989322014-12-15 14:16:27 -0800414 QuadBatchTracker* local = bt->cast<QuadBatchTracker>();
415 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
416 local->fCoverageScale = fCoverageScale;
joshualitt290c09b2014-12-19 13:45:20 -0800417 local->fUsesLocalCoords = init.fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800418}
419
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000420//////////////////////////////////////////////////////////////////////////////
421
joshualittb0a8a372014-09-23 09:50:21 -0700422GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000423
joshualittb0a8a372014-09-23 09:50:21 -0700424GrGeometryProcessor* GrQuadEffect::TestCreate(SkRandom* random,
425 GrContext*,
426 const GrDrawTargetCaps& caps,
427 GrTexture*[]) {
428 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000429 do {
joshualittb0a8a372014-09-23 09:50:21 -0700430 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
431 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800432 gp = GrQuadEffect::Create(GrRandomColor(random),
joshualitt4eaf9ce2015-04-28 13:31:18 -0700433 GrTest::TestMatrix(random),
joshualitt8059eb92014-12-29 15:10:07 -0800434 edgeType, caps,
joshualitt4eaf9ce2015-04-28 13:31:18 -0700435 GrTest::TestMatrix(random));
joshualittb0a8a372014-09-23 09:50:21 -0700436 } while (NULL == gp);
437 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000438}
439
440//////////////////////////////////////////////////////////////////////////////
441// Cubic
442//////////////////////////////////////////////////////////////////////////////
443
joshualitt9b989322014-12-15 14:16:27 -0800444struct CubicBatchTracker {
445 GrGPInput fInputColorType;
446 GrColor fColor;
joshualitt290c09b2014-12-19 13:45:20 -0800447 bool fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800448};
449
joshualitt249af152014-09-15 11:41:13 -0700450class GrGLCubicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000451public:
joshualitteb2a6762014-12-04 11:35:33 -0800452 GrGLCubicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800453 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000454
mtklein36352bf2015-03-25 18:17:31 -0700455 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000456
joshualitt87f48d92014-12-04 10:41:40 -0800457 static inline void GenKey(const GrGeometryProcessor&,
458 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -0700459 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800460 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000461
joshualitt9b989322014-12-15 14:16:27 -0800462 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800463 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -0700464 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -0700465 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
466 this->setUniformViewMatrix(pdman, ce.viewMatrix());
joshualittee2af952014-12-30 09:04:15 -0800467
joshualitt9b989322014-12-15 14:16:27 -0800468 const CubicBatchTracker& local = bt.cast<CubicBatchTracker>();
469 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
470 GrGLfloat c[4];
471 GrColorToRGBAFloat(local.fColor, c);
472 pdman.set4fv(fColorUniform, 1, c);
473 fColor = local.fColor;
474 }
475 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000476
477private:
joshualitt9b989322014-12-15 14:16:27 -0800478 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700479 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800480 UniformHandle fColorUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000481
joshualitt249af152014-09-15 11:41:13 -0700482 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000483};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000484
joshualitteb2a6762014-12-04 11:35:33 -0800485GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800486 const GrBatchTracker&)
487 : fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700488 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000489 fEdgeType = ce.getEdgeType();
490}
491
robertphillips46d36f02015-01-18 08:14:14 -0800492void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualittc369e7c2014-10-22 10:56:26 -0700493 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
joshualitt2dd1ae02014-12-03 06:24:10 -0800494 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800495 const CubicBatchTracker& local = args.fBT.cast<CubicBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800496
joshualittabb52a12015-01-13 15:02:10 -0800497 // emit attributes
498 vsBuilder->emitAttributes(gp);
499
joshualitt2dd1ae02014-12-03 06:24:10 -0800500 GrGLVertToFrag v(kVec4f_GrSLType);
bsalomonc0bd6482014-12-09 10:04:14 -0800501 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
joshualitt2dd1ae02014-12-03 06:24:10 -0800502 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
503
joshualitt9b989322014-12-15 14:16:27 -0800504 // Setup pass through color
505 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
506 &fColorUniform);
507
joshualittabb52a12015-01-13 15:02:10 -0800508 // Setup position
joshualittdd219872015-02-12 14:48:42 -0800509 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix());
joshualitt4973d9d2014-11-08 09:24:25 -0800510
joshualittabb52a12015-01-13 15:02:10 -0800511 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -0800512 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -0800513 args.fTransformsIn, args.fTransformsOut);
514
egdaniel29bee0f2015-04-29 11:54:42 -0700515 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -0700516
bsalomonc0bd6482014-12-09 10:04:14 -0800517 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
518 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
519 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
520 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
521 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
522 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
523 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
524 GrGLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700525
526 fsBuilder->declAppend(edgeAlpha);
527 fsBuilder->declAppend(dklmdx);
528 fsBuilder->declAppend(dklmdy);
529 fsBuilder->declAppend(dfdx);
530 fsBuilder->declAppend(dfdy);
531 fsBuilder->declAppend(gF);
532 fsBuilder->declAppend(gFM);
533 fsBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000534
535 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700536 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700537 SkAssertResult(fsBuilder->enableFeature(
538 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700539 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
540 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700541 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 -0700542 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
543 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700544 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 -0700545 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
546 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700547 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
548 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
549 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700550 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700551 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
552 fsBuilder->codeAppendf("%s = %s / %s;",
553 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
554 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
555 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000556 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700557 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
558 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
559 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000560 break;
561 }
joshualittb0a8a372014-09-23 09:50:21 -0700562 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700563 SkAssertResult(fsBuilder->enableFeature(
564 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700565 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
566 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700567 fsBuilder->codeAppendf("%s ="
568 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700569 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
570 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700571 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 -0700572 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
573 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700574 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
575 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
576 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700577 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700578 fsBuilder->codeAppendf("%s = %s / %s;",
579 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
580 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
581 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000582 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700583 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
584 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
585 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000586 break;
587 }
joshualittb0a8a372014-09-23 09:50:21 -0700588 case kFillBW_GrProcessorEdgeType: {
egdaniel9bd5bbf2014-08-29 11:12:30 -0700589 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700590 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700591 fsBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000592 break;
593 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000594 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000595 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000596 }
597
joshualitt2dd1ae02014-12-03 06:24:10 -0800598
599 fsBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000600}
601
robertphillips46d36f02015-01-18 08:14:14 -0800602void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800603 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700604 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700605 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800606 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800607 const CubicBatchTracker& local = bt.cast<CubicBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700608 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800609 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x8;
robertphillips46d36f02015-01-18 08:14:14 -0800610 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700611 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700612 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000613}
614
615//////////////////////////////////////////////////////////////////////////////
616
617GrCubicEffect::~GrCubicEffect() {}
618
joshualitteb2a6762014-12-04 11:35:33 -0800619void GrCubicEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700620 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800621 GrProcessorKeyBuilder* b) const {
622 GrGLCubicEffect::GenKey(*this, bt, caps, b);
623}
624
joshualittabb52a12015-01-13 15:02:10 -0800625GrGLPrimitiveProcessor* GrCubicEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700626 const GrGLSLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800627 return SkNEW_ARGS(GrGLCubicEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000628}
629
joshualitt8059eb92014-12-29 15:10:07 -0800630GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
631 GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700632 : fColor(color)
633 , fViewMatrix(viewMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700634 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800635 this->initClassID<GrCubicEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800636 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
637 fInCubicCoeffs = &this->addVertexAttrib(Attribute("inCubicCoeffs",
joshualitt2dd1ae02014-12-03 06:24:10 -0800638 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000639}
640
joshualitt4d8da812015-01-28 12:53:54 -0800641void GrCubicEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const {
joshualitt9b989322014-12-15 14:16:27 -0800642 CubicBatchTracker* local = bt->cast<CubicBatchTracker>();
643 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
joshualitt290c09b2014-12-19 13:45:20 -0800644 local->fUsesLocalCoords = init.fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800645}
646
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000647//////////////////////////////////////////////////////////////////////////////
648
joshualittb0a8a372014-09-23 09:50:21 -0700649GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000650
joshualittb0a8a372014-09-23 09:50:21 -0700651GrGeometryProcessor* GrCubicEffect::TestCreate(SkRandom* random,
652 GrContext*,
653 const GrDrawTargetCaps& caps,
654 GrTexture*[]) {
655 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000656 do {
joshualittb0a8a372014-09-23 09:50:21 -0700657 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
658 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800659 gp = GrCubicEffect::Create(GrRandomColor(random),
joshualitt4eaf9ce2015-04-28 13:31:18 -0700660 GrTest::TestMatrix(random), edgeType, caps);
joshualittb0a8a372014-09-23 09:50:21 -0700661 } while (NULL == gp);
662 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000663}
egdaniel9bd5bbf2014-08-29 11:12:30 -0700664