blob: e3fb8c15f94cb6cfebb493c513c1f96e991d46cd [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
joshualitt30ba4362014-08-21 20:18:45 -07008#include "gl/builders/GrGLProgramBuilder.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +00009#include "GrBezierEffect.h"
10
11#include "gl/GrGLEffect.h"
12#include "gl/GrGLSL.h"
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000013#include "gl/GrGLVertexEffect.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000014#include "GrTBackendEffectFactory.h"
15
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000016class GrGLConicEffect : public GrGLVertexEffect {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000017public:
18 GrGLConicEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
19
joshualitt30ba4362014-08-21 20:18:45 -070020 virtual void emitCode(GrGLFullProgramBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000021 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -070022 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000023 const char* outputColor,
24 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +000025 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000026 const TextureSamplerArray&) SK_OVERRIDE;
27
bsalomon63e99f72014-07-21 08:03:14 -070028 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000029
kkinnunen7510b222014-07-30 00:04:16 -070030 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_OVERRIDE {}
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000031
32private:
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +000033 GrEffectEdgeType fEdgeType;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000034
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000035 typedef GrGLVertexEffect INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000036};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +000037
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000038GrGLConicEffect::GrGLConicEffect(const GrBackendEffectFactory& factory,
39 const GrDrawEffect& drawEffect)
40 : INHERITED (factory) {
41 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>();
42 fEdgeType = ce.getEdgeType();
43}
44
joshualitt30ba4362014-08-21 20:18:45 -070045void GrGLConicEffect::emitCode(GrGLFullProgramBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000046 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -070047 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000048 const char* outputColor,
49 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +000050 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000051 const TextureSamplerArray& samplers) {
52 const char *vsName, *fsName;
53
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000054 builder->addVarying(kVec4f_GrSLType, "ConicCoeffs",
commit-bot@chromium.org5a02cb42013-08-30 20:17:31 +000055 &vsName, &fsName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000056
joshualitt30ba4362014-08-21 20:18:45 -070057 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
58 const SkString* attr0Name =
59 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
egdanielb2f94d12014-08-29 10:08:36 -070060 vsBuilder->codeAppendf("%s = %s;", vsName, attr0Name->c_str());
joshualitt30ba4362014-08-21 20:18:45 -070061
62 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -070063
64 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precision);
65 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Precision);
66 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Precision);
67 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precision);
68 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precision);
69 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, GrGLShaderVar::kHigh_Precision);
70 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precision);
71 GrGLShaderVar func("func", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precision);
72
73 fsBuilder->declAppend(edgeAlpha);
74 fsBuilder->declAppend(dklmdx);
75 fsBuilder->declAppend(dklmdy);
76 fsBuilder->declAppend(dfdx);
77 fsBuilder->declAppend(dfdy);
78 fsBuilder->declAppend(gF);
79 fsBuilder->declAppend(gFM);
80 fsBuilder->declAppend(func);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000081
82 switch (fEdgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +000083 case kHairlineAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -070084 SkAssertResult(fsBuilder->enableFeature(
85 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdanielb2f94d12014-08-29 10:08:36 -070086 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), fsName);
87 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), fsName);
88 fsBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
89 dfdx.c_str(), fsName, dklmdx.c_str(), fsName, dklmdx.c_str(),
90 fsName, dklmdx.c_str());
91 fsBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
92 dfdy.c_str(), fsName, dklmdy.c_str(), fsName, dklmdy.c_str(),
93 fsName, dklmdy.c_str());
94 fsBuilder->codeAppendf("%s = vec2(%s, %s);",
95 gF.c_str(), dfdx.c_str(), dfdy.c_str());
96 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
97 gFM.c_str(), gF.c_str(), gF.c_str());
98 fsBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
99 func.c_str(), fsName, fsName, fsName, fsName);
100 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
101 fsBuilder->codeAppendf("%s = %s / %s;",
102 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
103 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
104 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000105 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700106 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
107 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
108 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000109 break;
110 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000111 case kFillAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700112 SkAssertResult(fsBuilder->enableFeature(
113 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdanielb2f94d12014-08-29 10:08:36 -0700114 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), fsName);
115 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), fsName);
116 fsBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
117 dfdx.c_str(), fsName, dklmdx.c_str(), fsName, dklmdx.c_str(),
118 fsName, dklmdx.c_str());
119 fsBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
120 dfdy.c_str(), fsName, dklmdy.c_str(), fsName, dklmdy.c_str(),
121 fsName, dklmdy.c_str());
122 fsBuilder->codeAppendf("%s = vec2(%s, %s);",
123 gF.c_str(), dfdx.c_str(), dfdy.c_str());
124 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
125 gFM.c_str(), gF.c_str(), gF.c_str());
126 fsBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
127 func.c_str(), fsName, fsName, fsName, fsName);
128 fsBuilder->codeAppendf("%s = %s / %s;",
129 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
130 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
131 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000132 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700133 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
134 // edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlpha.c_str(),
135 // edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000136 break;
137 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000138 case kFillBW_GrEffectEdgeType: {
egdanielb2f94d12014-08-29 10:08:36 -0700139 fsBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
140 edgeAlpha.c_str(), fsName, fsName, fsName, fsName);
141 fsBuilder->codeAppendf("%s = float(%s < 0.0);",
142 edgeAlpha.c_str(), edgeAlpha.c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000143 break;
144 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000145 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000146 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000147 }
148
egdanielb2f94d12014-08-29 10:08:36 -0700149 fsBuilder->codeAppendf("%s = %s;", outputColor,
150 (GrGLSLExpr4(inputColor) * GrGLSLExpr1(edgeAlpha.c_str())).c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000151}
152
bsalomon63e99f72014-07-21 08:03:14 -0700153void GrGLConicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&,
154 GrEffectKeyBuilder* b) {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000155 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700156 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
157 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000158}
159
160//////////////////////////////////////////////////////////////////////////////
161
162GrConicEffect::~GrConicEffect() {}
163
164const GrBackendEffectFactory& GrConicEffect::getFactory() const {
165 return GrTBackendEffectFactory<GrConicEffect>::getInstance();
166}
167
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000168GrConicEffect::GrConicEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000169 this->addVertexAttrib(kVec4f_GrSLType);
170 fEdgeType = edgeType;
171}
172
173bool GrConicEffect::onIsEqual(const GrEffect& other) const {
174 const GrConicEffect& ce = CastEffect<GrConicEffect>(other);
175 return (ce.fEdgeType == fEdgeType);
176}
177
178//////////////////////////////////////////////////////////////////////////////
179
180GR_DEFINE_EFFECT_TEST(GrConicEffect);
181
bsalomon83d081a2014-07-08 09:56:10 -0700182GrEffect* GrConicEffect::TestCreate(SkRandom* random,
183 GrContext*,
184 const GrDrawTargetCaps& caps,
185 GrTexture*[]) {
186 GrEffect* effect;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000187 do {
188 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
189 random->nextULessThan(kGrEffectEdgeTypeCnt));
190 effect = GrConicEffect::Create(edgeType, caps);
191 } while (NULL == effect);
192 return effect;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000193}
194
195//////////////////////////////////////////////////////////////////////////////
196// Quad
197//////////////////////////////////////////////////////////////////////////////
198
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000199class GrGLQuadEffect : public GrGLVertexEffect {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000200public:
201 GrGLQuadEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
202
joshualitt30ba4362014-08-21 20:18:45 -0700203 virtual void emitCode(GrGLFullProgramBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000204 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700205 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000206 const char* outputColor,
207 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000208 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000209 const TextureSamplerArray&) SK_OVERRIDE;
210
bsalomon63e99f72014-07-21 08:03:14 -0700211 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000212
kkinnunen7510b222014-07-30 00:04:16 -0700213 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_OVERRIDE {}
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000214
215private:
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000216 GrEffectEdgeType fEdgeType;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000217
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000218 typedef GrGLVertexEffect INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000219};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000220
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000221GrGLQuadEffect::GrGLQuadEffect(const GrBackendEffectFactory& factory,
222 const GrDrawEffect& drawEffect)
223 : INHERITED (factory) {
224 const GrQuadEffect& ce = drawEffect.castEffect<GrQuadEffect>();
225 fEdgeType = ce.getEdgeType();
226}
227
joshualitt30ba4362014-08-21 20:18:45 -0700228void GrGLQuadEffect::emitCode(GrGLFullProgramBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000229 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700230 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000231 const char* outputColor,
232 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000233 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000234 const TextureSamplerArray& samplers) {
235 const char *vsName, *fsName;
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000236 builder->addVarying(kVec4f_GrSLType, "HairQuadEdge", &vsName, &fsName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000237
joshualitt30ba4362014-08-21 20:18:45 -0700238 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
239 const SkString* attrName =
240 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
egdanielb2f94d12014-08-29 10:08:36 -0700241 vsBuilder->codeAppendf("%s = %s;", vsName, attrName->c_str());
joshualitt30ba4362014-08-21 20:18:45 -0700242
243 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -0700244 fsBuilder->codeAppendf("float edgeAlpha;");
joshualitt30ba4362014-08-21 20:18:45 -0700245
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000246 switch (fEdgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000247 case kHairlineAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700248 SkAssertResult(fsBuilder->enableFeature(
249 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdanielb2f94d12014-08-29 10:08:36 -0700250 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", fsName);
251 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", fsName);
252 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
253 " 2.0 * %s.x * duvdy.x - duvdy.y);",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000254 fsName, fsName);
egdanielb2f94d12014-08-29 10:08:36 -0700255 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", fsName, fsName, fsName);
256 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
257 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000258 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700259 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000260 break;
261 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000262 case kFillAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700263 SkAssertResult(fsBuilder->enableFeature(
264 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdanielb2f94d12014-08-29 10:08:36 -0700265 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", fsName);
266 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", fsName);
267 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.y,"
268 " 2.0 * %s.x * duvdy.x - duvdy.y);",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000269 fsName, fsName);
egdanielb2f94d12014-08-29 10:08:36 -0700270 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", fsName, fsName, fsName);
271 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
272 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000273 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700274 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000275 break;
276 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000277 case kFillBW_GrEffectEdgeType: {
egdanielb2f94d12014-08-29 10:08:36 -0700278 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", fsName, fsName, fsName);
279 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000280 break;
281 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000282 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000283 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000284 }
285
egdanielb2f94d12014-08-29 10:08:36 -0700286 fsBuilder->codeAppendf("%s = %s;", outputColor,
commit-bot@chromium.orga34995e2013-10-23 05:42:03 +0000287 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000288}
289
bsalomon63e99f72014-07-21 08:03:14 -0700290void GrGLQuadEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&,
291 GrEffectKeyBuilder* b) {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000292 const GrQuadEffect& ce = drawEffect.castEffect<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700293 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
294 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000295}
296
297//////////////////////////////////////////////////////////////////////////////
298
299GrQuadEffect::~GrQuadEffect() {}
300
301const GrBackendEffectFactory& GrQuadEffect::getFactory() const {
302 return GrTBackendEffectFactory<GrQuadEffect>::getInstance();
303}
304
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000305GrQuadEffect::GrQuadEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000306 this->addVertexAttrib(kVec4f_GrSLType);
307 fEdgeType = edgeType;
308}
309
310bool GrQuadEffect::onIsEqual(const GrEffect& other) const {
311 const GrQuadEffect& ce = CastEffect<GrQuadEffect>(other);
312 return (ce.fEdgeType == fEdgeType);
313}
314
315//////////////////////////////////////////////////////////////////////////////
316
317GR_DEFINE_EFFECT_TEST(GrQuadEffect);
318
bsalomon83d081a2014-07-08 09:56:10 -0700319GrEffect* GrQuadEffect::TestCreate(SkRandom* random,
320 GrContext*,
321 const GrDrawTargetCaps& caps,
322 GrTexture*[]) {
323 GrEffect* effect;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000324 do {
325 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
326 random->nextULessThan(kGrEffectEdgeTypeCnt));
327 effect = GrQuadEffect::Create(edgeType, caps);
328 } while (NULL == effect);
329 return effect;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000330}
331
332//////////////////////////////////////////////////////////////////////////////
333// Cubic
334//////////////////////////////////////////////////////////////////////////////
335
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000336class GrGLCubicEffect : public GrGLVertexEffect {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000337public:
338 GrGLCubicEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
339
joshualitt30ba4362014-08-21 20:18:45 -0700340 virtual void emitCode(GrGLFullProgramBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000341 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700342 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000343 const char* outputColor,
344 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000345 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000346 const TextureSamplerArray&) SK_OVERRIDE;
347
bsalomon63e99f72014-07-21 08:03:14 -0700348 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000349
kkinnunen7510b222014-07-30 00:04:16 -0700350 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_OVERRIDE {}
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000351
352private:
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000353 GrEffectEdgeType fEdgeType;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000354
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000355 typedef GrGLVertexEffect INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000356};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000357
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000358GrGLCubicEffect::GrGLCubicEffect(const GrBackendEffectFactory& factory,
359 const GrDrawEffect& drawEffect)
360 : INHERITED (factory) {
361 const GrCubicEffect& ce = drawEffect.castEffect<GrCubicEffect>();
362 fEdgeType = ce.getEdgeType();
363}
364
joshualitt30ba4362014-08-21 20:18:45 -0700365void GrGLCubicEffect::emitCode(GrGLFullProgramBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000366 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700367 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000368 const char* outputColor,
369 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000370 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000371 const TextureSamplerArray& samplers) {
372 const char *vsName, *fsName;
373
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000374 builder->addVarying(kVec4f_GrSLType, "CubicCoeffs",
commit-bot@chromium.org5a02cb42013-08-30 20:17:31 +0000375 &vsName, &fsName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000376
joshualitt30ba4362014-08-21 20:18:45 -0700377 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
378 const SkString* attr0Name =
379 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
egdanielb2f94d12014-08-29 10:08:36 -0700380 vsBuilder->codeAppendf("%s = %s;", vsName, attr0Name->c_str());
joshualitt30ba4362014-08-21 20:18:45 -0700381
382 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
egdanielb2f94d12014-08-29 10:08:36 -0700383 fsBuilder->codeAppend("float edgeAlpha;");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000384
385 switch (fEdgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000386 case kHairlineAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700387 SkAssertResult(fsBuilder->enableFeature(
388 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdanielb2f94d12014-08-29 10:08:36 -0700389 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", fsName);
390 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", fsName);
391 fsBuilder->codeAppendf("float dfdx ="
392 "3.0*%s.x*%s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000393 fsName, fsName, fsName, fsName);
egdanielb2f94d12014-08-29 10:08:36 -0700394 fsBuilder->codeAppendf("float dfdy ="
395 "3.0*%s.x*%s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000396 fsName, fsName, fsName, fsName);
egdanielb2f94d12014-08-29 10:08:36 -0700397 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
398 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
399 fsBuilder->codeAppendf("float func = %s.x * %s.x * %s.x - %s.y * %s.z;",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000400 fsName, fsName, fsName, fsName, fsName);
egdanielb2f94d12014-08-29 10:08:36 -0700401 fsBuilder->codeAppend("func = abs(func);");
402 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
403 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000404 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700405 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000406 break;
407 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000408 case kFillAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700409 SkAssertResult(fsBuilder->enableFeature(
410 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
egdanielb2f94d12014-08-29 10:08:36 -0700411 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", fsName);
412 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", fsName);
413 fsBuilder->codeAppendf("float dfdx ="
414 "3.0*%s.x*%s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000415 fsName, fsName, fsName, fsName);
egdanielb2f94d12014-08-29 10:08:36 -0700416 fsBuilder->codeAppendf("float dfdy ="
417 "3.0*%s.x*%s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000418 fsName, fsName, fsName, fsName);
egdanielb2f94d12014-08-29 10:08:36 -0700419 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
420 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
421 fsBuilder->codeAppendf("float func = %s.x * %s.x * %s.x - %s.y * %s.z;",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000422 fsName, fsName, fsName, fsName, fsName);
egdanielb2f94d12014-08-29 10:08:36 -0700423 fsBuilder->codeAppend("edgeAlpha = func / gFM;");
424 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000425 // Add line below for smooth cubic ramp
egdanielb2f94d12014-08-29 10:08:36 -0700426 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000427 break;
428 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000429 case kFillBW_GrEffectEdgeType: {
egdanielb2f94d12014-08-29 10:08:36 -0700430 fsBuilder->codeAppendf("edgeAlpha = %s.x * %s.x * %s.x - %s.y * %s.z;",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000431 fsName, fsName, fsName, fsName, fsName);
egdanielb2f94d12014-08-29 10:08:36 -0700432 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000433 break;
434 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000435 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000436 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000437 }
438
egdanielb2f94d12014-08-29 10:08:36 -0700439 fsBuilder->codeAppendf("%s = %s;", outputColor,
commit-bot@chromium.orga34995e2013-10-23 05:42:03 +0000440 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000441}
442
bsalomon63e99f72014-07-21 08:03:14 -0700443void GrGLCubicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&,
444 GrEffectKeyBuilder* b) {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000445 const GrCubicEffect& ce = drawEffect.castEffect<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700446 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
447 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000448}
449
450//////////////////////////////////////////////////////////////////////////////
451
452GrCubicEffect::~GrCubicEffect() {}
453
454const GrBackendEffectFactory& GrCubicEffect::getFactory() const {
455 return GrTBackendEffectFactory<GrCubicEffect>::getInstance();
456}
457
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000458GrCubicEffect::GrCubicEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000459 this->addVertexAttrib(kVec4f_GrSLType);
460 fEdgeType = edgeType;
461}
462
463bool GrCubicEffect::onIsEqual(const GrEffect& other) const {
464 const GrCubicEffect& ce = CastEffect<GrCubicEffect>(other);
465 return (ce.fEdgeType == fEdgeType);
466}
467
468//////////////////////////////////////////////////////////////////////////////
469
470GR_DEFINE_EFFECT_TEST(GrCubicEffect);
471
bsalomon83d081a2014-07-08 09:56:10 -0700472GrEffect* GrCubicEffect::TestCreate(SkRandom* random,
473 GrContext*,
474 const GrDrawTargetCaps& caps,
475 GrTexture*[]) {
476 GrEffect* effect;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000477 do {
478 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
479 random->nextULessThan(kGrEffectEdgeTypeCnt));
480 effect = GrCubicEffect::Create(edgeType, caps);
481 } while (NULL == effect);
482 return effect;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000483}