blob: 5848888208668b5348883a404de278c4a9a57d6b [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"
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&,
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];
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 }
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;
joshualitt9b989322014-12-15 14:16:27 -080055 GrColor fColor;
56 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -070057 GrPrimitiveEdgeType 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)
joshualitt5559ca22015-05-21 15:50:36 -070066 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_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
Ethan Nicholas05d5a132017-09-15 11:42:17 -040080 GrGLSLVertToFrag v(kHighFloat4_GrSLType);
robertphillips96afa522015-12-09 07:54:24 -080081 varyingHandler->addVarying("ConicCoeffs", &v, kHigh_GrSLPrecision);
egdaniel4ca2e602015-11-18 08:01:26 -080082 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000083
cdalton85285412016-02-18 12:37:07 -080084 GrGLSLPPFragmentBuilder* 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,
92 gp.inPosition()->fName,
93 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,
egdaniel4ca2e602015-11-18 08:01:26 -0800100 gpArgs->fPositionVar,
101 gp.inPosition()->fName,
102 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700103 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800104
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400105 // TODO: we should check on the number of bits float and half provide and use the smallest one
106 // that suffices. Additionally we should assert that the upstream code only lets us get here if
107 // either float or half provides the required number of bits.
robertphillips2eb10092015-12-11 04:59:36 -0800108
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400109 GrShaderVar edgeAlpha("edgeAlpha", kHighFloat_GrSLType, 0);
110 GrShaderVar dklmdx("dklmdx", kHighFloat3_GrSLType, 0);
111 GrShaderVar dklmdy("dklmdy", kHighFloat3_GrSLType, 0);
112 GrShaderVar dfdx("dfdx", kHighFloat_GrSLType, 0);
113 GrShaderVar dfdy("dfdy", kHighFloat_GrSLType, 0);
114 GrShaderVar gF("gF", kHighFloat2_GrSLType, 0);
115 GrShaderVar gFM("gFM", kHighFloat_GrSLType, 0);
116 GrShaderVar func("func", kHighFloat_GrSLType, 0);
robertphillips96afa522015-12-09 07:54:24 -0800117
118 fragBuilder->declAppend(edgeAlpha);
119 fragBuilder->declAppend(dklmdx);
120 fragBuilder->declAppend(dklmdy);
121 fragBuilder->declAppend(dfdx);
122 fragBuilder->declAppend(dfdy);
123 fragBuilder->declAppend(gF);
124 fragBuilder->declAppend(gFM);
125 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000126
127 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700128 case kHairlineAA_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800129 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
130 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
131 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
132 dfdx.c_str(),
133 v.fsIn(), dklmdx.c_str(),
134 v.fsIn(), dklmdx.c_str(),
135 v.fsIn(), dklmdx.c_str());
136 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
137 dfdy.c_str(),
138 v.fsIn(), dklmdy.c_str(),
139 v.fsIn(), dklmdy.c_str(),
140 v.fsIn(), dklmdy.c_str());
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400141 fragBuilder->codeAppendf("%s = highfloat2(%s, %s);", gF.c_str(), dfdx.c_str(),
142 dfdy.c_str());
robertphillips96afa522015-12-09 07:54:24 -0800143 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
144 gFM.c_str(), gF.c_str(), gF.c_str());
145 fragBuilder->codeAppendf("%s = %s.x*%s.x - %s.y*%s.z;",
146 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
147 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
148 fragBuilder->codeAppendf("%s = %s / %s;",
149 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
150 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
151 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000152 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800153 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000154 break;
155 }
joshualittb0a8a372014-09-23 09:50:21 -0700156 case kFillAA_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800157 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
158 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
159 fragBuilder->codeAppendf("%s ="
160 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
161 dfdx.c_str(),
162 v.fsIn(), dklmdx.c_str(),
163 v.fsIn(), dklmdx.c_str(),
164 v.fsIn(), dklmdx.c_str());
165 fragBuilder->codeAppendf("%s ="
166 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
167 dfdy.c_str(),
168 v.fsIn(), dklmdy.c_str(),
169 v.fsIn(), dklmdy.c_str(),
170 v.fsIn(), dklmdy.c_str());
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400171 fragBuilder->codeAppendf("%s = highfloat2(%s, %s);", gF.c_str(), dfdx.c_str(),
172 dfdy.c_str());
robertphillips96afa522015-12-09 07:54:24 -0800173 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
174 gFM.c_str(), gF.c_str(), gF.c_str());
175 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
176 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
177 fragBuilder->codeAppendf("%s = %s / %s;",
178 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
Greg Daniel8199d942017-03-14 10:20:24 -0400179 fragBuilder->codeAppendf("%s = clamp(0.5 - %s, 0.0, 1.0);",
robertphillips96afa522015-12-09 07:54:24 -0800180 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000181 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800182 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000183 break;
184 }
joshualittb0a8a372014-09-23 09:50:21 -0700185 case kFillBW_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800186 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
187 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400188 fragBuilder->codeAppendf("%s = highfloat(%s < 0.0);",
robertphillips96afa522015-12-09 07:54:24 -0800189 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000190 break;
191 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000192 default:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400193 SK_ABORT("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000194 }
195
joshualittb8c241a2015-05-19 08:23:30 -0700196 // TODO should we really be doing this?
197 if (gp.coverageScale() != 0xff) {
joshualitt9b989322014-12-15 14:16:27 -0800198 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800199 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400200 kHighFloat_GrSLType,
cdalton5e58cee2016-02-11 12:49:47 -0800201 "Coverage",
202 &coverageScale);
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400203 fragBuilder->codeAppendf("%s = half4(%s * %s);",
robertphillips96afa522015-12-09 07:54:24 -0800204 args.fOutputCoverage, coverageScale, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800205 } else {
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400206 fragBuilder->codeAppendf("%s = half4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800207 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000208}
209
robertphillips46d36f02015-01-18 08:14:14 -0800210void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500211 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700212 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800213 const GrConicEffect& ce = gp.cast<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700214 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700215 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0;
216 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700217 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700218 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000219}
220
221//////////////////////////////////////////////////////////////////////////////
222
223GrConicEffect::~GrConicEffect() {}
224
Brian Salomon94efbf52016-11-29 13:43:05 -0500225void GrConicEffect::getGLSLProcessorKey(const GrShaderCaps& caps,
egdaniel57d3b032015-11-13 11:57:27 -0800226 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700227 GrGLConicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800228}
229
Brian Salomon94efbf52016-11-29 13:43:05 -0500230GrGLSLPrimitiveProcessor* GrConicEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700231 return new GrGLConicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000232}
233
joshualitt8059eb92014-12-29 15:10:07 -0800234GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700235 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
236 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700237 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700238 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700239 , fLocalMatrix(viewMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700240 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800241 , fCoverageScale(coverage)
242 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800243 this->initClassID<GrConicEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700244 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
245 kHigh_GrSLPrecision);
246 fInConicCoeffs = &this->addVertexAttrib("inConicCoeffs", kVec4f_GrVertexAttribType);
joshualitt9b989322014-12-15 14:16:27 -0800247}
248
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000249//////////////////////////////////////////////////////////////////////////////
250
joshualittb0a8a372014-09-23 09:50:21 -0700251GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000252
Hal Canary6f6961e2017-01-31 13:50:44 -0500253#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700254sk_sp<GrGeometryProcessor> GrConicEffect::TestCreate(GrProcessorTestData* d) {
255 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000256 do {
joshualitt0067ff52015-07-08 14:26:19 -0700257 GrPrimitiveEdgeType edgeType =
258 static_cast<GrPrimitiveEdgeType>(
259 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
bungeman06ca8ec2016-06-09 08:01:03 -0700260 gp = GrConicEffect::Make(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom),
Robert Phillips296b1cc2017-03-15 10:42:12 -0400261 edgeType, *d->caps(), GrTest::TestMatrix(d->fRandom),
Brian Salomon9ae32a22017-01-25 14:58:24 -0500262 d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700263 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700264 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000265}
Hal Canary6f6961e2017-01-31 13:50:44 -0500266#endif
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000267
268//////////////////////////////////////////////////////////////////////////////
269// Quad
270//////////////////////////////////////////////////////////////////////////////
271
egdaniele659a582015-11-13 09:55:43 -0800272class GrGLQuadEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000273public:
joshualitt465283c2015-09-11 08:19:35 -0700274 GrGLQuadEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000275
mtklein36352bf2015-03-25 18:17:31 -0700276 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000277
joshualitt87f48d92014-12-04 10:41:40 -0800278 static inline void GenKey(const GrGeometryProcessor&,
Brian Salomon94efbf52016-11-29 13:43:05 -0500279 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800280 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000281
bsalomona624bf32016-09-20 09:12:47 -0700282 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
283 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700284 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700285
286 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMatrix())) {
287 fViewMatrix = qe.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700288 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800289 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700290 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
291 }
joshualittee2af952014-12-30 09:04:15 -0800292
joshualittb8c241a2015-05-19 08:23:30 -0700293 if (qe.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700294 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700295 GrColorToRGBAFloat(qe.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800296 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700297 fColor = qe.color();
joshualitt9b989322014-12-15 14:16:27 -0800298 }
joshualittb8c241a2015-05-19 08:23:30 -0700299
300 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
301 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale()));
302 fCoverageScale = qe.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -0800303 }
bsalomona624bf32016-09-20 09:12:47 -0700304 this->setTransformDataHelper(qe.localMatrix(), pdman, &transformIter);
joshualitte3ababe2015-05-15 07:56:07 -0700305 }
306
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000307private:
joshualitt5559ca22015-05-21 15:50:36 -0700308 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800309 GrColor fColor;
310 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700311 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800312 UniformHandle fColorUniform;
313 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700314 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000315
egdaniele659a582015-11-13 09:55:43 -0800316 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000317};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000318
joshualitt465283c2015-09-11 08:19:35 -0700319GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -0700320 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800321 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000322 fEdgeType = ce.getEdgeType();
323}
324
robertphillips46d36f02015-01-18 08:14:14 -0800325void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800326 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800327 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800328 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800329 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800330
joshualittabb52a12015-01-13 15:02:10 -0800331 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800332 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800333
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400334 GrGLSLVertToFrag v(kHalf4_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800335 varyingHandler->addVarying("HairQuadEdge", &v);
egdaniel4ca2e602015-11-18 08:01:26 -0800336 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000337
cdalton85285412016-02-18 12:37:07 -0800338 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800339 // Setup pass through color
Brian Salomonbfd51832017-01-04 13:22:08 -0500340 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualitt9b989322014-12-15 14:16:27 -0800341
joshualittabb52a12015-01-13 15:02:10 -0800342 // Setup position
Brian Salomon7f235432017-08-16 09:41:48 -0400343 this->writeOutputPosition(vertBuilder,
344 uniformHandler,
345 gpArgs,
346 gp.inPosition()->fName,
347 gp.viewMatrix(),
348 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800349
joshualittabb52a12015-01-13 15:02:10 -0800350 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800351 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800352 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800353 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800354 gpArgs->fPositionVar,
355 gp.inPosition()->fName,
356 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700357 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800358
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400359 fragBuilder->codeAppendf("half edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700360
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000361 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700362 case kHairlineAA_GrProcessorEdgeType: {
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400363 fragBuilder->codeAppendf("half2 duvdx = dFdx(%s.xy);", v.fsIn());
364 fragBuilder->codeAppendf("half2 duvdy = dFdy(%s.xy);", v.fsIn());
365 fragBuilder->codeAppendf("half2 gF = half2(2.0 * %s.x * duvdx.x - duvdx.y,"
egdaniel4ca2e602015-11-18 08:01:26 -0800366 " 2.0 * %s.x * duvdy.x - duvdy.y);",
367 v.fsIn(), v.fsIn());
368 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
369 v.fsIn(), v.fsIn(), v.fsIn());
370 fragBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
371 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000372 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800373 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000374 break;
375 }
joshualittb0a8a372014-09-23 09:50:21 -0700376 case kFillAA_GrProcessorEdgeType: {
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400377 fragBuilder->codeAppendf("half2 duvdx = dFdx(%s.xy);", v.fsIn());
378 fragBuilder->codeAppendf("half2 duvdy = dFdy(%s.xy);", v.fsIn());
379 fragBuilder->codeAppendf("half2 gF = half2(2.0 * %s.x * duvdx.x - duvdx.y,"
egdaniel4ca2e602015-11-18 08:01:26 -0800380 " 2.0 * %s.x * duvdy.x - duvdy.y);",
381 v.fsIn(), v.fsIn());
382 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
383 v.fsIn(), v.fsIn(), v.fsIn());
384 fragBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
Greg Daniel8199d942017-03-14 10:20:24 -0400385 fragBuilder->codeAppend("edgeAlpha = clamp(0.5 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000386 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800387 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000388 break;
389 }
joshualittb0a8a372014-09-23 09:50:21 -0700390 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800391 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
392 v.fsIn(), v.fsIn(), v.fsIn());
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400393 fragBuilder->codeAppend("edgeAlpha = half(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000394 break;
395 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000396 default:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400397 SK_ABORT("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000398 }
399
joshualittb8c241a2015-05-19 08:23:30 -0700400 if (0xff != gp.coverageScale()) {
joshualitt9b989322014-12-15 14:16:27 -0800401 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800402 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400403 kHalf_GrSLType,
cdalton5e58cee2016-02-11 12:49:47 -0800404 "Coverage",
405 &coverageScale);
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400406 fragBuilder->codeAppendf("%s = half4(%s * edgeAlpha);", args.fOutputCoverage,
407 coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800408 } else {
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400409 fragBuilder->codeAppendf("%s = half4(edgeAlpha);", args.fOutputCoverage);
joshualitt9b989322014-12-15 14:16:27 -0800410 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000411}
412
robertphillips46d36f02015-01-18 08:14:14 -0800413void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500414 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700415 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800416 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700417 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700418 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
419 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700420 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700421 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000422}
423
424//////////////////////////////////////////////////////////////////////////////
425
426GrQuadEffect::~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
joshualitt8059eb92014-12-29 15:10:07 -0800437GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700438 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
439 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700440 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700441 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700442 , fLocalMatrix(localMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700443 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800444 , fCoverageScale(coverage)
445 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800446 this->initClassID<GrQuadEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700447 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
448 kHigh_GrSLPrecision);
449 fInHairQuadEdge = &this->addVertexAttrib("inHairQuadEdge", kVec4f_GrVertexAttribType);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000450}
451
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000452//////////////////////////////////////////////////////////////////////////////
453
joshualittb0a8a372014-09-23 09:50:21 -0700454GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000455
Hal Canary6f6961e2017-01-31 13:50:44 -0500456#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700457sk_sp<GrGeometryProcessor> GrQuadEffect::TestCreate(GrProcessorTestData* d) {
458 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000459 do {
joshualittb0a8a372014-09-23 09:50:21 -0700460 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
joshualitt0067ff52015-07-08 14:26:19 -0700461 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
Brian Salomon9ae32a22017-01-25 14:58:24 -0500462 gp = GrQuadEffect::Make(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom), edgeType,
Robert Phillips296b1cc2017-03-15 10:42:12 -0400463 *d->caps(), GrTest::TestMatrix(d->fRandom),
bungeman06ca8ec2016-06-09 08:01:03 -0700464 d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700465 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700466 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000467}
Hal Canary6f6961e2017-01-31 13:50:44 -0500468#endif
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000469
470//////////////////////////////////////////////////////////////////////////////
471// Cubic
472//////////////////////////////////////////////////////////////////////////////
473
egdaniele659a582015-11-13 09:55:43 -0800474class GrGLCubicEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000475public:
joshualitt465283c2015-09-11 08:19:35 -0700476 GrGLCubicEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000477
mtklein36352bf2015-03-25 18:17:31 -0700478 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000479
joshualitt87f48d92014-12-04 10:41:40 -0800480 static inline void GenKey(const GrGeometryProcessor&,
Brian Salomon94efbf52016-11-29 13:43:05 -0500481 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800482 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000483
bsalomona624bf32016-09-20 09:12:47 -0700484 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
485 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700486 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700487
488 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
489 fViewMatrix = ce.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700490 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800491 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700492 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
493 }
joshualittee2af952014-12-30 09:04:15 -0800494
Chris Daltonfebbffa2017-06-08 13:12:02 -0600495 if (!fDevKLMMatrix.cheapEqualTo(ce.devKLMMatrix())) {
496 fDevKLMMatrix = ce.devKLMMatrix();
497 float devKLMMatrix[3 * 3];
498 GrGLSLGetMatrix<3>(devKLMMatrix, fDevKLMMatrix);
499 pdman.setMatrix3f(fDevKLMUniform, devKLMMatrix);
500 }
501
joshualittb8c241a2015-05-19 08:23:30 -0700502 if (ce.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700503 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700504 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800505 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700506 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -0800507 }
Chris Daltonfebbffa2017-06-08 13:12:02 -0600508
bsalomona624bf32016-09-20 09:12:47 -0700509 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
joshualitt9b989322014-12-15 14:16:27 -0800510 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000511
512private:
joshualitt5559ca22015-05-21 15:50:36 -0700513 SkMatrix fViewMatrix;
Chris Daltonfebbffa2017-06-08 13:12:02 -0600514 SkMatrix fDevKLMMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800515 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700516 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800517 UniformHandle fColorUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700518 UniformHandle fViewMatrixUniform;
Chris Daltonfebbffa2017-06-08 13:12:02 -0600519 UniformHandle fDevKLMUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000520
egdaniele659a582015-11-13 09:55:43 -0800521 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000522};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000523
joshualitt465283c2015-09-11 08:19:35 -0700524GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor)
Robert Phillips888e9f22017-06-12 07:50:05 -0400525 : fViewMatrix(SkMatrix::InvalidMatrix())
526 , fDevKLMMatrix(SkMatrix::InvalidMatrix())
527 , fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700528 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000529 fEdgeType = ce.getEdgeType();
530}
531
robertphillips46d36f02015-01-18 08:14:14 -0800532void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800533 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800534 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800535 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800536 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800537
joshualittabb52a12015-01-13 15:02:10 -0800538 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800539 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800540
cdalton85285412016-02-18 12:37:07 -0800541 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800542 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700543 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -0800544 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700545 }
joshualitt9b989322014-12-15 14:16:27 -0800546
joshualittabb52a12015-01-13 15:02:10 -0800547 // Setup position
Brian Salomon7f235432017-08-16 09:41:48 -0400548 this->writeOutputPosition(vertBuilder,
549 uniformHandler,
550 gpArgs,
551 gp.inPosition()->fName,
552 gp.viewMatrix(),
553 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800554
Chris Daltonfebbffa2017-06-08 13:12:02 -0600555 // Setup KLM
556 const char* devkLMMatrixName;
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400557 fDevKLMUniform = uniformHandler->addUniform(kVertex_GrShaderFlag, kHighFloat3x3_GrSLType, "KLM",
558 &devkLMMatrixName);
559 GrGLSLVertToFrag v(kHighFloat3_GrSLType);
Chris Daltonfebbffa2017-06-08 13:12:02 -0600560 varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400561 vertBuilder->codeAppendf("%s = %s * highfloat3(%s, 1);",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600562 v.vsOut(), devkLMMatrixName, gpArgs->fPositionVar.c_str());
563
564
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400565 GrGLSLVertToFrag gradCoeffs(kHighFloat4_GrSLType);
Chris Daltonfebbffa2017-06-08 13:12:02 -0600566 if (kFillAA_GrProcessorEdgeType == fEdgeType || kHairlineAA_GrProcessorEdgeType == fEdgeType) {
567 varyingHandler->addVarying("GradCoeffs", &gradCoeffs, kHigh_GrSLPrecision);
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400568 vertBuilder->codeAppendf("highfloat k = %s[0], l = %s[1], m = %s[2];",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600569 v.vsOut(), v.vsOut(), v.vsOut());
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400570 vertBuilder->codeAppendf("highfloat2 gk = highfloat2(%s[0][0], %s[1][0]), "
571 "gl = highfloat2(%s[0][1], %s[1][1]), "
572 "gm = highfloat2(%s[0][2], %s[1][2]);",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600573 devkLMMatrixName, devkLMMatrixName, devkLMMatrixName,
574 devkLMMatrixName, devkLMMatrixName, devkLMMatrixName);
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400575 vertBuilder->codeAppendf("%s = highfloat4(3 * k * gk, -m * gl - l * gm);",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600576 gradCoeffs.vsOut());
577 }
578
joshualittabb52a12015-01-13 15:02:10 -0800579 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800580 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800581 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800582 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800583 gpArgs->fPositionVar,
584 gp.inPosition()->fName,
bsalomona624bf32016-09-20 09:12:47 -0700585 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800586
egdaniel9bd5bbf2014-08-29 11:12:30 -0700587
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400588 GrShaderVar edgeAlpha("edgeAlpha", kHighFloat_GrSLType, 0);
589 GrShaderVar gF("gF", kHighFloat2_GrSLType, 0);
590 GrShaderVar func("func", kHighFloat_GrSLType, 0);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700591
egdaniel4ca2e602015-11-18 08:01:26 -0800592 fragBuilder->declAppend(edgeAlpha);
egdaniel4ca2e602015-11-18 08:01:26 -0800593 fragBuilder->declAppend(gF);
egdaniel4ca2e602015-11-18 08:01:26 -0800594 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000595
596 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700597 case kHairlineAA_GrProcessorEdgeType: {
Chris Daltonfebbffa2017-06-08 13:12:02 -0600598 fragBuilder->codeAppendf("%s = %s.x * %s.xy + %s.zw;",
599 gF.c_str(), v.fsIn(), gradCoeffs.fsIn(), gradCoeffs.fsIn());
egdaniel4ca2e602015-11-18 08:01:26 -0800600 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
601 func.c_str(), v.fsIn(), v.fsIn(),
602 v.fsIn(), v.fsIn(), v.fsIn());
603 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
Chris Daltonfebbffa2017-06-08 13:12:02 -0600604 fragBuilder->codeAppendf("%s = %s * inversesqrt(dot(%s, %s));",
605 edgeAlpha.c_str(), func.c_str(), gF.c_str(), gF.c_str());
egdaniel4ca2e602015-11-18 08:01:26 -0800606 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
607 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000608 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800609 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700610 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
611 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000612 break;
613 }
joshualittb0a8a372014-09-23 09:50:21 -0700614 case kFillAA_GrProcessorEdgeType: {
Chris Daltonfebbffa2017-06-08 13:12:02 -0600615 fragBuilder->codeAppendf("%s = %s.x * %s.xy + %s.zw;",
616 gF.c_str(), v.fsIn(), gradCoeffs.fsIn(), gradCoeffs.fsIn());
egdaniel4ca2e602015-11-18 08:01:26 -0800617 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
robertphillips96afa522015-12-09 07:54:24 -0800618 func.c_str(),
619 v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
Chris Daltonfebbffa2017-06-08 13:12:02 -0600620 fragBuilder->codeAppendf("%s = %s * inversesqrt(dot(%s, %s));",
621 edgeAlpha.c_str(), func.c_str(), gF.c_str(), gF.c_str());
Greg Daniel8199d942017-03-14 10:20:24 -0400622 fragBuilder->codeAppendf("%s = clamp(0.5 - %s, 0.0, 1.0);",
egdaniel4ca2e602015-11-18 08:01:26 -0800623 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000624 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800625 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700626 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
627 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000628 break;
629 }
joshualittb0a8a372014-09-23 09:50:21 -0700630 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800631 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
632 edgeAlpha.c_str(), v.fsIn(), v.fsIn(),
633 v.fsIn(), v.fsIn(), v.fsIn());
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400634 fragBuilder->codeAppendf("%s = half(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000635 break;
636 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000637 default:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400638 SK_ABORT("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000639 }
640
joshualitt2dd1ae02014-12-03 06:24:10 -0800641
Ethan Nicholas05d5a132017-09-15 11:42:17 -0400642 fragBuilder->codeAppendf("%s = highfloat4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000643}
644
robertphillips46d36f02015-01-18 08:14:14 -0800645void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500646 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700647 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800648 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700649 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitte578a952015-05-14 10:09:13 -0700650 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700651 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000652}
653
654//////////////////////////////////////////////////////////////////////////////
655
656GrCubicEffect::~GrCubicEffect() {}
657
Brian Salomon94efbf52016-11-29 13:43:05 -0500658void GrCubicEffect::getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700659 GrGLCubicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800660}
661
Brian Salomon94efbf52016-11-29 13:43:05 -0500662GrGLSLPrimitiveProcessor* GrCubicEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700663 return new GrGLCubicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000664}
665
Chris Daltonfebbffa2017-06-08 13:12:02 -0600666GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix, const SkMatrix&
667 devKLMMatrix, GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700668 : fColor(color)
669 , fViewMatrix(viewMatrix)
Chris Daltonfebbffa2017-06-08 13:12:02 -0600670 , fDevKLMMatrix(devKLMMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700671 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800672 this->initClassID<GrCubicEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700673 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
674 kHigh_GrSLPrecision);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000675}
676
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000677//////////////////////////////////////////////////////////////////////////////
678
joshualittb0a8a372014-09-23 09:50:21 -0700679GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000680
Hal Canary6f6961e2017-01-31 13:50:44 -0500681#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700682sk_sp<GrGeometryProcessor> GrCubicEffect::TestCreate(GrProcessorTestData* d) {
683 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000684 do {
joshualitt0067ff52015-07-08 14:26:19 -0700685 GrPrimitiveEdgeType edgeType =
686 static_cast<GrPrimitiveEdgeType>(
687 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
Brian Salomon9ae32a22017-01-25 14:58:24 -0500688 gp = GrCubicEffect::Make(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom),
Chris Daltonfebbffa2017-06-08 13:12:02 -0600689 GrTest::TestMatrix(d->fRandom), d->fRandom->nextBool(), edgeType,
690 *d->caps());
halcanary96fcdcc2015-08-27 07:41:13 -0700691 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700692 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000693}
Hal Canary6f6961e2017-01-31 13:50:44 -0500694#endif