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/GrGLSLFragmentShaderBuilder.h" |
10 #include "glsl/GrGLSLGeometryProcessor.h" | 11 #include "glsl/GrGLSLGeometryProcessor.h" |
11 #include "glsl/GrGLSLProgramBuilder.h" | |
12 #include "glsl/GrGLSLProgramDataManager.h" | 12 #include "glsl/GrGLSLProgramDataManager.h" |
| 13 #include "glsl/GrGLSLUniformHandler.h" |
13 #include "glsl/GrGLSLUtil.h" | 14 #include "glsl/GrGLSLUtil.h" |
14 #include "glsl/GrGLSLVarying.h" | 15 #include "glsl/GrGLSLVarying.h" |
| 16 #include "glsl/GrGLSLVertexShaderBuilder.h" |
15 | 17 |
16 class GrGLConicEffect : public GrGLSLGeometryProcessor { | 18 class GrGLConicEffect : public GrGLSLGeometryProcessor { |
17 public: | 19 public: |
18 GrGLConicEffect(const GrGeometryProcessor&); | 20 GrGLConicEffect(const GrGeometryProcessor&); |
19 | 21 |
20 void onEmitCode(EmitArgs&, GrGPArgs*) override; | 22 void onEmitCode(EmitArgs&, GrGPArgs*) override; |
21 | 23 |
22 static inline void GenKey(const GrGeometryProcessor&, | 24 static inline void GenKey(const GrGeometryProcessor&, |
23 const GrGLSLCaps&, | 25 const GrGLSLCaps&, |
24 GrProcessorKeyBuilder*); | 26 GrProcessorKeyBuilder*); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 typedef GrGLSLGeometryProcessor INHERITED; | 68 typedef GrGLSLGeometryProcessor INHERITED; |
67 }; | 69 }; |
68 | 70 |
69 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) | 71 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) |
70 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { | 72 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { |
71 const GrConicEffect& ce = processor.cast<GrConicEffect>(); | 73 const GrConicEffect& ce = processor.cast<GrConicEffect>(); |
72 fEdgeType = ce.getEdgeType(); | 74 fEdgeType = ce.getEdgeType(); |
73 } | 75 } |
74 | 76 |
75 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 77 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
76 GrGLSLGPBuilder* pb = args.fPB; | |
77 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 78 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
78 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); | 79 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); |
79 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 80 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 81 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
80 | 82 |
81 // emit attributes | 83 // emit attributes |
82 varyingHandler->emitAttributes(gp); | 84 varyingHandler->emitAttributes(gp); |
83 | 85 |
84 GrGLSLVertToFrag v(kVec4f_GrSLType); | 86 GrGLSLVertToFrag v(kVec4f_GrSLType); |
85 varyingHandler->addVarying("ConicCoeffs", &v); | 87 varyingHandler->addVarying("ConicCoeffs", &v); |
86 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); | 88 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); |
87 | 89 |
88 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 90 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
89 // Setup pass through color | 91 // Setup pass through color |
90 if (!gp.colorIgnored()) { | 92 if (!gp.colorIgnored()) { |
91 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo
rUniform); | 93 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
&fColorUniform); |
92 } | 94 } |
93 | 95 |
94 // Setup position | 96 // Setup position |
95 this->setupPosition(pb, | 97 this->setupPosition(vertBuilder, |
96 vertBuilder, | 98 uniformHandler, |
97 gpArgs, | 99 gpArgs, |
98 gp.inPosition()->fName, | 100 gp.inPosition()->fName, |
99 gp.viewMatrix(), | 101 gp.viewMatrix(), |
100 &fViewMatrixUniform); | 102 &fViewMatrixUniform); |
101 | 103 |
102 // emit transforms with position | 104 // emit transforms with position |
103 this->emitTransforms(pb, | 105 this->emitTransforms(vertBuilder, |
104 vertBuilder, | |
105 varyingHandler, | 106 varyingHandler, |
| 107 uniformHandler, |
106 gpArgs->fPositionVar, | 108 gpArgs->fPositionVar, |
107 gp.inPosition()->fName, | 109 gp.inPosition()->fName, |
108 gp.localMatrix(), | 110 gp.localMatrix(), |
109 args.fTransformsIn, | 111 args.fTransformsIn, |
110 args.fTransformsOut); | 112 args.fTransformsOut); |
111 | 113 |
112 fragBuilder->codeAppend("float edgeAlpha;"); | 114 fragBuilder->codeAppend("float edgeAlpha;"); |
113 | 115 |
114 switch (fEdgeType) { | 116 switch (fEdgeType) { |
115 case kHairlineAA_GrProcessorEdgeType: { | 117 case kHairlineAA_GrProcessorEdgeType: { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); | 163 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); |
162 break; | 164 break; |
163 } | 165 } |
164 default: | 166 default: |
165 SkFAIL("Shouldn't get here"); | 167 SkFAIL("Shouldn't get here"); |
166 } | 168 } |
167 | 169 |
168 // TODO should we really be doing this? | 170 // TODO should we really be doing this? |
169 if (gp.coverageScale() != 0xff) { | 171 if (gp.coverageScale() != 0xff) { |
170 const char* coverageScale; | 172 const char* coverageScale; |
171 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, | 173 fCoverageScaleUniform = uniformHandler->addUniform( |
172 kFloat_GrSLType, | 174 GrGLSLUniformHandler::k
Fragment_Visibility, |
173 kDefault_GrSLPrecision, | 175 kFloat_GrSLType, |
174 "Coverage", | 176 kDefault_GrSLPrecision, |
175 &coverageScale); | 177 "Coverage", |
| 178 &coverageScale); |
176 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover
age, coverageScale); | 179 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover
age, coverageScale); |
177 } else { | 180 } else { |
178 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); | 181 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
179 } | 182 } |
180 } | 183 } |
181 | 184 |
182 void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp, | 185 void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp, |
183 const GrGLSLCaps&, | 186 const GrGLSLCaps&, |
184 GrProcessorKeyBuilder* b) { | 187 GrProcessorKeyBuilder* b) { |
185 const GrConicEffect& ce = gp.cast<GrConicEffect>(); | 188 const GrConicEffect& ce = gp.cast<GrConicEffect>(); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 typedef GrGLSLGeometryProcessor INHERITED; | 297 typedef GrGLSLGeometryProcessor INHERITED; |
295 }; | 298 }; |
296 | 299 |
297 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) | 300 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) |
298 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { | 301 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { |
299 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); | 302 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); |
300 fEdgeType = ce.getEdgeType(); | 303 fEdgeType = ce.getEdgeType(); |
301 } | 304 } |
302 | 305 |
303 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 306 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
304 GrGLSLGPBuilder* pb = args.fPB; | |
305 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 307 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
306 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); | 308 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); |
307 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 309 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 310 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
308 | 311 |
309 // emit attributes | 312 // emit attributes |
310 varyingHandler->emitAttributes(gp); | 313 varyingHandler->emitAttributes(gp); |
311 | 314 |
312 GrGLSLVertToFrag v(kVec4f_GrSLType); | 315 GrGLSLVertToFrag v(kVec4f_GrSLType); |
313 varyingHandler->addVarying("HairQuadEdge", &v); | 316 varyingHandler->addVarying("HairQuadEdge", &v); |
314 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); | 317 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); |
315 | 318 |
316 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 319 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
317 // Setup pass through color | 320 // Setup pass through color |
318 if (!gp.colorIgnored()) { | 321 if (!gp.colorIgnored()) { |
319 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo
rUniform); | 322 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
&fColorUniform); |
320 } | 323 } |
321 | 324 |
322 // Setup position | 325 // Setup position |
323 this->setupPosition(pb, | 326 this->setupPosition(vertBuilder, |
324 vertBuilder, | 327 uniformHandler, |
325 gpArgs, | 328 gpArgs, |
326 gp.inPosition()->fName, | 329 gp.inPosition()->fName, |
327 gp.viewMatrix(), | 330 gp.viewMatrix(), |
328 &fViewMatrixUniform); | 331 &fViewMatrixUniform); |
329 | 332 |
330 // emit transforms with position | 333 // emit transforms with position |
331 this->emitTransforms(pb, | 334 this->emitTransforms(vertBuilder, |
332 vertBuilder, | |
333 varyingHandler, | 335 varyingHandler, |
| 336 uniformHandler, |
334 gpArgs->fPositionVar, | 337 gpArgs->fPositionVar, |
335 gp.inPosition()->fName, | 338 gp.inPosition()->fName, |
336 gp.localMatrix(), | 339 gp.localMatrix(), |
337 args.fTransformsIn, | 340 args.fTransformsIn, |
338 args.fTransformsOut); | 341 args.fTransformsOut); |
339 | 342 |
340 fragBuilder->codeAppendf("float edgeAlpha;"); | 343 fragBuilder->codeAppendf("float edgeAlpha;"); |
341 | 344 |
342 switch (fEdgeType) { | 345 switch (fEdgeType) { |
343 case kHairlineAA_GrProcessorEdgeType: { | 346 case kHairlineAA_GrProcessorEdgeType: { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 v.fsIn(), v.fsIn(), v.fsIn()); | 380 v.fsIn(), v.fsIn(), v.fsIn()); |
378 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); | 381 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); |
379 break; | 382 break; |
380 } | 383 } |
381 default: | 384 default: |
382 SkFAIL("Shouldn't get here"); | 385 SkFAIL("Shouldn't get here"); |
383 } | 386 } |
384 | 387 |
385 if (0xff != gp.coverageScale()) { | 388 if (0xff != gp.coverageScale()) { |
386 const char* coverageScale; | 389 const char* coverageScale; |
387 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, | 390 fCoverageScaleUniform = uniformHandler->addUniform( |
388 kFloat_GrSLType, | 391 GrGLSLUniformHandler::k
Fragment_Visibility, |
389 kDefault_GrSLPrecision, | 392 kFloat_GrSLType, |
390 "Coverage", | 393 kDefault_GrSLPrecision, |
391 &coverageScale); | 394 "Coverage", |
| 395 &coverageScale); |
392 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover
age, coverageScale); | 396 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover
age, coverageScale); |
393 } else { | 397 } else { |
394 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); | 398 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
395 } | 399 } |
396 } | 400 } |
397 | 401 |
398 void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp, | 402 void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp, |
399 const GrGLSLCaps&, | 403 const GrGLSLCaps&, |
400 GrProcessorKeyBuilder* b) { | 404 GrProcessorKeyBuilder* b) { |
401 const GrQuadEffect& ce = gp.cast<GrQuadEffect>(); | 405 const GrQuadEffect& ce = gp.cast<GrQuadEffect>(); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) | 504 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) |
501 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { | 505 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { |
502 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); | 506 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); |
503 fEdgeType = ce.getEdgeType(); | 507 fEdgeType = ce.getEdgeType(); |
504 } | 508 } |
505 | 509 |
506 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 510 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
507 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 511 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
508 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); | 512 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); |
509 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 513 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 514 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
510 | 515 |
511 // emit attributes | 516 // emit attributes |
512 varyingHandler->emitAttributes(gp); | 517 varyingHandler->emitAttributes(gp); |
513 | 518 |
514 GrGLSLVertToFrag v(kVec4f_GrSLType); | 519 GrGLSLVertToFrag v(kVec4f_GrSLType); |
515 varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); | 520 varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); |
516 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); | 521 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); |
517 | 522 |
518 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 523 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
519 // Setup pass through color | 524 // Setup pass through color |
520 if (!gp.colorIgnored()) { | 525 if (!gp.colorIgnored()) { |
521 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo
rUniform); | 526 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
&fColorUniform); |
522 } | 527 } |
523 | 528 |
524 // Setup position | 529 // Setup position |
525 this->setupPosition(args.fPB, | 530 this->setupPosition(vertBuilder, |
526 vertBuilder, | 531 uniformHandler, |
527 gpArgs, | 532 gpArgs, |
528 gp.inPosition()->fName, | 533 gp.inPosition()->fName, |
529 gp.viewMatrix(), | 534 gp.viewMatrix(), |
530 &fViewMatrixUniform); | 535 &fViewMatrixUniform); |
531 | 536 |
532 // emit transforms with position | 537 // emit transforms with position |
533 this->emitTransforms(args.fPB, | 538 this->emitTransforms(vertBuilder, |
534 vertBuilder, | |
535 varyingHandler, | 539 varyingHandler, |
| 540 uniformHandler, |
536 gpArgs->fPositionVar, | 541 gpArgs->fPositionVar, |
537 gp.inPosition()->fName, | 542 gp.inPosition()->fName, |
538 args.fTransformsIn, | 543 args.fTransformsIn, |
539 args.fTransformsOut); | 544 args.fTransformsOut); |
540 | 545 |
541 | 546 |
542 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi
on); | 547 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi
on); |
543 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); | 548 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); |
544 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); | 549 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); |
545 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 550 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 do { | 677 do { |
673 GrPrimitiveEdgeType edgeType = | 678 GrPrimitiveEdgeType edgeType = |
674 static_cast<GrPrimitiveEdgeType>( | 679 static_cast<GrPrimitiveEdgeType>( |
675 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); | 680 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); |
676 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), | 681 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), |
677 GrTest::TestMatrix(d->fRandom), edgeType, *d-
>fCaps); | 682 GrTest::TestMatrix(d->fRandom), edgeType, *d-
>fCaps); |
678 } while (nullptr == gp); | 683 } while (nullptr == gp); |
679 return gp; | 684 return gp; |
680 } | 685 } |
681 | 686 |
OLD | NEW |