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

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

Issue 1457543003: Add ShaderBuilders to EmitArgs and remove gettings from ProgBuilder. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 1 month 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
« no previous file with comments | « src/gpu/batches/GrAAConvexPathRenderer.cpp ('k') | src/gpu/effects/GrBicubicEffect.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "GrBezierEffect.h" 8 #include "GrBezierEffect.h"
9 9
10 #include "glsl/GrGLSLGeometryProcessor.h" 10 #include "glsl/GrGLSLGeometryProcessor.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 }; 66 };
67 67
68 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) 68 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor)
69 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage Scale(0xff) { 69 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage Scale(0xff) {
70 const GrConicEffect& ce = processor.cast<GrConicEffect>(); 70 const GrConicEffect& ce = processor.cast<GrConicEffect>();
71 fEdgeType = ce.getEdgeType(); 71 fEdgeType = ce.getEdgeType();
72 } 72 }
73 73
74 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { 74 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
75 GrGLSLGPBuilder* pb = args.fPB; 75 GrGLSLGPBuilder* pb = args.fPB;
76 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 76 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
77 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); 77 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>();
78 78
79 // emit attributes 79 // emit attributes
80 vsBuilder->emitAttributes(gp); 80 vertBuilder->emitAttributes(gp);
81 81
82 GrGLSLVertToFrag v(kVec4f_GrSLType); 82 GrGLSLVertToFrag v(kVec4f_GrSLType);
83 args.fPB->addVarying("ConicCoeffs", &v); 83 args.fPB->addVarying("ConicCoeffs", &v);
84 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); 84 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
85 85
86 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
86 // Setup pass through color 87 // Setup pass through color
87 if (!gp.colorIgnored()) { 88 if (!gp.colorIgnored()) {
88 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); 89 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo rUniform);
89 } 90 }
90 91
91 // Setup position 92 // Setup position
92 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV iewMatrixUniform); 93 this->setupPosition(pb,
94 vertBuilder,
95 gpArgs,
96 gp.inPosition()->fName,
97 gp.viewMatrix(),
98 &fViewMatrixUniform);
93 99
94 // emit transforms with position 100 // emit transforms with position
95 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo calMatrix(), 101 this->emitTransforms(pb,
96 args.fTransformsIn, args.fTransformsOut); 102 vertBuilder,
103 gpArgs->fPositionVar,
104 gp.inPosition()->fName,
105 gp.localMatrix(),
106 args.fTransformsIn,
107 args.fTransformsOut);
97 108
98 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 109 fragBuilder->codeAppend("float edgeAlpha;");
99 fsBuilder->codeAppend("float edgeAlpha;");
100 110
101 switch (fEdgeType) { 111 switch (fEdgeType) {
102 case kHairlineAA_GrProcessorEdgeType: { 112 case kHairlineAA_GrProcessorEdgeType: {
103 SkAssertResult(fsBuilder->enableFeature( 113 SkAssertResult(fragBuilder->enableFeature(
104 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e)); 114 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e));
105 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); 115 fragBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
106 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); 116 fragBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
107 fsBuilder->codeAppendf("float dfdx =" 117 fragBuilder->codeAppendf("float dfdx ="
108 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s .z * dklmdx.y;", 118 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
109 v.fsIn(), v.fsIn(), v.fsIn()); 119 v.fsIn(), v.fsIn(), v.fsIn());
110 fsBuilder->codeAppendf("float dfdy =" 120 fragBuilder->codeAppendf("float dfdy ="
111 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s .z * dklmdy.y;", 121 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
112 v.fsIn(), v.fsIn(), v.fsIn()); 122 v.fsIn(), v.fsIn(), v.fsIn());
113 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); 123 fragBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
114 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); 124 fragBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
115 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn (), v.fsIn(), 125 fragBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fs In(), v.fsIn(),
116 v.fsIn(), v.fsIn()); 126 v.fsIn(), v.fsIn());
117 fsBuilder->codeAppend("func = abs(func);"); 127 fragBuilder->codeAppend("func = abs(func);");
118 fsBuilder->codeAppend("edgeAlpha = func / gFM;"); 128 fragBuilder->codeAppend("edgeAlpha = func / gFM;");
119 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); 129 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
120 // Add line below for smooth cubic ramp 130 // Add line below for smooth cubic ramp
121 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e dgeAlpha);"); 131 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0 *edgeAlpha);");
122 break; 132 break;
123 } 133 }
124 case kFillAA_GrProcessorEdgeType: { 134 case kFillAA_GrProcessorEdgeType: {
125 SkAssertResult(fsBuilder->enableFeature( 135 SkAssertResult(fragBuilder->enableFeature(
126 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e)); 136 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e));
127 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); 137 fragBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn());
128 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); 138 fragBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn());
129 fsBuilder->codeAppendf("float dfdx =" 139 fragBuilder->codeAppendf("float dfdx ="
130 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s .z * dklmdx.y;", 140 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s.z * dklmdx.y;",
131 v.fsIn(), v.fsIn(), v.fsIn()); 141 v.fsIn(), v.fsIn(), v.fsIn());
132 fsBuilder->codeAppendf("float dfdy =" 142 fragBuilder->codeAppendf("float dfdy ="
133 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s .z * dklmdy.y;", 143 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s.z * dklmdy.y;",
134 v.fsIn(), v.fsIn(), v.fsIn()); 144 v.fsIn(), v.fsIn(), v.fsIn());
135 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); 145 fragBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);");
136 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); 146 fragBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));");
137 fsBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;", v. fsIn(), v.fsIn(), 147 fragBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;", v.fsIn(), v.fsIn(),
138 v.fsIn(), v.fsIn()); 148 v.fsIn(), v.fsIn());
139 fsBuilder->codeAppend("edgeAlpha = func / gFM;"); 149 fragBuilder->codeAppend("edgeAlpha = func / gFM;");
140 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0); "); 150 fragBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0 );");
141 // Add line below for smooth cubic ramp 151 // Add line below for smooth cubic ramp
142 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e dgeAlpha);"); 152 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0 *edgeAlpha);");
143 break; 153 break;
144 } 154 }
145 case kFillBW_GrProcessorEdgeType: { 155 case kFillBW_GrProcessorEdgeType: {
146 fsBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v.f sIn(), v.fsIn(), 156 fragBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v .fsIn(), v.fsIn(),
147 v.fsIn(), v.fsIn()); 157 v.fsIn(), v.fsIn());
148 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); 158 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
149 break; 159 break;
150 } 160 }
151 default: 161 default:
152 SkFAIL("Shouldn't get here"); 162 SkFAIL("Shouldn't get here");
153 } 163 }
154 164
155 // TODO should we really be doing this? 165 // TODO should we really be doing this?
156 if (gp.coverageScale() != 0xff) { 166 if (gp.coverageScale() != 0xff) {
157 const char* coverageScale; 167 const char* coverageScale;
158 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V isibility, 168 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V isibility,
159 kFloat_GrSLType, 169 kFloat_GrSLType,
160 kDefault_GrSLPrecision, 170 kDefault_GrSLPrecision,
161 "Coverage", 171 "Coverage",
162 &coverageScale); 172 &coverageScale);
163 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag e, coverageScale); 173 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover age, coverageScale);
164 } else { 174 } else {
165 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); 175 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
166 } 176 }
167 } 177 }
168 178
169 void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp, 179 void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp,
170 const GrGLSLCaps&, 180 const GrGLSLCaps&,
171 GrProcessorKeyBuilder* b) { 181 GrProcessorKeyBuilder* b) {
172 const GrConicEffect& ce = gp.cast<GrConicEffect>(); 182 const GrConicEffect& ce = gp.cast<GrConicEffect>();
173 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; 183 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
174 key |= GrColor_ILLEGAL != ce.color() ? 0x4 : 0x0; 184 key |= GrColor_ILLEGAL != ce.color() ? 0x4 : 0x0;
175 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0; 185 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0;
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 }; 292 };
283 293
284 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) 294 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor)
285 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage Scale(0xff) { 295 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage Scale(0xff) {
286 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); 296 const GrQuadEffect& ce = processor.cast<GrQuadEffect>();
287 fEdgeType = ce.getEdgeType(); 297 fEdgeType = ce.getEdgeType();
288 } 298 }
289 299
290 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { 300 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
291 GrGLSLGPBuilder* pb = args.fPB; 301 GrGLSLGPBuilder* pb = args.fPB;
292 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 302 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
293 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); 303 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>();
294 304
295 // emit attributes 305 // emit attributes
296 vsBuilder->emitAttributes(gp); 306 vertBuilder->emitAttributes(gp);
297 307
298 GrGLSLVertToFrag v(kVec4f_GrSLType); 308 GrGLSLVertToFrag v(kVec4f_GrSLType);
299 args.fPB->addVarying("HairQuadEdge", &v); 309 args.fPB->addVarying("HairQuadEdge", &v);
300 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); 310 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
301 311
312 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
302 // Setup pass through color 313 // Setup pass through color
303 if (!gp.colorIgnored()) { 314 if (!gp.colorIgnored()) {
304 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); 315 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo rUniform);
305 } 316 }
306 317
307 // Setup position 318 // Setup position
308 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV iewMatrixUniform); 319 this->setupPosition(pb,
320 vertBuilder,
321 gpArgs,
322 gp.inPosition()->fName,
323 gp.viewMatrix(),
324 &fViewMatrixUniform);
309 325
310 // emit transforms with position 326 // emit transforms with position
311 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo calMatrix(), 327 this->emitTransforms(pb,
312 args.fTransformsIn, args.fTransformsOut); 328 vertBuilder,
329 gpArgs->fPositionVar,
330 gp.inPosition()->fName,
331 gp.localMatrix(),
332 args.fTransformsIn,
333 args.fTransformsOut);
313 334
314 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 335 fragBuilder->codeAppendf("float edgeAlpha;");
315 fsBuilder->codeAppendf("float edgeAlpha;");
316 336
317 switch (fEdgeType) { 337 switch (fEdgeType) {
318 case kHairlineAA_GrProcessorEdgeType: { 338 case kHairlineAA_GrProcessorEdgeType: {
319 SkAssertResult(fsBuilder->enableFeature( 339 SkAssertResult(fragBuilder->enableFeature(
320 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e)); 340 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e));
321 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); 341 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
322 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); 342 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
323 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx. y," 343 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvd x.y,"
324 " 2.0 * %s.x * duvdy.x - duvdy. y);", 344 " 2.0 * %s.x * duvdy.x - duvd y.y);",
325 v.fsIn(), v.fsIn()); 345 v.fsIn(), v.fsIn());
326 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn() , v.fsIn(), v.fsIn()); 346 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
327 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot( gF, gF));"); 347 v.fsIn(), v.fsIn(), v.fsIn());
328 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); 348 fragBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / do t(gF, gF));");
349 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
329 // Add line below for smooth cubic ramp 350 // Add line below for smooth cubic ramp
330 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e dgeAlpha);"); 351 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0 *edgeAlpha);");
331 break; 352 break;
332 } 353 }
333 case kFillAA_GrProcessorEdgeType: { 354 case kFillAA_GrProcessorEdgeType: {
334 SkAssertResult(fsBuilder->enableFeature( 355 SkAssertResult(fragBuilder->enableFeature(
335 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e)); 356 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e));
336 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); 357 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
337 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); 358 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
338 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx. y," 359 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvd x.y,"
339 " 2.0 * %s.x * duvdy.x - duvdy. y);", 360 " 2.0 * %s.x * duvdy.x - duvd y.y);",
340 v.fsIn(), v.fsIn()); 361 v.fsIn(), v.fsIn());
341 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn() , v.fsIn(), v.fsIn()); 362 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
342 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));"); 363 v.fsIn(), v.fsIn(), v.fsIn());
343 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0); "); 364 fragBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));" );
365 fragBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0 );");
344 // Add line below for smooth cubic ramp 366 // Add line below for smooth cubic ramp
345 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e dgeAlpha);"); 367 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0 *edgeAlpha);");
346 break; 368 break;
347 } 369 }
348 case kFillBW_GrProcessorEdgeType: { 370 case kFillBW_GrProcessorEdgeType: {
349 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn() , v.fsIn(), v.fsIn()); 371 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
350 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); 372 v.fsIn(), v.fsIn(), v.fsIn());
373 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
351 break; 374 break;
352 } 375 }
353 default: 376 default:
354 SkFAIL("Shouldn't get here"); 377 SkFAIL("Shouldn't get here");
355 } 378 }
356 379
357 if (0xff != gp.coverageScale()) { 380 if (0xff != gp.coverageScale()) {
358 const char* coverageScale; 381 const char* coverageScale;
359 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V isibility, 382 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V isibility,
360 kFloat_GrSLType, 383 kFloat_GrSLType,
361 kDefault_GrSLPrecision, 384 kDefault_GrSLPrecision,
362 "Coverage", 385 "Coverage",
363 &coverageScale); 386 &coverageScale);
364 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag e, coverageScale); 387 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover age, coverageScale);
365 } else { 388 } else {
366 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); 389 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage);
367 } 390 }
368 } 391 }
369 392
370 void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp, 393 void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp,
371 const GrGLSLCaps&, 394 const GrGLSLCaps&,
372 GrProcessorKeyBuilder* b) { 395 GrProcessorKeyBuilder* b) {
373 const GrQuadEffect& ce = gp.cast<GrQuadEffect>(); 396 const GrQuadEffect& ce = gp.cast<GrQuadEffect>();
374 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; 397 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
375 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0; 398 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0;
376 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0; 399 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 typedef GrGLSLGeometryProcessor INHERITED; 492 typedef GrGLSLGeometryProcessor INHERITED;
470 }; 493 };
471 494
472 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) 495 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor)
473 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { 496 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {
474 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); 497 const GrCubicEffect& ce = processor.cast<GrCubicEffect>();
475 fEdgeType = ce.getEdgeType(); 498 fEdgeType = ce.getEdgeType();
476 } 499 }
477 500
478 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { 501 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
479 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 502 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
480 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); 503 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>();
481 504
482 // emit attributes 505 // emit attributes
483 vsBuilder->emitAttributes(gp); 506 vertBuilder->emitAttributes(gp);
484 507
485 GrGLSLVertToFrag v(kVec4f_GrSLType); 508 GrGLSLVertToFrag v(kVec4f_GrSLType);
486 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); 509 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
487 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); 510 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName);
488 511
512 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
489 // Setup pass through color 513 // Setup pass through color
490 if (!gp.colorIgnored()) { 514 if (!gp.colorIgnored()) {
491 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); 515 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo rUniform);
492 } 516 }
493 517
494 // Setup position 518 // Setup position
495 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix( ), 519 this->setupPosition(args.fPB,
520 vertBuilder,
521 gpArgs,
522 gp.inPosition()->fName,
523 gp.viewMatrix(),
496 &fViewMatrixUniform); 524 &fViewMatrixUniform);
497 525
498 // emit transforms with position 526 // emit transforms with position
499 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName, args.fTransformsIn, 527 this->emitTransforms(args.fPB,
528 vertBuilder,
529 gpArgs->fPositionVar,
530 gp.inPosition()->fName,
531 args.fTransformsIn,
500 args.fTransformsOut); 532 args.fTransformsOut);
501 533
502 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
503 534
504 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi on); 535 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi on);
505 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); 536 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
506 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); 537 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
507 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); 538 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
508 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision); 539 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
509 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision); 540 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
510 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision); 541 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
511 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision); 542 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
512 543
513 fsBuilder->declAppend(edgeAlpha); 544 fragBuilder->declAppend(edgeAlpha);
514 fsBuilder->declAppend(dklmdx); 545 fragBuilder->declAppend(dklmdx);
515 fsBuilder->declAppend(dklmdy); 546 fragBuilder->declAppend(dklmdy);
516 fsBuilder->declAppend(dfdx); 547 fragBuilder->declAppend(dfdx);
517 fsBuilder->declAppend(dfdy); 548 fragBuilder->declAppend(dfdy);
518 fsBuilder->declAppend(gF); 549 fragBuilder->declAppend(gF);
519 fsBuilder->declAppend(gFM); 550 fragBuilder->declAppend(gFM);
520 fsBuilder->declAppend(func); 551 fragBuilder->declAppend(func);
521 552
522 switch (fEdgeType) { 553 switch (fEdgeType) {
523 case kHairlineAA_GrProcessorEdgeType: { 554 case kHairlineAA_GrProcessorEdgeType: {
524 SkAssertResult(fsBuilder->enableFeature( 555 SkAssertResult(fragBuilder->enableFeature(
525 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e)); 556 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e));
526 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn( )); 557 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsI n());
527 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn( )); 558 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsI n());
528 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;", 559 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s. z - %s.z * %s.y;",
529 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st r(), v.fsIn(), 560 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_ str(), v.fsIn(),
530 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); 561 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
531 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;", 562 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s. z - %s.z * %s.y;",
532 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st r(), v.fsIn(), 563 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_ str(), v.fsIn(),
533 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); 564 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
534 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str( ), dfdy.c_str()); 565 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_st r(), dfdy.c_str());
535 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_ str(), gF.c_str()); 566 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
536 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", 567 gFM.c_str(), gF.c_str(), gF.c_str());
537 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v .fsIn(), v.fsIn()); 568 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
538 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str()); 569 func.c_str(), v.fsIn(), v.fsIn(),
539 fsBuilder->codeAppendf("%s = %s / %s;", 570 v.fsIn(), v.fsIn(), v.fsIn());
540 edgeAlpha.c_str(), func.c_str(), gFM.c_str()) ; 571 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str() );
541 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);", 572 fragBuilder->codeAppendf("%s = %s / %s;",
542 edgeAlpha.c_str(), edgeAlpha.c_str()); 573 edgeAlpha.c_str(), func.c_str(), gFM.c_str( ));
574 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
575 edgeAlpha.c_str(), edgeAlpha.c_str());
543 // Add line below for smooth cubic ramp 576 // Add line below for smooth cubic ramp
544 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);", 577 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
545 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge Alpha.c_str(), 578 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge Alpha.c_str(),
546 // edgeAlpha.c_str()); 579 // edgeAlpha.c_str());
547 break; 580 break;
548 } 581 }
549 case kFillAA_GrProcessorEdgeType: { 582 case kFillAA_GrProcessorEdgeType: {
550 SkAssertResult(fsBuilder->enableFeature( 583 SkAssertResult(fragBuilder->enableFeature(
551 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e)); 584 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e));
552 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn( )); 585 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsI n());
553 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn( )); 586 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsI n());
554 fsBuilder->codeAppendf("%s =" 587 fragBuilder->codeAppendf("%s ="
555 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s. z * %s.y;", 588 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - % s.z * %s.y;",
556 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st r(), v.fsIn(), 589 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_ str(), v.fsIn(),
557 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); 590 dklmdx.c_str(), v.fsIn(), dklmdx.c_str());
558 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;", 591 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s. z - %s.z * %s.y;",
559 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st r(), v.fsIn(), 592 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_ str(), v.fsIn(),
560 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); 593 dklmdy.c_str(), v.fsIn(), dklmdy.c_str());
561 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str( ), dfdy.c_str()); 594 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_st r(), dfdy.c_str());
562 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_ str(), gF.c_str()); 595 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
563 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", 596 gFM.c_str(), gF.c_str(), gF.c_str());
564 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v .fsIn(), v.fsIn()); 597 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
565 fsBuilder->codeAppendf("%s = %s / %s;", 598 func.c_str(), v.fsIn(), v.fsIn(),
566 edgeAlpha.c_str(), func.c_str(), gFM.c_str()) ; 599 v.fsIn(), v.fsIn(), v.fsIn());
567 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);", 600 fragBuilder->codeAppendf("%s = %s / %s;",
568 edgeAlpha.c_str(), edgeAlpha.c_str()); 601 edgeAlpha.c_str(), func.c_str(), gFM.c_str( ));
602 fragBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);",
603 edgeAlpha.c_str(), edgeAlpha.c_str());
569 // Add line below for smooth cubic ramp 604 // Add line below for smooth cubic ramp
570 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);", 605 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",
571 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge Alpha.c_str(), 606 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge Alpha.c_str(),
572 // edgeAlpha.c_str()); 607 // edgeAlpha.c_str());
573 break; 608 break;
574 } 609 }
575 case kFillBW_GrProcessorEdgeType: { 610 case kFillBW_GrProcessorEdgeType: {
576 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", 611 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
577 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn (), v.fsIn(), v.fsIn()); 612 edgeAlpha.c_str(), v.fsIn(), v.fsIn(),
578 fsBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), e dgeAlpha.c_str()); 613 v.fsIn(), v.fsIn(), v.fsIn());
614 fragBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
579 break; 615 break;
580 } 616 }
581 default: 617 default:
582 SkFAIL("Shouldn't get here"); 618 SkFAIL("Shouldn't get here");
583 } 619 }
584 620
585 621
586 fsBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_s tr()); 622 fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c _str());
587 } 623 }
588 624
589 void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp, 625 void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,
590 const GrGLSLCaps&, 626 const GrGLSLCaps&,
591 GrProcessorKeyBuilder* b) { 627 GrProcessorKeyBuilder* b) {
592 const GrCubicEffect& ce = gp.cast<GrCubicEffect>(); 628 const GrCubicEffect& ce = gp.cast<GrCubicEffect>();
593 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; 629 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
594 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8; 630 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8;
595 key |= ComputePosKey(ce.viewMatrix()) << 5; 631 key |= ComputePosKey(ce.viewMatrix()) << 5;
596 b->add32(key); 632 b->add32(key);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 do { 665 do {
630 GrPrimitiveEdgeType edgeType = 666 GrPrimitiveEdgeType edgeType =
631 static_cast<GrPrimitiveEdgeType>( 667 static_cast<GrPrimitiveEdgeType>(
632 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); 668 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
633 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), 669 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom),
634 GrTest::TestMatrix(d->fRandom), edgeType, *d- >fCaps); 670 GrTest::TestMatrix(d->fRandom), edgeType, *d- >fCaps);
635 } while (nullptr == gp); 671 } while (nullptr == gp);
636 return gp; 672 return gp;
637 } 673 }
638 674
OLDNEW
« no previous file with comments | « src/gpu/batches/GrAAConvexPathRenderer.cpp ('k') | src/gpu/effects/GrBicubicEffect.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698