blob: 4877072210a097bb9b442faad6c4290a491d6065 [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"
Brian Salomon9ae32a22017-01-25 14:58:24 -05009#include "GrContext.h"
Brian Salomon94efbf52016-11-29 13:43:05 -050010#include "GrShaderCaps.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&,
Brian Salomon94efbf52016-11-29 13:43:05 -050026 const GrShaderCaps&,
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
Brian Salomonbfd51832017-01-04 13:22:08 -050087 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualitt9b989322014-12-15 14:16:27 -080088
joshualittabb52a12015-01-13 15:02:10 -080089 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -080090 this->setupPosition(vertBuilder,
91 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -080092 gpArgs,
93 gp.inPosition()->fName,
94 gp.viewMatrix(),
95 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -080096
joshualittabb52a12015-01-13 15:02:10 -080097 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -080098 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -080099 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800100 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800101 gpArgs->fPositionVar,
102 gp.inPosition()->fName,
103 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700104 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800105
robertphillips2eb10092015-12-11 04:59:36 -0800106 // TODO: this precision check should actually be a check on the number of bits
107 // high and medium provide and the selection of the lowest level that suffices.
108 // Additionally we should assert that the upstream code only lets us get here if
109 // either high or medium provides the required number of bits.
110 GrSLPrecision precision = kHigh_GrSLPrecision;
Brian Salomon1edc5b92016-11-29 13:43:46 -0500111 const GrShaderCaps::PrecisionInfo& highP = args.fShaderCaps->getFloatShaderPrecisionInfo(
robertphillips2eb10092015-12-11 04:59:36 -0800112 kFragment_GrShaderType,
113 kHigh_GrSLPrecision);
114 if (!highP.supported()) {
115 precision = kMedium_GrSLPrecision;
116 }
117
Brian Salomon99938a82016-11-21 13:41:08 -0500118 GrShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, precision);
119 GrShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, precision);
120 GrShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, precision);
121 GrShaderVar dfdx("dfdx", kFloat_GrSLType, 0, precision);
122 GrShaderVar dfdy("dfdy", kFloat_GrSLType, 0, precision);
123 GrShaderVar gF("gF", kVec2f_GrSLType, 0, precision);
124 GrShaderVar gFM("gFM", kFloat_GrSLType, 0, precision);
125 GrShaderVar func("func", kFloat_GrSLType, 0, precision);
robertphillips96afa522015-12-09 07:54:24 -0800126
127 fragBuilder->declAppend(edgeAlpha);
128 fragBuilder->declAppend(dklmdx);
129 fragBuilder->declAppend(dklmdy);
130 fragBuilder->declAppend(dfdx);
131 fragBuilder->declAppend(dfdy);
132 fragBuilder->declAppend(gF);
133 fragBuilder->declAppend(gFM);
134 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000135
136 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700137 case kHairlineAA_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800138 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
139 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
140 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
141 dfdx.c_str(),
142 v.fsIn(), dklmdx.c_str(),
143 v.fsIn(), dklmdx.c_str(),
144 v.fsIn(), dklmdx.c_str());
145 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
146 dfdy.c_str(),
147 v.fsIn(), dklmdy.c_str(),
148 v.fsIn(), dklmdy.c_str(),
149 v.fsIn(), dklmdy.c_str());
150 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
151 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
152 gFM.c_str(), gF.c_str(), gF.c_str());
153 fragBuilder->codeAppendf("%s = %s.x*%s.x - %s.y*%s.z;",
154 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
155 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
156 fragBuilder->codeAppendf("%s = %s / %s;",
157 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
158 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
159 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000160 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800161 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000162 break;
163 }
joshualittb0a8a372014-09-23 09:50:21 -0700164 case kFillAA_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800165 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
166 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
167 fragBuilder->codeAppendf("%s ="
168 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
169 dfdx.c_str(),
170 v.fsIn(), dklmdx.c_str(),
171 v.fsIn(), dklmdx.c_str(),
172 v.fsIn(), dklmdx.c_str());
173 fragBuilder->codeAppendf("%s ="
174 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
175 dfdy.c_str(),
176 v.fsIn(), dklmdy.c_str(),
177 v.fsIn(), dklmdy.c_str(),
178 v.fsIn(), dklmdy.c_str());
179 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
180 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
181 gFM.c_str(), gF.c_str(), gF.c_str());
182 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
183 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
184 fragBuilder->codeAppendf("%s = %s / %s;",
185 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
186 fragBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
187 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000188 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800189 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000190 break;
191 }
joshualittb0a8a372014-09-23 09:50:21 -0700192 case kFillBW_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800193 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
194 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
195 fragBuilder->codeAppendf("%s = float(%s < 0.0);",
196 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000197 break;
198 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000199 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000200 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000201 }
202
joshualittb8c241a2015-05-19 08:23:30 -0700203 // TODO should we really be doing this?
204 if (gp.coverageScale() != 0xff) {
joshualitt9b989322014-12-15 14:16:27 -0800205 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800206 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
207 kFloat_GrSLType,
208 kHigh_GrSLPrecision,
209 "Coverage",
210 &coverageScale);
robertphillips96afa522015-12-09 07:54:24 -0800211 fragBuilder->codeAppendf("%s = vec4(%s * %s);",
212 args.fOutputCoverage, coverageScale, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800213 } else {
robertphillips96afa522015-12-09 07:54:24 -0800214 fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800215 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000216}
217
robertphillips46d36f02015-01-18 08:14:14 -0800218void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500219 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700220 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800221 const GrConicEffect& ce = gp.cast<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700222 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700223 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0;
224 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700225 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700226 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000227}
228
229//////////////////////////////////////////////////////////////////////////////
230
231GrConicEffect::~GrConicEffect() {}
232
Brian Salomon94efbf52016-11-29 13:43:05 -0500233void GrConicEffect::getGLSLProcessorKey(const GrShaderCaps& caps,
egdaniel57d3b032015-11-13 11:57:27 -0800234 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700235 GrGLConicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800236}
237
Brian Salomon94efbf52016-11-29 13:43:05 -0500238GrGLSLPrimitiveProcessor* GrConicEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700239 return new GrGLConicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000240}
241
joshualitt8059eb92014-12-29 15:10:07 -0800242GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700243 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
244 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700245 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700246 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700247 , fLocalMatrix(viewMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700248 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800249 , fCoverageScale(coverage)
250 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800251 this->initClassID<GrConicEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700252 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
253 kHigh_GrSLPrecision);
254 fInConicCoeffs = &this->addVertexAttrib("inConicCoeffs", kVec4f_GrVertexAttribType);
joshualitt9b989322014-12-15 14:16:27 -0800255}
256
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000257//////////////////////////////////////////////////////////////////////////////
258
joshualittb0a8a372014-09-23 09:50:21 -0700259GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000260
Hal Canary6f6961e2017-01-31 13:50:44 -0500261#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700262sk_sp<GrGeometryProcessor> GrConicEffect::TestCreate(GrProcessorTestData* d) {
263 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000264 do {
joshualitt0067ff52015-07-08 14:26:19 -0700265 GrPrimitiveEdgeType edgeType =
266 static_cast<GrPrimitiveEdgeType>(
267 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
bungeman06ca8ec2016-06-09 08:01:03 -0700268 gp = GrConicEffect::Make(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom),
Brian Salomon9ae32a22017-01-25 14:58:24 -0500269 edgeType, *d->fContext->caps(), GrTest::TestMatrix(d->fRandom),
270 d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700271 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700272 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000273}
Hal Canary6f6961e2017-01-31 13:50:44 -0500274#endif
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000275
276//////////////////////////////////////////////////////////////////////////////
277// Quad
278//////////////////////////////////////////////////////////////////////////////
279
egdaniele659a582015-11-13 09:55:43 -0800280class GrGLQuadEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000281public:
joshualitt465283c2015-09-11 08:19:35 -0700282 GrGLQuadEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000283
mtklein36352bf2015-03-25 18:17:31 -0700284 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000285
joshualitt87f48d92014-12-04 10:41:40 -0800286 static inline void GenKey(const GrGeometryProcessor&,
Brian Salomon94efbf52016-11-29 13:43:05 -0500287 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800288 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000289
bsalomona624bf32016-09-20 09:12:47 -0700290 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
291 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700292 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700293
294 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMatrix())) {
295 fViewMatrix = qe.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700296 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800297 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700298 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
299 }
joshualittee2af952014-12-30 09:04:15 -0800300
joshualittb8c241a2015-05-19 08:23:30 -0700301 if (qe.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700302 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700303 GrColorToRGBAFloat(qe.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800304 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700305 fColor = qe.color();
joshualitt9b989322014-12-15 14:16:27 -0800306 }
joshualittb8c241a2015-05-19 08:23:30 -0700307
308 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
309 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale()));
310 fCoverageScale = qe.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -0800311 }
bsalomona624bf32016-09-20 09:12:47 -0700312 this->setTransformDataHelper(qe.localMatrix(), pdman, &transformIter);
joshualitte3ababe2015-05-15 07:56:07 -0700313 }
314
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000315private:
joshualitt5559ca22015-05-21 15:50:36 -0700316 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800317 GrColor fColor;
318 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700319 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800320 UniformHandle fColorUniform;
321 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700322 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000323
egdaniele659a582015-11-13 09:55:43 -0800324 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000325};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000326
joshualitt465283c2015-09-11 08:19:35 -0700327GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -0700328 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800329 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000330 fEdgeType = ce.getEdgeType();
331}
332
robertphillips46d36f02015-01-18 08:14:14 -0800333void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800334 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800335 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800336 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800337 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800338
joshualittabb52a12015-01-13 15:02:10 -0800339 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800340 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800341
egdaniel8dcdedc2015-11-11 06:27:20 -0800342 GrGLSLVertToFrag v(kVec4f_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800343 varyingHandler->addVarying("HairQuadEdge", &v);
egdaniel4ca2e602015-11-18 08:01:26 -0800344 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000345
cdalton85285412016-02-18 12:37:07 -0800346 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800347 // Setup pass through color
Brian Salomonbfd51832017-01-04 13:22:08 -0500348 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualitt9b989322014-12-15 14:16:27 -0800349
joshualittabb52a12015-01-13 15:02:10 -0800350 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -0800351 this->setupPosition(vertBuilder,
352 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800353 gpArgs,
354 gp.inPosition()->fName,
355 gp.viewMatrix(),
356 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800357
joshualittabb52a12015-01-13 15:02:10 -0800358 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800359 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800360 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800361 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800362 gpArgs->fPositionVar,
363 gp.inPosition()->fName,
364 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700365 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800366
egdaniel4ca2e602015-11-18 08:01:26 -0800367 fragBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700368
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000369 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700370 case kHairlineAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800371 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
372 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
373 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
374 " 2.0 * %s.x * duvdy.x - duvdy.y);",
375 v.fsIn(), v.fsIn());
376 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
377 v.fsIn(), v.fsIn(), v.fsIn());
378 fragBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
379 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000380 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800381 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000382 break;
383 }
joshualittb0a8a372014-09-23 09:50:21 -0700384 case kFillAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800385 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
386 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
387 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
388 " 2.0 * %s.x * duvdy.x - duvdy.y);",
389 v.fsIn(), v.fsIn());
390 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
391 v.fsIn(), v.fsIn(), v.fsIn());
392 fragBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
393 fragBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000394 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800395 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000396 break;
397 }
joshualittb0a8a372014-09-23 09:50:21 -0700398 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800399 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
400 v.fsIn(), v.fsIn(), v.fsIn());
401 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000402 break;
403 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000404 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000405 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000406 }
407
joshualittb8c241a2015-05-19 08:23:30 -0700408 if (0xff != gp.coverageScale()) {
joshualitt9b989322014-12-15 14:16:27 -0800409 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800410 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
411 kFloat_GrSLType,
412 kDefault_GrSLPrecision,
413 "Coverage",
414 &coverageScale);
egdaniel4ca2e602015-11-18 08:01:26 -0800415 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800416 } else {
egdaniel4ca2e602015-11-18 08:01:26 -0800417 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
joshualitt9b989322014-12-15 14:16:27 -0800418 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000419}
420
robertphillips46d36f02015-01-18 08:14:14 -0800421void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500422 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700423 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800424 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700425 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700426 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
427 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700428 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700429 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000430}
431
432//////////////////////////////////////////////////////////////////////////////
433
434GrQuadEffect::~GrQuadEffect() {}
435
Brian Salomon94efbf52016-11-29 13:43:05 -0500436void GrQuadEffect::getGLSLProcessorKey(const GrShaderCaps& caps,
egdaniel57d3b032015-11-13 11:57:27 -0800437 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700438 GrGLQuadEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800439}
440
Brian Salomon94efbf52016-11-29 13:43:05 -0500441GrGLSLPrimitiveProcessor* GrQuadEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700442 return new GrGLQuadEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000443}
444
joshualitt8059eb92014-12-29 15:10:07 -0800445GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700446 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
447 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700448 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700449 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700450 , fLocalMatrix(localMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700451 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800452 , fCoverageScale(coverage)
453 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800454 this->initClassID<GrQuadEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700455 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
456 kHigh_GrSLPrecision);
457 fInHairQuadEdge = &this->addVertexAttrib("inHairQuadEdge", kVec4f_GrVertexAttribType);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000458}
459
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000460//////////////////////////////////////////////////////////////////////////////
461
joshualittb0a8a372014-09-23 09:50:21 -0700462GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000463
Hal Canary6f6961e2017-01-31 13:50:44 -0500464#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700465sk_sp<GrGeometryProcessor> GrQuadEffect::TestCreate(GrProcessorTestData* d) {
466 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000467 do {
joshualittb0a8a372014-09-23 09:50:21 -0700468 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
joshualitt0067ff52015-07-08 14:26:19 -0700469 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
Brian Salomon9ae32a22017-01-25 14:58:24 -0500470 gp = GrQuadEffect::Make(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom), edgeType,
471 *d->fContext->caps(), GrTest::TestMatrix(d->fRandom),
bungeman06ca8ec2016-06-09 08:01:03 -0700472 d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700473 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700474 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000475}
Hal Canary6f6961e2017-01-31 13:50:44 -0500476#endif
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000477
478//////////////////////////////////////////////////////////////////////////////
479// Cubic
480//////////////////////////////////////////////////////////////////////////////
481
egdaniele659a582015-11-13 09:55:43 -0800482class GrGLCubicEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000483public:
joshualitt465283c2015-09-11 08:19:35 -0700484 GrGLCubicEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000485
mtklein36352bf2015-03-25 18:17:31 -0700486 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000487
joshualitt87f48d92014-12-04 10:41:40 -0800488 static inline void GenKey(const GrGeometryProcessor&,
Brian Salomon94efbf52016-11-29 13:43:05 -0500489 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800490 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000491
bsalomona624bf32016-09-20 09:12:47 -0700492 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
493 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700494 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700495
496 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
497 fViewMatrix = ce.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700498 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800499 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700500 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
501 }
joshualittee2af952014-12-30 09:04:15 -0800502
joshualittb8c241a2015-05-19 08:23:30 -0700503 if (ce.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700504 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700505 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800506 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700507 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -0800508 }
bsalomona624bf32016-09-20 09:12:47 -0700509 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
joshualitt9b989322014-12-15 14:16:27 -0800510 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000511
512private:
joshualitt5559ca22015-05-21 15:50:36 -0700513 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800514 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700515 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800516 UniformHandle fColorUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700517 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000518
egdaniele659a582015-11-13 09:55:43 -0800519 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000520};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000521
joshualitt465283c2015-09-11 08:19:35 -0700522GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -0700523 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700524 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000525 fEdgeType = ce.getEdgeType();
526}
527
robertphillips46d36f02015-01-18 08:14:14 -0800528void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800529 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800530 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800531 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800532 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800533
joshualittabb52a12015-01-13 15:02:10 -0800534 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800535 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800536
egdaniel8dcdedc2015-11-11 06:27:20 -0800537 GrGLSLVertToFrag v(kVec4f_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800538 varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
egdaniel4ca2e602015-11-18 08:01:26 -0800539 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
joshualitt2dd1ae02014-12-03 06:24:10 -0800540
cdalton85285412016-02-18 12:37:07 -0800541 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800542 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700543 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -0800544 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700545 }
joshualitt9b989322014-12-15 14:16:27 -0800546
joshualittabb52a12015-01-13 15:02:10 -0800547 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -0800548 this->setupPosition(vertBuilder,
549 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800550 gpArgs,
551 gp.inPosition()->fName,
552 gp.viewMatrix(),
joshualitt5559ca22015-05-21 15:50:36 -0700553 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800554
joshualittabb52a12015-01-13 15:02:10 -0800555 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800556 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800557 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800558 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800559 gpArgs->fPositionVar,
560 gp.inPosition()->fName,
bsalomona624bf32016-09-20 09:12:47 -0700561 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800562
egdaniel9bd5bbf2014-08-29 11:12:30 -0700563
Brian Salomon99938a82016-11-21 13:41:08 -0500564 GrShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
565 GrShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
566 GrShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
567 GrShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
568 GrShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
569 GrShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
570 GrShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
571 GrShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700572
egdaniel4ca2e602015-11-18 08:01:26 -0800573 fragBuilder->declAppend(edgeAlpha);
574 fragBuilder->declAppend(dklmdx);
575 fragBuilder->declAppend(dklmdy);
576 fragBuilder->declAppend(dfdx);
577 fragBuilder->declAppend(dfdy);
578 fragBuilder->declAppend(gF);
579 fragBuilder->declAppend(gFM);
580 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000581
582 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700583 case kHairlineAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800584 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
585 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
586 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
587 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
588 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
589 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
590 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
591 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
592 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
593 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
594 gFM.c_str(), gF.c_str(), gF.c_str());
595 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
596 func.c_str(), v.fsIn(), v.fsIn(),
597 v.fsIn(), v.fsIn(), v.fsIn());
598 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
599 fragBuilder->codeAppendf("%s = %s / %s;",
600 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
601 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
602 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000603 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800604 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700605 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
606 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000607 break;
608 }
joshualittb0a8a372014-09-23 09:50:21 -0700609 case kFillAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800610 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
611 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
612 fragBuilder->codeAppendf("%s ="
613 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
614 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
615 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
616 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
617 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
618 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
619 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
620 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
621 gFM.c_str(), gF.c_str(), gF.c_str());
622 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
robertphillips96afa522015-12-09 07:54:24 -0800623 func.c_str(),
624 v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel4ca2e602015-11-18 08:01:26 -0800625 fragBuilder->codeAppendf("%s = %s / %s;",
626 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
627 fragBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
628 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000629 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800630 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700631 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
632 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000633 break;
634 }
joshualittb0a8a372014-09-23 09:50:21 -0700635 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800636 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
637 edgeAlpha.c_str(), v.fsIn(), v.fsIn(),
638 v.fsIn(), v.fsIn(), v.fsIn());
639 fragBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000640 break;
641 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000642 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000643 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000644 }
645
joshualitt2dd1ae02014-12-03 06:24:10 -0800646
egdaniel4ca2e602015-11-18 08:01:26 -0800647 fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000648}
649
robertphillips46d36f02015-01-18 08:14:14 -0800650void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500651 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700652 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800653 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700654 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitte578a952015-05-14 10:09:13 -0700655 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700656 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000657}
658
659//////////////////////////////////////////////////////////////////////////////
660
661GrCubicEffect::~GrCubicEffect() {}
662
Brian Salomon94efbf52016-11-29 13:43:05 -0500663void GrCubicEffect::getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700664 GrGLCubicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800665}
666
Brian Salomon94efbf52016-11-29 13:43:05 -0500667GrGLSLPrimitiveProcessor* GrCubicEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700668 return new GrGLCubicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000669}
670
joshualitt8059eb92014-12-29 15:10:07 -0800671GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
672 GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700673 : fColor(color)
674 , fViewMatrix(viewMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700675 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800676 this->initClassID<GrCubicEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700677 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
678 kHigh_GrSLPrecision);
679 fInCubicCoeffs = &this->addVertexAttrib("inCubicCoeffs", kVec4f_GrVertexAttribType);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000680}
681
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000682//////////////////////////////////////////////////////////////////////////////
683
joshualittb0a8a372014-09-23 09:50:21 -0700684GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000685
Hal Canary6f6961e2017-01-31 13:50:44 -0500686#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700687sk_sp<GrGeometryProcessor> GrCubicEffect::TestCreate(GrProcessorTestData* d) {
688 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000689 do {
joshualitt0067ff52015-07-08 14:26:19 -0700690 GrPrimitiveEdgeType edgeType =
691 static_cast<GrPrimitiveEdgeType>(
692 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
Brian Salomon9ae32a22017-01-25 14:58:24 -0500693 gp = GrCubicEffect::Make(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom),
694 edgeType, *d->fContext->caps());
halcanary96fcdcc2015-08-27 07:41:13 -0700695 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700696 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000697}
Hal Canary6f6961e2017-01-31 13:50:44 -0500698#endif