blob: a09d6ce4149236a34fd95670708f60b1bd4d2b5d [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
joshualittd3a560f2015-05-19 07:15:28 -070015struct ConicBatchTracker {
16 GrGPInput fInputColorType;
17 GrColor fColor;
18 uint8_t fCoverageScale;
19 bool fUsesLocalCoords;
20};
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
joshualittd3a560f2015-05-19 07:15:28 -070040 const ConicBatchTracker& local = bt.cast<ConicBatchTracker>();
41 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
joshualitt9b989322014-12-15 14:16:27 -080042 GrGLfloat c[4];
joshualittd3a560f2015-05-19 07:15:28 -070043 GrColorToRGBAFloat(local.fColor, c);
joshualitt9b989322014-12-15 14:16:27 -080044 pdman.set4fv(fColorUniform, 1, c);
joshualittd3a560f2015-05-19 07:15:28 -070045 fColor = local.fColor;
joshualitt9b989322014-12-15 14:16:27 -080046 }
joshualittd3a560f2015-05-19 07:15:28 -070047 if (0xff != local.fCoverageScale && fCoverageScale != local.fCoverageScale) {
48 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale));
49 fCoverageScale = local.fCoverageScale;
joshualitt9b989322014-12-15 14:16:27 -080050 }
51 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000052
joshualitte3ababe2015-05-15 07:56:07 -070053 void setTransformData(const GrPrimitiveProcessor& primProc,
54 const GrGLProgramDataManager& pdman,
55 int index,
56 const SkTArray<const GrCoordTransform*, true>& transforms) override {
57 this->setTransformDataHelper<GrConicEffect>(primProc, pdman, index, transforms);
58 }
59
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000060private:
joshualitt9b989322014-12-15 14:16:27 -080061 GrColor fColor;
62 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -070063 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -080064 UniformHandle fColorUniform;
65 UniformHandle fCoverageScaleUniform;
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)
72 : 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>();
joshualittd3a560f2015-05-19 07:15:28 -070081 const ConicBatchTracker& local = args.fBT.cast<ConicBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -080082
joshualittabb52a12015-01-13 15:02:10 -080083 // emit attributes
84 vsBuilder->emitAttributes(gp);
85
joshualitt74077b92014-10-24 11:26:03 -070086 GrGLVertToFrag v(kVec4f_GrSLType);
87 args.fPB->addVarying("ConicCoeffs", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -080088 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000089
joshualitt9b989322014-12-15 14:16:27 -080090 // Setup pass through color
joshualittd3a560f2015-05-19 07:15:28 -070091 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
92 &fColorUniform);
joshualitt9b989322014-12-15 14:16:27 -080093
joshualittabb52a12015-01-13 15:02:10 -080094 // Setup position
joshualittdd219872015-02-12 14:48:42 -080095 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix());
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
joshualittd3a560f2015-05-19 07:15:28 -0700158 if (0xff != local.fCoverageScale) {
joshualitt9b989322014-12-15 14:16:27 -0800159 const char* coverageScale;
160 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
joshualittdd219872015-02-12 14:48:42 -0800161 kFloat_GrSLType,
162 kDefault_GrSLPrecision,
163 "Coverage",
164 &coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800165 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
166 } else {
167 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
168 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000169}
170
robertphillips46d36f02015-01-18 08:14:14 -0800171void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800172 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700173 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700174 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800175 const GrConicEffect& ce = gp.cast<GrConicEffect>();
joshualittd3a560f2015-05-19 07:15:28 -0700176 const ConicBatchTracker& local = bt.cast<ConicBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700177 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittd3a560f2015-05-19 07:15:28 -0700178 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0;
179 key |= 0xff != local.fCoverageScale ? 0x8 : 0x0;
180 key |= local.fUsesLocalCoords && 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,
joshualittd3a560f2015-05-19 07:15:28 -0700201 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700202 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700203 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700204 , fLocalMatrix(viewMatrix)
joshualitt8059eb92014-12-29 15:10:07 -0800205 , fCoverageScale(coverage)
206 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800207 this->initClassID<GrConicEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800208 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
209 fInConicCoeffs = &this->addVertexAttrib(Attribute("inConicCoeffs",
joshualittd3a560f2015-05-19 07:15:28 -0700210 kVec4f_GrVertexAttribType));
211}
212
213void GrConicEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const {
214 ConicBatchTracker* local = bt->cast<ConicBatchTracker>();
215 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
216 local->fCoverageScale = fCoverageScale;
217 local->fUsesLocalCoords = init.fUsesLocalCoords;
joshualitt9b989322014-12-15 14:16:27 -0800218}
219
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000220//////////////////////////////////////////////////////////////////////////////
221
joshualittb0a8a372014-09-23 09:50:21 -0700222GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000223
joshualittb0a8a372014-09-23 09:50:21 -0700224GrGeometryProcessor* GrConicEffect::TestCreate(SkRandom* random,
225 GrContext*,
226 const GrDrawTargetCaps& caps,
227 GrTexture*[]) {
228 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000229 do {
joshualittb0a8a372014-09-23 09:50:21 -0700230 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
231 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt4eaf9ce2015-04-28 13:31:18 -0700232 gp = GrConicEffect::Create(GrRandomColor(random), GrTest::TestMatrix(random),
joshualitt8059eb92014-12-29 15:10:07 -0800233 edgeType, caps,
joshualittd3a560f2015-05-19 07:15:28 -0700234 GrTest::TestMatrix(random));
joshualittb0a8a372014-09-23 09:50:21 -0700235 } while (NULL == gp);
236 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000237}
238
239//////////////////////////////////////////////////////////////////////////////
240// Quad
241//////////////////////////////////////////////////////////////////////////////
242
joshualittd3a560f2015-05-19 07:15:28 -0700243struct QuadBatchTracker {
244 GrGPInput fInputColorType;
245 GrColor fColor;
246 uint8_t fCoverageScale;
247 bool fUsesLocalCoords;
248};
249
joshualitt249af152014-09-15 11:41:13 -0700250class GrGLQuadEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000251public:
joshualitteb2a6762014-12-04 11:35:33 -0800252 GrGLQuadEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800253 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000254
mtklein36352bf2015-03-25 18:17:31 -0700255 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000256
joshualitt87f48d92014-12-04 10:41:40 -0800257 static inline void GenKey(const GrGeometryProcessor&,
258 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -0700259 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800260 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000261
joshualitt9b989322014-12-15 14:16:27 -0800262 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800263 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -0700264 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -0700265 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
266 this->setUniformViewMatrix(pdman, qe.viewMatrix());
joshualittee2af952014-12-30 09:04:15 -0800267
joshualittd3a560f2015-05-19 07:15:28 -0700268 const QuadBatchTracker& local = bt.cast<QuadBatchTracker>();
269 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
joshualitt9b989322014-12-15 14:16:27 -0800270 GrGLfloat c[4];
joshualittd3a560f2015-05-19 07:15:28 -0700271 GrColorToRGBAFloat(local.fColor, c);
joshualitt9b989322014-12-15 14:16:27 -0800272 pdman.set4fv(fColorUniform, 1, c);
joshualittd3a560f2015-05-19 07:15:28 -0700273 fColor = local.fColor;
joshualitt9b989322014-12-15 14:16:27 -0800274 }
joshualittd3a560f2015-05-19 07:15:28 -0700275 if (0xff != local.fCoverageScale && local.fCoverageScale != fCoverageScale) {
276 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale));
277 fCoverageScale = local.fCoverageScale;
joshualitt9b989322014-12-15 14:16:27 -0800278 }
279 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000280
joshualitte3ababe2015-05-15 07:56:07 -0700281 void setTransformData(const GrPrimitiveProcessor& primProc,
282 const GrGLProgramDataManager& pdman,
283 int index,
284 const SkTArray<const GrCoordTransform*, true>& transforms) override {
285 this->setTransformDataHelper<GrQuadEffect>(primProc, pdman, index, transforms);
286 }
287
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000288private:
joshualitt9b989322014-12-15 14:16:27 -0800289 GrColor fColor;
290 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700291 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800292 UniformHandle fColorUniform;
293 UniformHandle fCoverageScaleUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000294
joshualitt249af152014-09-15 11:41:13 -0700295 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000296};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000297
joshualitteb2a6762014-12-04 11:35:33 -0800298GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800299 const GrBatchTracker& bt)
300 : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800301 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000302 fEdgeType = ce.getEdgeType();
303}
304
robertphillips46d36f02015-01-18 08:14:14 -0800305void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualitt9b989322014-12-15 14:16:27 -0800306 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -0800307 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
308 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
joshualittd3a560f2015-05-19 07:15:28 -0700309 const QuadBatchTracker& local = args.fBT.cast<QuadBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800310
joshualittabb52a12015-01-13 15:02:10 -0800311 // emit attributes
312 vsBuilder->emitAttributes(gp);
313
joshualitt74077b92014-10-24 11:26:03 -0700314 GrGLVertToFrag v(kVec4f_GrSLType);
315 args.fPB->addVarying("HairQuadEdge", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -0800316 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000317
joshualitt9b989322014-12-15 14:16:27 -0800318 // Setup pass through color
joshualittd3a560f2015-05-19 07:15:28 -0700319 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
320 &fColorUniform);
joshualitt9b989322014-12-15 14:16:27 -0800321
joshualittabb52a12015-01-13 15:02:10 -0800322 // Setup position
joshualittdd219872015-02-12 14:48:42 -0800323 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix());
joshualitt4973d9d2014-11-08 09:24:25 -0800324
joshualittabb52a12015-01-13 15:02:10 -0800325 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -0800326 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -0800327 args.fTransformsIn, args.fTransformsOut);
328
egdaniel29bee0f2015-04-29 11:54:42 -0700329 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -0700330 fsBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700331
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000332 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700333 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700334 SkAssertResult(fsBuilder->enableFeature(
335 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700336 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
337 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700338 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
339 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700340 v.fsIn(), v.fsIn());
341 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700342 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
343 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000344 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700345 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000346 break;
347 }
joshualittb0a8a372014-09-23 09:50:21 -0700348 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700349 SkAssertResult(fsBuilder->enableFeature(
350 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700351 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
352 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700353 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
354 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700355 v.fsIn(), v.fsIn());
356 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700357 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
358 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000359 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700360 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000361 break;
362 }
joshualittb0a8a372014-09-23 09:50:21 -0700363 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700364 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700365 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000366 break;
367 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000368 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000369 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000370 }
371
joshualittd3a560f2015-05-19 07:15:28 -0700372 if (0xff != local.fCoverageScale) {
joshualitt9b989322014-12-15 14:16:27 -0800373 const char* coverageScale;
374 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
375 kFloat_GrSLType,
376 kDefault_GrSLPrecision,
377 "Coverage",
378 &coverageScale);
379 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
380 } else {
381 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
382 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000383}
384
robertphillips46d36f02015-01-18 08:14:14 -0800385void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800386 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700387 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700388 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800389 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
joshualittd3a560f2015-05-19 07:15:28 -0700390 const QuadBatchTracker& local = bt.cast<QuadBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700391 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittd3a560f2015-05-19 07:15:28 -0700392 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0;
393 key |= 0xff != local.fCoverageScale ? 0x8 : 0x0;
394 key |= local.fUsesLocalCoords && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700395 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700396 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000397}
398
399//////////////////////////////////////////////////////////////////////////////
400
401GrQuadEffect::~GrQuadEffect() {}
402
joshualitteb2a6762014-12-04 11:35:33 -0800403void GrQuadEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700404 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800405 GrProcessorKeyBuilder* b) const {
406 GrGLQuadEffect::GenKey(*this, bt, caps, b);
407}
408
joshualittabb52a12015-01-13 15:02:10 -0800409GrGLPrimitiveProcessor* GrQuadEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700410 const GrGLSLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800411 return SkNEW_ARGS(GrGLQuadEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000412}
413
joshualitt8059eb92014-12-29 15:10:07 -0800414GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittd3a560f2015-05-19 07:15:28 -0700415 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700416 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700417 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700418 , fLocalMatrix(localMatrix)
joshualitt8059eb92014-12-29 15:10:07 -0800419 , fCoverageScale(coverage)
420 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800421 this->initClassID<GrQuadEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800422 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
423 fInHairQuadEdge = &this->addVertexAttrib(Attribute("inHairQuadEdge",
joshualitt2dd1ae02014-12-03 06:24:10 -0800424 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000425}
426
joshualittd3a560f2015-05-19 07:15:28 -0700427void GrQuadEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const {
428 QuadBatchTracker* local = bt->cast<QuadBatchTracker>();
429 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
430 local->fCoverageScale = fCoverageScale;
431 local->fUsesLocalCoords = init.fUsesLocalCoords;
432}
433
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000434//////////////////////////////////////////////////////////////////////////////
435
joshualittb0a8a372014-09-23 09:50:21 -0700436GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000437
joshualittb0a8a372014-09-23 09:50:21 -0700438GrGeometryProcessor* GrQuadEffect::TestCreate(SkRandom* random,
439 GrContext*,
440 const GrDrawTargetCaps& caps,
441 GrTexture*[]) {
442 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000443 do {
joshualittb0a8a372014-09-23 09:50:21 -0700444 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
445 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800446 gp = GrQuadEffect::Create(GrRandomColor(random),
joshualitt4eaf9ce2015-04-28 13:31:18 -0700447 GrTest::TestMatrix(random),
joshualitt8059eb92014-12-29 15:10:07 -0800448 edgeType, caps,
joshualittd3a560f2015-05-19 07:15:28 -0700449 GrTest::TestMatrix(random));
joshualittb0a8a372014-09-23 09:50:21 -0700450 } while (NULL == gp);
451 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000452}
453
454//////////////////////////////////////////////////////////////////////////////
455// Cubic
456//////////////////////////////////////////////////////////////////////////////
457
joshualittd3a560f2015-05-19 07:15:28 -0700458struct CubicBatchTracker {
459 GrGPInput fInputColorType;
460 GrColor fColor;
461 bool fUsesLocalCoords;
462};
463
joshualitt249af152014-09-15 11:41:13 -0700464class GrGLCubicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000465public:
joshualitteb2a6762014-12-04 11:35:33 -0800466 GrGLCubicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800467 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000468
mtklein36352bf2015-03-25 18:17:31 -0700469 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000470
joshualitt87f48d92014-12-04 10:41:40 -0800471 static inline void GenKey(const GrGeometryProcessor&,
472 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -0700473 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800474 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000475
joshualitt9b989322014-12-15 14:16:27 -0800476 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800477 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -0700478 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -0700479 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
480 this->setUniformViewMatrix(pdman, ce.viewMatrix());
joshualittee2af952014-12-30 09:04:15 -0800481
joshualittd3a560f2015-05-19 07:15:28 -0700482 const CubicBatchTracker& local = bt.cast<CubicBatchTracker>();
483 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
joshualitt9b989322014-12-15 14:16:27 -0800484 GrGLfloat c[4];
joshualittd3a560f2015-05-19 07:15:28 -0700485 GrColorToRGBAFloat(local.fColor, c);
joshualitt9b989322014-12-15 14:16:27 -0800486 pdman.set4fv(fColorUniform, 1, c);
joshualittd3a560f2015-05-19 07:15:28 -0700487 fColor = local.fColor;
joshualitt9b989322014-12-15 14:16:27 -0800488 }
489 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000490
491private:
joshualitt9b989322014-12-15 14:16:27 -0800492 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700493 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800494 UniformHandle fColorUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000495
joshualitt249af152014-09-15 11:41:13 -0700496 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000497};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000498
joshualitteb2a6762014-12-04 11:35:33 -0800499GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800500 const GrBatchTracker&)
501 : fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700502 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000503 fEdgeType = ce.getEdgeType();
504}
505
robertphillips46d36f02015-01-18 08:14:14 -0800506void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualittc369e7c2014-10-22 10:56:26 -0700507 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
joshualitt2dd1ae02014-12-03 06:24:10 -0800508 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
joshualittd3a560f2015-05-19 07:15:28 -0700509 const CubicBatchTracker& local = args.fBT.cast<CubicBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800510
joshualittabb52a12015-01-13 15:02:10 -0800511 // emit attributes
512 vsBuilder->emitAttributes(gp);
513
joshualitt2dd1ae02014-12-03 06:24:10 -0800514 GrGLVertToFrag v(kVec4f_GrSLType);
bsalomonc0bd6482014-12-09 10:04:14 -0800515 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
joshualitt2dd1ae02014-12-03 06:24:10 -0800516 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
517
joshualitt9b989322014-12-15 14:16:27 -0800518 // Setup pass through color
joshualittd3a560f2015-05-19 07:15:28 -0700519 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
520 &fColorUniform);
joshualitt9b989322014-12-15 14:16:27 -0800521
joshualittabb52a12015-01-13 15:02:10 -0800522 // Setup position
joshualittdd219872015-02-12 14:48:42 -0800523 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix());
joshualitt4973d9d2014-11-08 09:24:25 -0800524
joshualittabb52a12015-01-13 15:02:10 -0800525 // emit transforms with position
joshualitte3ababe2015-05-15 07:56:07 -0700526 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName, args.fTransformsIn,
527 args.fTransformsOut);
joshualittabb52a12015-01-13 15:02:10 -0800528
egdaniel29bee0f2015-04-29 11:54:42 -0700529 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -0700530
bsalomonc0bd6482014-12-09 10:04:14 -0800531 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
532 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
533 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
534 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
535 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
536 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
537 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
538 GrGLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700539
540 fsBuilder->declAppend(edgeAlpha);
541 fsBuilder->declAppend(dklmdx);
542 fsBuilder->declAppend(dklmdy);
543 fsBuilder->declAppend(dfdx);
544 fsBuilder->declAppend(dfdy);
545 fsBuilder->declAppend(gF);
546 fsBuilder->declAppend(gFM);
547 fsBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000548
549 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700550 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700551 SkAssertResult(fsBuilder->enableFeature(
552 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700553 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
554 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700555 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 -0700556 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
557 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700558 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 -0700559 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
560 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700561 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
562 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
563 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700564 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700565 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
566 fsBuilder->codeAppendf("%s = %s / %s;",
567 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
568 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
569 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000570 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700571 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
572 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
573 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000574 break;
575 }
joshualittb0a8a372014-09-23 09:50:21 -0700576 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700577 SkAssertResult(fsBuilder->enableFeature(
578 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700579 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
580 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700581 fsBuilder->codeAppendf("%s ="
582 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700583 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
584 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700585 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 -0700586 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
587 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700588 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
589 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
590 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700591 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700592 fsBuilder->codeAppendf("%s = %s / %s;",
593 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
594 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
595 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000596 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700597 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
598 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
599 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000600 break;
601 }
joshualittb0a8a372014-09-23 09:50:21 -0700602 case kFillBW_GrProcessorEdgeType: {
egdaniel9bd5bbf2014-08-29 11:12:30 -0700603 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700604 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700605 fsBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000606 break;
607 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000608 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000609 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000610 }
611
joshualitt2dd1ae02014-12-03 06:24:10 -0800612
613 fsBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000614}
615
robertphillips46d36f02015-01-18 08:14:14 -0800616void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800617 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700618 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700619 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800620 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
joshualittd3a560f2015-05-19 07:15:28 -0700621 const CubicBatchTracker& local = bt.cast<CubicBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700622 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittd3a560f2015-05-19 07:15:28 -0700623 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x8;
joshualitte578a952015-05-14 10:09:13 -0700624 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700625 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000626}
627
628//////////////////////////////////////////////////////////////////////////////
629
630GrCubicEffect::~GrCubicEffect() {}
631
joshualitteb2a6762014-12-04 11:35:33 -0800632void GrCubicEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700633 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800634 GrProcessorKeyBuilder* b) const {
635 GrGLCubicEffect::GenKey(*this, bt, caps, b);
636}
637
joshualittabb52a12015-01-13 15:02:10 -0800638GrGLPrimitiveProcessor* GrCubicEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700639 const GrGLSLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800640 return SkNEW_ARGS(GrGLCubicEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000641}
642
joshualitt8059eb92014-12-29 15:10:07 -0800643GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
644 GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700645 : fColor(color)
646 , fViewMatrix(viewMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700647 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800648 this->initClassID<GrCubicEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800649 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
650 fInCubicCoeffs = &this->addVertexAttrib(Attribute("inCubicCoeffs",
joshualitt2dd1ae02014-12-03 06:24:10 -0800651 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000652}
653
joshualittd3a560f2015-05-19 07:15:28 -0700654void GrCubicEffect::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const {
655 CubicBatchTracker* local = bt->cast<CubicBatchTracker>();
656 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
657 local->fUsesLocalCoords = init.fUsesLocalCoords;
658}
659
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000660//////////////////////////////////////////////////////////////////////////////
661
joshualittb0a8a372014-09-23 09:50:21 -0700662GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000663
joshualittb0a8a372014-09-23 09:50:21 -0700664GrGeometryProcessor* GrCubicEffect::TestCreate(SkRandom* random,
665 GrContext*,
666 const GrDrawTargetCaps& caps,
667 GrTexture*[]) {
668 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000669 do {
joshualittb0a8a372014-09-23 09:50:21 -0700670 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
671 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800672 gp = GrCubicEffect::Create(GrRandomColor(random),
joshualitt4eaf9ce2015-04-28 13:31:18 -0700673 GrTest::TestMatrix(random), edgeType, caps);
joshualittb0a8a372014-09-23 09:50:21 -0700674 } while (NULL == gp);
675 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000676}
egdaniel9bd5bbf2014-08-29 11:12:30 -0700677