blob: be1fef76afd9fca6938e1f288a392edfc4883f6c [file] [log] [blame]
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrBezierEffect.h"
9
joshualittb0a8a372014-09-23 09:50:21 -070010#include "gl/GrGLProcessor.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000011#include "gl/GrGLSL.h"
joshualitt249af152014-09-15 11:41:13 -070012#include "gl/GrGLGeometryProcessor.h"
joshualitteb2a6762014-12-04 11:35:33 -080013#include "gl/builders/GrGLProgramBuilder.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000014
joshualitt9b989322014-12-15 14:16:27 -080015struct ConicBatchTracker {
16 GrGPInput fInputColorType;
17 GrColor fColor;
18 uint8_t fCoverageScale;
19};
20
joshualitt249af152014-09-15 11:41:13 -070021class GrGLConicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000022public:
joshualitteb2a6762014-12-04 11:35:33 -080023 GrGLConicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -080024 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000025
joshualittc369e7c2014-10-22 10:56:26 -070026 virtual void emitCode(const EmitArgs&) SK_OVERRIDE;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000027
joshualitt87f48d92014-12-04 10:41:40 -080028 static inline void GenKey(const GrGeometryProcessor&,
29 const GrBatchTracker&,
30 const GrGLCaps&,
31 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000032
joshualitt9b989322014-12-15 14:16:27 -080033 virtual void setData(const GrGLProgramDataManager& pdman,
34 const GrPrimitiveProcessor&,
35 const GrBatchTracker& bt) SK_OVERRIDE {
36 const ConicBatchTracker& local = bt.cast<ConicBatchTracker>();
37 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
38 GrGLfloat c[4];
39 GrColorToRGBAFloat(local.fColor, c);
40 pdman.set4fv(fColorUniform, 1, c);
41 fColor = local.fColor;
42 }
43 if (0xff != local.fCoverageScale && fCoverageScale != local.fCoverageScale) {
44 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale));
45 fCoverageScale = local.fCoverageScale;
46 }
47 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000048
49private:
joshualitt9b989322014-12-15 14:16:27 -080050 GrColor fColor;
51 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -070052 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -080053 UniformHandle fColorUniform;
54 UniformHandle fCoverageScaleUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000055
joshualitt249af152014-09-15 11:41:13 -070056 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000057};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +000058
joshualitteb2a6762014-12-04 11:35:33 -080059GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -080060 const GrBatchTracker& bt)
61 : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -080062 const GrConicEffect& ce = processor.cast<GrConicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000063 fEdgeType = ce.getEdgeType();
64}
65
joshualittc369e7c2014-10-22 10:56:26 -070066void GrGLConicEffect::emitCode(const EmitArgs& args) {
joshualitt9b989322014-12-15 14:16:27 -080067 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -080068 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
69 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>();
joshualitt9b989322014-12-15 14:16:27 -080070 const ConicBatchTracker& local = args.fBT.cast<ConicBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -080071
joshualitt74077b92014-10-24 11:26:03 -070072 GrGLVertToFrag v(kVec4f_GrSLType);
73 args.fPB->addVarying("ConicCoeffs", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -080074 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000075
joshualitt9b989322014-12-15 14:16:27 -080076 // Setup pass through color
77 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
78 &fColorUniform);
79
joshualitt2dd1ae02014-12-03 06:24:10 -080080 // setup coord outputs
81 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), gp.inPosition()->fName);
82 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), gp.inPosition()->fName);
joshualitt30ba4362014-08-21 20:18:45 -070083
joshualitt4973d9d2014-11-08 09:24:25 -080084 // setup position varying
85 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), vsBuilder->uViewM(),
joshualitt2dd1ae02014-12-03 06:24:10 -080086 gp.inPosition()->fName);
joshualitt4973d9d2014-11-08 09:24:25 -080087
joshualittc369e7c2014-10-22 10:56:26 -070088 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -070089 fsBuilder->codeAppend("float edgeAlpha;");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000090
91 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -070092 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -070093 SkAssertResult(fsBuilder->enableFeature(
94 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -070095 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
96 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -070097 fsBuilder->codeAppendf("float dfdx ="
98 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -070099 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700100 fsBuilder->codeAppendf("float dfdy ="
101 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700102 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700103 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
104 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700105 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn(), v.fsIn(),
106 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700107 fsBuilder->codeAppend("func = abs(func);");
108 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
109 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000110 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700111 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000112 break;
113 }
joshualittb0a8a372014-09-23 09:50:21 -0700114 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700115 SkAssertResult(fsBuilder->enableFeature(
116 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700117 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
118 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700119 fsBuilder->codeAppendf("float dfdx ="
120 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
joshualitt74077b92014-10-24 11:26:03 -0700121 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700122 fsBuilder->codeAppendf("float dfdy ="
123 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
joshualitt74077b92014-10-24 11:26:03 -0700124 v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700125 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
126 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
joshualitt74077b92014-10-24 11:26:03 -0700127 fsBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
128 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700129 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
130 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000131 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700132 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000133 break;
134 }
joshualittb0a8a372014-09-23 09:50:21 -0700135 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700136 fsBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
137 v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700138 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000139 break;
140 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000141 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000142 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000143 }
144
joshualitt9b989322014-12-15 14:16:27 -0800145 if (0xff != local.fCoverageScale) {
146 const char* coverageScale;
147 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
148 kFloat_GrSLType,
149 kDefault_GrSLPrecision,
150 "Coverage",
151 &coverageScale);
152 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
153 } else {
154 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
155 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000156}
157
joshualitt87f48d92014-12-04 10:41:40 -0800158void GrGLConicEffect::GenKey(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800159 const GrBatchTracker& bt,
joshualitt87f48d92014-12-04 10:41:40 -0800160 const GrGLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700161 GrProcessorKeyBuilder* b) {
162 const GrConicEffect& ce = processor.cast<GrConicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800163 const ConicBatchTracker& local = bt.cast<ConicBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700164 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800165 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0;
166 key |= 0xff != local.fCoverageScale ? 0x8 : 0x0;
bsalomon63e99f72014-07-21 08:03:14 -0700167 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000168}
169
170//////////////////////////////////////////////////////////////////////////////
171
172GrConicEffect::~GrConicEffect() {}
173
joshualitteb2a6762014-12-04 11:35:33 -0800174void GrConicEffect::getGLProcessorKey(const GrBatchTracker& bt,
175 const GrGLCaps& caps,
176 GrProcessorKeyBuilder* b) const {
177 GrGLConicEffect::GenKey(*this, bt, caps, b);
178}
179
180GrGLGeometryProcessor* GrConicEffect::createGLInstance(const GrBatchTracker& bt) const {
181 return SkNEW_ARGS(GrGLConicEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000182}
183
joshualitt2e3b3e32014-12-09 13:31:14 -0800184GrConicEffect::GrConicEffect(GrColor color, uint8_t coverage, GrPrimitiveEdgeType edgeType)
joshualitt9b989322014-12-15 14:16:27 -0800185 : INHERITED(color, false), fCoverageScale(coverage), fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800186 this->initClassID<GrConicEffect>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800187 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
188 fInConicCoeffs = &this->addVertexAttrib(GrAttribute("inConicCoeffs",
189 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000190}
191
bsalomon0e08fc12014-10-15 08:19:04 -0700192bool GrConicEffect::onIsEqual(const GrGeometryProcessor& other) const {
joshualitt49586be2014-09-16 08:21:41 -0700193 const GrConicEffect& ce = other.cast<GrConicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000194 return (ce.fEdgeType == fEdgeType);
195}
196
joshualitt9b989322014-12-15 14:16:27 -0800197void GrConicEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const {
198 ConicBatchTracker* local = bt->cast<ConicBatchTracker>();
199 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
200 local->fCoverageScale = fCoverageScale;
201}
202
203bool GrConicEffect::onCanMakeEqual(const GrBatchTracker& m, const GrBatchTracker& t) const {
204 const ConicBatchTracker& mine = m.cast<ConicBatchTracker>();
205 const ConicBatchTracker& theirs = t.cast<ConicBatchTracker>();
206 return CanCombineOutput(mine.fInputColorType, mine.fColor,
207 theirs.fInputColorType, theirs.fColor) &&
208 mine.fCoverageScale == theirs.fCoverageScale;
209}
210
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000211//////////////////////////////////////////////////////////////////////////////
212
joshualittb0a8a372014-09-23 09:50:21 -0700213GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000214
joshualittb0a8a372014-09-23 09:50:21 -0700215GrGeometryProcessor* GrConicEffect::TestCreate(SkRandom* random,
216 GrContext*,
217 const GrDrawTargetCaps& caps,
218 GrTexture*[]) {
219 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000220 do {
joshualittb0a8a372014-09-23 09:50:21 -0700221 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
222 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt2e3b3e32014-12-09 13:31:14 -0800223 gp = GrConicEffect::Create(GrRandomColor(random), edgeType, caps);
joshualittb0a8a372014-09-23 09:50:21 -0700224 } while (NULL == gp);
225 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000226}
227
228//////////////////////////////////////////////////////////////////////////////
229// Quad
230//////////////////////////////////////////////////////////////////////////////
231
joshualitt9b989322014-12-15 14:16:27 -0800232struct QuadBatchTracker {
233 GrGPInput fInputColorType;
234 GrColor fColor;
235 uint8_t fCoverageScale;
236};
237
joshualitt249af152014-09-15 11:41:13 -0700238class GrGLQuadEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000239public:
joshualitteb2a6762014-12-04 11:35:33 -0800240 GrGLQuadEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800241 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000242
joshualittc369e7c2014-10-22 10:56:26 -0700243 virtual void emitCode(const EmitArgs&) SK_OVERRIDE;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000244
joshualitt87f48d92014-12-04 10:41:40 -0800245 static inline void GenKey(const GrGeometryProcessor&,
246 const GrBatchTracker&,
247 const GrGLCaps&,
248 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000249
joshualitt9b989322014-12-15 14:16:27 -0800250 virtual void setData(const GrGLProgramDataManager& pdman,
251 const GrPrimitiveProcessor&,
252 const GrBatchTracker& bt) SK_OVERRIDE {
253 const QuadBatchTracker& local = bt.cast<QuadBatchTracker>();
254 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
255 GrGLfloat c[4];
256 GrColorToRGBAFloat(local.fColor, c);
257 pdman.set4fv(fColorUniform, 1, c);
258 fColor = local.fColor;
259 }
260 if (0xff != local.fCoverageScale && local.fCoverageScale != fCoverageScale) {
261 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale));
262 fCoverageScale = local.fCoverageScale;
263 }
264 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000265
266private:
joshualitt9b989322014-12-15 14:16:27 -0800267 GrColor fColor;
268 uint8_t fCoverageScale;
joshualittb0a8a372014-09-23 09:50:21 -0700269 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800270 UniformHandle fColorUniform;
271 UniformHandle fCoverageScaleUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000272
joshualitt249af152014-09-15 11:41:13 -0700273 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000274};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000275
joshualitteb2a6762014-12-04 11:35:33 -0800276GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800277 const GrBatchTracker& bt)
278 : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) {
joshualitt87f48d92014-12-04 10:41:40 -0800279 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000280 fEdgeType = ce.getEdgeType();
281}
282
joshualittc369e7c2014-10-22 10:56:26 -0700283void GrGLQuadEffect::emitCode(const EmitArgs& args) {
joshualitt9b989322014-12-15 14:16:27 -0800284 GrGLGPBuilder* pb = args.fPB;
joshualitt2dd1ae02014-12-03 06:24:10 -0800285 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
286 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800287 const QuadBatchTracker& local = args.fBT.cast<QuadBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800288
joshualitt74077b92014-10-24 11:26:03 -0700289 GrGLVertToFrag v(kVec4f_GrSLType);
290 args.fPB->addVarying("HairQuadEdge", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -0800291 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000292
joshualitt9b989322014-12-15 14:16:27 -0800293 // Setup pass through color
294 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
295 &fColorUniform);
296
joshualitt2dd1ae02014-12-03 06:24:10 -0800297 // setup coord outputs
298 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), gp.inPosition()->fName);
299 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), gp.inPosition()->fName);
joshualitt30ba4362014-08-21 20:18:45 -0700300
joshualitt4973d9d2014-11-08 09:24:25 -0800301 // setup position varying
302 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), vsBuilder->uViewM(),
joshualitt2dd1ae02014-12-03 06:24:10 -0800303 gp.inPosition()->fName);
joshualitt4973d9d2014-11-08 09:24:25 -0800304
joshualittc369e7c2014-10-22 10:56:26 -0700305 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -0700306 fsBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700307
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000308 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700309 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700310 SkAssertResult(fsBuilder->enableFeature(
311 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700312 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
313 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700314 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
315 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700316 v.fsIn(), v.fsIn());
317 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700318 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
319 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000320 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700321 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000322 break;
323 }
joshualittb0a8a372014-09-23 09:50:21 -0700324 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700325 SkAssertResult(fsBuilder->enableFeature(
326 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700327 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
328 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700329 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
330 " 2.0 * %s.x * duvdy.x - duvdy.y);",
joshualitt74077b92014-10-24 11:26:03 -0700331 v.fsIn(), v.fsIn());
332 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700333 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
334 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000335 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700336 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000337 break;
338 }
joshualittb0a8a372014-09-23 09:50:21 -0700339 case kFillBW_GrProcessorEdgeType: {
joshualitt74077b92014-10-24 11:26:03 -0700340 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn(), v.fsIn(), v.fsIn());
egdanielb2f94d12014-08-29 10:08:36 -0700341 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000342 break;
343 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000344 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000345 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000346 }
347
joshualitt9b989322014-12-15 14:16:27 -0800348 if (0xff != local.fCoverageScale) {
349 const char* coverageScale;
350 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
351 kFloat_GrSLType,
352 kDefault_GrSLPrecision,
353 "Coverage",
354 &coverageScale);
355 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
356 } else {
357 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
358 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000359}
360
joshualitt87f48d92014-12-04 10:41:40 -0800361void GrGLQuadEffect::GenKey(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800362 const GrBatchTracker& bt,
joshualitt87f48d92014-12-04 10:41:40 -0800363 const GrGLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700364 GrProcessorKeyBuilder* b) {
365 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800366 const QuadBatchTracker& local = bt.cast<QuadBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700367 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800368 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0;
369 key |= 0xff != local.fCoverageScale ? 0x8 : 0x0;
bsalomon63e99f72014-07-21 08:03:14 -0700370 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000371}
372
373//////////////////////////////////////////////////////////////////////////////
374
375GrQuadEffect::~GrQuadEffect() {}
376
joshualitteb2a6762014-12-04 11:35:33 -0800377void GrQuadEffect::getGLProcessorKey(const GrBatchTracker& bt,
378 const GrGLCaps& caps,
379 GrProcessorKeyBuilder* b) const {
380 GrGLQuadEffect::GenKey(*this, bt, caps, b);
381}
382
383GrGLGeometryProcessor* GrQuadEffect::createGLInstance(const GrBatchTracker& bt) const {
384 return SkNEW_ARGS(GrGLQuadEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000385}
386
joshualitt2e3b3e32014-12-09 13:31:14 -0800387GrQuadEffect::GrQuadEffect(GrColor color, uint8_t coverage, GrPrimitiveEdgeType edgeType)
joshualitt9b989322014-12-15 14:16:27 -0800388 : INHERITED(color, false), fCoverageScale(coverage), fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800389 this->initClassID<GrQuadEffect>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800390 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
391 fInHairQuadEdge = &this->addVertexAttrib(GrAttribute("inHairQuadEdge",
392 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000393}
394
bsalomon0e08fc12014-10-15 08:19:04 -0700395bool GrQuadEffect::onIsEqual(const GrGeometryProcessor& other) const {
joshualitt49586be2014-09-16 08:21:41 -0700396 const GrQuadEffect& ce = other.cast<GrQuadEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000397 return (ce.fEdgeType == fEdgeType);
398}
399
joshualitt9b989322014-12-15 14:16:27 -0800400void GrQuadEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const {
401 QuadBatchTracker* local = bt->cast<QuadBatchTracker>();
402 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
403 local->fCoverageScale = fCoverageScale;
404}
405
406bool GrQuadEffect::onCanMakeEqual(const GrBatchTracker& m, const GrBatchTracker& t) const {
407 const QuadBatchTracker& mine = m.cast<QuadBatchTracker>();
408 const QuadBatchTracker& theirs = t.cast<QuadBatchTracker>();
409 return CanCombineOutput(mine.fInputColorType, mine.fColor,
410 theirs.fInputColorType, theirs.fColor) &&
411 mine.fCoverageScale == theirs.fCoverageScale;
412}
413
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000414//////////////////////////////////////////////////////////////////////////////
415
joshualittb0a8a372014-09-23 09:50:21 -0700416GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000417
joshualittb0a8a372014-09-23 09:50:21 -0700418GrGeometryProcessor* GrQuadEffect::TestCreate(SkRandom* random,
419 GrContext*,
420 const GrDrawTargetCaps& caps,
421 GrTexture*[]) {
422 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000423 do {
joshualittb0a8a372014-09-23 09:50:21 -0700424 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
425 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt2e3b3e32014-12-09 13:31:14 -0800426 gp = GrQuadEffect::Create(GrRandomColor(random), edgeType, caps);
joshualittb0a8a372014-09-23 09:50:21 -0700427 } while (NULL == gp);
428 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000429}
430
431//////////////////////////////////////////////////////////////////////////////
432// Cubic
433//////////////////////////////////////////////////////////////////////////////
434
joshualitt9b989322014-12-15 14:16:27 -0800435struct CubicBatchTracker {
436 GrGPInput fInputColorType;
437 GrColor fColor;
438};
439
joshualitt249af152014-09-15 11:41:13 -0700440class GrGLCubicEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000441public:
joshualitteb2a6762014-12-04 11:35:33 -0800442 GrGLCubicEffect(const GrGeometryProcessor&,
joshualitt87f48d92014-12-04 10:41:40 -0800443 const GrBatchTracker&);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000444
joshualittc369e7c2014-10-22 10:56:26 -0700445 virtual void emitCode(const EmitArgs&) SK_OVERRIDE;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000446
joshualitt87f48d92014-12-04 10:41:40 -0800447 static inline void GenKey(const GrGeometryProcessor&,
448 const GrBatchTracker&,
449 const GrGLCaps&,
450 GrProcessorKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000451
joshualitt9b989322014-12-15 14:16:27 -0800452 virtual void setData(const GrGLProgramDataManager& pdman,
453 const GrPrimitiveProcessor&,
454 const GrBatchTracker& bt) SK_OVERRIDE {
455 const CubicBatchTracker& local = bt.cast<CubicBatchTracker>();
456 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
457 GrGLfloat c[4];
458 GrColorToRGBAFloat(local.fColor, c);
459 pdman.set4fv(fColorUniform, 1, c);
460 fColor = local.fColor;
461 }
462 }
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000463
464private:
joshualitt9b989322014-12-15 14:16:27 -0800465 GrColor fColor;
joshualittb0a8a372014-09-23 09:50:21 -0700466 GrPrimitiveEdgeType fEdgeType;
joshualitt9b989322014-12-15 14:16:27 -0800467 UniformHandle fColorUniform;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000468
joshualitt249af152014-09-15 11:41:13 -0700469 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000470};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000471
joshualitteb2a6762014-12-04 11:35:33 -0800472GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800473 const GrBatchTracker&)
474 : fColor(GrColor_ILLEGAL) {
joshualittb0a8a372014-09-23 09:50:21 -0700475 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000476 fEdgeType = ce.getEdgeType();
477}
478
joshualittc369e7c2014-10-22 10:56:26 -0700479void GrGLCubicEffect::emitCode(const EmitArgs& args) {
joshualittc369e7c2014-10-22 10:56:26 -0700480 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
joshualitt2dd1ae02014-12-03 06:24:10 -0800481 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800482 const CubicBatchTracker& local = args.fBT.cast<CubicBatchTracker>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800483
484 GrGLVertToFrag v(kVec4f_GrSLType);
bsalomonc0bd6482014-12-09 10:04:14 -0800485 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
joshualitt2dd1ae02014-12-03 06:24:10 -0800486 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
487
joshualitt9b989322014-12-15 14:16:27 -0800488 // Setup pass through color
489 this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL,
490 &fColorUniform);
491
joshualitt2dd1ae02014-12-03 06:24:10 -0800492 // setup coord outputs
493 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), gp.inPosition()->fName);
494 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), gp.inPosition()->fName);
joshualitt30ba4362014-08-21 20:18:45 -0700495
joshualitt4973d9d2014-11-08 09:24:25 -0800496 // setup position varying
497 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), vsBuilder->uViewM(),
joshualitt2dd1ae02014-12-03 06:24:10 -0800498 gp.inPosition()->fName);
joshualitt4973d9d2014-11-08 09:24:25 -0800499
joshualittc369e7c2014-10-22 10:56:26 -0700500 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
egdaniel9bd5bbf2014-08-29 11:12:30 -0700501
bsalomonc0bd6482014-12-09 10:04:14 -0800502 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
503 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
504 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
505 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
506 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
507 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
508 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
509 GrGLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
egdaniel9bd5bbf2014-08-29 11:12:30 -0700510
511 fsBuilder->declAppend(edgeAlpha);
512 fsBuilder->declAppend(dklmdx);
513 fsBuilder->declAppend(dklmdy);
514 fsBuilder->declAppend(dfdx);
515 fsBuilder->declAppend(dfdy);
516 fsBuilder->declAppend(gF);
517 fsBuilder->declAppend(gFM);
518 fsBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000519
520 switch (fEdgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700521 case kHairlineAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700522 SkAssertResult(fsBuilder->enableFeature(
523 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700524 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
525 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700526 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700527 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
528 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700529 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700530 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
531 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700532 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
533 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
534 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700535 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700536 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
537 fsBuilder->codeAppendf("%s = %s / %s;",
538 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
539 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
540 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000541 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700542 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
543 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
544 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000545 break;
546 }
joshualittb0a8a372014-09-23 09:50:21 -0700547 case kFillAA_GrProcessorEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700548 SkAssertResult(fsBuilder->enableFeature(
549 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
joshualitt74077b92014-10-24 11:26:03 -0700550 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
551 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700552 fsBuilder->codeAppendf("%s ="
553 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700554 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_str(), v.fsIn(),
555 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700556 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
joshualitt74077b92014-10-24 11:26:03 -0700557 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_str(), v.fsIn(),
558 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700559 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
560 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_str(), gF.c_str());
561 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700562 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700563 fsBuilder->codeAppendf("%s = %s / %s;",
564 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
565 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
566 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000567 // Add line below for smooth cubic ramp
egdaniel9bd5bbf2014-08-29 11:12:30 -0700568 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
569 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
570 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000571 break;
572 }
joshualittb0a8a372014-09-23 09:50:21 -0700573 case kFillBW_GrProcessorEdgeType: {
egdaniel9bd5bbf2014-08-29 11:12:30 -0700574 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
joshualitt74077b92014-10-24 11:26:03 -0700575 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
egdaniel9bd5bbf2014-08-29 11:12:30 -0700576 fsBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000577 break;
578 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000579 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000580 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000581 }
582
joshualitt2dd1ae02014-12-03 06:24:10 -0800583
584 fsBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000585}
586
joshualitt87f48d92014-12-04 10:41:40 -0800587void GrGLCubicEffect::GenKey(const GrGeometryProcessor& processor,
joshualitt9b989322014-12-15 14:16:27 -0800588 const GrBatchTracker& bt,
joshualitt87f48d92014-12-04 10:41:40 -0800589 const GrGLCaps&,
joshualittb0a8a372014-09-23 09:50:21 -0700590 GrProcessorKeyBuilder* b) {
591 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
joshualitt9b989322014-12-15 14:16:27 -0800592 const CubicBatchTracker& local = bt.cast<CubicBatchTracker>();
bsalomon63e99f72014-07-21 08:03:14 -0700593 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
joshualitt9b989322014-12-15 14:16:27 -0800594 key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x8;
bsalomon63e99f72014-07-21 08:03:14 -0700595 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000596}
597
598//////////////////////////////////////////////////////////////////////////////
599
600GrCubicEffect::~GrCubicEffect() {}
601
joshualitteb2a6762014-12-04 11:35:33 -0800602void GrCubicEffect::getGLProcessorKey(const GrBatchTracker& bt,
603 const GrGLCaps& caps,
604 GrProcessorKeyBuilder* b) const {
605 GrGLCubicEffect::GenKey(*this, bt, caps, b);
606}
607
608GrGLGeometryProcessor* GrCubicEffect::createGLInstance(const GrBatchTracker& bt) const {
609 return SkNEW_ARGS(GrGLCubicEffect, (*this, bt));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000610}
611
joshualitt2e3b3e32014-12-09 13:31:14 -0800612GrCubicEffect::GrCubicEffect(GrColor color, GrPrimitiveEdgeType edgeType)
613 : INHERITED(color), fEdgeType(edgeType) {
joshualitteb2a6762014-12-04 11:35:33 -0800614 this->initClassID<GrCubicEffect>();
joshualitt2dd1ae02014-12-03 06:24:10 -0800615 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
616 fInCubicCoeffs = &this->addVertexAttrib(GrAttribute("inCubicCoeffs",
617 kVec4f_GrVertexAttribType));
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000618}
619
bsalomon0e08fc12014-10-15 08:19:04 -0700620bool GrCubicEffect::onIsEqual(const GrGeometryProcessor& other) const {
joshualitt49586be2014-09-16 08:21:41 -0700621 const GrCubicEffect& ce = other.cast<GrCubicEffect>();
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000622 return (ce.fEdgeType == fEdgeType);
623}
624
joshualitt9b989322014-12-15 14:16:27 -0800625void GrCubicEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const {
626 CubicBatchTracker* local = bt->cast<CubicBatchTracker>();
627 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
628}
629
630bool GrCubicEffect::onCanMakeEqual(const GrBatchTracker& m, const GrBatchTracker& t) const {
631 const CubicBatchTracker& mine = m.cast<CubicBatchTracker>();
632 const CubicBatchTracker& theirs = t.cast<CubicBatchTracker>();
633 return CanCombineOutput(mine.fInputColorType, mine.fColor,
634 theirs.fInputColorType, theirs.fColor);
635}
636
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000637//////////////////////////////////////////////////////////////////////////////
638
joshualittb0a8a372014-09-23 09:50:21 -0700639GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000640
joshualittb0a8a372014-09-23 09:50:21 -0700641GrGeometryProcessor* GrCubicEffect::TestCreate(SkRandom* random,
642 GrContext*,
643 const GrDrawTargetCaps& caps,
644 GrTexture*[]) {
645 GrGeometryProcessor* gp;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000646 do {
joshualittb0a8a372014-09-23 09:50:21 -0700647 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(
648 random->nextULessThan(kGrProcessorEdgeTypeCnt));
joshualitt2e3b3e32014-12-09 13:31:14 -0800649 gp = GrCubicEffect::Create(GrRandomColor(random), edgeType, caps);
joshualittb0a8a372014-09-23 09:50:21 -0700650 } while (NULL == gp);
651 return gp;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000652}
egdaniel9bd5bbf2014-08-29 11:12:30 -0700653