OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "gl/builders/GrGLProgramBuilder.h" | 8 #include "gl/builders/GrGLProgramBuilder.h" |
9 #include "GrBezierEffect.h" | 9 #include "GrBezierEffect.h" |
10 | 10 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 | 53 |
54 builder->addVarying(kVec4f_GrSLType, "ConicCoeffs", | 54 builder->addVarying(kVec4f_GrSLType, "ConicCoeffs", |
55 &vsName, &fsName); | 55 &vsName, &fsName); |
56 | 56 |
57 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); | 57 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); |
58 const SkString* attr0Name = | 58 const SkString* attr0Name = |
59 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]
); | 59 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]
); |
60 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str()); | 60 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str()); |
61 | 61 |
62 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 62 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
63 fsBuilder->codeAppend("\t\tfloat edgeAlpha;\n"); | 63 |
| 64 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, GrGLShaderVar::kHig
h_Precision); |
| 65 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Prec
ision); |
| 66 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Prec
ision); |
| 67 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio
n); |
| 68 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio
n); |
| 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_Precisio
n); |
| 72 |
| 73 fsBuilder->declAppend(edgeAlpha, *builder); |
| 74 fsBuilder->declAppend(dklmdx, *builder); |
| 75 fsBuilder->declAppend(dklmdy, *builder); |
| 76 fsBuilder->declAppend(dfdx, *builder); |
| 77 fsBuilder->declAppend(dfdy, *builder); |
| 78 fsBuilder->declAppend(gF, *builder); |
| 79 fsBuilder->declAppend(gFM, *builder); |
| 80 fsBuilder->declAppend(func, *builder); |
64 | 81 |
65 switch (fEdgeType) { | 82 switch (fEdgeType) { |
66 case kHairlineAA_GrEffectEdgeType: { | 83 case kHairlineAA_GrEffectEdgeType: { |
67 SkAssertResult(fsBuilder->enableFeature( | 84 SkAssertResult(fsBuilder->enableFeature( |
68 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 85 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
69 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName); | 86 fsBuilder->codeAppendf("\t\t%s = dFdx(%s.xyz);\n", dklmdx.c_str(), f
sName); |
70 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName); | 87 fsBuilder->codeAppendf("\t\t%s = dFdy(%s.xyz);\n", dklmdy.c_str(), f
sName); |
71 fsBuilder->codeAppendf("\t\tfloat dfdx =\n" | 88 fsBuilder->codeAppendf("\t\t%s =\n" |
72 "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s
.z*dklmdx.y;\n", | 89 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z
* %s.y;\n", |
73 fsName, fsName, fsName); | 90 dfdx.c_str(), fsName, dklmdx.c_str(), fsName,
dklmdx.c_str(), |
74 fsBuilder->codeAppendf("\t\tfloat dfdy =\n" | 91 fsName, dklmdx.c_str()); |
75 "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s
.z*dklmdy.y;\n", | 92 fsBuilder->codeAppendf("\t\t%s =\n" |
76 fsName, fsName, fsName); | 93 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z
* %s.y;\n", |
77 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n"); | 94 dfdy.c_str(), fsName, dklmdy.c_str(), fsName,
dklmdy.c_str(), |
78 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n"); | 95 fsName, dklmdy.c_str()); |
79 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n",
fsName, fsName, | 96 fsBuilder->codeAppendf("\t\t%s = vec2(%s, %s);\n", |
80 fsName, fsName); | 97 gF.c_str(), dfdx.c_str(), dfdy.c_str()); |
81 fsBuilder->codeAppend("\t\tfunc = abs(func);\n"); | 98 fsBuilder->codeAppendf("\t\t%s = sqrt(dot(%s, %s));\n", |
82 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n"); | 99 gFM.c_str(), gF.c_str(), gF.c_str()); |
83 fsBuilder->codeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n"
); | 100 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x - %s.y*%s.z;\n", |
| 101 func.c_str(), fsName, fsName, fsName, fsName)
; |
| 102 fsBuilder->codeAppendf("\t\t%s = abs(%s);\n", func.c_str(), func.c_s
tr()); |
| 103 fsBuilder->codeAppendf("\t\t%s = %s / %s;\n", |
| 104 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; |
| 105 fsBuilder->codeAppendf("\t\t%s = max(1.0 - %s, 0.0);\n", |
| 106 edgeAlpha.c_str(), edgeAlpha.c_str()); |
84 // Add line below for smooth cubic ramp | 107 // Add line below for smooth cubic ramp |
85 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2
.0*edgeAlpha);\n"); | 108 // fsBuilder->codeAppendf("\t\t%s = %s * %s * (3.0 - 2.0 * %s);\n", |
| 109 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 110 // edgeAlpha.c_str()); |
86 break; | 111 break; |
87 } | 112 } |
88 case kFillAA_GrEffectEdgeType: { | 113 case kFillAA_GrEffectEdgeType: { |
89 SkAssertResult(fsBuilder->enableFeature( | 114 SkAssertResult(fsBuilder->enableFeature( |
90 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 115 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
91 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName); | 116 fsBuilder->codeAppendf("\t\t%s = dFdx(%s.xyz);\n", dklmdx.c_str(), f
sName); |
92 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName); | 117 fsBuilder->codeAppendf("\t\t%s = dFdy(%s.xyz);\n", dklmdy.c_str(), f
sName); |
93 fsBuilder->codeAppendf("\t\tfloat dfdx =\n" | 118 fsBuilder->codeAppendf("\t\t%s =\n" |
94 "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s
.z*dklmdx.y;\n", | 119 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z
* %s.y;\n", |
95 fsName, fsName, fsName); | 120 dfdx.c_str(), fsName, dklmdx.c_str(), fsName,
dklmdx.c_str(), |
96 fsBuilder->codeAppendf("\t\tfloat dfdy =\n" | 121 fsName, dklmdx.c_str()); |
97 "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s
.z*dklmdy.y;\n", | 122 fsBuilder->codeAppendf("\t\t%s =\n" |
98 fsName, fsName, fsName); | 123 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z
* %s.y;\n", |
99 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n"); | 124 dfdy.c_str(), fsName, dklmdy.c_str(), fsName,
dklmdy.c_str(), |
100 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n"); | 125 fsName, dklmdy.c_str()); |
101 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n",
fsName, fsName, | 126 fsBuilder->codeAppendf("\t\t%s = vec2(%s, %s);\n", |
102 fsName, fsName); | 127 gF.c_str(), dfdx.c_str(), dfdy.c_str()); |
103 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n"); | 128 fsBuilder->codeAppendf("\t\t%s = sqrt(dot(%s, %s));\n", |
104 fsBuilder->codeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1
.0);\n"); | 129 gFM.c_str(), gF.c_str(), gF.c_str()); |
| 130 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x - %s.y*%s.z;\n", |
| 131 func.c_str(), fsName, fsName, fsName, fsName)
; |
| 132 fsBuilder->codeAppendf("\t\t%s = %s / %s;\n", |
| 133 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; |
| 134 fsBuilder->codeAppendf("\t\t%s = clamp(1.0 - %s, 0.0, 1.0);\n", |
| 135 edgeAlpha.c_str(), edgeAlpha.c_str()); |
105 // Add line below for smooth cubic ramp | 136 // Add line below for smooth cubic ramp |
106 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2
.0*edgeAlpha);\n"); | 137 // fsBuilder->codeAppendf("\t\t%s = %s * %s * (3.0 - 2.0 * %s);\n", |
| 138 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 139 // edgeAlpha.c_str()); |
107 break; | 140 break; |
108 } | 141 } |
109 case kFillBW_GrEffectEdgeType: { | 142 case kFillBW_GrEffectEdgeType: { |
110 fsBuilder->codeAppendf("\t\tedgeAlpha = %s.x*%s.x - %s.y*%s.z;\n", f
sName, fsName, | 143 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x - %s.y*%s.z;\n", |
111 fsName, fsName); | 144 edgeAlpha.c_str(), fsName, fsName, fsName, fs
Name); |
112 fsBuilder->codeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n"); | 145 fsBuilder->codeAppendf("\t\t%s = float(%s < 0.0);\n", |
| 146 edgeAlpha.c_str(), edgeAlpha.c_str()); |
113 break; | 147 break; |
114 } | 148 } |
115 default: | 149 default: |
116 SkFAIL("Shouldn't get here"); | 150 SkFAIL("Shouldn't get here"); |
117 } | 151 } |
118 | 152 |
119 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, | 153 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, |
120 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).
c_str()); | 154 (GrGLSLExpr4(inputColor) * GrGLSLExpr1(edgeAlpha.c_st
r())).c_str()); |
121 } | 155 } |
122 | 156 |
123 void GrGLConicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, | 157 void GrGLConicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, |
124 GrEffectKeyBuilder* b) { | 158 GrEffectKeyBuilder* b) { |
125 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>(); | 159 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>(); |
126 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; | 160 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; |
127 b->add32(key); | 161 b->add32(key); |
128 } | 162 } |
129 | 163 |
130 ////////////////////////////////////////////////////////////////////////////// | 164 ////////////////////////////////////////////////////////////////////////////// |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 const TextureSamplerArray& samplers) { | 238 const TextureSamplerArray& samplers) { |
205 const char *vsName, *fsName; | 239 const char *vsName, *fsName; |
206 builder->addVarying(kVec4f_GrSLType, "HairQuadEdge", &vsName, &fsName); | 240 builder->addVarying(kVec4f_GrSLType, "HairQuadEdge", &vsName, &fsName); |
207 | 241 |
208 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); | 242 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); |
209 const SkString* attrName = | 243 const SkString* attrName = |
210 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]
); | 244 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]
); |
211 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attrName->c_str()); | 245 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attrName->c_str()); |
212 | 246 |
213 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 247 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
214 fsBuilder->codeAppendf("\t\tfloat edgeAlpha;\n"); | 248 |
| 249 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, GrGLShaderVar::kHig
h_Precision); |
| 250 GrGLShaderVar duvdx("duvdx", kVec2f_GrSLType, 0, GrGLShaderVar::kHigh_Precis
ion); |
| 251 GrGLShaderVar duvdy("duvdy", kVec2f_GrSLType, 0, GrGLShaderVar::kHigh_Precis
ion); |
| 252 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, GrGLShaderVar::kHigh_Precision); |
| 253 |
| 254 fsBuilder->declAppend(edgeAlpha, *builder); |
| 255 fsBuilder->declAppend(duvdx, *builder); |
| 256 fsBuilder->declAppend(duvdy, *builder); |
| 257 fsBuilder->declAppend(gF, *builder); |
215 | 258 |
216 switch (fEdgeType) { | 259 switch (fEdgeType) { |
217 case kHairlineAA_GrEffectEdgeType: { | 260 case kHairlineAA_GrEffectEdgeType: { |
218 SkAssertResult(fsBuilder->enableFeature( | 261 SkAssertResult(fsBuilder->enableFeature( |
219 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 262 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
220 fsBuilder->codeAppendf("\t\tvec2 duvdx = dFdx(%s.xy);\n", fsName); | 263 fsBuilder->codeAppendf("\t\t%s = dFdx(%s.xy);\n", duvdx.c_str(), fsN
ame); |
221 fsBuilder->codeAppendf("\t\tvec2 duvdy = dFdy(%s.xy);\n", fsName); | 264 fsBuilder->codeAppendf("\t\t%s = dFdy(%s.xy);\n", duvdy.c_str(), fsN
ame); |
222 fsBuilder->codeAppendf("\t\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.
y,\n" | 265 fsBuilder->codeAppendf("\t\t%s = vec2(2.0 * %s.x * %s.x - %s.y,\n" |
223 "\t\t 2.0*%s.x*duvdy.x - duvdy.
y);\n", | 266 "\t\t 2.0 * %s.x * %s.x - %s.y);\n", |
224 fsName, fsName); | 267 gF.c_str(), fsName, duvdx.c_str(), duvdx.c_st
r(), |
225 fsBuilder->codeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsNa
me, fsName, | 268 fsName, duvdy.c_str(), duvdy.c_str()); |
226 fsName); | 269 fsBuilder->codeAppendf("\t\t%s = (%s.x * %s.x - %s.y);\n", |
227 fsBuilder->codeAppend("\t\tedgeAlpha = sqrt(edgeAlpha*edgeAlpha / do
t(gF, gF));\n"); | 270 edgeAlpha.c_str(), fsName, fsName, fsName); |
228 fsBuilder->codeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n"
); | 271 fsBuilder->codeAppendf("\t\t%s = sqrt(%s * %s / dot(%s, %s));\n", |
| 272 edgeAlpha.c_str(), edgeAlpha.c_str(), edgeAlp
ha.c_str(), |
| 273 gF.c_str(), gF.c_str()); |
| 274 fsBuilder->codeAppendf("\t\t%s = max(1.0 - %s, 0.0);\n", |
| 275 edgeAlpha.c_str(), edgeAlpha.c_str()); |
229 // Add line below for smooth cubic ramp | 276 // Add line below for smooth cubic ramp |
230 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2
.0*edgeAlpha);\n"); | 277 // fsBuilder->codeAppendf("\t\t%s = %s * %s * (3.0 - 2.0 * %s);\n", |
| 278 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 279 // edgeAlpha.c_str()); |
231 break; | 280 break; |
232 } | 281 } |
233 case kFillAA_GrEffectEdgeType: { | 282 case kFillAA_GrEffectEdgeType: { |
234 SkAssertResult(fsBuilder->enableFeature( | 283 SkAssertResult(fsBuilder->enableFeature( |
235 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 284 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
236 fsBuilder->codeAppendf("\t\tvec2 duvdx = dFdx(%s.xy);\n", fsName); | 285 fsBuilder->codeAppendf("\t\t%s = dFdx(%s.xy);\n", duvdx.c_str(), fsN
ame); |
237 fsBuilder->codeAppendf("\t\tvec2 duvdy = dFdy(%s.xy);\n", fsName); | 286 fsBuilder->codeAppendf("\t\t%s = dFdy(%s.xy);\n", duvdy.c_str(), fsN
ame); |
238 fsBuilder->codeAppendf("\t\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.
y,\n" | 287 fsBuilder->codeAppendf("\t\t%s = vec2(2.0 * %s.x * %s.x - %s.y,\n" |
239 "\t\t 2.0*%s.x*duvdy.x - duvdy.
y);\n", | 288 "\t\t 2.0 * %s.x * %s.x - %s.y);\n", |
240 fsName, fsName); | 289 gF.c_str(), fsName, duvdx.c_str(), duvdx.c_st
r(), |
241 fsBuilder->codeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsNa
me, fsName, | 290 fsName, duvdy.c_str(), duvdy.c_str()); |
242 fsName); | 291 fsBuilder->codeAppendf("\t\t%s = (%s.x*%s.x - %s.y);\n", |
243 fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha / sqrt(dot(gF, gF))
;\n"); | 292 edgeAlpha.c_str(), fsName, fsName, fsName); |
244 fsBuilder->codeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1
.0);\n"); | 293 fsBuilder->codeAppendf("\t\t%s = %s / sqrt(dot(%s, %s));\n", |
| 294 edgeAlpha.c_str(), edgeAlpha.c_str(), gF.c_st
r(), gF.c_str()); |
| 295 fsBuilder->codeAppendf("\t\t%s = clamp(1.0 - %s, 0.0, 1.0);\n", |
| 296 edgeAlpha.c_str(), edgeAlpha.c_str()); |
245 // Add line below for smooth cubic ramp | 297 // Add line below for smooth cubic ramp |
246 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2
.0*edgeAlpha);\n"); | 298 // fsBuilder->codeAppendf("\t\t%s = %s * %s * (3.0 - 2.0 * %s);\n", |
| 299 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 300 // edgeAlpha.c_str()); |
247 break; | 301 break; |
248 } | 302 } |
249 case kFillBW_GrEffectEdgeType: { | 303 case kFillBW_GrEffectEdgeType: { |
250 fsBuilder->codeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsNa
me, fsName, | 304 fsBuilder->codeAppendf("\t\t%s = (%s.x*%s.x - %s.y);\n", |
251 fsName); | 305 edgeAlpha.c_str(), fsName, fsName, fsName); |
252 fsBuilder->codeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n"); | 306 fsBuilder->codeAppendf("\t\t%s = float(%s < 0.0);\n", |
| 307 edgeAlpha.c_str(), edgeAlpha.c_str()); |
253 break; | 308 break; |
254 } | 309 } |
255 default: | 310 default: |
256 SkFAIL("Shouldn't get here"); | 311 SkFAIL("Shouldn't get here"); |
257 } | 312 } |
258 | 313 |
259 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, | 314 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, |
260 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).
c_str()); | 315 (GrGLSLExpr4(inputColor) * GrGLSLExpr1(edgeAlpha.c_st
r())).c_str()); |
261 } | 316 } |
262 | 317 |
263 void GrGLQuadEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, | 318 void GrGLQuadEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, |
264 GrEffectKeyBuilder* b) { | 319 GrEffectKeyBuilder* b) { |
265 const GrQuadEffect& ce = drawEffect.castEffect<GrQuadEffect>(); | 320 const GrQuadEffect& ce = drawEffect.castEffect<GrQuadEffect>(); |
266 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; | 321 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; |
267 b->add32(key); | 322 b->add32(key); |
268 } | 323 } |
269 | 324 |
270 ////////////////////////////////////////////////////////////////////////////// | 325 ////////////////////////////////////////////////////////////////////////////// |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 | 401 |
347 builder->addVarying(kVec4f_GrSLType, "CubicCoeffs", | 402 builder->addVarying(kVec4f_GrSLType, "CubicCoeffs", |
348 &vsName, &fsName); | 403 &vsName, &fsName); |
349 | 404 |
350 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); | 405 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); |
351 const SkString* attr0Name = | 406 const SkString* attr0Name = |
352 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]
); | 407 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]
); |
353 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str()); | 408 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str()); |
354 | 409 |
355 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 410 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
356 fsBuilder->codeAppend("\t\tfloat edgeAlpha;\n"); | 411 |
| 412 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, GrGLShaderVar::kHig
h_Precision); |
| 413 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Prec
ision); |
| 414 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Prec
ision); |
| 415 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio
n); |
| 416 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio
n); |
| 417 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, GrGLShaderVar::kHigh_Precision); |
| 418 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precision)
; |
| 419 GrGLShaderVar func("func", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio
n); |
| 420 |
| 421 fsBuilder->declAppend(edgeAlpha, *builder); |
| 422 fsBuilder->declAppend(dklmdx, *builder); |
| 423 fsBuilder->declAppend(dklmdy, *builder); |
| 424 fsBuilder->declAppend(dfdx, *builder); |
| 425 fsBuilder->declAppend(dfdy, *builder); |
| 426 fsBuilder->declAppend(gF, *builder); |
| 427 fsBuilder->declAppend(gFM, *builder); |
| 428 fsBuilder->declAppend(func, *builder); |
357 | 429 |
358 switch (fEdgeType) { | 430 switch (fEdgeType) { |
359 case kHairlineAA_GrEffectEdgeType: { | 431 case kHairlineAA_GrEffectEdgeType: { |
360 SkAssertResult(fsBuilder->enableFeature( | 432 SkAssertResult(fsBuilder->enableFeature( |
361 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 433 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
362 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName); | 434 fsBuilder->codeAppendf("\t\t%s = dFdx(%s.xyz);\n", dklmdx.c_str(), f
sName); |
363 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName); | 435 fsBuilder->codeAppendf("\t\t%s = dFdy(%s.xyz);\n", dklmdy.c_str(), f
sName); |
364 fsBuilder->codeAppendf("\t\tfloat dfdx =\n" | 436 fsBuilder->codeAppendf("\t\t%s =\n" |
365 "\t\t3.0*%s.x*%s.x*dklmdx.x - %s.y*dklmdx.z -
%s.z*dklmdx.y;\n", | 437 "\t\t3.0 * %s.x * %s.x * %s.x - %s.y * %s.z -
%s.z * %s.y;\n", |
366 fsName, fsName, fsName, fsName); | 438 dfdx.c_str(), fsName, fsName, dklmdx.c_str(),
fsName, |
367 fsBuilder->codeAppendf("\t\tfloat dfdy =\n" | 439 dklmdx.c_str(), fsName, dklmdx.c_str()); |
368 "\t\t3.0*%s.x*%s.x*dklmdy.x - %s.y*dklmdy.z -
%s.z*dklmdy.y;\n", | 440 fsBuilder->codeAppendf("\t\t%s =\n" |
369 fsName, fsName, fsName, fsName); | 441 "\t\t3.0 * %s.x * %s.x * %s.x - %s.y * %s.z -
%s.z * %s.y;\n", |
370 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n"); | 442 dfdy.c_str(), fsName, fsName, dklmdy.c_str(),
fsName, |
371 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n"); | 443 dklmdy.c_str(), fsName, dklmdy.c_str()); |
372 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x*%s.x - %s.y*%s.z;
\n", | 444 fsBuilder->codeAppendf("\t\t%s = vec2(%s, %s);\n", |
373 fsName, fsName, fsName, fsName, fsName); | 445 gF.c_str(), dfdx.c_str(), dfdy.c_str()); |
374 fsBuilder->codeAppend("\t\tfunc = abs(func);\n"); | 446 fsBuilder->codeAppendf("\t\t%s = sqrt(dot(%s, %s));\n", |
375 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n"); | 447 gFM.c_str(), gF.c_str(), gF.c_str()); |
376 fsBuilder->codeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n"
); | 448 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x*%s.x - %s.y*%s.z;\n", |
| 449 func.c_str(), fsName, fsName, fsName, fsName,
fsName); |
| 450 fsBuilder->codeAppendf("\t\t%s = abs(%s);\n", func.c_str(), func.c_s
tr()); |
| 451 fsBuilder->codeAppendf("\t\t%s = %s / %s;\n", |
| 452 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; |
| 453 fsBuilder->codeAppendf("\t\t%s = max(1.0 - %s, 0.0);\n", |
| 454 edgeAlpha.c_str(), edgeAlpha.c_str()); |
377 // Add line below for smooth cubic ramp | 455 // Add line below for smooth cubic ramp |
378 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2
.0*edgeAlpha);\n"); | 456 // fsBuilder->codeAppendf("\t\t%s = %s * %s * (3.0 - 2.0 * %s);\n", |
| 457 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 458 // edgeAlpha.c_str()); |
379 break; | 459 break; |
380 } | 460 } |
381 case kFillAA_GrEffectEdgeType: { | 461 case kFillAA_GrEffectEdgeType: { |
382 SkAssertResult(fsBuilder->enableFeature( | 462 SkAssertResult(fsBuilder->enableFeature( |
383 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 463 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
384 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName); | 464 fsBuilder->codeAppendf("\t\t%s = dFdx(%s.xyz);\n", dklmdx.c_str(), f
sName); |
385 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName); | 465 fsBuilder->codeAppendf("\t\t%s = dFdy(%s.xyz);\n", dklmdy.c_str(), f
sName); |
386 fsBuilder->codeAppendf("\t\tfloat dfdx =\n" | 466 fsBuilder->codeAppendf("\t\t%s =\n" |
387 "\t\t3.0*%s.x*%s.x*dklmdx.x - %s.y*dklmdx.z -
%s.z*dklmdx.y;\n", | 467 "\t\t3.0 * %s.x * %s.x * %s.x - %s.y * %s.z -
%s.z * %s.y;\n", |
388 fsName, fsName, fsName, fsName); | 468 dfdx.c_str(), fsName, fsName, dklmdx.c_str(),
fsName, |
389 fsBuilder->codeAppendf("\t\tfloat dfdy =\n" | 469 dklmdx.c_str(), fsName, dklmdx.c_str()); |
390 "\t\t3.0*%s.x*%s.x*dklmdy.x - %s.y*dklmdy.z -
%s.z*dklmdy.y;\n", | 470 fsBuilder->codeAppendf("\t\t%s =\n" |
391 fsName, fsName, fsName, fsName); | 471 "\t\t3.0 * %s.x * %s.x * %s.x - %s.y * %s.z -
%s.z * %s.y;\n", |
392 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n"); | 472 dfdy.c_str(), fsName, fsName, dklmdy.c_str(),
fsName, |
393 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n"); | 473 dklmdy.c_str(), fsName, dklmdy.c_str()); |
394 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x*%s.x - %s.y*%s.z;
\n", | 474 fsBuilder->codeAppendf("\t\t%s = vec2(%s, %s);\n", |
395 fsName, fsName, fsName, fsName, fsName); | 475 gF.c_str(), dfdx.c_str(), dfdy.c_str()); |
396 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n"); | 476 fsBuilder->codeAppendf("\t\t%s = sqrt(dot(%s, %s));\n", |
397 fsBuilder->codeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1
.0);\n"); | 477 gFM.c_str(), gF.c_str(), gF.c_str()); |
| 478 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x*%s.x - %s.y*%s.z;\n", |
| 479 func.c_str(), fsName, fsName, fsName, fsName,
fsName); |
| 480 fsBuilder->codeAppendf("\t\t%s = %s / %s;\n", |
| 481 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; |
| 482 fsBuilder->codeAppendf("\t\t%s = clamp(1.0 - %s, 0.0, 1.0);\n", |
| 483 edgeAlpha.c_str(), edgeAlpha.c_str()); |
398 // Add line below for smooth cubic ramp | 484 // Add line below for smooth cubic ramp |
399 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2
.0*edgeAlpha);\n"); | 485 // fsBuilder->codeAppendf("\t\t%s = %s * %s * (3.0 - 2.0 * %s);\n", |
| 486 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 487 // edgeAlpha.c_str()); |
400 break; | 488 break; |
401 } | 489 } |
402 case kFillBW_GrEffectEdgeType: { | 490 case kFillBW_GrEffectEdgeType: { |
403 fsBuilder->codeAppendf("\t\tedgeAlpha = %s.x*%s.x*%s.x - %s.y*%s.z;\
n", | 491 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x*%s.x - %s.y*%s.z;\n", |
404 fsName, fsName, fsName, fsName, fsName); | 492 edgeAlpha.c_str(), fsName, fsName, fsName, fs
Name, fsName); |
405 fsBuilder->codeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n"); | 493 fsBuilder->codeAppendf("\t\t%s = float(%s < 0.0);\n", |
| 494 edgeAlpha.c_str(), edgeAlpha.c_str()); |
406 break; | 495 break; |
407 } | 496 } |
408 default: | 497 default: |
409 SkFAIL("Shouldn't get here"); | 498 SkFAIL("Shouldn't get here"); |
410 } | 499 } |
411 | 500 |
412 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, | 501 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, |
413 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).
c_str()); | 502 (GrGLSLExpr4(inputColor) * GrGLSLExpr1(edgeAlpha.c_st
r())).c_str()); |
414 } | 503 } |
415 | 504 |
416 void GrGLCubicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, | 505 void GrGLCubicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, |
417 GrEffectKeyBuilder* b) { | 506 GrEffectKeyBuilder* b) { |
418 const GrCubicEffect& ce = drawEffect.castEffect<GrCubicEffect>(); | 507 const GrCubicEffect& ce = drawEffect.castEffect<GrCubicEffect>(); |
419 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; | 508 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; |
420 b->add32(key); | 509 b->add32(key); |
421 } | 510 } |
422 | 511 |
423 ////////////////////////////////////////////////////////////////////////////// | 512 ////////////////////////////////////////////////////////////////////////////// |
(...skipping 23 matching lines...) Expand all Loading... |
447 const GrDrawTargetCaps& caps, | 536 const GrDrawTargetCaps& caps, |
448 GrTexture*[]) { | 537 GrTexture*[]) { |
449 GrEffect* effect; | 538 GrEffect* effect; |
450 do { | 539 do { |
451 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>( | 540 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>( |
452 random->nextULessThan(kGrEff
ectEdgeTypeCnt)); | 541 random->nextULessThan(kGrEff
ectEdgeTypeCnt)); |
453 effect = GrCubicEffect::Create(edgeType, caps); | 542 effect = GrCubicEffect::Create(edgeType, caps); |
454 } while (NULL == effect); | 543 } while (NULL == effect); |
455 return effect; | 544 return effect; |
456 } | 545 } |
OLD | NEW |