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 "gl/GrGLFragmentProcessor.h" | 10 #include "gl/GrGLFragmentProcessor.h" |
11 #include "gl/GrGLGeometryProcessor.h" | 11 #include "gl/GrGLGeometryProcessor.h" |
12 #include "gl/GrGLUtil.h" | 12 #include "gl/GrGLUtil.h" |
13 #include "gl/builders/GrGLProgramBuilder.h" | 13 #include "glsl/GrGLSLProgramBuilder.h" |
14 #include "glsl/GrGLSLProgramDataManager.h" | 14 #include "glsl/GrGLSLProgramDataManager.h" |
15 | 15 |
16 class GrGLConicEffect : public GrGLGeometryProcessor { | 16 class GrGLConicEffect : public GrGLGeometryProcessor { |
17 public: | 17 public: |
18 GrGLConicEffect(const GrGeometryProcessor&); | 18 GrGLConicEffect(const GrGeometryProcessor&); |
19 | 19 |
20 void onEmitCode(EmitArgs&, GrGPArgs*) override; | 20 void onEmitCode(EmitArgs&, GrGPArgs*) override; |
21 | 21 |
22 static inline void GenKey(const GrGeometryProcessor&, | 22 static inline void GenKey(const GrGeometryProcessor&, |
23 const GrGLSLCaps&, | 23 const GrGLSLCaps&, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 }; | 67 }; |
68 | 68 |
69 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) | 69 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) |
70 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { | 70 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { |
71 const GrConicEffect& ce = processor.cast<GrConicEffect>(); | 71 const GrConicEffect& ce = processor.cast<GrConicEffect>(); |
72 fEdgeType = ce.getEdgeType(); | 72 fEdgeType = ce.getEdgeType(); |
73 } | 73 } |
74 | 74 |
75 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 75 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
76 GrGLSLGPBuilder* pb = args.fPB; | 76 GrGLSLGPBuilder* pb = args.fPB; |
77 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 77 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
78 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); | 78 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); |
79 | 79 |
80 // emit attributes | 80 // emit attributes |
81 vsBuilder->emitAttributes(gp); | 81 vsBuilder->emitAttributes(gp); |
82 | 82 |
83 GrGLSLVertToFrag v(kVec4f_GrSLType); | 83 GrGLSLVertToFrag v(kVec4f_GrSLType); |
84 args.fPB->addVarying("ConicCoeffs", &v); | 84 args.fPB->addVarying("ConicCoeffs", &v); |
85 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); | 85 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); |
86 | 86 |
87 // Setup pass through color | 87 // Setup pass through color |
88 if (!gp.colorIgnored()) { | 88 if (!gp.colorIgnored()) { |
89 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); | 89 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); |
90 } | 90 } |
91 | 91 |
92 // Setup position | 92 // Setup position |
93 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV
iewMatrixUniform); | 93 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV
iewMatrixUniform); |
94 | 94 |
95 // emit transforms with position | 95 // emit transforms with position |
96 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo
calMatrix(), | 96 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo
calMatrix(), |
97 args.fTransformsIn, args.fTransformsOut); | 97 args.fTransformsIn, args.fTransformsOut); |
98 | 98 |
99 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 99 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
100 fsBuilder->codeAppend("float edgeAlpha;"); | 100 fsBuilder->codeAppend("float edgeAlpha;"); |
101 | 101 |
102 switch (fEdgeType) { | 102 switch (fEdgeType) { |
103 case kHairlineAA_GrProcessorEdgeType: { | 103 case kHairlineAA_GrProcessorEdgeType: { |
104 SkAssertResult(fsBuilder->enableFeature( | 104 SkAssertResult(fsBuilder->enableFeature( |
105 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 105 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
106 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); | 106 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); |
107 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); | 107 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); |
108 fsBuilder->codeAppendf("float dfdx =" | 108 fsBuilder->codeAppendf("float dfdx =" |
109 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s
.z * dklmdx.y;", | 109 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s
.z * dklmdx.y;", |
110 v.fsIn(), v.fsIn(), v.fsIn()); | 110 v.fsIn(), v.fsIn(), v.fsIn()); |
111 fsBuilder->codeAppendf("float dfdy =" | 111 fsBuilder->codeAppendf("float dfdy =" |
112 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s
.z * dklmdy.y;", | 112 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s
.z * dklmdy.y;", |
113 v.fsIn(), v.fsIn(), v.fsIn()); | 113 v.fsIn(), v.fsIn(), v.fsIn()); |
114 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); | 114 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); |
115 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); | 115 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); |
116 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn
(), v.fsIn(), | 116 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn
(), v.fsIn(), |
117 v.fsIn(), v.fsIn()); | 117 v.fsIn(), v.fsIn()); |
118 fsBuilder->codeAppend("func = abs(func);"); | 118 fsBuilder->codeAppend("func = abs(func);"); |
119 fsBuilder->codeAppend("edgeAlpha = func / gFM;"); | 119 fsBuilder->codeAppend("edgeAlpha = func / gFM;"); |
120 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); | 120 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); |
121 // Add line below for smooth cubic ramp | 121 // Add line below for smooth cubic ramp |
122 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); | 122 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); |
123 break; | 123 break; |
124 } | 124 } |
125 case kFillAA_GrProcessorEdgeType: { | 125 case kFillAA_GrProcessorEdgeType: { |
126 SkAssertResult(fsBuilder->enableFeature( | 126 SkAssertResult(fsBuilder->enableFeature( |
127 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 127 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
128 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); | 128 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); |
129 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); | 129 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); |
130 fsBuilder->codeAppendf("float dfdx =" | 130 fsBuilder->codeAppendf("float dfdx =" |
131 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s
.z * dklmdx.y;", | 131 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s
.z * dklmdx.y;", |
132 v.fsIn(), v.fsIn(), v.fsIn()); | 132 v.fsIn(), v.fsIn(), v.fsIn()); |
133 fsBuilder->codeAppendf("float dfdy =" | 133 fsBuilder->codeAppendf("float dfdy =" |
134 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s
.z * dklmdy.y;", | 134 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s
.z * dklmdy.y;", |
135 v.fsIn(), v.fsIn(), v.fsIn()); | 135 v.fsIn(), v.fsIn(), v.fsIn()); |
136 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); | 136 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); |
137 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); | 137 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); |
(...skipping 11 matching lines...) Expand all Loading... |
149 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); | 149 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); |
150 break; | 150 break; |
151 } | 151 } |
152 default: | 152 default: |
153 SkFAIL("Shouldn't get here"); | 153 SkFAIL("Shouldn't get here"); |
154 } | 154 } |
155 | 155 |
156 // TODO should we really be doing this? | 156 // TODO should we really be doing this? |
157 if (gp.coverageScale() != 0xff) { | 157 if (gp.coverageScale() != 0xff) { |
158 const char* coverageScale; | 158 const char* coverageScale; |
159 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 159 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, |
160 kFloat_GrSLType, | 160 kFloat_GrSLType, |
161 kDefault_GrSLPrecision, | 161 kDefault_GrSLPrecision, |
162 "Coverage", | 162 "Coverage", |
163 &coverageScale); | 163 &coverageScale); |
164 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag
e, coverageScale); | 164 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag
e, coverageScale); |
165 } else { | 165 } else { |
166 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); | 166 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
167 } | 167 } |
168 } | 168 } |
169 | 169 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 }; | 283 }; |
284 | 284 |
285 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) | 285 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) |
286 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { | 286 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { |
287 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); | 287 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); |
288 fEdgeType = ce.getEdgeType(); | 288 fEdgeType = ce.getEdgeType(); |
289 } | 289 } |
290 | 290 |
291 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 291 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
292 GrGLSLGPBuilder* pb = args.fPB; | 292 GrGLSLGPBuilder* pb = args.fPB; |
293 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 293 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
294 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); | 294 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); |
295 | 295 |
296 // emit attributes | 296 // emit attributes |
297 vsBuilder->emitAttributes(gp); | 297 vsBuilder->emitAttributes(gp); |
298 | 298 |
299 GrGLSLVertToFrag v(kVec4f_GrSLType); | 299 GrGLSLVertToFrag v(kVec4f_GrSLType); |
300 args.fPB->addVarying("HairQuadEdge", &v); | 300 args.fPB->addVarying("HairQuadEdge", &v); |
301 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); | 301 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); |
302 | 302 |
303 // Setup pass through color | 303 // Setup pass through color |
304 if (!gp.colorIgnored()) { | 304 if (!gp.colorIgnored()) { |
305 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); | 305 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); |
306 } | 306 } |
307 | 307 |
308 // Setup position | 308 // Setup position |
309 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV
iewMatrixUniform); | 309 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV
iewMatrixUniform); |
310 | 310 |
311 // emit transforms with position | 311 // emit transforms with position |
312 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo
calMatrix(), | 312 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo
calMatrix(), |
313 args.fTransformsIn, args.fTransformsOut); | 313 args.fTransformsIn, args.fTransformsOut); |
314 | 314 |
315 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 315 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
316 fsBuilder->codeAppendf("float edgeAlpha;"); | 316 fsBuilder->codeAppendf("float edgeAlpha;"); |
317 | 317 |
318 switch (fEdgeType) { | 318 switch (fEdgeType) { |
319 case kHairlineAA_GrProcessorEdgeType: { | 319 case kHairlineAA_GrProcessorEdgeType: { |
320 SkAssertResult(fsBuilder->enableFeature( | 320 SkAssertResult(fsBuilder->enableFeature( |
321 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 321 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
322 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); | 322 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); |
323 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); | 323 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); |
324 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.
y," | 324 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.
y," |
325 " 2.0 * %s.x * duvdy.x - duvdy.
y);", | 325 " 2.0 * %s.x * duvdy.x - duvdy.
y);", |
326 v.fsIn(), v.fsIn()); | 326 v.fsIn(), v.fsIn()); |
327 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); | 327 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); |
328 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(
gF, gF));"); | 328 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(
gF, gF));"); |
329 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); | 329 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); |
330 // Add line below for smooth cubic ramp | 330 // Add line below for smooth cubic ramp |
331 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); | 331 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); |
332 break; | 332 break; |
333 } | 333 } |
334 case kFillAA_GrProcessorEdgeType: { | 334 case kFillAA_GrProcessorEdgeType: { |
335 SkAssertResult(fsBuilder->enableFeature( | 335 SkAssertResult(fsBuilder->enableFeature( |
336 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 336 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
337 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); | 337 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); |
338 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); | 338 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); |
339 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.
y," | 339 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.
y," |
340 " 2.0 * %s.x * duvdy.x - duvdy.
y);", | 340 " 2.0 * %s.x * duvdy.x - duvdy.
y);", |
341 v.fsIn(), v.fsIn()); | 341 v.fsIn(), v.fsIn()); |
342 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); | 342 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); |
343 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));"); | 343 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));"); |
344 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);
"); | 344 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);
"); |
345 // Add line below for smooth cubic ramp | 345 // Add line below for smooth cubic ramp |
346 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); | 346 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); |
347 break; | 347 break; |
348 } | 348 } |
349 case kFillBW_GrProcessorEdgeType: { | 349 case kFillBW_GrProcessorEdgeType: { |
350 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); | 350 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); |
351 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); | 351 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); |
352 break; | 352 break; |
353 } | 353 } |
354 default: | 354 default: |
355 SkFAIL("Shouldn't get here"); | 355 SkFAIL("Shouldn't get here"); |
356 } | 356 } |
357 | 357 |
358 if (0xff != gp.coverageScale()) { | 358 if (0xff != gp.coverageScale()) { |
359 const char* coverageScale; | 359 const char* coverageScale; |
360 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 360 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, |
361 kFloat_GrSLType, | 361 kFloat_GrSLType, |
362 kDefault_GrSLPrecision, | 362 kDefault_GrSLPrecision, |
363 "Coverage", | 363 "Coverage", |
364 &coverageScale); | 364 &coverageScale); |
365 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag
e, coverageScale); | 365 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag
e, coverageScale); |
366 } else { | 366 } else { |
367 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); | 367 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
368 } | 368 } |
369 } | 369 } |
370 | 370 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 typedef GrGLGeometryProcessor INHERITED; | 470 typedef GrGLGeometryProcessor INHERITED; |
471 }; | 471 }; |
472 | 472 |
473 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) | 473 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) |
474 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { | 474 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { |
475 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); | 475 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); |
476 fEdgeType = ce.getEdgeType(); | 476 fEdgeType = ce.getEdgeType(); |
477 } | 477 } |
478 | 478 |
479 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 479 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
480 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 480 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
481 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); | 481 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); |
482 | 482 |
483 // emit attributes | 483 // emit attributes |
484 vsBuilder->emitAttributes(gp); | 484 vsBuilder->emitAttributes(gp); |
485 | 485 |
486 GrGLSLVertToFrag v(kVec4f_GrSLType); | 486 GrGLSLVertToFrag v(kVec4f_GrSLType); |
487 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); | 487 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); |
488 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); | 488 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); |
489 | 489 |
490 // Setup pass through color | 490 // Setup pass through color |
491 if (!gp.colorIgnored()) { | 491 if (!gp.colorIgnored()) { |
492 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); | 492 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); |
493 } | 493 } |
494 | 494 |
495 // Setup position | 495 // Setup position |
496 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix(
), | 496 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix(
), |
497 &fViewMatrixUniform); | 497 &fViewMatrixUniform); |
498 | 498 |
499 // emit transforms with position | 499 // emit transforms with position |
500 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName,
args.fTransformsIn, | 500 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName,
args.fTransformsIn, |
501 args.fTransformsOut); | 501 args.fTransformsOut); |
502 | 502 |
503 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 503 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
504 | 504 |
505 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi
on); | 505 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi
on); |
506 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); | 506 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); |
507 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); | 507 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); |
508 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 508 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
509 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 509 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
510 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision); | 510 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision); |
511 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 511 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
512 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 512 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
513 | 513 |
514 fsBuilder->declAppend(edgeAlpha); | 514 fsBuilder->declAppend(edgeAlpha); |
515 fsBuilder->declAppend(dklmdx); | 515 fsBuilder->declAppend(dklmdx); |
516 fsBuilder->declAppend(dklmdy); | 516 fsBuilder->declAppend(dklmdy); |
517 fsBuilder->declAppend(dfdx); | 517 fsBuilder->declAppend(dfdx); |
518 fsBuilder->declAppend(dfdy); | 518 fsBuilder->declAppend(dfdy); |
519 fsBuilder->declAppend(gF); | 519 fsBuilder->declAppend(gF); |
520 fsBuilder->declAppend(gFM); | 520 fsBuilder->declAppend(gFM); |
521 fsBuilder->declAppend(func); | 521 fsBuilder->declAppend(func); |
522 | 522 |
523 switch (fEdgeType) { | 523 switch (fEdgeType) { |
524 case kHairlineAA_GrProcessorEdgeType: { | 524 case kHairlineAA_GrProcessorEdgeType: { |
525 SkAssertResult(fsBuilder->enableFeature( | 525 SkAssertResult(fsBuilder->enableFeature( |
526 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 526 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
527 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn(
)); | 527 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn(
)); |
528 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn(
)); | 528 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn(
)); |
529 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", | 529 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", |
530 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st
r(), v.fsIn(), | 530 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st
r(), v.fsIn(), |
531 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); | 531 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); |
532 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", | 532 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", |
533 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st
r(), v.fsIn(), | 533 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st
r(), v.fsIn(), |
534 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); | 534 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); |
535 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(
), dfdy.c_str()); | 535 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(
), dfdy.c_str()); |
536 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_
str(), gF.c_str()); | 536 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_
str(), gF.c_str()); |
537 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", | 537 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", |
538 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v
.fsIn(), v.fsIn()); | 538 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v
.fsIn(), v.fsIn()); |
539 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str()); | 539 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str()); |
540 fsBuilder->codeAppendf("%s = %s / %s;", | 540 fsBuilder->codeAppendf("%s = %s / %s;", |
541 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; | 541 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; |
542 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);", | 542 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);", |
543 edgeAlpha.c_str(), edgeAlpha.c_str()); | 543 edgeAlpha.c_str(), edgeAlpha.c_str()); |
544 // Add line below for smooth cubic ramp | 544 // Add line below for smooth cubic ramp |
545 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);", | 545 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);", |
546 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), | 546 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
547 // edgeAlpha.c_str()); | 547 // edgeAlpha.c_str()); |
548 break; | 548 break; |
549 } | 549 } |
550 case kFillAA_GrProcessorEdgeType: { | 550 case kFillAA_GrProcessorEdgeType: { |
551 SkAssertResult(fsBuilder->enableFeature( | 551 SkAssertResult(fsBuilder->enableFeature( |
552 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 552 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
553 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn(
)); | 553 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn(
)); |
554 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn(
)); | 554 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn(
)); |
555 fsBuilder->codeAppendf("%s =" | 555 fsBuilder->codeAppendf("%s =" |
556 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.
z * %s.y;", | 556 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.
z * %s.y;", |
557 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st
r(), v.fsIn(), | 557 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st
r(), v.fsIn(), |
558 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); | 558 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); |
559 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", | 559 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", |
560 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st
r(), v.fsIn(), | 560 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st
r(), v.fsIn(), |
561 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); | 561 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); |
562 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(
), dfdy.c_str()); | 562 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(
), dfdy.c_str()); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 do { | 630 do { |
631 GrPrimitiveEdgeType edgeType = | 631 GrPrimitiveEdgeType edgeType = |
632 static_cast<GrPrimitiveEdgeType>( | 632 static_cast<GrPrimitiveEdgeType>( |
633 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); | 633 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); |
634 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), | 634 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), |
635 GrTest::TestMatrix(d->fRandom), edgeType, *d-
>fCaps); | 635 GrTest::TestMatrix(d->fRandom), edgeType, *d-
>fCaps); |
636 } while (nullptr == gp); | 636 } while (nullptr == gp); |
637 return gp; | 637 return gp; |
638 } | 638 } |
639 | 639 |
OLD | NEW |