blob: 582558027addb4cbac3916f20989d80573f720c8 [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
joshualitt249af152014-09-15 11:41:13 -070015class GrGLConicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000016public:
joshualitteb2a6762014-12-04 11:35:33 -080017 GrGLConicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -080018 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000019
mtklein36352bf2015-03-25 18:17:31 -070020 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000021
joshualitt87f48d92014-12-04 10:41:40 -080022 static inline void GenKey(const GrGeometryProcessor&,
23 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -070024 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -080025 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000026
joshualitt9b989322014-12-15 14:16:27 -080027 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -080028 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -070029 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -070030 const GrConicEffect& ce = primProc.cast<GrConicEffect>();
31 this->setUniformViewMatrix(pdman, ce.viewMatrix());
joshualittee2af952014-12-30 09:04:15 -080032
joshualittb8c241a2015-05-19 08:23:30 -070033 if (ce.color() != fColor) {
joshualitt9b989322014-12-15 14:16:27 -080034 GrGLfloat c[4];
joshualittb8c241a2015-05-19 08:23:30 -070035 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -080036 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -070037 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -080038 }
joshualittb8c241a2015-05-19 08:23:30 -070039
40 if (ce.coverageScale() != 0xff && ce.coverageScale() != fCoverageScale) {
41 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(ce.coverageScale()));
42 fCoverageScale = ce.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -080043 }
44 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000045
joshualitte3ababe2015-05-15 07:56:07 -070046 void setTransformData(const GrPrimitiveProcessor& primProc,
47 const GrGLProgramDataManager& pdman,
48 int index,
49 const SkTArray<const GrCoordTransform*, true>& transforms) override {
50 this->setTransformDataHelper<GrConicEffect>(primProc, pdman, index, transforms);
51 }
52
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000053private:
joshualitt9b989322014-12-15 14:16:27 -080054 GrColor fColor;
55 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -070056 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -080057 UniformHandle fColorUniform;
58 UniformHandle fCoverageScaleUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000059
joshualitt249af152014-09-15 11:41:13 -070060 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000061};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +000062
joshualitteb2a6762014-12-04 11:35:33 -080063GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -080064 const GrBatchTracker& bt)
65 : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -080066 const GrConicEffect& ce = processor.cast<GrConicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000067 fEdgeType = ce.getEdgeType();
68}
69
robertphillips46d36f02015-01-18 08:14:14 -080070void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualitt9b989322014-12-15 14:16:27 -080071 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -080072 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
73 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>();
74
joshualittabb52a12015-01-13 15:02:10 -080075 // emit attributes
76 vsBuilder->emitAttributes(gp);
77
joshualitt74077b92014-10-24 11:26:03 -070078 GrGLVertToFrag v(kVec4f_GrSLType);
79 args.fPB->addVarying("ConicCoeffs", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -080080 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000081
joshualitt9b989322014-12-15 14:16:27 -080082 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -070083 if (!gp.colorIgnored()) {
84 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform);
85 }
joshualitt9b989322014-12-15 14:16:27 -080086
joshualittabb52a12015-01-13 15:02:10 -080087 // Setup position
joshualittdd219872015-02-12 14:48:42 -080088 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix());
joshualitt4973d9d2014-11-08 09:24:25 -080089
joshualittabb52a12015-01-13 15:02:10 -080090 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -080091 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -080092 args.fTransformsIn, args.fTransformsOut);
93
egdaniel29bee0f2015-04-29 11:54:42 -070094 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -070095 fsBuilder->codeAppend("float edgeAlpha;");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000096
97 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -070098 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -070099 SkAssertResult(fsBuilder->enableFeature(
100 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700101 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
102 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700103 fsBuilder->codeAppendf("float dfdx ="
104 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700105 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700106 fsBuilder->codeAppendf("float dfdy ="
107 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700108 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700109 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
110 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700111 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn(), v.fsIn(),
112 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700113 fsBuilder->codeAppend("func = abs(func);");
114 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
115 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000116 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700117 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000118 break;
119 }
joshualittb0a8a372014-09-23 09:50:21 -0700120 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700121 SkAssertResult(fsBuilder->enableFeature(
122 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700123 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
124 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700125 fsBuilder->codeAppendf("float dfdx ="
126 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700127 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700128 fsBuilder->codeAppendf("float dfdy ="
129 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700130 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700131 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
132 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700133 fsBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
134 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700135 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
136 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000137 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700138 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000139 break;
140 }
joshualittb0a8a372014-09-23 09:50:21 -0700141 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700142 fsBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
143 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700144 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000145 break;
146 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000147 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000148 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000149 }
150
joshualittb8c241a2015-05-19 08:23:30 -0700151 // TODO should we really be doing this?
152 if (gp.coverageScale() != 0xff) {
joshualitt9b989322014-12-15 14:16:27 -0800153 const char* coverageScale;
154 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
joshualittdd219872015-02-12 14:48:42 -0800155 kFloat_GrSLType,
156 kDefault_GrSLPrecision,
157 "Coverage",
158 &coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800159 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
160 } else {
161 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
162 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000163}
164
robertphillips46d36f02015-01-18 08:14:14 -0800165void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800166 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700167 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700168 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800169 const GrConicEffect& ce = gp.cast<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700170 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700171 key |= GrColor_ILLEGAL != ce.color() ? 0x4 : 0x0;
172 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0;
173 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700174 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700175 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000176}
177
178//////////////////////////////////////////////////////////////////////////////
179
180GrConicEffect::~GrConicEffect() {}
181
joshualitteb2a6762014-12-04 11:35:33 -0800182void GrConicEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700183 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800184 GrProcessorKeyBuilder* b) const {
185 GrGLConicEffect::GenKey(*this, bt, caps, b);
186}
187
joshualittabb52a12015-01-13 15:02:10 -0800188GrGLPrimitiveProcessor* GrConicEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700189 const GrGLSLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800190 return SkNEW_ARGS(GrGLConicEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000191}
192
joshualitt8059eb92014-12-29 15:10:07 -0800193GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700194 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
195 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700196 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700197 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700198 , fLocalMatrix(viewMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700199 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800200 , fCoverageScale(coverage)
201 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800202 this->initClassID<GrConicEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800203 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
204 fInConicCoeffs = &this->addVertexAttrib(Attribute("inConicCoeffs",
joshualittb8c241a2015-05-19 08:23:30 -0700205 kVec4f_GrVertexAttribType));
joshualitt9b989322014-12-15 14:16:27 -0800206}
207
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000208//////////////////////////////////////////////////////////////////////////////
209
joshualittb0a8a372014-09-23 09:50:21 -0700210GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000211
joshualittb0a8a372014-09-23 09:50:21 -0700212GrGeometryProcessor* GrConicEffect::TestCreate(SkRandom* random,
213 GrContext*,
bsalomon4b91f762015-05-19 09:29:46 -0700214 const GrCaps& caps,
joshualittb0a8a372014-09-23 09:50:21 -0700215 GrTexture*[]) {
216 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000217 do {
joshualittb0a8a372014-09-23 09:50:21 -0700218 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
219 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt4eaf9ce2015-04-28 13:31:18 -0700220 gp = GrConicEffect::Create(GrRandomColor(random), GrTest::TestMatrix(random),
joshualitt8059eb92014-12-29 15:10:07 -0800221 edgeType, caps,
joshualittb8c241a2015-05-19 08:23:30 -0700222 GrTest::TestMatrix(random), random->nextBool());
joshualittb0a8a372014-09-23 09:50:21 -0700223 } while (NULL == gp);
224 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000225}
226
227//////////////////////////////////////////////////////////////////////////////
228// Quad
229//////////////////////////////////////////////////////////////////////////////
230
joshualitt249af152014-09-15 11:41:13 -0700231class GrGLQuadEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000232public:
joshualitteb2a6762014-12-04 11:35:33 -0800233 GrGLQuadEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800234 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000235
mtklein36352bf2015-03-25 18:17:31 -0700236 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000237
joshualitt87f48d92014-12-04 10:41:40 -0800238 static inline void GenKey(const GrGeometryProcessor&,
239 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -0700240 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800241 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000242
joshualitt9b989322014-12-15 14:16:27 -0800243 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800244 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -0700245 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -0700246 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
247 this->setUniformViewMatrix(pdman, qe.viewMatrix());
joshualittee2af952014-12-30 09:04:15 -0800248
joshualittb8c241a2015-05-19 08:23:30 -0700249 if (qe.color() != fColor) {
joshualitt9b989322014-12-15 14:16:27 -0800250 GrGLfloat c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700251 GrColorToRGBAFloat(qe.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800252 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700253 fColor = qe.color();
joshualitt9b989322014-12-15 14:16:27 -0800254 }
joshualittb8c241a2015-05-19 08:23:30 -0700255
256 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
257 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale()));
258 fCoverageScale = qe.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -0800259 }
260 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000261
joshualitte3ababe2015-05-15 07:56:07 -0700262 void setTransformData(const GrPrimitiveProcessor& primProc,
263 const GrGLProgramDataManager& pdman,
264 int index,
265 const SkTArray<const GrCoordTransform*, true>& transforms) override {
266 this->setTransformDataHelper<GrQuadEffect>(primProc, pdman, index, transforms);
267 }
268
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000269private:
joshualitt9b989322014-12-15 14:16:27 -0800270 GrColor fColor;
271 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700272 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800273 UniformHandle fColorUniform;
274 UniformHandle fCoverageScaleUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000275
joshualitt249af152014-09-15 11:41:13 -0700276 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000277};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000278
joshualitteb2a6762014-12-04 11:35:33 -0800279GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800280 const GrBatchTracker& bt)
281 : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800282 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000283 fEdgeType = ce.getEdgeType();
284}
285
robertphillips46d36f02015-01-18 08:14:14 -0800286void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualitt9b989322014-12-15 14:16:27 -0800287 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -0800288 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
289 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
290
joshualittabb52a12015-01-13 15:02:10 -0800291 // emit attributes
292 vsBuilder->emitAttributes(gp);
293
joshualitt74077b92014-10-24 11:26:03 -0700294 GrGLVertToFrag v(kVec4f_GrSLType);
295 args.fPB->addVarying("HairQuadEdge", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -0800296 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000297
joshualitt9b989322014-12-15 14:16:27 -0800298 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700299 if (!gp.colorIgnored()) {
300 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform);
301 }
joshualitt9b989322014-12-15 14:16:27 -0800302
joshualittabb52a12015-01-13 15:02:10 -0800303 // Setup position
joshualittdd219872015-02-12 14:48:42 -0800304 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix());
joshualitt4973d9d2014-11-08 09:24:25 -0800305
joshualittabb52a12015-01-13 15:02:10 -0800306 // emit transforms with position
robertphillips46d36f02015-01-18 08:14:14 -0800307 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.localMatrix(),
joshualittabb52a12015-01-13 15:02:10 -0800308 args.fTransformsIn, args.fTransformsOut);
309
egdaniel29bee0f2015-04-29 11:54:42 -0700310 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -0700311 fsBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700312
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000313 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700314 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700315 SkAssertResult(fsBuilder->enableFeature(
316 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700317 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
318 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700319 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
320 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700321 v.fsIn(), v.fsIn());
322 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700323 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
324 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000325 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700326 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000327 break;
328 }
joshualittb0a8a372014-09-23 09:50:21 -0700329 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700330 SkAssertResult(fsBuilder->enableFeature(
331 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700332 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
333 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700334 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
335 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700336 v.fsIn(), v.fsIn());
337 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700338 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
339 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000340 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700341 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000342 break;
343 }
joshualittb0a8a372014-09-23 09:50:21 -0700344 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700345 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700346 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000347 break;
348 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000349 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000350 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000351 }
352
joshualittb8c241a2015-05-19 08:23:30 -0700353 if (0xff != gp.coverageScale()) {
joshualitt9b989322014-12-15 14:16:27 -0800354 const char* coverageScale;
355 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
356 kFloat_GrSLType,
357 kDefault_GrSLPrecision,
358 "Coverage",
359 &coverageScale);
360 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
361 } else {
362 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
363 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000364}
365
robertphillips46d36f02015-01-18 08:14:14 -0800366void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800367 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700368 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700369 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800370 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700371 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700372 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0;
373 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
374 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700375 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700376 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000377}
378
379//////////////////////////////////////////////////////////////////////////////
380
381GrQuadEffect::~GrQuadEffect() {}
382
joshualitteb2a6762014-12-04 11:35:33 -0800383void GrQuadEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700384 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800385 GrProcessorKeyBuilder* b) const {
386 GrGLQuadEffect::GenKey(*this, bt, caps, b);
387}
388
joshualittabb52a12015-01-13 15:02:10 -0800389GrGLPrimitiveProcessor* GrQuadEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700390 const GrGLSLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800391 return SkNEW_ARGS(GrGLQuadEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000392}
393
joshualitt8059eb92014-12-29 15:10:07 -0800394GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700395 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
396 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700397 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700398 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700399 , fLocalMatrix(localMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700400 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800401 , fCoverageScale(coverage)
402 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800403 this->initClassID<GrQuadEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800404 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
405 fInHairQuadEdge = &this->addVertexAttrib(Attribute("inHairQuadEdge",
joshualitt2dd1ae02014-12-03 06:24:10 -0800406 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000407}
408
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000409//////////////////////////////////////////////////////////////////////////////
410
joshualittb0a8a372014-09-23 09:50:21 -0700411GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000412
joshualittb0a8a372014-09-23 09:50:21 -0700413GrGeometryProcessor* GrQuadEffect::TestCreate(SkRandom* random,
414 GrContext*,
bsalomon4b91f762015-05-19 09:29:46 -0700415 const GrCaps& caps,
joshualittb0a8a372014-09-23 09:50:21 -0700416 GrTexture*[]) {
417 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000418 do {
joshualittb0a8a372014-09-23 09:50:21 -0700419 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
420 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800421 gp = GrQuadEffect::Create(GrRandomColor(random),
joshualitt4eaf9ce2015-04-28 13:31:18 -0700422 GrTest::TestMatrix(random),
joshualitt8059eb92014-12-29 15:10:07 -0800423 edgeType, caps,
joshualittb8c241a2015-05-19 08:23:30 -0700424 GrTest::TestMatrix(random),
425 random->nextBool());
joshualittb0a8a372014-09-23 09:50:21 -0700426 } while (NULL == gp);
427 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000428}
429
430//////////////////////////////////////////////////////////////////////////////
431// Cubic
432//////////////////////////////////////////////////////////////////////////////
433
joshualitt249af152014-09-15 11:41:13 -0700434class GrGLCubicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000435public:
joshualitteb2a6762014-12-04 11:35:33 -0800436 GrGLCubicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800437 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000438
mtklein36352bf2015-03-25 18:17:31 -0700439 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000440
joshualitt87f48d92014-12-04 10:41:40 -0800441 static inline void GenKey(const GrGeometryProcessor&,
442 const GrBatchTracker&,
jvanverthcfc18862015-04-28 08:48:20 -0700443 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800444 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000445
joshualitt9b989322014-12-15 14:16:27 -0800446 virtual void setData(const GrGLProgramDataManager& pdman,
joshualittee2af952014-12-30 09:04:15 -0800447 const GrPrimitiveProcessor& primProc,
mtklein36352bf2015-03-25 18:17:31 -0700448 const GrBatchTracker& bt) override {
joshualitte578a952015-05-14 10:09:13 -0700449 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
450 this->setUniformViewMatrix(pdman, ce.viewMatrix());
joshualittee2af952014-12-30 09:04:15 -0800451
joshualittb8c241a2015-05-19 08:23:30 -0700452 if (ce.color() != fColor) {
joshualitt9b989322014-12-15 14:16:27 -0800453 GrGLfloat c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700454 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800455 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700456 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -0800457 }
458 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000459
460private:
joshualitt9b989322014-12-15 14:16:27 -0800461 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700462 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800463 UniformHandle fColorUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000464
joshualitt249af152014-09-15 11:41:13 -0700465 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000466};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000467
joshualitteb2a6762014-12-04 11:35:33 -0800468GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800469 const GrBatchTracker&)
470 : fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700471 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000472 fEdgeType = ce.getEdgeType();
473}
474
robertphillips46d36f02015-01-18 08:14:14 -0800475void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
joshualittc369e7c2014-10-22 10:56:26 -0700476 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
joshualitt2dd1ae02014-12-03 06:24:10 -0800477 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
478
joshualittabb52a12015-01-13 15:02:10 -0800479 // emit attributes
480 vsBuilder->emitAttributes(gp);
481
joshualitt2dd1ae02014-12-03 06:24:10 -0800482 GrGLVertToFrag v(kVec4f_GrSLType);
bsalomonc0bd6482014-12-09 10:04:14 -0800483 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
joshualitt2dd1ae02014-12-03 06:24:10 -0800484 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
485
joshualitt9b989322014-12-15 14:16:27 -0800486 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700487 if (!gp.colorIgnored()) {
488 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform);
489 }
joshualitt9b989322014-12-15 14:16:27 -0800490
joshualittabb52a12015-01-13 15:02:10 -0800491 // Setup position
joshualittdd219872015-02-12 14:48:42 -0800492 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix());
joshualitt4973d9d2014-11-08 09:24:25 -0800493
joshualittabb52a12015-01-13 15:02:10 -0800494 // emit transforms with position
joshualitte3ababe2015-05-15 07:56:07 -0700495 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName, args.fTransformsIn,
496 args.fTransformsOut);
joshualittabb52a12015-01-13 15:02:10 -0800497
egdaniel29bee0f2015-04-29 11:54:42 -0700498 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -0700499
bsalomonc0bd6482014-12-09 10:04:14 -0800500 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
501 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
502 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
503 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
504 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
505 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
506 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
507 GrGLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700508
509 fsBuilder->declAppend(edgeAlpha);
510 fsBuilder->declAppend(dklmdx);
511 fsBuilder->declAppend(dklmdy);
512 fsBuilder->declAppend(dfdx);
513 fsBuilder->declAppend(dfdy);
514 fsBuilder->declAppend(gF);
515 fsBuilder->declAppend(gFM);
516 fsBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000517
518 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700519 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700520 SkAssertResult(fsBuilder->enableFeature(
521 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700522 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
523 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700524 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 -0700525 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
526 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700527 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 -0700528 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
529 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700530 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
531 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
532 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700533 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700534 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
535 fsBuilder->codeAppendf("%s = %s / %s;",
536 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
537 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
538 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000539 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700540 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
541 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
542 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000543 break;
544 }
joshualittb0a8a372014-09-23 09:50:21 -0700545 case kFillAA_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 ="
551 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700552 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
553 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700554 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 -0700555 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
556 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700557 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
558 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
559 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700560 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700561 fsBuilder->codeAppendf("%s = %s / %s;",
562 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
563 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.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 kFillBW_GrProcessorEdgeType: {
egdaniel9bd5bbf2014-08-29 11:12:30 -0700572 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700573 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700574 fsBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000575 break;
576 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000577 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000578 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000579 }
580
joshualitt2dd1ae02014-12-03 06:24:10 -0800581
582 fsBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000583}
584
robertphillips46d36f02015-01-18 08:14:14 -0800585void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
joshualitt9b989322014-12-15 14:16:27 -0800586 const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700587 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700588 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800589 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700590 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700591 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8;
joshualitte578a952015-05-14 10:09:13 -0700592 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700593 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000594}
595
596//////////////////////////////////////////////////////////////////////////////
597
598GrCubicEffect::~GrCubicEffect() {}
599
joshualitteb2a6762014-12-04 11:35:33 -0800600void GrCubicEffect::getGLProcessorKey(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700601 const GrGLSLCaps& caps,
joshualitteb2a6762014-12-04 11:35:33 -0800602 GrProcessorKeyBuilder* b) const {
603 GrGLCubicEffect::GenKey(*this, bt, caps, b);
604}
605
joshualittabb52a12015-01-13 15:02:10 -0800606GrGLPrimitiveProcessor* GrCubicEffect::createGLInstance(const GrBatchTracker& bt,
jvanverthcfc18862015-04-28 08:48:20 -0700607 const GrGLSLCaps&) const {
joshualitteb2a6762014-12-04 11:35:33 -0800608 return SkNEW_ARGS(GrGLCubicEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000609}
610
joshualitt8059eb92014-12-29 15:10:07 -0800611GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
612 GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700613 : fColor(color)
614 , fViewMatrix(viewMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700615 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800616 this->initClassID<GrCubicEffect>();
joshualitt71c92602015-01-14 08:12:47 -0800617 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
618 fInCubicCoeffs = &this->addVertexAttrib(Attribute("inCubicCoeffs",
joshualitt2dd1ae02014-12-03 06:24:10 -0800619 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000620}
621
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000622//////////////////////////////////////////////////////////////////////////////
623
joshualittb0a8a372014-09-23 09:50:21 -0700624GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000625
joshualittb0a8a372014-09-23 09:50:21 -0700626GrGeometryProcessor* GrCubicEffect::TestCreate(SkRandom* random,
627 GrContext*,
bsalomon4b91f762015-05-19 09:29:46 -0700628 const GrCaps& caps,
joshualittb0a8a372014-09-23 09:50:21 -0700629 GrTexture*[]) {
630 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000631 do {
joshualittb0a8a372014-09-23 09:50:21 -0700632 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
633 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt8059eb92014-12-29 15:10:07 -0800634 gp = GrCubicEffect::Create(GrRandomColor(random),
joshualitt4eaf9ce2015-04-28 13:31:18 -0700635 GrTest::TestMatrix(random), edgeType, caps);
joshualittb0a8a372014-09-23 09:50:21 -0700636 } while (NULL == gp);
637 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000638}
egdaniel9bd5bbf2014-08-29 11:12:30 -0700639