Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: src/gpu/effects/GrBezierEffect.cpp

Issue 519473003: Use highp for gpu bezier effects (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | src/gpu/gl/builders/GrGLShaderBuilder.h » ('j') | src/gpu/gl/builders/GrGLShaderBuilder.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698