blob: 31cffb68bd4040efed32e41162638541a3dde25c [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 Salomon94efbf52016-11-29 13:43:05 -05009#include "GrShaderCaps.h"
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"
Chris Daltonc17bf322017-10-24 10:59:03 -060016#include "glsl/GrGLSLVertexGeoBuilder.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&,
Brian Salomon94efbf52016-11-29 13:43:05 -050025 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -080026 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000027
bsalomona624bf32016-09-20 09:12:47 -070028 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
29 FPCoordTransformIter&& transformIter) 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];
Brian Osman1be2b7c2018-10-29 16:07:15 -040041 ce.color().toFloats(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 }
bsalomona624bf32016-09-20 09:12:47 -070050 this->setTransformDataHelper(ce.localMatrix(), pdman, &transformIter);
joshualitte3ababe2015-05-15 07:56:07 -070051 }
52
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000053private:
joshualitt5559ca22015-05-21 15:50:36 -070054 SkMatrix fViewMatrix;
Brian Osman1be2b7c2018-10-29 16:07:15 -040055 GrColor4h fColor;
joshualitt9b989322014-12-15 14:16:27 -080056 uint8_t fCoverageScale;
Ethan Nicholas0f3c7322017-11-09 14:51:17 -050057 GrClipEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -080058 UniformHandle fColorUniform;
59 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -070060 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000061
egdaniele659a582015-11-13 09:55:43 -080062 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000063};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +000064
joshualitt465283c2015-09-11 08:19:35 -070065GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor)
Brian Osman1be2b7c2018-10-29 16:07:15 -040066 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor4h_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -080067 const GrConicEffect& ce = processor.cast<GrConicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000068 fEdgeType = ce.getEdgeType();
69}
70
robertphillips46d36f02015-01-18 08:14:14 -080071void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -080072 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -080073 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>();
egdaniel0eafe792015-11-20 14:01:22 -080074 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -080075 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -080076
joshualittabb52a12015-01-13 15:02:10 -080077 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -080078 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -080079
Chris Dalton27372882017-12-08 13:34:21 -070080 GrGLSLVarying v(kFloat4_GrSLType);
Chris Daltonfdde34e2017-10-16 14:15:26 -060081 varyingHandler->addVarying("ConicCoeffs", &v);
Brian Salomon92be2f72018-06-19 14:33:47 -040082 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs().name());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000083
Chris Dalton60283612018-02-14 13:38:14 -070084 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -080085 // Setup pass through color
Brian Salomonbfd51832017-01-04 13:22:08 -050086 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualitt9b989322014-12-15 14:16:27 -080087
joshualittabb52a12015-01-13 15:02:10 -080088 // Setup position
Brian Salomon7f235432017-08-16 09:41:48 -040089 this->writeOutputPosition(vertBuilder,
90 uniformHandler,
91 gpArgs,
Brian Salomon92be2f72018-06-19 14:33:47 -040092 gp.inPosition().name(),
Brian Salomon7f235432017-08-16 09:41:48 -040093 gp.viewMatrix(),
94 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -080095
joshualittabb52a12015-01-13 15:02:10 -080096 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -080097 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -080098 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -080099 uniformHandler,
Brian Salomon92be2f72018-06-19 14:33:47 -0400100 gp.inPosition().asShaderVar(),
egdaniel4ca2e602015-11-18 08:01:26 -0800101 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700102 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800103
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400104 // TODO: we should check on the number of bits float and half provide and use the smallest one
105 // that suffices. Additionally we should assert that the upstream code only lets us get here if
106 // either float or half provides the required number of bits.
robertphillips2eb10092015-12-11 04:59:36 -0800107
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400108 GrShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0);
109 GrShaderVar dklmdx("dklmdx", kFloat3_GrSLType, 0);
110 GrShaderVar dklmdy("dklmdy", kFloat3_GrSLType, 0);
111 GrShaderVar dfdx("dfdx", kFloat_GrSLType, 0);
112 GrShaderVar dfdy("dfdy", kFloat_GrSLType, 0);
113 GrShaderVar gF("gF", kFloat2_GrSLType, 0);
114 GrShaderVar gFM("gFM", kFloat_GrSLType, 0);
115 GrShaderVar func("func", kFloat_GrSLType, 0);
robertphillips96afa522015-12-09 07:54:24 -0800116
117 fragBuilder->declAppend(edgeAlpha);
118 fragBuilder->declAppend(dklmdx);
119 fragBuilder->declAppend(dklmdy);
120 fragBuilder->declAppend(dfdx);
121 fragBuilder->declAppend(dfdy);
122 fragBuilder->declAppend(gF);
123 fragBuilder->declAppend(gFM);
124 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000125
126 switch (fEdgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500127 case GrClipEdgeType::kHairlineAA: {
robertphillips96afa522015-12-09 07:54:24 -0800128 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
129 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
130 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
131 dfdx.c_str(),
132 v.fsIn(), dklmdx.c_str(),
133 v.fsIn(), dklmdx.c_str(),
134 v.fsIn(), dklmdx.c_str());
135 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
136 dfdy.c_str(),
137 v.fsIn(), dklmdy.c_str(),
138 v.fsIn(), dklmdy.c_str(),
139 v.fsIn(), dklmdy.c_str());
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400140 fragBuilder->codeAppendf("%s = float2(%s, %s);", gF.c_str(), dfdx.c_str(),
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400141 dfdy.c_str());
robertphillips96afa522015-12-09 07:54:24 -0800142 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
143 gFM.c_str(), gF.c_str(), gF.c_str());
144 fragBuilder->codeAppendf("%s = %s.x*%s.x - %s.y*%s.z;",
145 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
146 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
147 fragBuilder->codeAppendf("%s = %s / %s;",
148 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
149 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
150 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000151 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800152 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000153 break;
154 }
Ethan Nicholas1706f842017-11-10 11:58:19 -0500155 case GrClipEdgeType::kFillAA: {
robertphillips96afa522015-12-09 07:54:24 -0800156 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
157 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
158 fragBuilder->codeAppendf("%s ="
159 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
160 dfdx.c_str(),
161 v.fsIn(), dklmdx.c_str(),
162 v.fsIn(), dklmdx.c_str(),
163 v.fsIn(), dklmdx.c_str());
164 fragBuilder->codeAppendf("%s ="
165 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
166 dfdy.c_str(),
167 v.fsIn(), dklmdy.c_str(),
168 v.fsIn(), dklmdy.c_str(),
169 v.fsIn(), dklmdy.c_str());
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400170 fragBuilder->codeAppendf("%s = float2(%s, %s);", gF.c_str(), dfdx.c_str(),
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400171 dfdy.c_str());
robertphillips96afa522015-12-09 07:54:24 -0800172 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
173 gFM.c_str(), gF.c_str(), gF.c_str());
174 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
175 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
176 fragBuilder->codeAppendf("%s = %s / %s;",
177 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
Ethan Nicholas12fb9cf2018-08-03 16:16:57 -0400178 fragBuilder->codeAppendf("%s = saturate(0.5 - %s);",
robertphillips96afa522015-12-09 07:54:24 -0800179 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000180 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800181 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000182 break;
183 }
Ethan Nicholas1706f842017-11-10 11:58:19 -0500184 case GrClipEdgeType::kFillBW: {
robertphillips96afa522015-12-09 07:54:24 -0800185 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
186 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400187 fragBuilder->codeAppendf("%s = float(%s < 0.0);",
robertphillips96afa522015-12-09 07:54:24 -0800188 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000189 break;
190 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000191 default:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400192 SK_ABORT("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000193 }
194
joshualittb8c241a2015-05-19 08:23:30 -0700195 // TODO should we really be doing this?
196 if (gp.coverageScale() != 0xff) {
joshualitt9b989322014-12-15 14:16:27 -0800197 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800198 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400199 kFloat_GrSLType,
cdalton5e58cee2016-02-11 12:49:47 -0800200 "Coverage",
201 &coverageScale);
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400202 fragBuilder->codeAppendf("%s = half4(%s * %s);",
robertphillips96afa522015-12-09 07:54:24 -0800203 args.fOutputCoverage, coverageScale, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800204 } else {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400205 fragBuilder->codeAppendf("%s = half4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800206 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000207}
208
robertphillips46d36f02015-01-18 08:14:14 -0800209void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500210 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700211 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800212 const GrConicEffect& ce = gp.cast<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700213 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700214 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0;
215 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700216 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700217 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000218}
219
220//////////////////////////////////////////////////////////////////////////////
221
Brian Salomon92be2f72018-06-19 14:33:47 -0400222constexpr GrPrimitiveProcessor::Attribute GrConicEffect::kAttributes[];
223
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000224GrConicEffect::~GrConicEffect() {}
225
Brian Salomon94efbf52016-11-29 13:43:05 -0500226void GrConicEffect::getGLSLProcessorKey(const GrShaderCaps& caps,
egdaniel57d3b032015-11-13 11:57:27 -0800227 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700228 GrGLConicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800229}
230
Brian Salomon94efbf52016-11-29 13:43:05 -0500231GrGLSLPrimitiveProcessor* GrConicEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700232 return new GrGLConicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000233}
234
Brian Osman1be2b7c2018-10-29 16:07:15 -0400235GrConicEffect::GrConicEffect(GrColor4h color, const SkMatrix& viewMatrix, uint8_t coverage,
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500236 GrClipEdgeType edgeType, const SkMatrix& localMatrix,
joshualittb8c241a2015-05-19 08:23:30 -0700237 bool usesLocalCoords)
Ethan Nicholasabff9562017-10-09 10:54:08 -0400238 : INHERITED(kGrConicEffect_ClassID)
239 , fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700240 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700241 , fLocalMatrix(viewMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700242 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800243 , fCoverageScale(coverage)
244 , fEdgeType(edgeType) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400245 this->setVertexAttributeCnt(2);
joshualitt9b989322014-12-15 14:16:27 -0800246}
247
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000248//////////////////////////////////////////////////////////////////////////////
249
joshualittb0a8a372014-09-23 09:50:21 -0700250GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000251
Hal Canary6f6961e2017-01-31 13:50:44 -0500252#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700253sk_sp<GrGeometryProcessor> GrConicEffect::TestCreate(GrProcessorTestData* d) {
254 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000255 do {
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500256 GrClipEdgeType edgeType =
257 static_cast<GrClipEdgeType>(
Ethan Nicholas1706f842017-11-10 11:58:19 -0500258 d->fRandom->nextULessThan(kGrClipEdgeTypeCnt));
Brian Osman1be2b7c2018-10-29 16:07:15 -0400259 gp = GrConicEffect::Make(GrColor4h::FromGrColor(GrRandomColor(d->fRandom)),
260 GrTest::TestMatrix(d->fRandom), edgeType, *d->caps(),
261 GrTest::TestMatrix(d->fRandom), d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700262 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700263 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000264}
Hal Canary6f6961e2017-01-31 13:50:44 -0500265#endif
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000266
267//////////////////////////////////////////////////////////////////////////////
268// Quad
269//////////////////////////////////////////////////////////////////////////////
270
egdaniele659a582015-11-13 09:55:43 -0800271class GrGLQuadEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000272public:
joshualitt465283c2015-09-11 08:19:35 -0700273 GrGLQuadEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000274
mtklein36352bf2015-03-25 18:17:31 -0700275 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000276
joshualitt87f48d92014-12-04 10:41:40 -0800277 static inline void GenKey(const GrGeometryProcessor&,
Brian Salomon94efbf52016-11-29 13:43:05 -0500278 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800279 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000280
bsalomona624bf32016-09-20 09:12:47 -0700281 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
282 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700283 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700284
285 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMatrix())) {
286 fViewMatrix = qe.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700287 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800288 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700289 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
290 }
joshualittee2af952014-12-30 09:04:15 -0800291
joshualittb8c241a2015-05-19 08:23:30 -0700292 if (qe.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700293 float c[4];
Brian Osman1be2b7c2018-10-29 16:07:15 -0400294 qe.color().toFloats(c);
joshualitt9b989322014-12-15 14:16:27 -0800295 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700296 fColor = qe.color();
joshualitt9b989322014-12-15 14:16:27 -0800297 }
joshualittb8c241a2015-05-19 08:23:30 -0700298
299 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
300 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale()));
301 fCoverageScale = qe.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -0800302 }
bsalomona624bf32016-09-20 09:12:47 -0700303 this->setTransformDataHelper(qe.localMatrix(), pdman, &transformIter);
joshualitte3ababe2015-05-15 07:56:07 -0700304 }
305
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000306private:
joshualitt5559ca22015-05-21 15:50:36 -0700307 SkMatrix fViewMatrix;
Brian Osman1be2b7c2018-10-29 16:07:15 -0400308 GrColor4h fColor;
joshualitt9b989322014-12-15 14:16:27 -0800309 uint8_t fCoverageScale;
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500310 GrClipEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800311 UniformHandle fColorUniform;
312 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700313 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000314
egdaniele659a582015-11-13 09:55:43 -0800315 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000316};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000317
joshualitt465283c2015-09-11 08:19:35 -0700318GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor)
Brian Osman1be2b7c2018-10-29 16:07:15 -0400319 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor4h_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800320 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000321 fEdgeType = ce.getEdgeType();
322}
323
robertphillips46d36f02015-01-18 08:14:14 -0800324void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800325 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800326 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800327 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800328 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800329
joshualittabb52a12015-01-13 15:02:10 -0800330 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800331 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800332
Chris Dalton27372882017-12-08 13:34:21 -0700333 GrGLSLVarying v(kHalf4_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800334 varyingHandler->addVarying("HairQuadEdge", &v);
Brian Salomon92be2f72018-06-19 14:33:47 -0400335 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge().name());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000336
Chris Dalton60283612018-02-14 13:38:14 -0700337 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800338 // Setup pass through color
Brian Salomonbfd51832017-01-04 13:22:08 -0500339 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualitt9b989322014-12-15 14:16:27 -0800340
joshualittabb52a12015-01-13 15:02:10 -0800341 // Setup position
Brian Salomon7f235432017-08-16 09:41:48 -0400342 this->writeOutputPosition(vertBuilder,
343 uniformHandler,
344 gpArgs,
Brian Salomon92be2f72018-06-19 14:33:47 -0400345 gp.inPosition().name(),
Brian Salomon7f235432017-08-16 09:41:48 -0400346 gp.viewMatrix(),
347 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800348
joshualittabb52a12015-01-13 15:02:10 -0800349 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800350 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800351 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800352 uniformHandler,
Brian Salomon92be2f72018-06-19 14:33:47 -0400353 gp.inPosition().asShaderVar(),
egdaniel4ca2e602015-11-18 08:01:26 -0800354 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700355 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800356
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400357 fragBuilder->codeAppendf("half edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700358
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000359 switch (fEdgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500360 case GrClipEdgeType::kHairlineAA: {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400361 fragBuilder->codeAppendf("half2 duvdx = dFdx(%s.xy);", v.fsIn());
362 fragBuilder->codeAppendf("half2 duvdy = dFdy(%s.xy);", v.fsIn());
363 fragBuilder->codeAppendf("half2 gF = half2(2.0 * %s.x * duvdx.x - duvdx.y,"
egdaniel4ca2e602015-11-18 08:01:26 -0800364 " 2.0 * %s.x * duvdy.x - duvdy.y);",
365 v.fsIn(), v.fsIn());
366 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
367 v.fsIn(), v.fsIn(), v.fsIn());
368 fragBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
369 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000370 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800371 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000372 break;
373 }
Ethan Nicholas1706f842017-11-10 11:58:19 -0500374 case GrClipEdgeType::kFillAA: {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400375 fragBuilder->codeAppendf("half2 duvdx = dFdx(%s.xy);", v.fsIn());
376 fragBuilder->codeAppendf("half2 duvdy = dFdy(%s.xy);", v.fsIn());
377 fragBuilder->codeAppendf("half2 gF = half2(2.0 * %s.x * duvdx.x - duvdx.y,"
egdaniel4ca2e602015-11-18 08:01:26 -0800378 " 2.0 * %s.x * duvdy.x - duvdy.y);",
379 v.fsIn(), v.fsIn());
380 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
381 v.fsIn(), v.fsIn(), v.fsIn());
382 fragBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
Ethan Nicholas12fb9cf2018-08-03 16:16:57 -0400383 fragBuilder->codeAppend("edgeAlpha = saturate(0.5 - edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000384 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800385 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000386 break;
387 }
Ethan Nicholas1706f842017-11-10 11:58:19 -0500388 case GrClipEdgeType::kFillBW: {
egdaniel4ca2e602015-11-18 08:01:26 -0800389 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
390 v.fsIn(), v.fsIn(), v.fsIn());
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400391 fragBuilder->codeAppend("edgeAlpha = half(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000392 break;
393 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000394 default:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400395 SK_ABORT("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000396 }
397
joshualittb8c241a2015-05-19 08:23:30 -0700398 if (0xff != gp.coverageScale()) {
joshualitt9b989322014-12-15 14:16:27 -0800399 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800400 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400401 kHalf_GrSLType,
cdalton5e58cee2016-02-11 12:49:47 -0800402 "Coverage",
403 &coverageScale);
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400404 fragBuilder->codeAppendf("%s = half4(%s * edgeAlpha);", args.fOutputCoverage,
405 coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800406 } else {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400407 fragBuilder->codeAppendf("%s = half4(edgeAlpha);", args.fOutputCoverage);
joshualitt9b989322014-12-15 14:16:27 -0800408 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000409}
410
robertphillips46d36f02015-01-18 08:14:14 -0800411void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500412 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700413 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800414 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700415 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700416 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
417 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700418 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700419 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000420}
421
422//////////////////////////////////////////////////////////////////////////////
423
Brian Salomon92be2f72018-06-19 14:33:47 -0400424constexpr GrPrimitiveProcessor::Attribute GrQuadEffect::kAttributes[];
425
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000426GrQuadEffect::~GrQuadEffect() {}
427
Brian Salomon94efbf52016-11-29 13:43:05 -0500428void GrQuadEffect::getGLSLProcessorKey(const GrShaderCaps& caps,
egdaniel57d3b032015-11-13 11:57:27 -0800429 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700430 GrGLQuadEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800431}
432
Brian Salomon94efbf52016-11-29 13:43:05 -0500433GrGLSLPrimitiveProcessor* GrQuadEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700434 return new GrGLQuadEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000435}
436
Brian Osman1be2b7c2018-10-29 16:07:15 -0400437GrQuadEffect::GrQuadEffect(GrColor4h color, const SkMatrix& viewMatrix, uint8_t coverage,
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500438 GrClipEdgeType edgeType, const SkMatrix& localMatrix,
joshualittb8c241a2015-05-19 08:23:30 -0700439 bool usesLocalCoords)
Ethan Nicholasabff9562017-10-09 10:54:08 -0400440 : INHERITED(kGrQuadEffect_ClassID)
441 , fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700442 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700443 , fLocalMatrix(localMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700444 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800445 , fCoverageScale(coverage)
446 , fEdgeType(edgeType) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400447 this->setVertexAttributeCnt(2);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000448}
449
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000450//////////////////////////////////////////////////////////////////////////////
451
joshualittb0a8a372014-09-23 09:50:21 -0700452GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000453
Hal Canary6f6961e2017-01-31 13:50:44 -0500454#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700455sk_sp<GrGeometryProcessor> GrQuadEffect::TestCreate(GrProcessorTestData* d) {
456 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000457 do {
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500458 GrClipEdgeType edgeType = static_cast<GrClipEdgeType>(
Ethan Nicholas1706f842017-11-10 11:58:19 -0500459 d->fRandom->nextULessThan(kGrClipEdgeTypeCnt));
Brian Osman1be2b7c2018-10-29 16:07:15 -0400460 gp = GrQuadEffect::Make(GrColor4h::FromGrColor(GrRandomColor(d->fRandom)),
461 GrTest::TestMatrix(d->fRandom), edgeType, *d->caps(),
462 GrTest::TestMatrix(d->fRandom), d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700463 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700464 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000465}
Hal Canary6f6961e2017-01-31 13:50:44 -0500466#endif
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000467
468//////////////////////////////////////////////////////////////////////////////
469// Cubic
470//////////////////////////////////////////////////////////////////////////////
471
egdaniele659a582015-11-13 09:55:43 -0800472class GrGLCubicEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000473public:
joshualitt465283c2015-09-11 08:19:35 -0700474 GrGLCubicEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000475
mtklein36352bf2015-03-25 18:17:31 -0700476 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000477
joshualitt87f48d92014-12-04 10:41:40 -0800478 static inline void GenKey(const GrGeometryProcessor&,
Brian Salomon94efbf52016-11-29 13:43:05 -0500479 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800480 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000481
bsalomona624bf32016-09-20 09:12:47 -0700482 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
483 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700484 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700485
486 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
487 fViewMatrix = ce.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700488 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800489 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700490 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
491 }
joshualittee2af952014-12-30 09:04:15 -0800492
Chris Daltonfebbffa2017-06-08 13:12:02 -0600493 if (!fDevKLMMatrix.cheapEqualTo(ce.devKLMMatrix())) {
494 fDevKLMMatrix = ce.devKLMMatrix();
495 float devKLMMatrix[3 * 3];
496 GrGLSLGetMatrix<3>(devKLMMatrix, fDevKLMMatrix);
497 pdman.setMatrix3f(fDevKLMUniform, devKLMMatrix);
498 }
499
joshualittb8c241a2015-05-19 08:23:30 -0700500 if (ce.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700501 float c[4];
Brian Osman1be2b7c2018-10-29 16:07:15 -0400502 ce.color().toFloats(c);
joshualitt9b989322014-12-15 14:16:27 -0800503 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700504 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -0800505 }
Chris Daltonfebbffa2017-06-08 13:12:02 -0600506
bsalomona624bf32016-09-20 09:12:47 -0700507 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
joshualitt9b989322014-12-15 14:16:27 -0800508 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000509
510private:
joshualitt5559ca22015-05-21 15:50:36 -0700511 SkMatrix fViewMatrix;
Chris Daltonfebbffa2017-06-08 13:12:02 -0600512 SkMatrix fDevKLMMatrix;
Brian Osman1be2b7c2018-10-29 16:07:15 -0400513 GrColor4h fColor;
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500514 GrClipEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800515 UniformHandle fColorUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700516 UniformHandle fViewMatrixUniform;
Chris Daltonfebbffa2017-06-08 13:12:02 -0600517 UniformHandle fDevKLMUniform;
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)
Robert Phillips888e9f22017-06-12 07:50:05 -0400523 : fViewMatrix(SkMatrix::InvalidMatrix())
524 , fDevKLMMatrix(SkMatrix::InvalidMatrix())
Brian Osman1be2b7c2018-10-29 16:07:15 -0400525 , fColor(GrColor4h_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700526 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000527 fEdgeType = ce.getEdgeType();
528}
529
robertphillips46d36f02015-01-18 08:14:14 -0800530void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800531 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800532 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800533 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800534 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800535
joshualittabb52a12015-01-13 15:02:10 -0800536 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800537 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800538
Chris Dalton60283612018-02-14 13:38:14 -0700539 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800540 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700541 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -0800542 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700543 }
joshualitt9b989322014-12-15 14:16:27 -0800544
joshualittabb52a12015-01-13 15:02:10 -0800545 // Setup position
Brian Salomon7f235432017-08-16 09:41:48 -0400546 this->writeOutputPosition(vertBuilder,
547 uniformHandler,
548 gpArgs,
Brian Salomon92be2f72018-06-19 14:33:47 -0400549 gp.inPosition().name(),
Brian Salomon7f235432017-08-16 09:41:48 -0400550 gp.viewMatrix(),
551 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800552
Chris Daltonfebbffa2017-06-08 13:12:02 -0600553 // Setup KLM
554 const char* devkLMMatrixName;
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400555 fDevKLMUniform = uniformHandler->addUniform(kVertex_GrShaderFlag, kFloat3x3_GrSLType, "KLM",
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400556 &devkLMMatrixName);
Chris Dalton27372882017-12-08 13:34:21 -0700557 GrGLSLVarying v(kFloat3_GrSLType);
Chris Daltonfdde34e2017-10-16 14:15:26 -0600558 varyingHandler->addVarying("CubicCoeffs", &v);
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400559 vertBuilder->codeAppendf("%s = %s * float3(%s, 1);",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600560 v.vsOut(), devkLMMatrixName, gpArgs->fPositionVar.c_str());
561
562
Chris Dalton27372882017-12-08 13:34:21 -0700563 GrGLSLVarying gradCoeffs(kFloat4_GrSLType);
Ethan Nicholas1706f842017-11-10 11:58:19 -0500564 if (GrClipEdgeType::kFillAA == fEdgeType || GrClipEdgeType::kHairlineAA == fEdgeType) {
Chris Daltonfdde34e2017-10-16 14:15:26 -0600565 varyingHandler->addVarying("GradCoeffs", &gradCoeffs);
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400566 vertBuilder->codeAppendf("float k = %s[0], l = %s[1], m = %s[2];",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600567 v.vsOut(), v.vsOut(), v.vsOut());
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400568 vertBuilder->codeAppendf("float2 gk = float2(%s[0][0], %s[1][0]), "
569 "gl = float2(%s[0][1], %s[1][1]), "
570 "gm = float2(%s[0][2], %s[1][2]);",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600571 devkLMMatrixName, devkLMMatrixName, devkLMMatrixName,
572 devkLMMatrixName, devkLMMatrixName, devkLMMatrixName);
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400573 vertBuilder->codeAppendf("%s = float4(3 * k * gk, -m * gl - l * gm);",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600574 gradCoeffs.vsOut());
575 }
576
joshualittabb52a12015-01-13 15:02:10 -0800577 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800578 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800579 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800580 uniformHandler,
Brian Salomon92be2f72018-06-19 14:33:47 -0400581 gp.inPosition().asShaderVar(),
bsalomona624bf32016-09-20 09:12:47 -0700582 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800583
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400584 GrShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0);
585 GrShaderVar gF("gF", kFloat2_GrSLType, 0);
586 GrShaderVar func("func", kFloat_GrSLType, 0);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700587
egdaniel4ca2e602015-11-18 08:01:26 -0800588 fragBuilder->declAppend(edgeAlpha);
egdaniel4ca2e602015-11-18 08:01:26 -0800589 fragBuilder->declAppend(gF);
egdaniel4ca2e602015-11-18 08:01:26 -0800590 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000591
592 switch (fEdgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500593 case GrClipEdgeType::kHairlineAA: {
Chris Daltonfebbffa2017-06-08 13:12:02 -0600594 fragBuilder->codeAppendf("%s = %s.x * %s.xy + %s.zw;",
595 gF.c_str(), v.fsIn(), gradCoeffs.fsIn(), gradCoeffs.fsIn());
egdaniel4ca2e602015-11-18 08:01:26 -0800596 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
597 func.c_str(), v.fsIn(), v.fsIn(),
598 v.fsIn(), v.fsIn(), v.fsIn());
599 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
Chris Daltonfebbffa2017-06-08 13:12:02 -0600600 fragBuilder->codeAppendf("%s = %s * inversesqrt(dot(%s, %s));",
601 edgeAlpha.c_str(), func.c_str(), gF.c_str(), gF.c_str());
egdaniel4ca2e602015-11-18 08:01:26 -0800602 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
603 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000604 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800605 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700606 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
607 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000608 break;
609 }
Ethan Nicholas1706f842017-11-10 11:58:19 -0500610 case GrClipEdgeType::kFillAA: {
Chris Daltonfebbffa2017-06-08 13:12:02 -0600611 fragBuilder->codeAppendf("%s = %s.x * %s.xy + %s.zw;",
612 gF.c_str(), v.fsIn(), gradCoeffs.fsIn(), gradCoeffs.fsIn());
egdaniel4ca2e602015-11-18 08:01:26 -0800613 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
robertphillips96afa522015-12-09 07:54:24 -0800614 func.c_str(),
615 v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
Chris Daltonfebbffa2017-06-08 13:12:02 -0600616 fragBuilder->codeAppendf("%s = %s * inversesqrt(dot(%s, %s));",
617 edgeAlpha.c_str(), func.c_str(), gF.c_str(), gF.c_str());
Ethan Nicholas12fb9cf2018-08-03 16:16:57 -0400618 fragBuilder->codeAppendf("%s = saturate(0.5 - %s);",
egdaniel4ca2e602015-11-18 08:01:26 -0800619 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000620 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800621 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700622 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
623 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000624 break;
625 }
Ethan Nicholas1706f842017-11-10 11:58:19 -0500626 case GrClipEdgeType::kFillBW: {
egdaniel4ca2e602015-11-18 08:01:26 -0800627 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
628 edgeAlpha.c_str(), v.fsIn(), v.fsIn(),
629 v.fsIn(), v.fsIn(), v.fsIn());
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400630 fragBuilder->codeAppendf("%s = half(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000631 break;
632 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000633 default:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400634 SK_ABORT("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000635 }
636
joshualitt2dd1ae02014-12-03 06:24:10 -0800637
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400638 fragBuilder->codeAppendf("%s = float4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000639}
640
robertphillips46d36f02015-01-18 08:14:14 -0800641void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500642 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700643 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800644 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700645 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitte578a952015-05-14 10:09:13 -0700646 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700647 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000648}
649
650//////////////////////////////////////////////////////////////////////////////
651
Brian Salomon92be2f72018-06-19 14:33:47 -0400652constexpr GrPrimitiveProcessor::Attribute GrCubicEffect::kInPosition;
653
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000654GrCubicEffect::~GrCubicEffect() {}
655
Brian Salomon94efbf52016-11-29 13:43:05 -0500656void GrCubicEffect::getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700657 GrGLCubicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800658}
659
Brian Salomon94efbf52016-11-29 13:43:05 -0500660GrGLSLPrimitiveProcessor* GrCubicEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700661 return new GrGLCubicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000662}
663
Brian Osman1be2b7c2018-10-29 16:07:15 -0400664GrCubicEffect::GrCubicEffect(GrColor4h color, const SkMatrix& viewMatrix, const SkMatrix&
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500665 devKLMMatrix, GrClipEdgeType edgeType)
Ethan Nicholasabff9562017-10-09 10:54:08 -0400666 : INHERITED(kGrCubicEffect_ClassID)
667 , fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700668 , fViewMatrix(viewMatrix)
Chris Daltonfebbffa2017-06-08 13:12:02 -0600669 , fDevKLMMatrix(devKLMMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700670 , fEdgeType(edgeType) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400671 this->setVertexAttributeCnt(1);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000672}
673
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000674//////////////////////////////////////////////////////////////////////////////
675
joshualittb0a8a372014-09-23 09:50:21 -0700676GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000677
Hal Canary6f6961e2017-01-31 13:50:44 -0500678#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700679sk_sp<GrGeometryProcessor> GrCubicEffect::TestCreate(GrProcessorTestData* d) {
680 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000681 do {
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500682 GrClipEdgeType edgeType =
683 static_cast<GrClipEdgeType>(
Ethan Nicholas1706f842017-11-10 11:58:19 -0500684 d->fRandom->nextULessThan(kGrClipEdgeTypeCnt));
Brian Osman1be2b7c2018-10-29 16:07:15 -0400685 gp = GrCubicEffect::Make(GrColor4h::FromGrColor(GrRandomColor(d->fRandom)),
686 GrTest::TestMatrix(d->fRandom), GrTest::TestMatrix(d->fRandom),
687 d->fRandom->nextBool(), edgeType, *d->caps());
halcanary96fcdcc2015-08-27 07:41:13 -0700688 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700689 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000690}
Hal Canary6f6961e2017-01-31 13:50:44 -0500691#endif