blob: cdea9d01ff1b26eb6b496b88eb60468a2087ad63 [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"
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 {
joshualitteb2a6762014-12-04 11:35:33 -0800197 return SkNEW_ARGS(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
joshualittb0a8a372014-09-23 09:50:21 -0700220GrGeometryProcessor* GrConicEffect::TestCreate(SkRandom* random,
221 GrContext*,
bsalomon4b91f762015-05-19 09:29:46 -0700222 const GrCaps& caps,
joshualittb0a8a372014-09-23 09:50:21 -0700223 GrTexture*[]) {
224 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000225 do {
joshualittb0a8a372014-09-23 09:50:21 -0700226 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
227 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt4eaf9ce2015-04-28 13:31:18 -0700228 gp = GrConicEffect::Create(GrRandomColor(random), GrTest::TestMatrix(random),
joshualitt8059eb92014-12-29 15:10:07 -0800229 edgeType, caps,
joshualittb8c241a2015-05-19 08:23:30 -0700230 GrTest::TestMatrix(random), random->nextBool());
joshualittb0a8a372014-09-23 09:50:21 -0700231 } while (NULL == gp);
232 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000233}
234
235//////////////////////////////////////////////////////////////////////////////
236// Quad
237//////////////////////////////////////////////////////////////////////////////
238
joshualitt249af152014-09-15 11:41:13 -0700239class GrGLQuadEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000240public:
joshualitteb2a6762014-12-04 11:35:33 -0800241 GrGLQuadEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800242 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000243
mtklein36352bf2015-03-25 18:17:31 -0700244 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000245
joshualitt87f48d92014-12-04 10:41:40 -0800246 static inline void GenKey(const GrGeometryProcessor&,
247 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -0700248 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800249 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000250
joshualitt9b989322014-12-15 14:16:27 -0800251 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800252 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -0700253 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -0700254 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700255
256 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMatrix())) {
257 fViewMatrix = qe.viewMatrix();
258 GrGLfloat viewMatrix[3 * 3];
259 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
260 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
261 }
joshualittee2af952014-12-30 09:04:15 -0800262
joshualittb8c241a2015-05-19 08:23:30 -0700263 if (qe.color() != fColor) {
joshualitt9b989322014-12-15 14:16:27 -0800264 GrGLfloat c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700265 GrColorToRGBAFloat(qe.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800266 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700267 fColor = qe.color();
joshualitt9b989322014-12-15 14:16:27 -0800268 }
joshualittb8c241a2015-05-19 08:23:30 -0700269
270 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
271 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale()));
272 fCoverageScale = qe.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -0800273 }
274 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000275
joshualitte3ababe2015-05-15 07:56:07 -0700276 void setTransformData(const GrPrimitiveProcessor& primProc,
277 const GrGLProgramDataManager& pdman,
278 int index,
279 const SkTArray<const GrCoordTransform*, true>& transforms) override {
280 this->setTransformDataHelper<GrQuadEffect>(primProc, pdman, index, transforms);
281 }
282
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000283private:
joshualitt5559ca22015-05-21 15:50:36 -0700284 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800285 GrColor fColor;
286 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700287 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800288 UniformHandle fColorUniform;
289 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700290 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000291
joshualitt249af152014-09-15 11:41:13 -0700292 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000293};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000294
joshualitteb2a6762014-12-04 11:35:33 -0800295GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800296 const GrBatchTracker& bt)
joshualitt5559ca22015-05-21 15:50:36 -0700297 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800298 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000299 fEdgeType = ce.getEdgeType();
300}
301
robertphillips46d36f02015-01-18 08:14:14 -0800302void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualitt9b989322014-12-15 14:16:27 -0800303 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -0800304 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
305 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
306
joshualittabb52a12015-01-13 15:02:10 -0800307 // emit attributes
308 vsBuilder->emitAttributes(gp);
309
joshualitt74077b92014-10-24 11:26:03 -0700310 GrGLVertToFrag v(kVec4f_GrSLType);
311 args.fPB->addVarying("HairQuadEdge", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -0800312 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000313
joshualitt9b989322014-12-15 14:16:27 -0800314 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700315 if (!gp.colorIgnored()) {
316 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform);
317 }
joshualitt9b989322014-12-15 14:16:27 -0800318
joshualittabb52a12015-01-13 15:02:10 -0800319 // Setup position
joshualitt5559ca22015-05-21 15:50:36 -0700320 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800321
joshualittabb52a12015-01-13 15:02:10 -0800322 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -0800323 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -0800324 args.fTransformsIn, args.fTransformsOut);
325
egdaniel29bee0f2015-04-29 11:54:42 -0700326 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -0700327 fsBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700328
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000329 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700330 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700331 SkAssertResult(fsBuilder->enableFeature(
332 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700333 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
334 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700335 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
336 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700337 v.fsIn(), v.fsIn());
338 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700339 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
340 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000341 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700342 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000343 break;
344 }
joshualittb0a8a372014-09-23 09:50:21 -0700345 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700346 SkAssertResult(fsBuilder->enableFeature(
347 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700348 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
349 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700350 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
351 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700352 v.fsIn(), v.fsIn());
353 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700354 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
355 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000356 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700357 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000358 break;
359 }
joshualittb0a8a372014-09-23 09:50:21 -0700360 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700361 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700362 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000363 break;
364 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000365 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000366 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000367 }
368
joshualittb8c241a2015-05-19 08:23:30 -0700369 if (0xff != gp.coverageScale()) {
joshualitt9b989322014-12-15 14:16:27 -0800370 const char* coverageScale;
371 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
372 kFloat_GrSLType,
373 kDefault_GrSLPrecision,
374 "Coverage",
375 &coverageScale);
376 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
377 } else {
378 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
379 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000380}
381
robertphillips46d36f02015-01-18 08:14:14 -0800382void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800383 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700384 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700385 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800386 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700387 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700388 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0;
389 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
390 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700391 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700392 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000393}
394
395//////////////////////////////////////////////////////////////////////////////
396
397GrQuadEffect::~GrQuadEffect() {}
398
joshualitteb2a6762014-12-04 11:35:33 -0800399void GrQuadEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700400 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800401 GrProcessorKeyBuilder* b) const {
402 GrGLQuadEffect::GenKey(*this, bt, caps, b);
403}
404
joshualittabb52a12015-01-13 15:02:10 -0800405GrGLPrimitiveProcessor* GrQuadEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700406 const GrGLSLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800407 return SkNEW_ARGS(GrGLQuadEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000408}
409
joshualitt8059eb92014-12-29 15:10:07 -0800410GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700411 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
412 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700413 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700414 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700415 , fLocalMatrix(localMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700416 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800417 , fCoverageScale(coverage)
418 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800419 this->initClassID<GrQuadEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700420 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
421 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800422 fInHairQuadEdge = &this->addVertexAttrib(Attribute("inHairQuadEdge",
joshualitt2dd1ae02014-12-03 06:24:10 -0800423 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000424}
425
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000426//////////////////////////////////////////////////////////////////////////////
427
joshualittb0a8a372014-09-23 09:50:21 -0700428GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000429
joshualittb0a8a372014-09-23 09:50:21 -0700430GrGeometryProcessor* GrQuadEffect::TestCreate(SkRandom* random,
431 GrContext*,
bsalomon4b91f762015-05-19 09:29:46 -0700432 const GrCaps& caps,
joshualittb0a8a372014-09-23 09:50:21 -0700433 GrTexture*[]) {
434 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000435 do {
joshualittb0a8a372014-09-23 09:50:21 -0700436 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
437 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800438 gp = GrQuadEffect::Create(GrRandomColor(random),
joshualitt4eaf9ce2015-04-28 13:31:18 -0700439 GrTest::TestMatrix(random),
joshualitt8059eb92014-12-29 15:10:07 -0800440 edgeType, caps,
joshualittb8c241a2015-05-19 08:23:30 -0700441 GrTest::TestMatrix(random),
442 random->nextBool());
joshualittb0a8a372014-09-23 09:50:21 -0700443 } while (NULL == gp);
444 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000445}
446
447//////////////////////////////////////////////////////////////////////////////
448// Cubic
449//////////////////////////////////////////////////////////////////////////////
450
joshualitt249af152014-09-15 11:41:13 -0700451class GrGLCubicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000452public:
joshualitteb2a6762014-12-04 11:35:33 -0800453 GrGLCubicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800454 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000455
mtklein36352bf2015-03-25 18:17:31 -0700456 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000457
joshualitt87f48d92014-12-04 10:41:40 -0800458 static inline void GenKey(const GrGeometryProcessor&,
459 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -0700460 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800461 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000462
joshualitt9b989322014-12-15 14:16:27 -0800463 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800464 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -0700465 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -0700466 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700467
468 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
469 fViewMatrix = ce.viewMatrix();
470 GrGLfloat viewMatrix[3 * 3];
471 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
472 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
473 }
joshualittee2af952014-12-30 09:04:15 -0800474
joshualittb8c241a2015-05-19 08:23:30 -0700475 if (ce.color() != fColor) {
joshualitt9b989322014-12-15 14:16:27 -0800476 GrGLfloat c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700477 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800478 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700479 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -0800480 }
481 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000482
483private:
joshualitt5559ca22015-05-21 15:50:36 -0700484 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800485 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700486 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800487 UniformHandle fColorUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700488 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000489
joshualitt249af152014-09-15 11:41:13 -0700490 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000491};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000492
joshualitteb2a6762014-12-04 11:35:33 -0800493GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800494 const GrBatchTracker&)
joshualitt5559ca22015-05-21 15:50:36 -0700495 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700496 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000497 fEdgeType = ce.getEdgeType();
498}
499
robertphillips46d36f02015-01-18 08:14:14 -0800500void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualittc369e7c2014-10-22 10:56:26 -0700501 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
joshualitt2dd1ae02014-12-03 06:24:10 -0800502 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
503
joshualittabb52a12015-01-13 15:02:10 -0800504 // emit attributes
505 vsBuilder->emitAttributes(gp);
506
joshualitt2dd1ae02014-12-03 06:24:10 -0800507 GrGLVertToFrag v(kVec4f_GrSLType);
bsalomonc0bd6482014-12-09 10:04:14 -0800508 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
joshualitt2dd1ae02014-12-03 06:24:10 -0800509 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
510
joshualitt9b989322014-12-15 14:16:27 -0800511 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700512 if (!gp.colorIgnored()) {
513 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform);
514 }
joshualitt9b989322014-12-15 14:16:27 -0800515
joshualittabb52a12015-01-13 15:02:10 -0800516 // Setup position
joshualitt5559ca22015-05-21 15:50:36 -0700517 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix(),
518 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800519
joshualittabb52a12015-01-13 15:02:10 -0800520 // emit transforms with position
joshualitte3ababe2015-05-15 07:56:07 -0700521 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName, args.fTransformsIn,
522 args.fTransformsOut);
joshualittabb52a12015-01-13 15:02:10 -0800523
egdaniel29bee0f2015-04-29 11:54:42 -0700524 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -0700525
bsalomonc0bd6482014-12-09 10:04:14 -0800526 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
527 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
528 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
529 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
530 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
531 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
532 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
533 GrGLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700534
535 fsBuilder->declAppend(edgeAlpha);
536 fsBuilder->declAppend(dklmdx);
537 fsBuilder->declAppend(dklmdy);
538 fsBuilder->declAppend(dfdx);
539 fsBuilder->declAppend(dfdy);
540 fsBuilder->declAppend(gF);
541 fsBuilder->declAppend(gFM);
542 fsBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000543
544 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700545 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700546 SkAssertResult(fsBuilder->enableFeature(
547 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700548 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
549 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700550 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 -0700551 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
552 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700553 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 -0700554 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
555 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700556 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
557 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
558 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700559 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700560 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
561 fsBuilder->codeAppendf("%s = %s / %s;",
562 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
563 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
564 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000565 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700566 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
567 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
568 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000569 break;
570 }
joshualittb0a8a372014-09-23 09:50:21 -0700571 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700572 SkAssertResult(fsBuilder->enableFeature(
573 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700574 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
575 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700576 fsBuilder->codeAppendf("%s ="
577 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700578 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
579 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700580 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700581 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
582 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700583 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
584 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
585 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700586 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700587 fsBuilder->codeAppendf("%s = %s / %s;",
588 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
589 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
590 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000591 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700592 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
593 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
594 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000595 break;
596 }
joshualittb0a8a372014-09-23 09:50:21 -0700597 case kFillBW_GrProcessorEdgeType: {
egdaniel9bd5bbf2014-08-29 11:12:30 -0700598 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700599 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700600 fsBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000601 break;
602 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000603 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000604 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000605 }
606
joshualitt2dd1ae02014-12-03 06:24:10 -0800607
608 fsBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000609}
610
robertphillips46d36f02015-01-18 08:14:14 -0800611void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800612 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700613 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700614 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800615 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700616 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700617 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8;
joshualitte578a952015-05-14 10:09:13 -0700618 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700619 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000620}
621
622//////////////////////////////////////////////////////////////////////////////
623
624GrCubicEffect::~GrCubicEffect() {}
625
joshualitteb2a6762014-12-04 11:35:33 -0800626void GrCubicEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700627 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800628 GrProcessorKeyBuilder* b) const {
629 GrGLCubicEffect::GenKey(*this, bt, caps, b);
630}
631
joshualittabb52a12015-01-13 15:02:10 -0800632GrGLPrimitiveProcessor* GrCubicEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700633 const GrGLSLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800634 return SkNEW_ARGS(GrGLCubicEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000635}
636
joshualitt8059eb92014-12-29 15:10:07 -0800637GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
638 GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700639 : fColor(color)
640 , fViewMatrix(viewMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700641 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800642 this->initClassID<GrCubicEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700643 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
644 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800645 fInCubicCoeffs = &this->addVertexAttrib(Attribute("inCubicCoeffs",
joshualitt2dd1ae02014-12-03 06:24:10 -0800646 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000647}
648
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000649//////////////////////////////////////////////////////////////////////////////
650
joshualittb0a8a372014-09-23 09:50:21 -0700651GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000652
joshualittb0a8a372014-09-23 09:50:21 -0700653GrGeometryProcessor* GrCubicEffect::TestCreate(SkRandom* random,
654 GrContext*,
bsalomon4b91f762015-05-19 09:29:46 -0700655 const GrCaps& caps,
joshualittb0a8a372014-09-23 09:50:21 -0700656 GrTexture*[]) {
657 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000658 do {
joshualittb0a8a372014-09-23 09:50:21 -0700659 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
660 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800661 gp = GrCubicEffect::Create(GrRandomColor(random),
joshualitt4eaf9ce2015-04-28 13:31:18 -0700662 GrTest::TestMatrix(random), edgeType, caps);
joshualittb0a8a372014-09-23 09:50:21 -0700663 } while (NULL == gp);
664 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000665}
egdaniel9bd5bbf2014-08-29 11:12:30 -0700666