blob: 5872992aac7047a305013d03266147fb3bb5df3e [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
wangyix6af0c932015-07-22 10:21:17 -070010#include "gl/GrGLFragmentProcessor.h"
joshualitt249af152014-09-15 11:41:13 -070011#include "gl/GrGLGeometryProcessor.h"
joshualitteb2a6762014-12-04 11:35:33 -080012#include "gl/builders/GrGLProgramBuilder.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000013
joshualitt249af152014-09-15 11:41:13 -070014class GrGLConicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000015public:
joshualitteb2a6762014-12-04 11:35:33 -080016 GrGLConicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -080017 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000018
mtklein36352bf2015-03-25 18:17:31 -070019 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000020
joshualitt87f48d92014-12-04 10:41:40 -080021 static inline void GenKey(const GrGeometryProcessor&,
22 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -070023 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -080024 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000025
joshualitt9b989322014-12-15 14:16:27 -080026 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -080027 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -070028 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -070029 const GrConicEffect& ce = primProc.cast<GrConicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -070030
31 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
32 fViewMatrix = ce.viewMatrix();
33 GrGLfloat viewMatrix[3 * 3];
34 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
35 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
36 }
joshualittee2af952014-12-30 09:04:15 -080037
joshualittb8c241a2015-05-19 08:23:30 -070038 if (ce.color() != fColor) {
joshualitt9b989322014-12-15 14:16:27 -080039 GrGLfloat c[4];
joshualittb8c241a2015-05-19 08:23:30 -070040 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -080041 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -070042 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -080043 }
joshualittb8c241a2015-05-19 08:23:30 -070044
45 if (ce.coverageScale() != 0xff && ce.coverageScale() != fCoverageScale) {
46 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(ce.coverageScale()));
47 fCoverageScale = ce.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -080048 }
49 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000050
joshualitte3ababe2015-05-15 07:56:07 -070051 void setTransformData(const GrPrimitiveProcessor& primProc,
52 const GrGLProgramDataManager& pdman,
53 int index,
54 const SkTArray<const GrCoordTransform*, true>& transforms) override {
55 this->setTransformDataHelper<GrConicEffect>(primProc, pdman, index, transforms);
56 }
57
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000058private:
joshualitt5559ca22015-05-21 15:50:36 -070059 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -080060 GrColor fColor;
61 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -070062 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -080063 UniformHandle fColorUniform;
64 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -070065 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000066
joshualitt249af152014-09-15 11:41:13 -070067 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000068};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +000069
joshualitteb2a6762014-12-04 11:35:33 -080070GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -080071 const GrBatchTracker& bt)
joshualitt5559ca22015-05-21 15:50:36 -070072 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -080073 const GrConicEffect& ce = processor.cast<GrConicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000074 fEdgeType = ce.getEdgeType();
75}
76
robertphillips46d36f02015-01-18 08:14:14 -080077void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualitt9b989322014-12-15 14:16:27 -080078 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -080079 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
80 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>();
81
joshualittabb52a12015-01-13 15:02:10 -080082 // emit attributes
83 vsBuilder->emitAttributes(gp);
84
joshualitt74077b92014-10-24 11:26:03 -070085 GrGLVertToFrag v(kVec4f_GrSLType);
86 args.fPB->addVarying("ConicCoeffs", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -080087 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000088
joshualitt9b989322014-12-15 14:16:27 -080089 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -070090 if (!gp.colorIgnored()) {
91 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform);
92 }
joshualitt9b989322014-12-15 14:16:27 -080093
joshualittabb52a12015-01-13 15:02:10 -080094 // Setup position
joshualitt5559ca22015-05-21 15:50:36 -070095 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -080096
joshualittabb52a12015-01-13 15:02:10 -080097 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -080098 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -080099 args.fTransformsIn, args.fTransformsOut);
100
egdaniel29bee0f2015-04-29 11:54:42 -0700101 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -0700102 fsBuilder->codeAppend("float edgeAlpha;");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000103
104 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700105 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700106 SkAssertResult(fsBuilder->enableFeature(
107 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700108 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
109 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700110 fsBuilder->codeAppendf("float dfdx ="
111 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700112 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700113 fsBuilder->codeAppendf("float dfdy ="
114 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700115 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700116 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
117 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700118 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn(), v.fsIn(),
119 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700120 fsBuilder->codeAppend("func = abs(func);");
121 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
122 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000123 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700124 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000125 break;
126 }
joshualittb0a8a372014-09-23 09:50:21 -0700127 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700128 SkAssertResult(fsBuilder->enableFeature(
129 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700130 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
131 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700132 fsBuilder->codeAppendf("float dfdx ="
133 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700134 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700135 fsBuilder->codeAppendf("float dfdy ="
136 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700137 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700138 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
139 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700140 fsBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
141 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700142 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
143 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000144 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700145 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000146 break;
147 }
joshualittb0a8a372014-09-23 09:50:21 -0700148 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700149 fsBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
150 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700151 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000152 break;
153 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000154 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000155 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000156 }
157
joshualittb8c241a2015-05-19 08:23:30 -0700158 // TODO should we really be doing this?
159 if (gp.coverageScale() != 0xff) {
joshualitt9b989322014-12-15 14:16:27 -0800160 const char* coverageScale;
161 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
joshualittdd219872015-02-12 14:48:42 -0800162 kFloat_GrSLType,
163 kDefault_GrSLPrecision,
164 "Coverage",
165 &coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800166 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
167 } else {
168 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
169 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000170}
171
robertphillips46d36f02015-01-18 08:14:14 -0800172void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800173 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700174 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700175 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800176 const GrConicEffect& ce = gp.cast<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700177 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700178 key |= GrColor_ILLEGAL != ce.color() ? 0x4 : 0x0;
179 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0;
180 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700181 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700182 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000183}
184
185//////////////////////////////////////////////////////////////////////////////
186
187GrConicEffect::~GrConicEffect() {}
188
joshualitteb2a6762014-12-04 11:35:33 -0800189void GrConicEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700190 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800191 GrProcessorKeyBuilder* b) const {
192 GrGLConicEffect::GenKey(*this, bt, caps, b);
193}
194
joshualittabb52a12015-01-13 15:02:10 -0800195GrGLPrimitiveProcessor* GrConicEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700196 const GrGLSLCaps&) const {
halcanary385fe4d2015-08-26 13:07:48 -0700197 return new GrGLConicEffect(*this, bt);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000198}
199
joshualitt8059eb92014-12-29 15:10:07 -0800200GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700201 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
202 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700203 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700204 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700205 , fLocalMatrix(viewMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700206 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800207 , fCoverageScale(coverage)
208 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800209 this->initClassID<GrConicEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700210 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
211 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800212 fInConicCoeffs = &this->addVertexAttrib(Attribute("inConicCoeffs",
joshualittb8c241a2015-05-19 08:23:30 -0700213 kVec4f_GrVertexAttribType));
joshualitt9b989322014-12-15 14:16:27 -0800214}
215
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000216//////////////////////////////////////////////////////////////////////////////
217
joshualittb0a8a372014-09-23 09:50:21 -0700218GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000219
bsalomonc21b09e2015-08-28 18:46:56 -0700220const GrGeometryProcessor* GrConicEffect::TestCreate(GrProcessorTestData* d) {
joshualittb0a8a372014-09-23 09:50:21 -0700221 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000222 do {
joshualitt0067ff52015-07-08 14:26:19 -0700223 GrPrimitiveEdgeType edgeType =
224 static_cast<GrPrimitiveEdgeType>(
225 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
226 gp = GrConicEffect::Create(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom),
227 edgeType, *d->fCaps,
228 GrTest::TestMatrix(d->fRandom), d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700229 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700230 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000231}
232
233//////////////////////////////////////////////////////////////////////////////
234// Quad
235//////////////////////////////////////////////////////////////////////////////
236
joshualitt249af152014-09-15 11:41:13 -0700237class GrGLQuadEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000238public:
joshualitteb2a6762014-12-04 11:35:33 -0800239 GrGLQuadEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800240 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000241
mtklein36352bf2015-03-25 18:17:31 -0700242 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000243
joshualitt87f48d92014-12-04 10:41:40 -0800244 static inline void GenKey(const GrGeometryProcessor&,
245 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -0700246 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800247 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000248
joshualitt9b989322014-12-15 14:16:27 -0800249 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800250 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -0700251 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -0700252 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700253
254 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMatrix())) {
255 fViewMatrix = qe.viewMatrix();
256 GrGLfloat viewMatrix[3 * 3];
257 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
258 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
259 }
joshualittee2af952014-12-30 09:04:15 -0800260
joshualittb8c241a2015-05-19 08:23:30 -0700261 if (qe.color() != fColor) {
joshualitt9b989322014-12-15 14:16:27 -0800262 GrGLfloat c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700263 GrColorToRGBAFloat(qe.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800264 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700265 fColor = qe.color();
joshualitt9b989322014-12-15 14:16:27 -0800266 }
joshualittb8c241a2015-05-19 08:23:30 -0700267
268 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
269 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale()));
270 fCoverageScale = qe.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -0800271 }
272 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000273
joshualitte3ababe2015-05-15 07:56:07 -0700274 void setTransformData(const GrPrimitiveProcessor& primProc,
275 const GrGLProgramDataManager& pdman,
276 int index,
277 const SkTArray<const GrCoordTransform*, true>& transforms) override {
278 this->setTransformDataHelper<GrQuadEffect>(primProc, pdman, index, transforms);
279 }
280
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000281private:
joshualitt5559ca22015-05-21 15:50:36 -0700282 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800283 GrColor fColor;
284 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700285 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800286 UniformHandle fColorUniform;
287 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700288 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000289
joshualitt249af152014-09-15 11:41:13 -0700290 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000291};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000292
joshualitteb2a6762014-12-04 11:35:33 -0800293GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800294 const GrBatchTracker& bt)
joshualitt5559ca22015-05-21 15:50:36 -0700295 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800296 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000297 fEdgeType = ce.getEdgeType();
298}
299
robertphillips46d36f02015-01-18 08:14:14 -0800300void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualitt9b989322014-12-15 14:16:27 -0800301 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -0800302 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
303 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
304
joshualittabb52a12015-01-13 15:02:10 -0800305 // emit attributes
306 vsBuilder->emitAttributes(gp);
307
joshualitt74077b92014-10-24 11:26:03 -0700308 GrGLVertToFrag v(kVec4f_GrSLType);
309 args.fPB->addVarying("HairQuadEdge", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -0800310 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000311
joshualitt9b989322014-12-15 14:16:27 -0800312 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700313 if (!gp.colorIgnored()) {
314 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform);
315 }
joshualitt9b989322014-12-15 14:16:27 -0800316
joshualittabb52a12015-01-13 15:02:10 -0800317 // Setup position
joshualitt5559ca22015-05-21 15:50:36 -0700318 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800319
joshualittabb52a12015-01-13 15:02:10 -0800320 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -0800321 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -0800322 args.fTransformsIn, args.fTransformsOut);
323
egdaniel29bee0f2015-04-29 11:54:42 -0700324 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -0700325 fsBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700326
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000327 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700328 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700329 SkAssertResult(fsBuilder->enableFeature(
330 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700331 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
332 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700333 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
334 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700335 v.fsIn(), v.fsIn());
336 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700337 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
338 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000339 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700340 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000341 break;
342 }
joshualittb0a8a372014-09-23 09:50:21 -0700343 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700344 SkAssertResult(fsBuilder->enableFeature(
345 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700346 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
347 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700348 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
349 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700350 v.fsIn(), v.fsIn());
351 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700352 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
353 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000354 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700355 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000356 break;
357 }
joshualittb0a8a372014-09-23 09:50:21 -0700358 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700359 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700360 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000361 break;
362 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000363 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000364 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000365 }
366
joshualittb8c241a2015-05-19 08:23:30 -0700367 if (0xff != gp.coverageScale()) {
joshualitt9b989322014-12-15 14:16:27 -0800368 const char* coverageScale;
369 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
370 kFloat_GrSLType,
371 kDefault_GrSLPrecision,
372 "Coverage",
373 &coverageScale);
374 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
375 } else {
376 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
377 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000378}
379
robertphillips46d36f02015-01-18 08:14:14 -0800380void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800381 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700382 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700383 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800384 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700385 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700386 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0;
387 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
388 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700389 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700390 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000391}
392
393//////////////////////////////////////////////////////////////////////////////
394
395GrQuadEffect::~GrQuadEffect() {}
396
joshualitteb2a6762014-12-04 11:35:33 -0800397void GrQuadEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700398 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800399 GrProcessorKeyBuilder* b) const {
400 GrGLQuadEffect::GenKey(*this, bt, caps, b);
401}
402
joshualittabb52a12015-01-13 15:02:10 -0800403GrGLPrimitiveProcessor* GrQuadEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700404 const GrGLSLCaps&) const {
halcanary385fe4d2015-08-26 13:07:48 -0700405 return new GrGLQuadEffect(*this, bt);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000406}
407
joshualitt8059eb92014-12-29 15:10:07 -0800408GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700409 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
410 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700411 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700412 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700413 , fLocalMatrix(localMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700414 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800415 , fCoverageScale(coverage)
416 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800417 this->initClassID<GrQuadEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700418 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
419 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800420 fInHairQuadEdge = &this->addVertexAttrib(Attribute("inHairQuadEdge",
joshualitt2dd1ae02014-12-03 06:24:10 -0800421 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000422}
423
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000424//////////////////////////////////////////////////////////////////////////////
425
joshualittb0a8a372014-09-23 09:50:21 -0700426GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000427
bsalomonc21b09e2015-08-28 18:46:56 -0700428const GrGeometryProcessor* GrQuadEffect::TestCreate(GrProcessorTestData* d) {
joshualittb0a8a372014-09-23 09:50:21 -0700429 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000430 do {
joshualittb0a8a372014-09-23 09:50:21 -0700431 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
joshualitt0067ff52015-07-08 14:26:19 -0700432 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
433 gp = GrQuadEffect::Create(GrRandomColor(d->fRandom),
434 GrTest::TestMatrix(d->fRandom),
435 edgeType, *d->fCaps,
436 GrTest::TestMatrix(d->fRandom),
437 d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700438 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700439 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000440}
441
442//////////////////////////////////////////////////////////////////////////////
443// Cubic
444//////////////////////////////////////////////////////////////////////////////
445
joshualitt249af152014-09-15 11:41:13 -0700446class GrGLCubicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000447public:
joshualitteb2a6762014-12-04 11:35:33 -0800448 GrGLCubicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800449 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000450
mtklein36352bf2015-03-25 18:17:31 -0700451 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000452
joshualitt87f48d92014-12-04 10:41:40 -0800453 static inline void GenKey(const GrGeometryProcessor&,
454 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -0700455 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800456 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000457
joshualitt9b989322014-12-15 14:16:27 -0800458 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800459 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -0700460 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -0700461 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700462
463 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
464 fViewMatrix = ce.viewMatrix();
465 GrGLfloat viewMatrix[3 * 3];
466 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
467 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
468 }
joshualittee2af952014-12-30 09:04:15 -0800469
joshualittb8c241a2015-05-19 08:23:30 -0700470 if (ce.color() != fColor) {
joshualitt9b989322014-12-15 14:16:27 -0800471 GrGLfloat c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700472 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800473 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700474 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -0800475 }
476 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000477
478private:
joshualitt5559ca22015-05-21 15:50:36 -0700479 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800480 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700481 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800482 UniformHandle fColorUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700483 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000484
joshualitt249af152014-09-15 11:41:13 -0700485 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000486};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000487
joshualitteb2a6762014-12-04 11:35:33 -0800488GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800489 const GrBatchTracker&)
joshualitt5559ca22015-05-21 15:50:36 -0700490 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700491 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000492 fEdgeType = ce.getEdgeType();
493}
494
robertphillips46d36f02015-01-18 08:14:14 -0800495void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualittc369e7c2014-10-22 10:56:26 -0700496 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
joshualitt2dd1ae02014-12-03 06:24:10 -0800497 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
498
joshualittabb52a12015-01-13 15:02:10 -0800499 // emit attributes
500 vsBuilder->emitAttributes(gp);
501
joshualitt2dd1ae02014-12-03 06:24:10 -0800502 GrGLVertToFrag v(kVec4f_GrSLType);
bsalomonc0bd6482014-12-09 10:04:14 -0800503 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
joshualitt2dd1ae02014-12-03 06:24:10 -0800504 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
505
joshualitt9b989322014-12-15 14:16:27 -0800506 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700507 if (!gp.colorIgnored()) {
508 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform);
509 }
joshualitt9b989322014-12-15 14:16:27 -0800510
joshualittabb52a12015-01-13 15:02:10 -0800511 // Setup position
joshualitt5559ca22015-05-21 15:50:36 -0700512 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix(),
513 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800514
joshualittabb52a12015-01-13 15:02:10 -0800515 // emit transforms with position
joshualitte3ababe2015-05-15 07:56:07 -0700516 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName, args.fTransformsIn,
517 args.fTransformsOut);
joshualittabb52a12015-01-13 15:02:10 -0800518
egdaniel29bee0f2015-04-29 11:54:42 -0700519 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -0700520
bsalomonc0bd6482014-12-09 10:04:14 -0800521 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
522 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
523 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
524 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
525 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
526 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
527 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
528 GrGLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700529
530 fsBuilder->declAppend(edgeAlpha);
531 fsBuilder->declAppend(dklmdx);
532 fsBuilder->declAppend(dklmdy);
533 fsBuilder->declAppend(dfdx);
534 fsBuilder->declAppend(dfdy);
535 fsBuilder->declAppend(gF);
536 fsBuilder->declAppend(gFM);
537 fsBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000538
539 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700540 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700541 SkAssertResult(fsBuilder->enableFeature(
542 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700543 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
544 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700545 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 -0700546 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
547 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700548 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 -0700549 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
550 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700551 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
552 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
553 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700554 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700555 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
556 fsBuilder->codeAppendf("%s = %s / %s;",
557 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
558 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
559 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000560 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700561 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
562 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
563 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000564 break;
565 }
joshualittb0a8a372014-09-23 09:50:21 -0700566 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700567 SkAssertResult(fsBuilder->enableFeature(
568 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700569 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
570 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700571 fsBuilder->codeAppendf("%s ="
572 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700573 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
574 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700575 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 -0700576 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
577 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700578 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
579 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
580 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700581 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700582 fsBuilder->codeAppendf("%s = %s / %s;",
583 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
584 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
585 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000586 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700587 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
588 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
589 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000590 break;
591 }
joshualittb0a8a372014-09-23 09:50:21 -0700592 case kFillBW_GrProcessorEdgeType: {
egdaniel9bd5bbf2014-08-29 11:12:30 -0700593 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700594 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700595 fsBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000596 break;
597 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000598 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000599 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000600 }
601
joshualitt2dd1ae02014-12-03 06:24:10 -0800602
603 fsBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000604}
605
robertphillips46d36f02015-01-18 08:14:14 -0800606void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800607 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700608 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700609 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800610 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700611 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700612 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8;
joshualitte578a952015-05-14 10:09:13 -0700613 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700614 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000615}
616
617//////////////////////////////////////////////////////////////////////////////
618
619GrCubicEffect::~GrCubicEffect() {}
620
joshualitteb2a6762014-12-04 11:35:33 -0800621void GrCubicEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700622 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800623 GrProcessorKeyBuilder* b) const {
624 GrGLCubicEffect::GenKey(*this, bt, caps, b);
625}
626
joshualittabb52a12015-01-13 15:02:10 -0800627GrGLPrimitiveProcessor* GrCubicEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700628 const GrGLSLCaps&) const {
halcanary385fe4d2015-08-26 13:07:48 -0700629 return new GrGLCubicEffect(*this, bt);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000630}
631
joshualitt8059eb92014-12-29 15:10:07 -0800632GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
633 GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700634 : fColor(color)
635 , fViewMatrix(viewMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700636 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800637 this->initClassID<GrCubicEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700638 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
639 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800640 fInCubicCoeffs = &this->addVertexAttrib(Attribute("inCubicCoeffs",
joshualitt2dd1ae02014-12-03 06:24:10 -0800641 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000642}
643
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000644//////////////////////////////////////////////////////////////////////////////
645
joshualittb0a8a372014-09-23 09:50:21 -0700646GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000647
bsalomonc21b09e2015-08-28 18:46:56 -0700648const GrGeometryProcessor* GrCubicEffect::TestCreate(GrProcessorTestData* d) {
joshualittb0a8a372014-09-23 09:50:21 -0700649 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000650 do {
joshualitt0067ff52015-07-08 14:26:19 -0700651 GrPrimitiveEdgeType edgeType =
652 static_cast<GrPrimitiveEdgeType>(
653 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
654 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom),
655 GrTest::TestMatrix(d->fRandom), edgeType, *d->fCaps);
halcanary96fcdcc2015-08-27 07:41:13 -0700656 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700657 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000658}
egdaniel9bd5bbf2014-08-29 11:12:30 -0700659