blob: c7e7b3647acd04780f932d5937f00461a484f4c1 [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
egdaniel7ea439b2015-12-03 09:20:44 -080010#include "glsl/GrGLSLFragmentShaderBuilder.h"
egdaniele659a582015-11-13 09:55:43 -080011#include "glsl/GrGLSLGeometryProcessor.h"
egdaniel018fb622015-10-28 07:26:40 -070012#include "glsl/GrGLSLProgramDataManager.h"
egdaniel7ea439b2015-12-03 09:20:44 -080013#include "glsl/GrGLSLUniformHandler.h"
egdaniel64c47282015-11-13 06:54:19 -080014#include "glsl/GrGLSLUtil.h"
egdaniel0eafe792015-11-20 14:01:22 -080015#include "glsl/GrGLSLVarying.h"
egdaniel7ea439b2015-12-03 09:20:44 -080016#include "glsl/GrGLSLVertexShaderBuilder.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000017
egdaniele659a582015-11-13 09:55:43 -080018class GrGLConicEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000019public:
joshualitt465283c2015-09-11 08:19:35 -070020 GrGLConicEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000021
mtklein36352bf2015-03-25 18:17:31 -070022 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000023
joshualitt87f48d92014-12-04 10:41:40 -080024 static inline void GenKey(const GrGeometryProcessor&,
jvanverthcfc18862015-04-28 08:48:20 -070025 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -080026 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000027
egdaniel018fb622015-10-28 07:26:40 -070028 void setData(const GrGLSLProgramDataManager& pdman,
joshualitt465283c2015-09-11 08:19:35 -070029 const GrPrimitiveProcessor& primProc) override {
joshualitte578a952015-05-14 10:09:13 -070030 const GrConicEffect& ce = primProc.cast<GrConicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -070031
32 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
33 fViewMatrix = ce.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -070034 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -080035 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -070036 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
37 }
joshualittee2af952014-12-30 09:04:15 -080038
joshualittb8c241a2015-05-19 08:23:30 -070039 if (ce.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -070040 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -070041 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -080042 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -070043 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -080044 }
joshualittb8c241a2015-05-19 08:23:30 -070045
46 if (ce.coverageScale() != 0xff && ce.coverageScale() != fCoverageScale) {
47 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(ce.coverageScale()));
48 fCoverageScale = ce.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -080049 }
50 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000051
joshualitte3ababe2015-05-15 07:56:07 -070052 void setTransformData(const GrPrimitiveProcessor& primProc,
egdaniel018fb622015-10-28 07:26:40 -070053 const GrGLSLProgramDataManager& pdman,
joshualitte3ababe2015-05-15 07:56:07 -070054 int index,
55 const SkTArray<const GrCoordTransform*, true>& transforms) override {
56 this->setTransformDataHelper<GrConicEffect>(primProc, pdman, index, transforms);
57 }
58
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000059private:
joshualitt5559ca22015-05-21 15:50:36 -070060 SkMatrix fViewMatrix;
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;
joshualitt5559ca22015-05-21 15:50:36 -070066 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000067
egdaniele659a582015-11-13 09:55:43 -080068 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000069};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +000070
joshualitt465283c2015-09-11 08:19:35 -070071GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor)
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) {
egdaniel4ca2e602015-11-18 08:01:26 -080078 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -080079 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>();
egdaniel0eafe792015-11-20 14:01:22 -080080 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -080081 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -080082
joshualittabb52a12015-01-13 15:02:10 -080083 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -080084 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -080085
egdaniel8dcdedc2015-11-11 06:27:20 -080086 GrGLSLVertToFrag v(kVec4f_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -080087 varyingHandler->addVarying("ConicCoeffs", &v);
egdaniel4ca2e602015-11-18 08:01:26 -080088 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000089
egdaniel4ca2e602015-11-18 08:01:26 -080090 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -080091 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -070092 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -080093 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -070094 }
joshualitt9b989322014-12-15 14:16:27 -080095
joshualittabb52a12015-01-13 15:02:10 -080096 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -080097 this->setupPosition(vertBuilder,
98 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -080099 gpArgs,
100 gp.inPosition()->fName,
101 gp.viewMatrix(),
102 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800103
joshualittabb52a12015-01-13 15:02:10 -0800104 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800105 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800106 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800107 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800108 gpArgs->fPositionVar,
109 gp.inPosition()->fName,
110 gp.localMatrix(),
111 args.fTransformsIn,
112 args.fTransformsOut);
joshualittabb52a12015-01-13 15:02:10 -0800113
egdaniel4ca2e602015-11-18 08:01:26 -0800114 fragBuilder->codeAppend("float edgeAlpha;");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000115
116 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700117 case kHairlineAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800118 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800119 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdaniel4ca2e602015-11-18 08:01:26 -0800120 fragBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
121 fragBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
122 fragBuilder->codeAppendf("float dfdx ="
123 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
124 v.fsIn(), v.fsIn(), v.fsIn());
125 fragBuilder->codeAppendf("float dfdy ="
126 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
127 v.fsIn(), v.fsIn(), v.fsIn());
128 fragBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
129 fragBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
130 fragBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn(), v.fsIn(),
131 v.fsIn(), v.fsIn());
132 fragBuilder->codeAppend("func = abs(func);");
133 fragBuilder->codeAppend("edgeAlpha = func / gFM;");
134 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000135 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800136 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000137 break;
138 }
joshualittb0a8a372014-09-23 09:50:21 -0700139 case kFillAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800140 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800141 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdaniel4ca2e602015-11-18 08:01:26 -0800142 fragBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
143 fragBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
144 fragBuilder->codeAppendf("float dfdx ="
145 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
146 v.fsIn(), v.fsIn(), v.fsIn());
147 fragBuilder->codeAppendf("float dfdy ="
148 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
149 v.fsIn(), v.fsIn(), v.fsIn());
150 fragBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
151 fragBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
152 fragBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
153 v.fsIn(), v.fsIn());
154 fragBuilder->codeAppend("edgeAlpha = func / gFM;");
155 fragBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000156 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800157 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000158 break;
159 }
joshualittb0a8a372014-09-23 09:50:21 -0700160 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800161 fragBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
162 v.fsIn(), v.fsIn());
163 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000164 break;
165 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000166 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000167 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000168 }
169
joshualittb8c241a2015-05-19 08:23:30 -0700170 // TODO should we really be doing this?
171 if (gp.coverageScale() != 0xff) {
joshualitt9b989322014-12-15 14:16:27 -0800172 const char* coverageScale;
egdaniel7ea439b2015-12-03 09:20:44 -0800173 fCoverageScaleUniform = uniformHandler->addUniform(
174 GrGLSLUniformHandler::kFragment_Visibility,
175 kFloat_GrSLType,
176 kDefault_GrSLPrecision,
177 "Coverage",
178 &coverageScale);
egdaniel4ca2e602015-11-18 08:01:26 -0800179 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800180 } else {
egdaniel4ca2e602015-11-18 08:01:26 -0800181 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
joshualitt9b989322014-12-15 14:16:27 -0800182 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000183}
184
robertphillips46d36f02015-01-18 08:14:14 -0800185void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
jvanverthcfc18862015-04-28 08:48:20 -0700186 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700187 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800188 const GrConicEffect& ce = gp.cast<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700189 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700190 key |= GrColor_ILLEGAL != ce.color() ? 0x4 : 0x0;
191 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0;
192 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700193 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700194 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000195}
196
197//////////////////////////////////////////////////////////////////////////////
198
199GrConicEffect::~GrConicEffect() {}
200
egdaniel57d3b032015-11-13 11:57:27 -0800201void GrConicEffect::getGLSLProcessorKey(const GrGLSLCaps& caps,
202 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700203 GrGLConicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800204}
205
egdaniel57d3b032015-11-13 11:57:27 -0800206GrGLSLPrimitiveProcessor* GrConicEffect::createGLSLInstance(const GrGLSLCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700207 return new GrGLConicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000208}
209
joshualitt8059eb92014-12-29 15:10:07 -0800210GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700211 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
212 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700213 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700214 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700215 , fLocalMatrix(viewMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700216 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800217 , fCoverageScale(coverage)
218 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800219 this->initClassID<GrConicEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700220 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
221 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800222 fInConicCoeffs = &this->addVertexAttrib(Attribute("inConicCoeffs",
joshualittb8c241a2015-05-19 08:23:30 -0700223 kVec4f_GrVertexAttribType));
joshualitt9b989322014-12-15 14:16:27 -0800224}
225
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000226//////////////////////////////////////////////////////////////////////////////
227
joshualittb0a8a372014-09-23 09:50:21 -0700228GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000229
bsalomonc21b09e2015-08-28 18:46:56 -0700230const GrGeometryProcessor* GrConicEffect::TestCreate(GrProcessorTestData* d) {
joshualittb0a8a372014-09-23 09:50:21 -0700231 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000232 do {
joshualitt0067ff52015-07-08 14:26:19 -0700233 GrPrimitiveEdgeType edgeType =
234 static_cast<GrPrimitiveEdgeType>(
235 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
236 gp = GrConicEffect::Create(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom),
237 edgeType, *d->fCaps,
238 GrTest::TestMatrix(d->fRandom), d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700239 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700240 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000241}
242
243//////////////////////////////////////////////////////////////////////////////
244// Quad
245//////////////////////////////////////////////////////////////////////////////
246
egdaniele659a582015-11-13 09:55:43 -0800247class GrGLQuadEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000248public:
joshualitt465283c2015-09-11 08:19:35 -0700249 GrGLQuadEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000250
mtklein36352bf2015-03-25 18:17:31 -0700251 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000252
joshualitt87f48d92014-12-04 10:41:40 -0800253 static inline void GenKey(const GrGeometryProcessor&,
jvanverthcfc18862015-04-28 08:48:20 -0700254 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800255 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000256
egdaniel018fb622015-10-28 07:26:40 -0700257 void setData(const GrGLSLProgramDataManager& pdman,
joshualitt465283c2015-09-11 08:19:35 -0700258 const GrPrimitiveProcessor& primProc) override {
joshualitte578a952015-05-14 10:09:13 -0700259 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700260
261 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMatrix())) {
262 fViewMatrix = qe.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700263 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800264 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700265 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
266 }
joshualittee2af952014-12-30 09:04:15 -0800267
joshualittb8c241a2015-05-19 08:23:30 -0700268 if (qe.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700269 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700270 GrColorToRGBAFloat(qe.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800271 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700272 fColor = qe.color();
joshualitt9b989322014-12-15 14:16:27 -0800273 }
joshualittb8c241a2015-05-19 08:23:30 -0700274
275 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
276 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale()));
277 fCoverageScale = qe.coverageScale();
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,
egdaniel018fb622015-10-28 07:26:40 -0700282 const GrGLSLProgramDataManager& pdman,
joshualitte3ababe2015-05-15 07:56:07 -0700283 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:
joshualitt5559ca22015-05-21 15:50:36 -0700289 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800290 GrColor fColor;
291 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700292 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800293 UniformHandle fColorUniform;
294 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700295 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000296
egdaniele659a582015-11-13 09:55:43 -0800297 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000298};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000299
joshualitt465283c2015-09-11 08:19:35 -0700300GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -0700301 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800302 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000303 fEdgeType = ce.getEdgeType();
304}
305
robertphillips46d36f02015-01-18 08:14:14 -0800306void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800307 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800308 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800309 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800310 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800311
joshualittabb52a12015-01-13 15:02:10 -0800312 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800313 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800314
egdaniel8dcdedc2015-11-11 06:27:20 -0800315 GrGLSLVertToFrag v(kVec4f_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800316 varyingHandler->addVarying("HairQuadEdge", &v);
egdaniel4ca2e602015-11-18 08:01:26 -0800317 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000318
egdaniel4ca2e602015-11-18 08:01:26 -0800319 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800320 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700321 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -0800322 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700323 }
joshualitt9b989322014-12-15 14:16:27 -0800324
joshualittabb52a12015-01-13 15:02:10 -0800325 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -0800326 this->setupPosition(vertBuilder,
327 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800328 gpArgs,
329 gp.inPosition()->fName,
330 gp.viewMatrix(),
331 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800332
joshualittabb52a12015-01-13 15:02:10 -0800333 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800334 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800335 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800336 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800337 gpArgs->fPositionVar,
338 gp.inPosition()->fName,
339 gp.localMatrix(),
340 args.fTransformsIn,
341 args.fTransformsOut);
joshualittabb52a12015-01-13 15:02:10 -0800342
egdaniel4ca2e602015-11-18 08:01:26 -0800343 fragBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700344
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000345 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700346 case kHairlineAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800347 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800348 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdaniel4ca2e602015-11-18 08:01:26 -0800349 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
350 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
351 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
352 " 2.0 * %s.x * duvdy.x - duvdy.y);",
353 v.fsIn(), v.fsIn());
354 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
355 v.fsIn(), v.fsIn(), v.fsIn());
356 fragBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
357 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000358 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800359 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000360 break;
361 }
joshualittb0a8a372014-09-23 09:50:21 -0700362 case kFillAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800363 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800364 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdaniel4ca2e602015-11-18 08:01:26 -0800365 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
366 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
367 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
368 " 2.0 * %s.x * duvdy.x - duvdy.y);",
369 v.fsIn(), v.fsIn());
370 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
371 v.fsIn(), v.fsIn(), v.fsIn());
372 fragBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
373 fragBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000374 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800375 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000376 break;
377 }
joshualittb0a8a372014-09-23 09:50:21 -0700378 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800379 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
380 v.fsIn(), v.fsIn(), v.fsIn());
381 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000382 break;
383 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000384 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000385 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000386 }
387
joshualittb8c241a2015-05-19 08:23:30 -0700388 if (0xff != gp.coverageScale()) {
joshualitt9b989322014-12-15 14:16:27 -0800389 const char* coverageScale;
egdaniel7ea439b2015-12-03 09:20:44 -0800390 fCoverageScaleUniform = uniformHandler->addUniform(
391 GrGLSLUniformHandler::kFragment_Visibility,
392 kFloat_GrSLType,
393 kDefault_GrSLPrecision,
394 "Coverage",
395 &coverageScale);
egdaniel4ca2e602015-11-18 08:01:26 -0800396 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800397 } else {
egdaniel4ca2e602015-11-18 08:01:26 -0800398 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
joshualitt9b989322014-12-15 14:16:27 -0800399 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000400}
401
robertphillips46d36f02015-01-18 08:14:14 -0800402void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
jvanverthcfc18862015-04-28 08:48:20 -0700403 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700404 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800405 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700406 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700407 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0;
408 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
409 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700410 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700411 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000412}
413
414//////////////////////////////////////////////////////////////////////////////
415
416GrQuadEffect::~GrQuadEffect() {}
417
egdaniel57d3b032015-11-13 11:57:27 -0800418void GrQuadEffect::getGLSLProcessorKey(const GrGLSLCaps& caps,
419 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700420 GrGLQuadEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800421}
422
egdaniel57d3b032015-11-13 11:57:27 -0800423GrGLSLPrimitiveProcessor* GrQuadEffect::createGLSLInstance(const GrGLSLCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700424 return new GrGLQuadEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000425}
426
joshualitt8059eb92014-12-29 15:10:07 -0800427GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700428 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
429 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700430 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700431 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700432 , fLocalMatrix(localMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700433 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800434 , fCoverageScale(coverage)
435 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800436 this->initClassID<GrQuadEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700437 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
438 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800439 fInHairQuadEdge = &this->addVertexAttrib(Attribute("inHairQuadEdge",
joshualitt2dd1ae02014-12-03 06:24:10 -0800440 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000441}
442
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000443//////////////////////////////////////////////////////////////////////////////
444
joshualittb0a8a372014-09-23 09:50:21 -0700445GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000446
bsalomonc21b09e2015-08-28 18:46:56 -0700447const GrGeometryProcessor* GrQuadEffect::TestCreate(GrProcessorTestData* d) {
joshualittb0a8a372014-09-23 09:50:21 -0700448 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000449 do {
joshualittb0a8a372014-09-23 09:50:21 -0700450 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
joshualitt0067ff52015-07-08 14:26:19 -0700451 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
452 gp = GrQuadEffect::Create(GrRandomColor(d->fRandom),
453 GrTest::TestMatrix(d->fRandom),
454 edgeType, *d->fCaps,
455 GrTest::TestMatrix(d->fRandom),
456 d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700457 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700458 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000459}
460
461//////////////////////////////////////////////////////////////////////////////
462// Cubic
463//////////////////////////////////////////////////////////////////////////////
464
egdaniele659a582015-11-13 09:55:43 -0800465class GrGLCubicEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000466public:
joshualitt465283c2015-09-11 08:19:35 -0700467 GrGLCubicEffect(const GrGeometryProcessor&);
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&,
jvanverthcfc18862015-04-28 08:48:20 -0700472 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800473 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000474
egdaniel018fb622015-10-28 07:26:40 -0700475 void setData(const GrGLSLProgramDataManager& pdman,
joshualitt465283c2015-09-11 08:19:35 -0700476 const GrPrimitiveProcessor& primProc) override {
joshualitte578a952015-05-14 10:09:13 -0700477 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700478
479 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
480 fViewMatrix = ce.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700481 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800482 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700483 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
484 }
joshualittee2af952014-12-30 09:04:15 -0800485
joshualittb8c241a2015-05-19 08:23:30 -0700486 if (ce.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700487 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700488 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800489 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700490 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -0800491 }
492 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000493
494private:
joshualitt5559ca22015-05-21 15:50:36 -0700495 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800496 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700497 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800498 UniformHandle fColorUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700499 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000500
egdaniele659a582015-11-13 09:55:43 -0800501 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000502};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000503
joshualitt465283c2015-09-11 08:19:35 -0700504GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -0700505 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700506 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000507 fEdgeType = ce.getEdgeType();
508}
509
robertphillips46d36f02015-01-18 08:14:14 -0800510void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800511 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800512 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800513 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800514 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800515
joshualittabb52a12015-01-13 15:02:10 -0800516 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800517 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800518
egdaniel8dcdedc2015-11-11 06:27:20 -0800519 GrGLSLVertToFrag v(kVec4f_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800520 varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
egdaniel4ca2e602015-11-18 08:01:26 -0800521 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
joshualitt2dd1ae02014-12-03 06:24:10 -0800522
egdaniel4ca2e602015-11-18 08:01:26 -0800523 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800524 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700525 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -0800526 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700527 }
joshualitt9b989322014-12-15 14:16:27 -0800528
joshualittabb52a12015-01-13 15:02:10 -0800529 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -0800530 this->setupPosition(vertBuilder,
531 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800532 gpArgs,
533 gp.inPosition()->fName,
534 gp.viewMatrix(),
joshualitt5559ca22015-05-21 15:50:36 -0700535 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800536
joshualittabb52a12015-01-13 15:02:10 -0800537 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800538 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800539 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800540 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800541 gpArgs->fPositionVar,
542 gp.inPosition()->fName,
543 args.fTransformsIn,
joshualitte3ababe2015-05-15 07:56:07 -0700544 args.fTransformsOut);
joshualittabb52a12015-01-13 15:02:10 -0800545
egdaniel9bd5bbf2014-08-29 11:12:30 -0700546
egdaniel0d3f0612015-10-21 10:45:48 -0700547 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
548 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
549 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
550 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
551 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
552 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
553 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
554 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700555
egdaniel4ca2e602015-11-18 08:01:26 -0800556 fragBuilder->declAppend(edgeAlpha);
557 fragBuilder->declAppend(dklmdx);
558 fragBuilder->declAppend(dklmdy);
559 fragBuilder->declAppend(dfdx);
560 fragBuilder->declAppend(dfdy);
561 fragBuilder->declAppend(gF);
562 fragBuilder->declAppend(gFM);
563 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000564
565 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700566 case kHairlineAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800567 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800568 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdaniel4ca2e602015-11-18 08:01:26 -0800569 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
570 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
571 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
572 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
573 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
574 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
575 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
576 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
577 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
578 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
579 gFM.c_str(), gF.c_str(), gF.c_str());
580 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
581 func.c_str(), v.fsIn(), v.fsIn(),
582 v.fsIn(), v.fsIn(), v.fsIn());
583 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
584 fragBuilder->codeAppendf("%s = %s / %s;",
585 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
586 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
587 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000588 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800589 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700590 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
591 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000592 break;
593 }
joshualittb0a8a372014-09-23 09:50:21 -0700594 case kFillAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800595 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800596 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdaniel4ca2e602015-11-18 08:01:26 -0800597 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
598 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
599 fragBuilder->codeAppendf("%s ="
600 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
601 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
602 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
603 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
604 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
605 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
606 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
607 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
608 gFM.c_str(), gF.c_str(), gF.c_str());
609 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
610 func.c_str(), v.fsIn(), v.fsIn(),
611 v.fsIn(), v.fsIn(), v.fsIn());
612 fragBuilder->codeAppendf("%s = %s / %s;",
613 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
614 fragBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
615 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000616 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800617 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700618 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
619 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000620 break;
621 }
joshualittb0a8a372014-09-23 09:50:21 -0700622 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800623 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
624 edgeAlpha.c_str(), v.fsIn(), v.fsIn(),
625 v.fsIn(), v.fsIn(), v.fsIn());
626 fragBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000627 break;
628 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000629 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000630 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000631 }
632
joshualitt2dd1ae02014-12-03 06:24:10 -0800633
egdaniel4ca2e602015-11-18 08:01:26 -0800634 fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000635}
636
robertphillips46d36f02015-01-18 08:14:14 -0800637void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
jvanverthcfc18862015-04-28 08:48:20 -0700638 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700639 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800640 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700641 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700642 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8;
joshualitte578a952015-05-14 10:09:13 -0700643 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700644 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000645}
646
647//////////////////////////////////////////////////////////////////////////////
648
649GrCubicEffect::~GrCubicEffect() {}
650
egdaniel57d3b032015-11-13 11:57:27 -0800651void GrCubicEffect::getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700652 GrGLCubicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800653}
654
egdaniel57d3b032015-11-13 11:57:27 -0800655GrGLSLPrimitiveProcessor* GrCubicEffect::createGLSLInstance(const GrGLSLCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700656 return new GrGLCubicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000657}
658
joshualitt8059eb92014-12-29 15:10:07 -0800659GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
660 GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700661 : fColor(color)
662 , fViewMatrix(viewMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700663 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800664 this->initClassID<GrCubicEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700665 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
666 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800667 fInCubicCoeffs = &this->addVertexAttrib(Attribute("inCubicCoeffs",
joshualitt2dd1ae02014-12-03 06:24:10 -0800668 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000669}
670
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000671//////////////////////////////////////////////////////////////////////////////
672
joshualittb0a8a372014-09-23 09:50:21 -0700673GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000674
bsalomonc21b09e2015-08-28 18:46:56 -0700675const GrGeometryProcessor* GrCubicEffect::TestCreate(GrProcessorTestData* d) {
joshualittb0a8a372014-09-23 09:50:21 -0700676 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000677 do {
joshualitt0067ff52015-07-08 14:26:19 -0700678 GrPrimitiveEdgeType edgeType =
679 static_cast<GrPrimitiveEdgeType>(
680 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
681 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom),
682 GrTest::TestMatrix(d->fRandom), edgeType, *d->fCaps);
halcanary96fcdcc2015-08-27 07:41:13 -0700683 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700684 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000685}
egdaniel9bd5bbf2014-08-29 11:12:30 -0700686