blob: ae1a8d361d0cba7dc9a8203df52625ef26ec8833 [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);
robertphillips96afa522015-12-09 07:54:24 -080087 varyingHandler->addVarying("ConicCoeffs", &v, kHigh_GrSLPrecision);
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
cdalton85285412016-02-18 12:37:07 -080090 GrGLSLPPFragmentBuilder* 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
robertphillips2eb10092015-12-11 04:59:36 -0800114 // TODO: this precision check should actually be a check on the number of bits
115 // high and medium provide and the selection of the lowest level that suffices.
116 // Additionally we should assert that the upstream code only lets us get here if
117 // either high or medium provides the required number of bits.
118 GrSLPrecision precision = kHigh_GrSLPrecision;
119 const GrShaderCaps::PrecisionInfo& highP = args.fGLSLCaps->getFloatShaderPrecisionInfo(
120 kFragment_GrShaderType,
121 kHigh_GrSLPrecision);
122 if (!highP.supported()) {
123 precision = kMedium_GrSLPrecision;
124 }
125
126 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, precision);
127 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, precision);
128 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, precision);
129 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, precision);
130 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, precision);
131 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, precision);
132 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, precision);
133 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, precision);
robertphillips96afa522015-12-09 07:54:24 -0800134
135 fragBuilder->declAppend(edgeAlpha);
136 fragBuilder->declAppend(dklmdx);
137 fragBuilder->declAppend(dklmdy);
138 fragBuilder->declAppend(dfdx);
139 fragBuilder->declAppend(dfdy);
140 fragBuilder->declAppend(gF);
141 fragBuilder->declAppend(gFM);
142 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000143
144 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700145 case kHairlineAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800146 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800147 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
robertphillips96afa522015-12-09 07:54:24 -0800148 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
149 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
150 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
151 dfdx.c_str(),
152 v.fsIn(), dklmdx.c_str(),
153 v.fsIn(), dklmdx.c_str(),
154 v.fsIn(), dklmdx.c_str());
155 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
156 dfdy.c_str(),
157 v.fsIn(), dklmdy.c_str(),
158 v.fsIn(), dklmdy.c_str(),
159 v.fsIn(), dklmdy.c_str());
160 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
161 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
162 gFM.c_str(), gF.c_str(), gF.c_str());
163 fragBuilder->codeAppendf("%s = %s.x*%s.x - %s.y*%s.z;",
164 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
165 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
166 fragBuilder->codeAppendf("%s = %s / %s;",
167 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
168 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
169 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000170 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800171 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000172 break;
173 }
joshualittb0a8a372014-09-23 09:50:21 -0700174 case kFillAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800175 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800176 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
robertphillips96afa522015-12-09 07:54:24 -0800177 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
178 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
179 fragBuilder->codeAppendf("%s ="
180 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
181 dfdx.c_str(),
182 v.fsIn(), dklmdx.c_str(),
183 v.fsIn(), dklmdx.c_str(),
184 v.fsIn(), dklmdx.c_str());
185 fragBuilder->codeAppendf("%s ="
186 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
187 dfdy.c_str(),
188 v.fsIn(), dklmdy.c_str(),
189 v.fsIn(), dklmdy.c_str(),
190 v.fsIn(), dklmdy.c_str());
191 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
192 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
193 gFM.c_str(), gF.c_str(), gF.c_str());
194 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
195 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
196 fragBuilder->codeAppendf("%s = %s / %s;",
197 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
198 fragBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
199 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000200 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800201 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000202 break;
203 }
joshualittb0a8a372014-09-23 09:50:21 -0700204 case kFillBW_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800205 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
206 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
207 fragBuilder->codeAppendf("%s = float(%s < 0.0);",
208 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000209 break;
210 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000211 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000212 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000213 }
214
joshualittb8c241a2015-05-19 08:23:30 -0700215 // TODO should we really be doing this?
216 if (gp.coverageScale() != 0xff) {
joshualitt9b989322014-12-15 14:16:27 -0800217 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800218 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
219 kFloat_GrSLType,
220 kHigh_GrSLPrecision,
221 "Coverage",
222 &coverageScale);
robertphillips96afa522015-12-09 07:54:24 -0800223 fragBuilder->codeAppendf("%s = vec4(%s * %s);",
224 args.fOutputCoverage, coverageScale, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800225 } else {
robertphillips96afa522015-12-09 07:54:24 -0800226 fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800227 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000228}
229
robertphillips46d36f02015-01-18 08:14:14 -0800230void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
jvanverthcfc18862015-04-28 08:48:20 -0700231 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700232 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800233 const GrConicEffect& ce = gp.cast<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700234 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700235 key |= GrColor_ILLEGAL != ce.color() ? 0x4 : 0x0;
236 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0;
237 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700238 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700239 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000240}
241
242//////////////////////////////////////////////////////////////////////////////
243
244GrConicEffect::~GrConicEffect() {}
245
egdaniel57d3b032015-11-13 11:57:27 -0800246void GrConicEffect::getGLSLProcessorKey(const GrGLSLCaps& caps,
247 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700248 GrGLConicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800249}
250
egdaniel57d3b032015-11-13 11:57:27 -0800251GrGLSLPrimitiveProcessor* GrConicEffect::createGLSLInstance(const GrGLSLCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700252 return new GrGLConicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000253}
254
joshualitt8059eb92014-12-29 15:10:07 -0800255GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700256 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
257 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700258 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700259 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700260 , fLocalMatrix(viewMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700261 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800262 , fCoverageScale(coverage)
263 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800264 this->initClassID<GrConicEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700265 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
266 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800267 fInConicCoeffs = &this->addVertexAttrib(Attribute("inConicCoeffs",
joshualittb8c241a2015-05-19 08:23:30 -0700268 kVec4f_GrVertexAttribType));
joshualitt9b989322014-12-15 14:16:27 -0800269}
270
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000271//////////////////////////////////////////////////////////////////////////////
272
joshualittb0a8a372014-09-23 09:50:21 -0700273GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000274
bsalomonc21b09e2015-08-28 18:46:56 -0700275const GrGeometryProcessor* GrConicEffect::TestCreate(GrProcessorTestData* d) {
joshualittb0a8a372014-09-23 09:50:21 -0700276 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000277 do {
joshualitt0067ff52015-07-08 14:26:19 -0700278 GrPrimitiveEdgeType edgeType =
279 static_cast<GrPrimitiveEdgeType>(
280 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
281 gp = GrConicEffect::Create(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom),
282 edgeType, *d->fCaps,
283 GrTest::TestMatrix(d->fRandom), d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700284 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700285 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000286}
287
288//////////////////////////////////////////////////////////////////////////////
289// Quad
290//////////////////////////////////////////////////////////////////////////////
291
egdaniele659a582015-11-13 09:55:43 -0800292class GrGLQuadEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000293public:
joshualitt465283c2015-09-11 08:19:35 -0700294 GrGLQuadEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000295
mtklein36352bf2015-03-25 18:17:31 -0700296 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000297
joshualitt87f48d92014-12-04 10:41:40 -0800298 static inline void GenKey(const GrGeometryProcessor&,
jvanverthcfc18862015-04-28 08:48:20 -0700299 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800300 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000301
egdaniel018fb622015-10-28 07:26:40 -0700302 void setData(const GrGLSLProgramDataManager& pdman,
joshualitt465283c2015-09-11 08:19:35 -0700303 const GrPrimitiveProcessor& primProc) override {
joshualitte578a952015-05-14 10:09:13 -0700304 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700305
306 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMatrix())) {
307 fViewMatrix = qe.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700308 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800309 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700310 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
311 }
joshualittee2af952014-12-30 09:04:15 -0800312
joshualittb8c241a2015-05-19 08:23:30 -0700313 if (qe.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700314 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700315 GrColorToRGBAFloat(qe.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800316 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700317 fColor = qe.color();
joshualitt9b989322014-12-15 14:16:27 -0800318 }
joshualittb8c241a2015-05-19 08:23:30 -0700319
320 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
321 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale()));
322 fCoverageScale = qe.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -0800323 }
324 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000325
joshualitte3ababe2015-05-15 07:56:07 -0700326 void setTransformData(const GrPrimitiveProcessor& primProc,
egdaniel018fb622015-10-28 07:26:40 -0700327 const GrGLSLProgramDataManager& pdman,
joshualitte3ababe2015-05-15 07:56:07 -0700328 int index,
329 const SkTArray<const GrCoordTransform*, true>& transforms) override {
330 this->setTransformDataHelper<GrQuadEffect>(primProc, pdman, index, transforms);
331 }
332
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000333private:
joshualitt5559ca22015-05-21 15:50:36 -0700334 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800335 GrColor fColor;
336 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700337 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800338 UniformHandle fColorUniform;
339 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700340 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000341
egdaniele659a582015-11-13 09:55:43 -0800342 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000343};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000344
joshualitt465283c2015-09-11 08:19:35 -0700345GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -0700346 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800347 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000348 fEdgeType = ce.getEdgeType();
349}
350
robertphillips46d36f02015-01-18 08:14:14 -0800351void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800352 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800353 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800354 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800355 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800356
joshualittabb52a12015-01-13 15:02:10 -0800357 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800358 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800359
egdaniel8dcdedc2015-11-11 06:27:20 -0800360 GrGLSLVertToFrag v(kVec4f_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800361 varyingHandler->addVarying("HairQuadEdge", &v);
egdaniel4ca2e602015-11-18 08:01:26 -0800362 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000363
cdalton85285412016-02-18 12:37:07 -0800364 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800365 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700366 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -0800367 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700368 }
joshualitt9b989322014-12-15 14:16:27 -0800369
joshualittabb52a12015-01-13 15:02:10 -0800370 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -0800371 this->setupPosition(vertBuilder,
372 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800373 gpArgs,
374 gp.inPosition()->fName,
375 gp.viewMatrix(),
376 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800377
joshualittabb52a12015-01-13 15:02:10 -0800378 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800379 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800380 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800381 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800382 gpArgs->fPositionVar,
383 gp.inPosition()->fName,
384 gp.localMatrix(),
385 args.fTransformsIn,
386 args.fTransformsOut);
joshualittabb52a12015-01-13 15:02:10 -0800387
egdaniel4ca2e602015-11-18 08:01:26 -0800388 fragBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700389
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000390 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700391 case kHairlineAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800392 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800393 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdaniel4ca2e602015-11-18 08:01:26 -0800394 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
395 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
396 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
397 " 2.0 * %s.x * duvdy.x - duvdy.y);",
398 v.fsIn(), v.fsIn());
399 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
400 v.fsIn(), v.fsIn(), v.fsIn());
401 fragBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
402 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000403 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800404 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000405 break;
406 }
joshualittb0a8a372014-09-23 09:50:21 -0700407 case kFillAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800408 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800409 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdaniel4ca2e602015-11-18 08:01:26 -0800410 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
411 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
412 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
413 " 2.0 * %s.x * duvdy.x - duvdy.y);",
414 v.fsIn(), v.fsIn());
415 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
416 v.fsIn(), v.fsIn(), v.fsIn());
417 fragBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
418 fragBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000419 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800420 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000421 break;
422 }
joshualittb0a8a372014-09-23 09:50:21 -0700423 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800424 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
425 v.fsIn(), v.fsIn(), v.fsIn());
426 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000427 break;
428 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000429 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000430 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000431 }
432
joshualittb8c241a2015-05-19 08:23:30 -0700433 if (0xff != gp.coverageScale()) {
joshualitt9b989322014-12-15 14:16:27 -0800434 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800435 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
436 kFloat_GrSLType,
437 kDefault_GrSLPrecision,
438 "Coverage",
439 &coverageScale);
egdaniel4ca2e602015-11-18 08:01:26 -0800440 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800441 } else {
egdaniel4ca2e602015-11-18 08:01:26 -0800442 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
joshualitt9b989322014-12-15 14:16:27 -0800443 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000444}
445
robertphillips46d36f02015-01-18 08:14:14 -0800446void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
jvanverthcfc18862015-04-28 08:48:20 -0700447 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700448 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800449 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700450 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700451 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0;
452 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
453 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700454 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700455 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000456}
457
458//////////////////////////////////////////////////////////////////////////////
459
460GrQuadEffect::~GrQuadEffect() {}
461
egdaniel57d3b032015-11-13 11:57:27 -0800462void GrQuadEffect::getGLSLProcessorKey(const GrGLSLCaps& caps,
463 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700464 GrGLQuadEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800465}
466
egdaniel57d3b032015-11-13 11:57:27 -0800467GrGLSLPrimitiveProcessor* GrQuadEffect::createGLSLInstance(const GrGLSLCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700468 return new GrGLQuadEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000469}
470
joshualitt8059eb92014-12-29 15:10:07 -0800471GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700472 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
473 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700474 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700475 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700476 , fLocalMatrix(localMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700477 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800478 , fCoverageScale(coverage)
479 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800480 this->initClassID<GrQuadEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700481 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
482 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800483 fInHairQuadEdge = &this->addVertexAttrib(Attribute("inHairQuadEdge",
joshualitt2dd1ae02014-12-03 06:24:10 -0800484 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000485}
486
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000487//////////////////////////////////////////////////////////////////////////////
488
joshualittb0a8a372014-09-23 09:50:21 -0700489GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000490
bsalomonc21b09e2015-08-28 18:46:56 -0700491const GrGeometryProcessor* GrQuadEffect::TestCreate(GrProcessorTestData* d) {
joshualittb0a8a372014-09-23 09:50:21 -0700492 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000493 do {
joshualittb0a8a372014-09-23 09:50:21 -0700494 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
joshualitt0067ff52015-07-08 14:26:19 -0700495 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
496 gp = GrQuadEffect::Create(GrRandomColor(d->fRandom),
497 GrTest::TestMatrix(d->fRandom),
498 edgeType, *d->fCaps,
499 GrTest::TestMatrix(d->fRandom),
500 d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700501 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700502 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000503}
504
505//////////////////////////////////////////////////////////////////////////////
506// Cubic
507//////////////////////////////////////////////////////////////////////////////
508
egdaniele659a582015-11-13 09:55:43 -0800509class GrGLCubicEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000510public:
joshualitt465283c2015-09-11 08:19:35 -0700511 GrGLCubicEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000512
mtklein36352bf2015-03-25 18:17:31 -0700513 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000514
joshualitt87f48d92014-12-04 10:41:40 -0800515 static inline void GenKey(const GrGeometryProcessor&,
jvanverthcfc18862015-04-28 08:48:20 -0700516 const GrGLSLCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800517 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000518
egdaniel018fb622015-10-28 07:26:40 -0700519 void setData(const GrGLSLProgramDataManager& pdman,
joshualitt465283c2015-09-11 08:19:35 -0700520 const GrPrimitiveProcessor& primProc) override {
joshualitte578a952015-05-14 10:09:13 -0700521 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700522
523 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
524 fViewMatrix = ce.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700525 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800526 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700527 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
528 }
joshualittee2af952014-12-30 09:04:15 -0800529
joshualittb8c241a2015-05-19 08:23:30 -0700530 if (ce.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700531 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700532 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800533 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700534 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -0800535 }
536 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000537
538private:
joshualitt5559ca22015-05-21 15:50:36 -0700539 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800540 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700541 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800542 UniformHandle fColorUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700543 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000544
egdaniele659a582015-11-13 09:55:43 -0800545 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000546};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000547
joshualitt465283c2015-09-11 08:19:35 -0700548GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -0700549 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700550 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000551 fEdgeType = ce.getEdgeType();
552}
553
robertphillips46d36f02015-01-18 08:14:14 -0800554void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800555 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800556 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800557 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800558 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800559
joshualittabb52a12015-01-13 15:02:10 -0800560 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800561 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800562
egdaniel8dcdedc2015-11-11 06:27:20 -0800563 GrGLSLVertToFrag v(kVec4f_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800564 varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
egdaniel4ca2e602015-11-18 08:01:26 -0800565 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
joshualitt2dd1ae02014-12-03 06:24:10 -0800566
cdalton85285412016-02-18 12:37:07 -0800567 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800568 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700569 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -0800570 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700571 }
joshualitt9b989322014-12-15 14:16:27 -0800572
joshualittabb52a12015-01-13 15:02:10 -0800573 // Setup position
egdaniel7ea439b2015-12-03 09:20:44 -0800574 this->setupPosition(vertBuilder,
575 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800576 gpArgs,
577 gp.inPosition()->fName,
578 gp.viewMatrix(),
joshualitt5559ca22015-05-21 15:50:36 -0700579 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800580
joshualittabb52a12015-01-13 15:02:10 -0800581 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800582 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800583 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800584 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800585 gpArgs->fPositionVar,
586 gp.inPosition()->fName,
587 args.fTransformsIn,
joshualitte3ababe2015-05-15 07:56:07 -0700588 args.fTransformsOut);
joshualittabb52a12015-01-13 15:02:10 -0800589
egdaniel9bd5bbf2014-08-29 11:12:30 -0700590
egdaniel0d3f0612015-10-21 10:45:48 -0700591 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
592 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
593 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
594 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
595 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
596 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
597 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
598 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700599
egdaniel4ca2e602015-11-18 08:01:26 -0800600 fragBuilder->declAppend(edgeAlpha);
601 fragBuilder->declAppend(dklmdx);
602 fragBuilder->declAppend(dklmdy);
603 fragBuilder->declAppend(dfdx);
604 fragBuilder->declAppend(dfdy);
605 fragBuilder->declAppend(gF);
606 fragBuilder->declAppend(gFM);
607 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000608
609 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700610 case kHairlineAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800611 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800612 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdaniel4ca2e602015-11-18 08:01:26 -0800613 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
614 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
615 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
616 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
617 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
618 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
619 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
620 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
621 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
622 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
623 gFM.c_str(), gF.c_str(), gF.c_str());
624 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
625 func.c_str(), v.fsIn(), v.fsIn(),
626 v.fsIn(), v.fsIn(), v.fsIn());
627 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
628 fragBuilder->codeAppendf("%s = %s / %s;",
629 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
630 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
631 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000632 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800633 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700634 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
635 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000636 break;
637 }
joshualittb0a8a372014-09-23 09:50:21 -0700638 case kFillAA_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800639 SkAssertResult(fragBuilder->enableFeature(
egdaniel2d721d32015-11-11 13:06:05 -0800640 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdaniel4ca2e602015-11-18 08:01:26 -0800641 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
642 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
643 fragBuilder->codeAppendf("%s ="
644 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
645 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
646 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
647 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
648 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
649 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
650 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
651 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
652 gFM.c_str(), gF.c_str(), gF.c_str());
653 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
robertphillips96afa522015-12-09 07:54:24 -0800654 func.c_str(),
655 v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel4ca2e602015-11-18 08:01:26 -0800656 fragBuilder->codeAppendf("%s = %s / %s;",
657 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
658 fragBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
659 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000660 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800661 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700662 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
663 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000664 break;
665 }
joshualittb0a8a372014-09-23 09:50:21 -0700666 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800667 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
668 edgeAlpha.c_str(), v.fsIn(), v.fsIn(),
669 v.fsIn(), v.fsIn(), v.fsIn());
670 fragBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000671 break;
672 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000673 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000674 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000675 }
676
joshualitt2dd1ae02014-12-03 06:24:10 -0800677
egdaniel4ca2e602015-11-18 08:01:26 -0800678 fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000679}
680
robertphillips46d36f02015-01-18 08:14:14 -0800681void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
jvanverthcfc18862015-04-28 08:48:20 -0700682 const GrGLSLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700683 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800684 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700685 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700686 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8;
joshualitte578a952015-05-14 10:09:13 -0700687 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700688 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000689}
690
691//////////////////////////////////////////////////////////////////////////////
692
693GrCubicEffect::~GrCubicEffect() {}
694
egdaniel57d3b032015-11-13 11:57:27 -0800695void GrCubicEffect::getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700696 GrGLCubicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800697}
698
egdaniel57d3b032015-11-13 11:57:27 -0800699GrGLSLPrimitiveProcessor* GrCubicEffect::createGLSLInstance(const GrGLSLCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700700 return new GrGLCubicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000701}
702
joshualitt8059eb92014-12-29 15:10:07 -0800703GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
704 GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700705 : fColor(color)
706 , fViewMatrix(viewMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700707 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800708 this->initClassID<GrCubicEffect>();
senorblancof2539d52015-05-20 14:03:42 -0700709 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
710 kHigh_GrSLPrecision));
joshualitt71c92602015-01-14 08:12:47 -0800711 fInCubicCoeffs = &this->addVertexAttrib(Attribute("inCubicCoeffs",
joshualitt2dd1ae02014-12-03 06:24:10 -0800712 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000713}
714
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000715//////////////////////////////////////////////////////////////////////////////
716
joshualittb0a8a372014-09-23 09:50:21 -0700717GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000718
bsalomonc21b09e2015-08-28 18:46:56 -0700719const GrGeometryProcessor* GrCubicEffect::TestCreate(GrProcessorTestData* d) {
joshualittb0a8a372014-09-23 09:50:21 -0700720 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000721 do {
joshualitt0067ff52015-07-08 14:26:19 -0700722 GrPrimitiveEdgeType edgeType =
723 static_cast<GrPrimitiveEdgeType>(
724 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
725 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom),
726 GrTest::TestMatrix(d->fRandom), edgeType, *d->fCaps);
halcanary96fcdcc2015-08-27 07:41:13 -0700727 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700728 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000729}
egdaniel9bd5bbf2014-08-29 11:12:30 -0700730