blob: cd7f763148a35fa3a66538fe0d184e92897ba493 [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
Brian Salomon99938a82016-11-21 13:41:08 -050010#include "glsl/GrGLSLCaps.h"
egdaniel7ea439b2015-12-03 09:20:44 -080011#include "glsl/GrGLSLFragmentShaderBuilder.h"
egdaniele659a582015-11-13 09:55:43 -080012#include "glsl/GrGLSLGeometryProcessor.h"
egdaniel018fb622015-10-28 07:26:40 -070013#include "glsl/GrGLSLProgramDataManager.h"
egdaniel7ea439b2015-12-03 09:20:44 -080014#include "glsl/GrGLSLUniformHandler.h"
egdaniel64c47282015-11-13 06:54:19 -080015#include "glsl/GrGLSLUtil.h"
egdaniel0eafe792015-11-20 14:01:22 -080016#include "glsl/GrGLSLVarying.h"
egdaniel7ea439b2015-12-03 09:20:44 -080017#include "glsl/GrGLSLVertexShaderBuilder.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000018
egdaniele659a582015-11-13 09:55:43 -080019class GrGLConicEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000020public:
joshualitt465283c2015-09-11 08:19:35 -070021 GrGLConicEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000022
mtklein36352bf2015-03-25 18:17:31 -070023 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000024
joshualitt87f48d92014-12-04 10:41:40 -080025 static inline void GenKey(const GrGeometryProcessor&,
jvanverthcfc18862015-04-28 08:48:20 -070026 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -080027 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000028
bsalomona624bf32016-09-20 09:12:47 -070029 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
30 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -070031 const GrConicEffect& ce = primProc.cast<GrConicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -070032
33 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
34 fViewMatrix = ce.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -070035 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -080036 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -070037 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
38 }
joshualittee2af952014-12-30 09:04:15 -080039
joshualittb8c241a2015-05-19 08:23:30 -070040 if (ce.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -070041 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -070042 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -080043 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -070044 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -080045 }
joshualittb8c241a2015-05-19 08:23:30 -070046
47 if (ce.coverageScale() != 0xff && ce.coverageScale() != fCoverageScale) {
48 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(ce.coverageScale()));
49 fCoverageScale = ce.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -080050 }
bsalomona624bf32016-09-20 09:12:47 -070051 this->setTransformDataHelper(ce.localMatrix(), pdman, &transformIter);
joshualitte3ababe2015-05-15 07:56:07 -070052 }
53
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000054private:
joshualitt5559ca22015-05-21 15:50:36 -070055 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -080056 GrColor fColor;
57 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -070058 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -080059 UniformHandle fColorUniform;
60 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -070061 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000062
egdaniele659a582015-11-13 09:55:43 -080063 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000064};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +000065
joshualitt465283c2015-09-11 08:19:35 -070066GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -070067 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -080068 const GrConicEffect& ce = processor.cast<GrConicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000069 fEdgeType = ce.getEdgeType();
70}
71
robertphillips46d36f02015-01-18 08:14:14 -080072void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -080073 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -080074 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>();
egdaniel0eafe792015-11-20 14:01:22 -080075 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -080076 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -080077
joshualittabb52a12015-01-13 15:02:10 -080078 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -080079 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -080080
egdaniel8dcdedc2015-11-11 06:27:20 -080081 GrGLSLVertToFrag v(kVec4f_GrSLType);
robertphillips96afa522015-12-09 07:54:24 -080082 varyingHandler->addVarying("ConicCoeffs", &v, kHigh_GrSLPrecision);
egdaniel4ca2e602015-11-18 08:01:26 -080083 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000084
cdalton85285412016-02-18 12:37:07 -080085 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -080086 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -070087 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -080088 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -070089 }
joshualitt9b989322014-12-15 14:16:27 -080090
joshualittabb52a12015-01-13 15:02:10 -080091 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -080092 this->setupPosition(vertBuilder,
93 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -080094 gpArgs,
95 gp.inPosition()->fName,
96 gp.viewMatrix(),
97 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -080098
joshualittabb52a12015-01-13 15:02:10 -080099 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800100 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800101 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800102 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800103 gpArgs->fPositionVar,
104 gp.inPosition()->fName,
105 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700106 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800107
robertphillips2eb10092015-12-11 04:59:36 -0800108 // TODO: this precision check should actually be a check on the number of bits
109 // high and medium provide and the selection of the lowest level that suffices.
110 // Additionally we should assert that the upstream code only lets us get here if
111 // either high or medium provides the required number of bits.
112 GrSLPrecision precision = kHigh_GrSLPrecision;
113 const GrShaderCaps::PrecisionInfo& highP = args.fGLSLCaps->getFloatShaderPrecisionInfo(
114 kFragment_GrShaderType,
115 kHigh_GrSLPrecision);
116 if (!highP.supported()) {
117 precision = kMedium_GrSLPrecision;
118 }
119
Brian Salomon99938a82016-11-21 13:41:08 -0500120 GrShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, precision);
121 GrShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, precision);
122 GrShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, precision);
123 GrShaderVar dfdx("dfdx", kFloat_GrSLType, 0, precision);
124 GrShaderVar dfdy("dfdy", kFloat_GrSLType, 0, precision);
125 GrShaderVar gF("gF", kVec2f_GrSLType, 0, precision);
126 GrShaderVar gFM("gFM", kFloat_GrSLType, 0, precision);
127 GrShaderVar func("func", kFloat_GrSLType, 0, precision);
robertphillips96afa522015-12-09 07:54:24 -0800128
129 fragBuilder->declAppend(edgeAlpha);
130 fragBuilder->declAppend(dklmdx);
131 fragBuilder->declAppend(dklmdy);
132 fragBuilder->declAppend(dfdx);
133 fragBuilder->declAppend(dfdy);
134 fragBuilder->declAppend(gF);
135 fragBuilder->declAppend(gFM);
136 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000137
138 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700139 case kHairlineAA_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800140 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
141 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
142 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
143 dfdx.c_str(),
144 v.fsIn(), dklmdx.c_str(),
145 v.fsIn(), dklmdx.c_str(),
146 v.fsIn(), dklmdx.c_str());
147 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
148 dfdy.c_str(),
149 v.fsIn(), dklmdy.c_str(),
150 v.fsIn(), dklmdy.c_str(),
151 v.fsIn(), dklmdy.c_str());
152 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
153 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
154 gFM.c_str(), gF.c_str(), gF.c_str());
155 fragBuilder->codeAppendf("%s = %s.x*%s.x - %s.y*%s.z;",
156 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
157 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
158 fragBuilder->codeAppendf("%s = %s / %s;",
159 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
160 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
161 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000162 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800163 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000164 break;
165 }
joshualittb0a8a372014-09-23 09:50:21 -0700166 case kFillAA_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800167 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
168 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
169 fragBuilder->codeAppendf("%s ="
170 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
171 dfdx.c_str(),
172 v.fsIn(), dklmdx.c_str(),
173 v.fsIn(), dklmdx.c_str(),
174 v.fsIn(), dklmdx.c_str());
175 fragBuilder->codeAppendf("%s ="
176 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
177 dfdy.c_str(),
178 v.fsIn(), dklmdy.c_str(),
179 v.fsIn(), dklmdy.c_str(),
180 v.fsIn(), dklmdy.c_str());
181 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
182 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
183 gFM.c_str(), gF.c_str(), gF.c_str());
184 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
185 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
186 fragBuilder->codeAppendf("%s = %s / %s;",
187 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
188 fragBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
189 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000190 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800191 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000192 break;
193 }
joshualittb0a8a372014-09-23 09:50:21 -0700194 case kFillBW_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800195 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
196 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
197 fragBuilder->codeAppendf("%s = float(%s < 0.0);",
198 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000199 break;
200 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000201 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000202 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000203 }
204
joshualittb8c241a2015-05-19 08:23:30 -0700205 // TODO should we really be doing this?
206 if (gp.coverageScale() != 0xff) {
joshualitt9b989322014-12-15 14:16:27 -0800207 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800208 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
209 kFloat_GrSLType,
210 kHigh_GrSLPrecision,
211 "Coverage",
212 &coverageScale);
robertphillips96afa522015-12-09 07:54:24 -0800213 fragBuilder->codeAppendf("%s = vec4(%s * %s);",
214 args.fOutputCoverage, coverageScale, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800215 } else {
robertphillips96afa522015-12-09 07:54:24 -0800216 fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800217 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000218}
219
robertphillips46d36f02015-01-18 08:14:14 -0800220void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
jvanverthcfc18862015-04-28 08:48:20 -0700221 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700222 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800223 const GrConicEffect& ce = gp.cast<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700224 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700225 key |= GrColor_ILLEGAL != ce.color() ? 0x4 : 0x0;
226 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0;
227 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700228 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700229 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000230}
231
232//////////////////////////////////////////////////////////////////////////////
233
234GrConicEffect::~GrConicEffect() {}
235
egdaniel57d3b032015-11-13 11:57:27 -0800236void GrConicEffect::getGLSLProcessorKey(const GrGLSLCaps& caps,
237 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700238 GrGLConicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800239}
240
egdaniel57d3b032015-11-13 11:57:27 -0800241GrGLSLPrimitiveProcessor* GrConicEffect::createGLSLInstance(const GrGLSLCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700242 return new GrGLConicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000243}
244
joshualitt8059eb92014-12-29 15:10:07 -0800245GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700246 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
247 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700248 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700249 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700250 , fLocalMatrix(viewMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700251 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800252 , fCoverageScale(coverage)
253 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800254 this->initClassID<GrConicEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700255 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
256 kHigh_GrSLPrecision);
257 fInConicCoeffs = &this->addVertexAttrib("inConicCoeffs", kVec4f_GrVertexAttribType);
joshualitt9b989322014-12-15 14:16:27 -0800258}
259
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000260//////////////////////////////////////////////////////////////////////////////
261
joshualittb0a8a372014-09-23 09:50:21 -0700262GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000263
bungeman06ca8ec2016-06-09 08:01:03 -0700264sk_sp<GrGeometryProcessor> GrConicEffect::TestCreate(GrProcessorTestData* d) {
265 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000266 do {
joshualitt0067ff52015-07-08 14:26:19 -0700267 GrPrimitiveEdgeType edgeType =
268 static_cast<GrPrimitiveEdgeType>(
269 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
bungeman06ca8ec2016-06-09 08:01:03 -0700270 gp = GrConicEffect::Make(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom),
271 edgeType, *d->fCaps,
272 GrTest::TestMatrix(d->fRandom), d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700273 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700274 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000275}
276
277//////////////////////////////////////////////////////////////////////////////
278// Quad
279//////////////////////////////////////////////////////////////////////////////
280
egdaniele659a582015-11-13 09:55:43 -0800281class GrGLQuadEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000282public:
joshualitt465283c2015-09-11 08:19:35 -0700283 GrGLQuadEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000284
mtklein36352bf2015-03-25 18:17:31 -0700285 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000286
joshualitt87f48d92014-12-04 10:41:40 -0800287 static inline void GenKey(const GrGeometryProcessor&,
jvanverthcfc18862015-04-28 08:48:20 -0700288 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800289 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000290
bsalomona624bf32016-09-20 09:12:47 -0700291 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
292 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700293 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700294
295 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMatrix())) {
296 fViewMatrix = qe.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700297 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800298 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700299 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
300 }
joshualittee2af952014-12-30 09:04:15 -0800301
joshualittb8c241a2015-05-19 08:23:30 -0700302 if (qe.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700303 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700304 GrColorToRGBAFloat(qe.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800305 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700306 fColor = qe.color();
joshualitt9b989322014-12-15 14:16:27 -0800307 }
joshualittb8c241a2015-05-19 08:23:30 -0700308
309 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
310 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale()));
311 fCoverageScale = qe.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -0800312 }
bsalomona624bf32016-09-20 09:12:47 -0700313 this->setTransformDataHelper(qe.localMatrix(), pdman, &transformIter);
joshualitte3ababe2015-05-15 07:56:07 -0700314 }
315
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000316private:
joshualitt5559ca22015-05-21 15:50:36 -0700317 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800318 GrColor fColor;
319 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700320 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800321 UniformHandle fColorUniform;
322 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700323 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000324
egdaniele659a582015-11-13 09:55:43 -0800325 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000326};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000327
joshualitt465283c2015-09-11 08:19:35 -0700328GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -0700329 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800330 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000331 fEdgeType = ce.getEdgeType();
332}
333
robertphillips46d36f02015-01-18 08:14:14 -0800334void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800335 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800336 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800337 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800338 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800339
joshualittabb52a12015-01-13 15:02:10 -0800340 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800341 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800342
egdaniel8dcdedc2015-11-11 06:27:20 -0800343 GrGLSLVertToFrag v(kVec4f_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800344 varyingHandler->addVarying("HairQuadEdge", &v);
egdaniel4ca2e602015-11-18 08:01:26 -0800345 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000346
cdalton85285412016-02-18 12:37:07 -0800347 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800348 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700349 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -0800350 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700351 }
joshualitt9b989322014-12-15 14:16:27 -0800352
joshualittabb52a12015-01-13 15:02:10 -0800353 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -0800354 this->setupPosition(vertBuilder,
355 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800356 gpArgs,
357 gp.inPosition()->fName,
358 gp.viewMatrix(),
359 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800360
joshualittabb52a12015-01-13 15:02:10 -0800361 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800362 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800363 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800364 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800365 gpArgs->fPositionVar,
366 gp.inPosition()->fName,
367 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700368 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800369
egdaniel4ca2e602015-11-18 08:01:26 -0800370 fragBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700371
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000372 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700373 case kHairlineAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800374 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
375 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
376 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
377 " 2.0 * %s.x * duvdy.x - duvdy.y);",
378 v.fsIn(), v.fsIn());
379 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
380 v.fsIn(), v.fsIn(), v.fsIn());
381 fragBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
382 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000383 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800384 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000385 break;
386 }
joshualittb0a8a372014-09-23 09:50:21 -0700387 case kFillAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800388 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
389 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
390 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
391 " 2.0 * %s.x * duvdy.x - duvdy.y);",
392 v.fsIn(), v.fsIn());
393 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
394 v.fsIn(), v.fsIn(), v.fsIn());
395 fragBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
396 fragBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000397 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800398 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000399 break;
400 }
joshualittb0a8a372014-09-23 09:50:21 -0700401 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800402 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
403 v.fsIn(), v.fsIn(), v.fsIn());
404 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000405 break;
406 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000407 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000408 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000409 }
410
joshualittb8c241a2015-05-19 08:23:30 -0700411 if (0xff != gp.coverageScale()) {
joshualitt9b989322014-12-15 14:16:27 -0800412 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800413 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
414 kFloat_GrSLType,
415 kDefault_GrSLPrecision,
416 "Coverage",
417 &coverageScale);
egdaniel4ca2e602015-11-18 08:01:26 -0800418 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800419 } else {
egdaniel4ca2e602015-11-18 08:01:26 -0800420 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
joshualitt9b989322014-12-15 14:16:27 -0800421 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000422}
423
robertphillips46d36f02015-01-18 08:14:14 -0800424void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
jvanverthcfc18862015-04-28 08:48:20 -0700425 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700426 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800427 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700428 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700429 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0;
430 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
431 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700432 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700433 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000434}
435
436//////////////////////////////////////////////////////////////////////////////
437
438GrQuadEffect::~GrQuadEffect() {}
439
egdaniel57d3b032015-11-13 11:57:27 -0800440void GrQuadEffect::getGLSLProcessorKey(const GrGLSLCaps& caps,
441 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700442 GrGLQuadEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800443}
444
egdaniel57d3b032015-11-13 11:57:27 -0800445GrGLSLPrimitiveProcessor* GrQuadEffect::createGLSLInstance(const GrGLSLCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700446 return new GrGLQuadEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000447}
448
joshualitt8059eb92014-12-29 15:10:07 -0800449GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700450 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
451 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700452 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700453 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700454 , fLocalMatrix(localMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700455 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800456 , fCoverageScale(coverage)
457 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800458 this->initClassID<GrQuadEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700459 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
460 kHigh_GrSLPrecision);
461 fInHairQuadEdge = &this->addVertexAttrib("inHairQuadEdge", kVec4f_GrVertexAttribType);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000462}
463
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000464//////////////////////////////////////////////////////////////////////////////
465
joshualittb0a8a372014-09-23 09:50:21 -0700466GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000467
bungeman06ca8ec2016-06-09 08:01:03 -0700468sk_sp<GrGeometryProcessor> GrQuadEffect::TestCreate(GrProcessorTestData* d) {
469 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000470 do {
joshualittb0a8a372014-09-23 09:50:21 -0700471 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
joshualitt0067ff52015-07-08 14:26:19 -0700472 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
bungeman06ca8ec2016-06-09 08:01:03 -0700473 gp = GrQuadEffect::Make(GrRandomColor(d->fRandom),
474 GrTest::TestMatrix(d->fRandom),
475 edgeType, *d->fCaps,
476 GrTest::TestMatrix(d->fRandom),
477 d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700478 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700479 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000480}
481
482//////////////////////////////////////////////////////////////////////////////
483// Cubic
484//////////////////////////////////////////////////////////////////////////////
485
egdaniele659a582015-11-13 09:55:43 -0800486class GrGLCubicEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000487public:
joshualitt465283c2015-09-11 08:19:35 -0700488 GrGLCubicEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000489
mtklein36352bf2015-03-25 18:17:31 -0700490 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000491
joshualitt87f48d92014-12-04 10:41:40 -0800492 static inline void GenKey(const GrGeometryProcessor&,
jvanverthcfc18862015-04-28 08:48:20 -0700493 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800494 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000495
bsalomona624bf32016-09-20 09:12:47 -0700496 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
497 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700498 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700499
500 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
501 fViewMatrix = ce.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700502 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800503 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700504 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
505 }
joshualittee2af952014-12-30 09:04:15 -0800506
joshualittb8c241a2015-05-19 08:23:30 -0700507 if (ce.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700508 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700509 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800510 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700511 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -0800512 }
bsalomona624bf32016-09-20 09:12:47 -0700513 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
joshualitt9b989322014-12-15 14:16:27 -0800514 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000515
516private:
joshualitt5559ca22015-05-21 15:50:36 -0700517 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800518 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700519 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800520 UniformHandle fColorUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700521 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000522
egdaniele659a582015-11-13 09:55:43 -0800523 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000524};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000525
joshualitt465283c2015-09-11 08:19:35 -0700526GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -0700527 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700528 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000529 fEdgeType = ce.getEdgeType();
530}
531
robertphillips46d36f02015-01-18 08:14:14 -0800532void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800533 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800534 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800535 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800536 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800537
joshualittabb52a12015-01-13 15:02:10 -0800538 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800539 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800540
egdaniel8dcdedc2015-11-11 06:27:20 -0800541 GrGLSLVertToFrag v(kVec4f_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800542 varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
egdaniel4ca2e602015-11-18 08:01:26 -0800543 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
joshualitt2dd1ae02014-12-03 06:24:10 -0800544
cdalton85285412016-02-18 12:37:07 -0800545 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800546 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700547 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -0800548 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700549 }
joshualitt9b989322014-12-15 14:16:27 -0800550
joshualittabb52a12015-01-13 15:02:10 -0800551 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -0800552 this->setupPosition(vertBuilder,
553 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800554 gpArgs,
555 gp.inPosition()->fName,
556 gp.viewMatrix(),
joshualitt5559ca22015-05-21 15:50:36 -0700557 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800558
joshualittabb52a12015-01-13 15:02:10 -0800559 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800560 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800561 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800562 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800563 gpArgs->fPositionVar,
564 gp.inPosition()->fName,
bsalomona624bf32016-09-20 09:12:47 -0700565 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800566
egdaniel9bd5bbf2014-08-29 11:12:30 -0700567
Brian Salomon99938a82016-11-21 13:41:08 -0500568 GrShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
569 GrShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
570 GrShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
571 GrShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
572 GrShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
573 GrShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
574 GrShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
575 GrShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700576
egdaniel4ca2e602015-11-18 08:01:26 -0800577 fragBuilder->declAppend(edgeAlpha);
578 fragBuilder->declAppend(dklmdx);
579 fragBuilder->declAppend(dklmdy);
580 fragBuilder->declAppend(dfdx);
581 fragBuilder->declAppend(dfdy);
582 fragBuilder->declAppend(gF);
583 fragBuilder->declAppend(gFM);
584 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000585
586 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700587 case kHairlineAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800588 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
589 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
590 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
591 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
592 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
593 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
594 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
595 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
596 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
597 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
598 gFM.c_str(), gF.c_str(), gF.c_str());
599 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
600 func.c_str(), v.fsIn(), v.fsIn(),
601 v.fsIn(), v.fsIn(), v.fsIn());
602 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
603 fragBuilder->codeAppendf("%s = %s / %s;",
604 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
605 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
606 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000607 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800608 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700609 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
610 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000611 break;
612 }
joshualittb0a8a372014-09-23 09:50:21 -0700613 case kFillAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800614 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
615 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
616 fragBuilder->codeAppendf("%s ="
617 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
618 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
619 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
620 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
621 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
622 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
623 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
624 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
625 gFM.c_str(), gF.c_str(), gF.c_str());
626 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
robertphillips96afa522015-12-09 07:54:24 -0800627 func.c_str(),
628 v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel4ca2e602015-11-18 08:01:26 -0800629 fragBuilder->codeAppendf("%s = %s / %s;",
630 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
631 fragBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
632 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000633 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800634 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700635 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
636 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000637 break;
638 }
joshualittb0a8a372014-09-23 09:50:21 -0700639 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800640 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
641 edgeAlpha.c_str(), v.fsIn(), v.fsIn(),
642 v.fsIn(), v.fsIn(), v.fsIn());
643 fragBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000644 break;
645 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000646 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000647 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000648 }
649
joshualitt2dd1ae02014-12-03 06:24:10 -0800650
egdaniel4ca2e602015-11-18 08:01:26 -0800651 fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000652}
653
robertphillips46d36f02015-01-18 08:14:14 -0800654void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
jvanverthcfc18862015-04-28 08:48:20 -0700655 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700656 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800657 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700658 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700659 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8;
joshualitte578a952015-05-14 10:09:13 -0700660 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700661 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000662}
663
664//////////////////////////////////////////////////////////////////////////////
665
666GrCubicEffect::~GrCubicEffect() {}
667
egdaniel57d3b032015-11-13 11:57:27 -0800668void GrCubicEffect::getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700669 GrGLCubicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800670}
671
egdaniel57d3b032015-11-13 11:57:27 -0800672GrGLSLPrimitiveProcessor* GrCubicEffect::createGLSLInstance(const GrGLSLCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700673 return new GrGLCubicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000674}
675
joshualitt8059eb92014-12-29 15:10:07 -0800676GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
677 GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700678 : fColor(color)
679 , fViewMatrix(viewMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700680 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800681 this->initClassID<GrCubicEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700682 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
683 kHigh_GrSLPrecision);
684 fInCubicCoeffs = &this->addVertexAttrib("inCubicCoeffs", kVec4f_GrVertexAttribType);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000685}
686
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000687//////////////////////////////////////////////////////////////////////////////
688
joshualittb0a8a372014-09-23 09:50:21 -0700689GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000690
bungeman06ca8ec2016-06-09 08:01:03 -0700691sk_sp<GrGeometryProcessor> GrCubicEffect::TestCreate(GrProcessorTestData* d) {
692 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000693 do {
joshualitt0067ff52015-07-08 14:26:19 -0700694 GrPrimitiveEdgeType edgeType =
695 static_cast<GrPrimitiveEdgeType>(
696 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
bungeman06ca8ec2016-06-09 08:01:03 -0700697 gp = GrCubicEffect::Make(GrRandomColor(d->fRandom),
698 GrTest::TestMatrix(d->fRandom), edgeType, *d->fCaps);
halcanary96fcdcc2015-08-27 07:41:13 -0700699 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700700 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000701}