blob: 7384f62856c91378014f114d3fdee8c026a8e02a [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]);
60 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str());
61
62 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
63 fsBuilder->codeAppend("\t\tfloat edgeAlpha;\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000064
65 switch (fEdgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +000066 case kHairlineAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -070067 SkAssertResult(fsBuilder->enableFeature(
68 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
69 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
70 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
71 fsBuilder->codeAppendf("\t\tfloat dfdx =\n"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000072 "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
73 fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -070074 fsBuilder->codeAppendf("\t\tfloat dfdy =\n"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000075 "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
76 fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -070077 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
78 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
79 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000080 fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -070081 fsBuilder->codeAppend("\t\tfunc = abs(func);\n");
82 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n");
83 fsBuilder->codeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000084 // Add line below for smooth cubic ramp
joshualitt30ba4362014-08-21 20:18:45 -070085 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000086 break;
87 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +000088 case kFillAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -070089 SkAssertResult(fsBuilder->enableFeature(
90 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
91 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
92 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
93 fsBuilder->codeAppendf("\t\tfloat dfdx =\n"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000094 "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
95 fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -070096 fsBuilder->codeAppendf("\t\tfloat dfdy =\n"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000097 "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
98 fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -070099 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
100 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
101 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000102 fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700103 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n");
104 fsBuilder->codeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000105 // Add line below for smooth cubic ramp
joshualitt30ba4362014-08-21 20:18:45 -0700106 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000107 break;
108 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000109 case kFillBW_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700110 fsBuilder->codeAppendf("\t\tedgeAlpha = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000111 fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700112 fsBuilder->codeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000113 break;
114 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000115 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000116 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000117 }
118
joshualitt30ba4362014-08-21 20:18:45 -0700119 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor,
commit-bot@chromium.orga34995e2013-10-23 05:42:03 +0000120 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000121}
122
bsalomon63e99f72014-07-21 08:03:14 -0700123void GrGLConicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&,
124 GrEffectKeyBuilder* b) {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000125 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700126 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
127 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000128}
129
130//////////////////////////////////////////////////////////////////////////////
131
132GrConicEffect::~GrConicEffect() {}
133
134const GrBackendEffectFactory& GrConicEffect::getFactory() const {
135 return GrTBackendEffectFactory<GrConicEffect>::getInstance();
136}
137
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000138GrConicEffect::GrConicEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000139 this->addVertexAttrib(kVec4f_GrSLType);
140 fEdgeType = edgeType;
141}
142
143bool GrConicEffect::onIsEqual(const GrEffect& other) const {
144 const GrConicEffect& ce = CastEffect<GrConicEffect>(other);
145 return (ce.fEdgeType == fEdgeType);
146}
147
148//////////////////////////////////////////////////////////////////////////////
149
150GR_DEFINE_EFFECT_TEST(GrConicEffect);
151
bsalomon83d081a2014-07-08 09:56:10 -0700152GrEffect* GrConicEffect::TestCreate(SkRandom* random,
153 GrContext*,
154 const GrDrawTargetCaps& caps,
155 GrTexture*[]) {
156 GrEffect* effect;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000157 do {
158 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
159 random->nextULessThan(kGrEffectEdgeTypeCnt));
160 effect = GrConicEffect::Create(edgeType, caps);
161 } while (NULL == effect);
162 return effect;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000163}
164
165//////////////////////////////////////////////////////////////////////////////
166// Quad
167//////////////////////////////////////////////////////////////////////////////
168
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000169class GrGLQuadEffect : public GrGLVertexEffect {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000170public:
171 GrGLQuadEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
172
joshualitt30ba4362014-08-21 20:18:45 -0700173 virtual void emitCode(GrGLFullProgramBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000174 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700175 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000176 const char* outputColor,
177 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000178 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000179 const TextureSamplerArray&) SK_OVERRIDE;
180
bsalomon63e99f72014-07-21 08:03:14 -0700181 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000182
kkinnunen7510b222014-07-30 00:04:16 -0700183 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_OVERRIDE {}
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000184
185private:
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000186 GrEffectEdgeType fEdgeType;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000187
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000188 typedef GrGLVertexEffect INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000189};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000190
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000191GrGLQuadEffect::GrGLQuadEffect(const GrBackendEffectFactory& factory,
192 const GrDrawEffect& drawEffect)
193 : INHERITED (factory) {
194 const GrQuadEffect& ce = drawEffect.castEffect<GrQuadEffect>();
195 fEdgeType = ce.getEdgeType();
196}
197
joshualitt30ba4362014-08-21 20:18:45 -0700198void GrGLQuadEffect::emitCode(GrGLFullProgramBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000199 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700200 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000201 const char* outputColor,
202 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000203 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000204 const TextureSamplerArray& samplers) {
205 const char *vsName, *fsName;
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000206 builder->addVarying(kVec4f_GrSLType, "HairQuadEdge", &vsName, &fsName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000207
joshualitt30ba4362014-08-21 20:18:45 -0700208 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
209 const SkString* attrName =
210 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
211 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attrName->c_str());
212
213 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
214 fsBuilder->codeAppendf("\t\tfloat edgeAlpha;\n");
215
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000216 switch (fEdgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000217 case kHairlineAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700218 SkAssertResult(fsBuilder->enableFeature(
219 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
220 fsBuilder->codeAppendf("\t\tvec2 duvdx = dFdx(%s.xy);\n", fsName);
221 fsBuilder->codeAppendf("\t\tvec2 duvdy = dFdy(%s.xy);\n", fsName);
222 fsBuilder->codeAppendf("\t\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.y,\n"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000223 "\t\t 2.0*%s.x*duvdy.x - duvdy.y);\n",
224 fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700225 fsBuilder->codeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000226 fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700227 fsBuilder->codeAppend("\t\tedgeAlpha = sqrt(edgeAlpha*edgeAlpha / dot(gF, gF));\n");
228 fsBuilder->codeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000229 // Add line below for smooth cubic ramp
joshualitt30ba4362014-08-21 20:18:45 -0700230 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000231 break;
232 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000233 case kFillAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700234 SkAssertResult(fsBuilder->enableFeature(
235 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
236 fsBuilder->codeAppendf("\t\tvec2 duvdx = dFdx(%s.xy);\n", fsName);
237 fsBuilder->codeAppendf("\t\tvec2 duvdy = dFdy(%s.xy);\n", fsName);
238 fsBuilder->codeAppendf("\t\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.y,\n"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000239 "\t\t 2.0*%s.x*duvdy.x - duvdy.y);\n",
240 fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700241 fsBuilder->codeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000242 fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700243 fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha / sqrt(dot(gF, gF));\n");
244 fsBuilder->codeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000245 // Add line below for smooth cubic ramp
joshualitt30ba4362014-08-21 20:18:45 -0700246 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000247 break;
248 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000249 case kFillBW_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700250 fsBuilder->codeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000251 fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700252 fsBuilder->codeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000253 break;
254 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000255 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000256 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000257 }
258
joshualitt30ba4362014-08-21 20:18:45 -0700259 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor,
commit-bot@chromium.orga34995e2013-10-23 05:42:03 +0000260 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000261}
262
bsalomon63e99f72014-07-21 08:03:14 -0700263void GrGLQuadEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&,
264 GrEffectKeyBuilder* b) {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000265 const GrQuadEffect& ce = drawEffect.castEffect<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700266 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
267 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000268}
269
270//////////////////////////////////////////////////////////////////////////////
271
272GrQuadEffect::~GrQuadEffect() {}
273
274const GrBackendEffectFactory& GrQuadEffect::getFactory() const {
275 return GrTBackendEffectFactory<GrQuadEffect>::getInstance();
276}
277
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000278GrQuadEffect::GrQuadEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000279 this->addVertexAttrib(kVec4f_GrSLType);
280 fEdgeType = edgeType;
281}
282
283bool GrQuadEffect::onIsEqual(const GrEffect& other) const {
284 const GrQuadEffect& ce = CastEffect<GrQuadEffect>(other);
285 return (ce.fEdgeType == fEdgeType);
286}
287
288//////////////////////////////////////////////////////////////////////////////
289
290GR_DEFINE_EFFECT_TEST(GrQuadEffect);
291
bsalomon83d081a2014-07-08 09:56:10 -0700292GrEffect* GrQuadEffect::TestCreate(SkRandom* random,
293 GrContext*,
294 const GrDrawTargetCaps& caps,
295 GrTexture*[]) {
296 GrEffect* effect;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000297 do {
298 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
299 random->nextULessThan(kGrEffectEdgeTypeCnt));
300 effect = GrQuadEffect::Create(edgeType, caps);
301 } while (NULL == effect);
302 return effect;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000303}
304
305//////////////////////////////////////////////////////////////////////////////
306// Cubic
307//////////////////////////////////////////////////////////////////////////////
308
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000309class GrGLCubicEffect : public GrGLVertexEffect {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000310public:
311 GrGLCubicEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
312
joshualitt30ba4362014-08-21 20:18:45 -0700313 virtual void emitCode(GrGLFullProgramBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000314 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700315 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000316 const char* outputColor,
317 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000318 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000319 const TextureSamplerArray&) SK_OVERRIDE;
320
bsalomon63e99f72014-07-21 08:03:14 -0700321 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000322
kkinnunen7510b222014-07-30 00:04:16 -0700323 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_OVERRIDE {}
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000324
325private:
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000326 GrEffectEdgeType fEdgeType;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000327
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000328 typedef GrGLVertexEffect INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000329};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000330
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000331GrGLCubicEffect::GrGLCubicEffect(const GrBackendEffectFactory& factory,
332 const GrDrawEffect& drawEffect)
333 : INHERITED (factory) {
334 const GrCubicEffect& ce = drawEffect.castEffect<GrCubicEffect>();
335 fEdgeType = ce.getEdgeType();
336}
337
joshualitt30ba4362014-08-21 20:18:45 -0700338void GrGLCubicEffect::emitCode(GrGLFullProgramBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000339 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700340 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000341 const char* outputColor,
342 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000343 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000344 const TextureSamplerArray& samplers) {
345 const char *vsName, *fsName;
346
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000347 builder->addVarying(kVec4f_GrSLType, "CubicCoeffs",
commit-bot@chromium.org5a02cb42013-08-30 20:17:31 +0000348 &vsName, &fsName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000349
joshualitt30ba4362014-08-21 20:18:45 -0700350 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
351 const SkString* attr0Name =
352 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
353 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str());
354
355 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
356 fsBuilder->codeAppend("\t\tfloat edgeAlpha;\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000357
358 switch (fEdgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000359 case kHairlineAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700360 SkAssertResult(fsBuilder->enableFeature(
361 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
362 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
363 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
364 fsBuilder->codeAppendf("\t\tfloat dfdx =\n"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000365 "\t\t3.0*%s.x*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
366 fsName, fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700367 fsBuilder->codeAppendf("\t\tfloat dfdy =\n"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000368 "\t\t3.0*%s.x*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
369 fsName, fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700370 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
371 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
372 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x*%s.x - %s.y*%s.z;\n",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000373 fsName, fsName, fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700374 fsBuilder->codeAppend("\t\tfunc = abs(func);\n");
375 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n");
376 fsBuilder->codeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000377 // Add line below for smooth cubic ramp
joshualitt30ba4362014-08-21 20:18:45 -0700378 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000379 break;
380 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000381 case kFillAA_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700382 SkAssertResult(fsBuilder->enableFeature(
383 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
384 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
385 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
386 fsBuilder->codeAppendf("\t\tfloat dfdx =\n"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000387 "\t\t3.0*%s.x*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
388 fsName, fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700389 fsBuilder->codeAppendf("\t\tfloat dfdy =\n"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000390 "\t\t3.0*%s.x*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
391 fsName, fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700392 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
393 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
394 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x*%s.x - %s.y*%s.z;\n",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000395 fsName, fsName, fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700396 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n");
397 fsBuilder->codeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000398 // Add line below for smooth cubic ramp
joshualitt30ba4362014-08-21 20:18:45 -0700399 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000400 break;
401 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000402 case kFillBW_GrEffectEdgeType: {
joshualitt30ba4362014-08-21 20:18:45 -0700403 fsBuilder->codeAppendf("\t\tedgeAlpha = %s.x*%s.x*%s.x - %s.y*%s.z;\n",
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000404 fsName, fsName, fsName, fsName, fsName);
joshualitt30ba4362014-08-21 20:18:45 -0700405 fsBuilder->codeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000406 break;
407 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000408 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000409 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000410 }
411
joshualitt30ba4362014-08-21 20:18:45 -0700412 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor,
commit-bot@chromium.orga34995e2013-10-23 05:42:03 +0000413 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000414}
415
bsalomon63e99f72014-07-21 08:03:14 -0700416void GrGLCubicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&,
417 GrEffectKeyBuilder* b) {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000418 const GrCubicEffect& ce = drawEffect.castEffect<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700419 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
420 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000421}
422
423//////////////////////////////////////////////////////////////////////////////
424
425GrCubicEffect::~GrCubicEffect() {}
426
427const GrBackendEffectFactory& GrCubicEffect::getFactory() const {
428 return GrTBackendEffectFactory<GrCubicEffect>::getInstance();
429}
430
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000431GrCubicEffect::GrCubicEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000432 this->addVertexAttrib(kVec4f_GrSLType);
433 fEdgeType = edgeType;
434}
435
436bool GrCubicEffect::onIsEqual(const GrEffect& other) const {
437 const GrCubicEffect& ce = CastEffect<GrCubicEffect>(other);
438 return (ce.fEdgeType == fEdgeType);
439}
440
441//////////////////////////////////////////////////////////////////////////////
442
443GR_DEFINE_EFFECT_TEST(GrCubicEffect);
444
bsalomon83d081a2014-07-08 09:56:10 -0700445GrEffect* GrCubicEffect::TestCreate(SkRandom* random,
446 GrContext*,
447 const GrDrawTargetCaps& caps,
448 GrTexture*[]) {
449 GrEffect* effect;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000450 do {
451 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
452 random->nextULessThan(kGrEffectEdgeTypeCnt));
453 effect = GrCubicEffect::Create(edgeType, caps);
454 } while (NULL == effect);
455 return effect;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000456}