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 "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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |