blob: aa9a509887776848bef3e7e19c6cffe633e33638 [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
Brian Salomon1d816b92017-08-17 11:07:59 -040080 GrGLSLVertToFrag v(kVec4f_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
Brian Salomon1d816b92017-08-17 11:07:59 -0400105 // TODO: this precision check should actually be a check on the number of bits
106 // high and medium provide and the selection of the lowest level that suffices.
107 // Additionally we should assert that the upstream code only lets us get here if
108 // either high or medium provides the required number of bits.
109 GrSLPrecision precision = kHigh_GrSLPrecision;
110 const GrShaderCaps::PrecisionInfo& highP = args.fShaderCaps->getFloatShaderPrecisionInfo(
111 kFragment_GrShaderType,
112 kHigh_GrSLPrecision);
113 if (!highP.supported()) {
114 precision = kMedium_GrSLPrecision;
115 }
robertphillips2eb10092015-12-11 04:59:36 -0800116
Brian Salomon1d816b92017-08-17 11:07:59 -0400117 GrShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, precision);
118 GrShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, precision);
119 GrShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, precision);
120 GrShaderVar dfdx("dfdx", kFloat_GrSLType, 0, precision);
121 GrShaderVar dfdy("dfdy", kFloat_GrSLType, 0, precision);
122 GrShaderVar gF("gF", kVec2f_GrSLType, 0, precision);
123 GrShaderVar gFM("gFM", kFloat_GrSLType, 0, precision);
124 GrShaderVar func("func", kFloat_GrSLType, 0, precision);
robertphillips96afa522015-12-09 07:54:24 -0800125
126 fragBuilder->declAppend(edgeAlpha);
127 fragBuilder->declAppend(dklmdx);
128 fragBuilder->declAppend(dklmdy);
129 fragBuilder->declAppend(dfdx);
130 fragBuilder->declAppend(dfdy);
131 fragBuilder->declAppend(gF);
132 fragBuilder->declAppend(gFM);
133 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000134
135 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700136 case kHairlineAA_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800137 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
138 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
139 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
140 dfdx.c_str(),
141 v.fsIn(), dklmdx.c_str(),
142 v.fsIn(), dklmdx.c_str(),
143 v.fsIn(), dklmdx.c_str());
144 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
145 dfdy.c_str(),
146 v.fsIn(), dklmdy.c_str(),
147 v.fsIn(), dklmdy.c_str(),
148 v.fsIn(), dklmdy.c_str());
Brian Salomon1d816b92017-08-17 11:07:59 -0400149 fragBuilder->codeAppendf("%s = float2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
robertphillips96afa522015-12-09 07:54:24 -0800150 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
151 gFM.c_str(), gF.c_str(), gF.c_str());
152 fragBuilder->codeAppendf("%s = %s.x*%s.x - %s.y*%s.z;",
153 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
154 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
155 fragBuilder->codeAppendf("%s = %s / %s;",
156 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
157 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
158 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000159 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800160 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000161 break;
162 }
joshualittb0a8a372014-09-23 09:50:21 -0700163 case kFillAA_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800164 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
165 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
166 fragBuilder->codeAppendf("%s ="
167 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
168 dfdx.c_str(),
169 v.fsIn(), dklmdx.c_str(),
170 v.fsIn(), dklmdx.c_str(),
171 v.fsIn(), dklmdx.c_str());
172 fragBuilder->codeAppendf("%s ="
173 "2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
174 dfdy.c_str(),
175 v.fsIn(), dklmdy.c_str(),
176 v.fsIn(), dklmdy.c_str(),
177 v.fsIn(), dklmdy.c_str());
Brian Salomon1d816b92017-08-17 11:07:59 -0400178 fragBuilder->codeAppendf("%s = float2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
robertphillips96afa522015-12-09 07:54:24 -0800179 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
180 gFM.c_str(), gF.c_str(), gF.c_str());
181 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
182 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
183 fragBuilder->codeAppendf("%s = %s / %s;",
184 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
Greg Daniel8199d942017-03-14 10:20:24 -0400185 fragBuilder->codeAppendf("%s = clamp(0.5 - %s, 0.0, 1.0);",
robertphillips96afa522015-12-09 07:54:24 -0800186 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000187 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800188 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000189 break;
190 }
joshualittb0a8a372014-09-23 09:50:21 -0700191 case kFillBW_GrProcessorEdgeType: {
robertphillips96afa522015-12-09 07:54:24 -0800192 fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
193 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
Brian Salomon1d816b92017-08-17 11:07:59 -0400194 fragBuilder->codeAppendf("%s = float(%s < 0.0);",
robertphillips96afa522015-12-09 07:54:24 -0800195 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000196 break;
197 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000198 default:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400199 SK_ABORT("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000200 }
201
joshualittb8c241a2015-05-19 08:23:30 -0700202 // TODO should we really be doing this?
203 if (gp.coverageScale() != 0xff) {
joshualitt9b989322014-12-15 14:16:27 -0800204 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800205 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
Brian Salomon1d816b92017-08-17 11:07:59 -0400206 kFloat_GrSLType,
207 kHigh_GrSLPrecision,
cdalton5e58cee2016-02-11 12:49:47 -0800208 "Coverage",
209 &coverageScale);
Brian Salomon1d816b92017-08-17 11:07:59 -0400210 fragBuilder->codeAppendf("%s = float4(%s * %s);",
robertphillips96afa522015-12-09 07:54:24 -0800211 args.fOutputCoverage, coverageScale, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800212 } else {
Brian Salomon1d816b92017-08-17 11:07:59 -0400213 fragBuilder->codeAppendf("%s = float4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
joshualitt9b989322014-12-15 14:16:27 -0800214 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000215}
216
robertphillips46d36f02015-01-18 08:14:14 -0800217void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500218 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700219 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800220 const GrConicEffect& ce = gp.cast<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700221 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700222 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0;
223 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700224 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700225 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000226}
227
228//////////////////////////////////////////////////////////////////////////////
229
230GrConicEffect::~GrConicEffect() {}
231
Brian Salomon94efbf52016-11-29 13:43:05 -0500232void GrConicEffect::getGLSLProcessorKey(const GrShaderCaps& caps,
egdaniel57d3b032015-11-13 11:57:27 -0800233 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700234 GrGLConicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800235}
236
Brian Salomon94efbf52016-11-29 13:43:05 -0500237GrGLSLPrimitiveProcessor* GrConicEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700238 return new GrGLConicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000239}
240
joshualitt8059eb92014-12-29 15:10:07 -0800241GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700242 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
243 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700244 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700245 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700246 , fLocalMatrix(viewMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700247 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800248 , fCoverageScale(coverage)
249 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800250 this->initClassID<GrConicEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700251 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
252 kHigh_GrSLPrecision);
253 fInConicCoeffs = &this->addVertexAttrib("inConicCoeffs", kVec4f_GrVertexAttribType);
joshualitt9b989322014-12-15 14:16:27 -0800254}
255
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000256//////////////////////////////////////////////////////////////////////////////
257
joshualittb0a8a372014-09-23 09:50:21 -0700258GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000259
Hal Canary6f6961e2017-01-31 13:50:44 -0500260#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700261sk_sp<GrGeometryProcessor> GrConicEffect::TestCreate(GrProcessorTestData* d) {
262 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000263 do {
joshualitt0067ff52015-07-08 14:26:19 -0700264 GrPrimitiveEdgeType edgeType =
265 static_cast<GrPrimitiveEdgeType>(
266 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
bungeman06ca8ec2016-06-09 08:01:03 -0700267 gp = GrConicEffect::Make(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom),
Robert Phillips296b1cc2017-03-15 10:42:12 -0400268 edgeType, *d->caps(), GrTest::TestMatrix(d->fRandom),
Brian Salomon9ae32a22017-01-25 14:58:24 -0500269 d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700270 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700271 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000272}
Hal Canary6f6961e2017-01-31 13:50:44 -0500273#endif
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000274
275//////////////////////////////////////////////////////////////////////////////
276// Quad
277//////////////////////////////////////////////////////////////////////////////
278
egdaniele659a582015-11-13 09:55:43 -0800279class GrGLQuadEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000280public:
joshualitt465283c2015-09-11 08:19:35 -0700281 GrGLQuadEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000282
mtklein36352bf2015-03-25 18:17:31 -0700283 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000284
joshualitt87f48d92014-12-04 10:41:40 -0800285 static inline void GenKey(const GrGeometryProcessor&,
Brian Salomon94efbf52016-11-29 13:43:05 -0500286 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800287 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000288
bsalomona624bf32016-09-20 09:12:47 -0700289 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
290 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700291 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700292
293 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMatrix())) {
294 fViewMatrix = qe.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700295 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800296 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700297 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
298 }
joshualittee2af952014-12-30 09:04:15 -0800299
joshualittb8c241a2015-05-19 08:23:30 -0700300 if (qe.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700301 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700302 GrColorToRGBAFloat(qe.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800303 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700304 fColor = qe.color();
joshualitt9b989322014-12-15 14:16:27 -0800305 }
joshualittb8c241a2015-05-19 08:23:30 -0700306
307 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
308 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale()));
309 fCoverageScale = qe.coverageScale();
joshualitt9b989322014-12-15 14:16:27 -0800310 }
bsalomona624bf32016-09-20 09:12:47 -0700311 this->setTransformDataHelper(qe.localMatrix(), pdman, &transformIter);
joshualitte3ababe2015-05-15 07:56:07 -0700312 }
313
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000314private:
joshualitt5559ca22015-05-21 15:50:36 -0700315 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800316 GrColor fColor;
317 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700318 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800319 UniformHandle fColorUniform;
320 UniformHandle fCoverageScaleUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700321 UniformHandle fViewMatrixUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000322
egdaniele659a582015-11-13 09:55:43 -0800323 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000324};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000325
joshualitt465283c2015-09-11 08:19:35 -0700326GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor)
joshualitt5559ca22015-05-21 15:50:36 -0700327 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800328 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000329 fEdgeType = ce.getEdgeType();
330}
331
robertphillips46d36f02015-01-18 08:14:14 -0800332void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800333 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800334 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800335 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800336 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800337
joshualittabb52a12015-01-13 15:02:10 -0800338 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800339 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800340
Brian Salomon1d816b92017-08-17 11:07:59 -0400341 GrGLSLVertToFrag v(kVec4f_GrSLType);
egdaniel0eafe792015-11-20 14:01:22 -0800342 varyingHandler->addVarying("HairQuadEdge", &v);
egdaniel4ca2e602015-11-18 08:01:26 -0800343 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000344
cdalton85285412016-02-18 12:37:07 -0800345 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800346 // Setup pass through color
Brian Salomonbfd51832017-01-04 13:22:08 -0500347 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualitt9b989322014-12-15 14:16:27 -0800348
joshualittabb52a12015-01-13 15:02:10 -0800349 // Setup position
Brian Salomon7f235432017-08-16 09:41:48 -0400350 this->writeOutputPosition(vertBuilder,
351 uniformHandler,
352 gpArgs,
353 gp.inPosition()->fName,
354 gp.viewMatrix(),
355 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800356
joshualittabb52a12015-01-13 15:02:10 -0800357 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800358 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800359 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800360 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800361 gpArgs->fPositionVar,
362 gp.inPosition()->fName,
363 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700364 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800365
Brian Salomon1d816b92017-08-17 11:07:59 -0400366 fragBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700367
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000368 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700369 case kHairlineAA_GrProcessorEdgeType: {
Brian Salomon1d816b92017-08-17 11:07:59 -0400370 fragBuilder->codeAppendf("float2 duvdx = dFdx(%s.xy);", v.fsIn());
371 fragBuilder->codeAppendf("float2 duvdy = dFdy(%s.xy);", v.fsIn());
372 fragBuilder->codeAppendf("float2 gF = float2(2.0 * %s.x * duvdx.x - duvdx.y,"
egdaniel4ca2e602015-11-18 08:01:26 -0800373 " 2.0 * %s.x * duvdy.x - duvdy.y);",
374 v.fsIn(), v.fsIn());
375 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
376 v.fsIn(), v.fsIn(), v.fsIn());
377 fragBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
378 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000379 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800380 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000381 break;
382 }
joshualittb0a8a372014-09-23 09:50:21 -0700383 case kFillAA_GrProcessorEdgeType: {
Brian Salomon1d816b92017-08-17 11:07:59 -0400384 fragBuilder->codeAppendf("float2 duvdx = dFdx(%s.xy);", v.fsIn());
385 fragBuilder->codeAppendf("float2 duvdy = dFdy(%s.xy);", v.fsIn());
386 fragBuilder->codeAppendf("float2 gF = float2(2.0 * %s.x * duvdx.x - duvdx.y,"
egdaniel4ca2e602015-11-18 08:01:26 -0800387 " 2.0 * %s.x * duvdy.x - duvdy.y);",
388 v.fsIn(), v.fsIn());
389 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
390 v.fsIn(), v.fsIn(), v.fsIn());
391 fragBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
Greg Daniel8199d942017-03-14 10:20:24 -0400392 fragBuilder->codeAppend("edgeAlpha = clamp(0.5 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000393 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800394 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000395 break;
396 }
joshualittb0a8a372014-09-23 09:50:21 -0700397 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800398 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
399 v.fsIn(), v.fsIn(), v.fsIn());
Brian Salomon1d816b92017-08-17 11:07:59 -0400400 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000401 break;
402 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000403 default:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400404 SK_ABORT("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000405 }
406
joshualittb8c241a2015-05-19 08:23:30 -0700407 if (0xff != gp.coverageScale()) {
joshualitt9b989322014-12-15 14:16:27 -0800408 const char* coverageScale;
cdalton5e58cee2016-02-11 12:49:47 -0800409 fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
Brian Salomon1d816b92017-08-17 11:07:59 -0400410 kFloat_GrSLType,
411 kDefault_GrSLPrecision,
cdalton5e58cee2016-02-11 12:49:47 -0800412 "Coverage",
413 &coverageScale);
Brian Salomon1d816b92017-08-17 11:07:59 -0400414 fragBuilder->codeAppendf("%s = float4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
joshualitt9b989322014-12-15 14:16:27 -0800415 } else {
Brian Salomon1d816b92017-08-17 11:07:59 -0400416 fragBuilder->codeAppendf("%s = float4(edgeAlpha);", args.fOutputCoverage);
joshualitt9b989322014-12-15 14:16:27 -0800417 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000418}
419
robertphillips46d36f02015-01-18 08:14:14 -0800420void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500421 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700422 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800423 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700424 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualittb8c241a2015-05-19 08:23:30 -0700425 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
426 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0x10 : 0x0;
joshualitte578a952015-05-14 10:09:13 -0700427 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700428 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000429}
430
431//////////////////////////////////////////////////////////////////////////////
432
433GrQuadEffect::~GrQuadEffect() {}
434
Brian Salomon94efbf52016-11-29 13:43:05 -0500435void GrQuadEffect::getGLSLProcessorKey(const GrShaderCaps& caps,
egdaniel57d3b032015-11-13 11:57:27 -0800436 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700437 GrGLQuadEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800438}
439
Brian Salomon94efbf52016-11-29 13:43:05 -0500440GrGLSLPrimitiveProcessor* GrQuadEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700441 return new GrGLQuadEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000442}
443
joshualitt8059eb92014-12-29 15:10:07 -0800444GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t coverage,
joshualittb8c241a2015-05-19 08:23:30 -0700445 GrPrimitiveEdgeType edgeType, const SkMatrix& localMatrix,
446 bool usesLocalCoords)
joshualitte3ababe2015-05-15 07:56:07 -0700447 : fColor(color)
joshualitte578a952015-05-14 10:09:13 -0700448 , fViewMatrix(viewMatrix)
joshualitte3ababe2015-05-15 07:56:07 -0700449 , fLocalMatrix(localMatrix)
joshualittb8c241a2015-05-19 08:23:30 -0700450 , fUsesLocalCoords(usesLocalCoords)
joshualitt8059eb92014-12-29 15:10:07 -0800451 , fCoverageScale(coverage)
452 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800453 this->initClassID<GrQuadEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700454 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
455 kHigh_GrSLPrecision);
456 fInHairQuadEdge = &this->addVertexAttrib("inHairQuadEdge", kVec4f_GrVertexAttribType);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000457}
458
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000459//////////////////////////////////////////////////////////////////////////////
460
joshualittb0a8a372014-09-23 09:50:21 -0700461GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000462
Hal Canary6f6961e2017-01-31 13:50:44 -0500463#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700464sk_sp<GrGeometryProcessor> GrQuadEffect::TestCreate(GrProcessorTestData* d) {
465 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000466 do {
joshualittb0a8a372014-09-23 09:50:21 -0700467 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
joshualitt0067ff52015-07-08 14:26:19 -0700468 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
Brian Salomon9ae32a22017-01-25 14:58:24 -0500469 gp = GrQuadEffect::Make(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom), edgeType,
Robert Phillips296b1cc2017-03-15 10:42:12 -0400470 *d->caps(), GrTest::TestMatrix(d->fRandom),
bungeman06ca8ec2016-06-09 08:01:03 -0700471 d->fRandom->nextBool());
halcanary96fcdcc2015-08-27 07:41:13 -0700472 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700473 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000474}
Hal Canary6f6961e2017-01-31 13:50:44 -0500475#endif
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000476
477//////////////////////////////////////////////////////////////////////////////
478// Cubic
479//////////////////////////////////////////////////////////////////////////////
480
egdaniele659a582015-11-13 09:55:43 -0800481class GrGLCubicEffect : public GrGLSLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000482public:
joshualitt465283c2015-09-11 08:19:35 -0700483 GrGLCubicEffect(const GrGeometryProcessor&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000484
mtklein36352bf2015-03-25 18:17:31 -0700485 void onEmitCode(EmitArgs&, GrGPArgs*) override;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000486
joshualitt87f48d92014-12-04 10:41:40 -0800487 static inline void GenKey(const GrGeometryProcessor&,
Brian Salomon94efbf52016-11-29 13:43:05 -0500488 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800489 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000490
bsalomona624bf32016-09-20 09:12:47 -0700491 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc,
492 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700493 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
joshualitt5559ca22015-05-21 15:50:36 -0700494
495 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) {
496 fViewMatrix = ce.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700497 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800498 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700499 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
500 }
joshualittee2af952014-12-30 09:04:15 -0800501
Chris Daltonfebbffa2017-06-08 13:12:02 -0600502 if (!fDevKLMMatrix.cheapEqualTo(ce.devKLMMatrix())) {
503 fDevKLMMatrix = ce.devKLMMatrix();
504 float devKLMMatrix[3 * 3];
505 GrGLSLGetMatrix<3>(devKLMMatrix, fDevKLMMatrix);
506 pdman.setMatrix3f(fDevKLMUniform, devKLMMatrix);
507 }
508
joshualittb8c241a2015-05-19 08:23:30 -0700509 if (ce.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -0700510 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700511 GrColorToRGBAFloat(ce.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800512 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700513 fColor = ce.color();
joshualitt9b989322014-12-15 14:16:27 -0800514 }
Chris Daltonfebbffa2017-06-08 13:12:02 -0600515
bsalomona624bf32016-09-20 09:12:47 -0700516 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
joshualitt9b989322014-12-15 14:16:27 -0800517 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000518
519private:
joshualitt5559ca22015-05-21 15:50:36 -0700520 SkMatrix fViewMatrix;
Chris Daltonfebbffa2017-06-08 13:12:02 -0600521 SkMatrix fDevKLMMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800522 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700523 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800524 UniformHandle fColorUniform;
joshualitt5559ca22015-05-21 15:50:36 -0700525 UniformHandle fViewMatrixUniform;
Chris Daltonfebbffa2017-06-08 13:12:02 -0600526 UniformHandle fDevKLMUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000527
egdaniele659a582015-11-13 09:55:43 -0800528 typedef GrGLSLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000529};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000530
joshualitt465283c2015-09-11 08:19:35 -0700531GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor)
Robert Phillips888e9f22017-06-12 07:50:05 -0400532 : fViewMatrix(SkMatrix::InvalidMatrix())
533 , fDevKLMMatrix(SkMatrix::InvalidMatrix())
534 , fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700535 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000536 fEdgeType = ce.getEdgeType();
537}
538
robertphillips46d36f02015-01-18 08:14:14 -0800539void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
egdaniel4ca2e602015-11-18 08:01:26 -0800540 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
joshualitt2dd1ae02014-12-03 06:24:10 -0800541 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
egdaniel0eafe792015-11-20 14:01:22 -0800542 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800543 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt2dd1ae02014-12-03 06:24:10 -0800544
joshualittabb52a12015-01-13 15:02:10 -0800545 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -0800546 varyingHandler->emitAttributes(gp);
joshualittabb52a12015-01-13 15:02:10 -0800547
cdalton85285412016-02-18 12:37:07 -0800548 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt9b989322014-12-15 14:16:27 -0800549 // Setup pass through color
joshualittb8c241a2015-05-19 08:23:30 -0700550 if (!gp.colorIgnored()) {
egdaniel7ea439b2015-12-03 09:20:44 -0800551 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700552 }
joshualitt9b989322014-12-15 14:16:27 -0800553
joshualittabb52a12015-01-13 15:02:10 -0800554 // Setup position
Brian Salomon7f235432017-08-16 09:41:48 -0400555 this->writeOutputPosition(vertBuilder,
556 uniformHandler,
557 gpArgs,
558 gp.inPosition()->fName,
559 gp.viewMatrix(),
560 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800561
Chris Daltonfebbffa2017-06-08 13:12:02 -0600562 // Setup KLM
563 const char* devkLMMatrixName;
Brian Salomon1d816b92017-08-17 11:07:59 -0400564 fDevKLMUniform = uniformHandler->addUniform(kVertex_GrShaderFlag, kMat33f_GrSLType,
565 kHigh_GrSLPrecision, "KLM", &devkLMMatrixName);
566 GrGLSLVertToFrag v(kVec3f_GrSLType);
Chris Daltonfebbffa2017-06-08 13:12:02 -0600567 varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
Brian Salomon1d816b92017-08-17 11:07:59 -0400568 vertBuilder->codeAppendf("%s = %s * float3(%s, 1);",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600569 v.vsOut(), devkLMMatrixName, gpArgs->fPositionVar.c_str());
570
571
Brian Salomon1d816b92017-08-17 11:07:59 -0400572 GrGLSLVertToFrag gradCoeffs(kVec4f_GrSLType);
Chris Daltonfebbffa2017-06-08 13:12:02 -0600573 if (kFillAA_GrProcessorEdgeType == fEdgeType || kHairlineAA_GrProcessorEdgeType == fEdgeType) {
574 varyingHandler->addVarying("GradCoeffs", &gradCoeffs, kHigh_GrSLPrecision);
Brian Salomon1d816b92017-08-17 11:07:59 -0400575 vertBuilder->codeAppendf("highp float k = %s[0], l = %s[1], m = %s[2];",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600576 v.vsOut(), v.vsOut(), v.vsOut());
Brian Salomon1d816b92017-08-17 11:07:59 -0400577 vertBuilder->codeAppendf("highp float2 gk = float2(%s[0][0], %s[1][0]), "
578 "gl = float2(%s[0][1], %s[1][1]), "
579 "gm = float2(%s[0][2], %s[1][2]);",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600580 devkLMMatrixName, devkLMMatrixName, devkLMMatrixName,
581 devkLMMatrixName, devkLMMatrixName, devkLMMatrixName);
Brian Salomon1d816b92017-08-17 11:07:59 -0400582 vertBuilder->codeAppendf("%s = float4(3 * k * gk, -m * gl - l * gm);",
Chris Daltonfebbffa2017-06-08 13:12:02 -0600583 gradCoeffs.vsOut());
584 }
585
joshualittabb52a12015-01-13 15:02:10 -0800586 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800587 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800588 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800589 uniformHandler,
egdaniel4ca2e602015-11-18 08:01:26 -0800590 gpArgs->fPositionVar,
591 gp.inPosition()->fName,
bsalomona624bf32016-09-20 09:12:47 -0700592 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800593
egdaniel9bd5bbf2014-08-29 11:12:30 -0700594
Brian Salomon1d816b92017-08-17 11:07:59 -0400595 GrShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
596 GrShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
597 GrShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700598
egdaniel4ca2e602015-11-18 08:01:26 -0800599 fragBuilder->declAppend(edgeAlpha);
egdaniel4ca2e602015-11-18 08:01:26 -0800600 fragBuilder->declAppend(gF);
egdaniel4ca2e602015-11-18 08:01:26 -0800601 fragBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000602
603 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700604 case kHairlineAA_GrProcessorEdgeType: {
Chris Daltonfebbffa2017-06-08 13:12:02 -0600605 fragBuilder->codeAppendf("%s = %s.x * %s.xy + %s.zw;",
606 gF.c_str(), v.fsIn(), gradCoeffs.fsIn(), gradCoeffs.fsIn());
egdaniel4ca2e602015-11-18 08:01:26 -0800607 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
608 func.c_str(), v.fsIn(), v.fsIn(),
609 v.fsIn(), v.fsIn(), v.fsIn());
610 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
Chris Daltonfebbffa2017-06-08 13:12:02 -0600611 fragBuilder->codeAppendf("%s = %s * inversesqrt(dot(%s, %s));",
612 edgeAlpha.c_str(), func.c_str(), gF.c_str(), gF.c_str());
egdaniel4ca2e602015-11-18 08:01:26 -0800613 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
614 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000615 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800616 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700617 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
618 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000619 break;
620 }
joshualittb0a8a372014-09-23 09:50:21 -0700621 case kFillAA_GrProcessorEdgeType: {
Chris Daltonfebbffa2017-06-08 13:12:02 -0600622 fragBuilder->codeAppendf("%s = %s.x * %s.xy + %s.zw;",
623 gF.c_str(), v.fsIn(), gradCoeffs.fsIn(), gradCoeffs.fsIn());
egdaniel4ca2e602015-11-18 08:01:26 -0800624 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
robertphillips96afa522015-12-09 07:54:24 -0800625 func.c_str(),
626 v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
Chris Daltonfebbffa2017-06-08 13:12:02 -0600627 fragBuilder->codeAppendf("%s = %s * inversesqrt(dot(%s, %s));",
628 edgeAlpha.c_str(), func.c_str(), gF.c_str(), gF.c_str());
Greg Daniel8199d942017-03-14 10:20:24 -0400629 fragBuilder->codeAppendf("%s = clamp(0.5 - %s, 0.0, 1.0);",
egdaniel4ca2e602015-11-18 08:01:26 -0800630 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000631 // Add line below for smooth cubic ramp
egdaniel4ca2e602015-11-18 08:01:26 -0800632 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
egdaniel9bd5bbf2014-08-29 11:12:30 -0700633 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
634 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000635 break;
636 }
joshualittb0a8a372014-09-23 09:50:21 -0700637 case kFillBW_GrProcessorEdgeType: {
egdaniel4ca2e602015-11-18 08:01:26 -0800638 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
639 edgeAlpha.c_str(), v.fsIn(), v.fsIn(),
640 v.fsIn(), v.fsIn(), v.fsIn());
Brian Salomon1d816b92017-08-17 11:07:59 -0400641 fragBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000642 break;
643 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000644 default:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400645 SK_ABORT("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000646 }
647
joshualitt2dd1ae02014-12-03 06:24:10 -0800648
Brian Salomon1d816b92017-08-17 11:07:59 -0400649 fragBuilder->codeAppendf("%s = float4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000650}
651
robertphillips46d36f02015-01-18 08:14:14 -0800652void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500653 const GrShaderCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700654 GrProcessorKeyBuilder* b) {
robertphillips46d36f02015-01-18 08:14:14 -0800655 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700656 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitte578a952015-05-14 10:09:13 -0700657 key |= ComputePosKey(ce.viewMatrix()) << 5;
bsalomon63e99f72014-07-21 08:03:14 -0700658 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000659}
660
661//////////////////////////////////////////////////////////////////////////////
662
663GrCubicEffect::~GrCubicEffect() {}
664
Brian Salomon94efbf52016-11-29 13:43:05 -0500665void GrCubicEffect::getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700666 GrGLCubicEffect::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800667}
668
Brian Salomon94efbf52016-11-29 13:43:05 -0500669GrGLSLPrimitiveProcessor* GrCubicEffect::createGLSLInstance(const GrShaderCaps&) const {
joshualitt465283c2015-09-11 08:19:35 -0700670 return new GrGLCubicEffect(*this);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000671}
672
Chris Daltonfebbffa2017-06-08 13:12:02 -0600673GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix, const SkMatrix&
674 devKLMMatrix, GrPrimitiveEdgeType edgeType)
joshualitte578a952015-05-14 10:09:13 -0700675 : fColor(color)
676 , fViewMatrix(viewMatrix)
Chris Daltonfebbffa2017-06-08 13:12:02 -0600677 , fDevKLMMatrix(devKLMMatrix)
joshualitt88c23fc2015-05-13 14:18:07 -0700678 , fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800679 this->initClassID<GrCubicEffect>();
bsalomon6cb807b2016-08-17 11:33:39 -0700680 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
681 kHigh_GrSLPrecision);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000682}
683
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000684//////////////////////////////////////////////////////////////////////////////
685
joshualittb0a8a372014-09-23 09:50:21 -0700686GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000687
Hal Canary6f6961e2017-01-31 13:50:44 -0500688#if GR_TEST_UTILS
bungeman06ca8ec2016-06-09 08:01:03 -0700689sk_sp<GrGeometryProcessor> GrCubicEffect::TestCreate(GrProcessorTestData* d) {
690 sk_sp<GrGeometryProcessor> gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000691 do {
joshualitt0067ff52015-07-08 14:26:19 -0700692 GrPrimitiveEdgeType edgeType =
693 static_cast<GrPrimitiveEdgeType>(
694 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
Brian Salomon9ae32a22017-01-25 14:58:24 -0500695 gp = GrCubicEffect::Make(GrRandomColor(d->fRandom), GrTest::TestMatrix(d->fRandom),
Chris Daltonfebbffa2017-06-08 13:12:02 -0600696 GrTest::TestMatrix(d->fRandom), d->fRandom->nextBool(), edgeType,
697 *d->caps());
halcanary96fcdcc2015-08-27 07:41:13 -0700698 } while (nullptr == gp);
joshualittb0a8a372014-09-23 09:50:21 -0700699 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000700}
Hal Canary6f6961e2017-01-31 13:50:44 -0500701#endif