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 "SkDisplacementMapEffect.h" | 8 #include "SkDisplacementMapEffect.h" |
9 #include "SkDevice.h" | 9 #include "SkDevice.h" |
10 #include "SkReadBuffer.h" | 10 #include "SkReadBuffer.h" |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 } | 305 } |
306 str->appendf("))"); | 306 str->appendf("))"); |
307 } | 307 } |
308 #endif | 308 #endif |
309 | 309 |
310 /////////////////////////////////////////////////////////////////////////////// | 310 /////////////////////////////////////////////////////////////////////////////// |
311 | 311 |
312 #if SK_SUPPORT_GPU | 312 #if SK_SUPPORT_GPU |
313 class GrGLDisplacementMapEffect : public GrGLSLFragmentProcessor { | 313 class GrGLDisplacementMapEffect : public GrGLSLFragmentProcessor { |
314 public: | 314 public: |
315 GrGLDisplacementMapEffect(const GrProcessor&); | |
316 | |
317 void emitCode(EmitArgs&) override; | 315 void emitCode(EmitArgs&) override; |
318 | 316 |
319 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); | 317 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); |
320 | 318 |
321 const GrTextureDomain::GLDomain& glDomain() const { return fGLDomain; } | |
322 | |
323 protected: | 319 protected: |
324 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; | 320 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
325 | 321 |
326 private: | 322 private: |
327 SkDisplacementMapEffect::ChannelSelectorType fXChannelSelector; | |
328 SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector; | |
329 GrGLSLProgramDataManager::UniformHandle fScaleUni; | 323 GrGLSLProgramDataManager::UniformHandle fScaleUni; |
330 GrTextureDomain::GLDomain fGLDomain; | 324 GrTextureDomain::GLDomain fGLDomain; |
331 | 325 |
332 typedef GrGLSLFragmentProcessor INHERITED; | 326 typedef GrGLSLFragmentProcessor INHERITED; |
333 }; | 327 }; |
334 | 328 |
335 /////////////////////////////////////////////////////////////////////////////// | 329 /////////////////////////////////////////////////////////////////////////////// |
336 | 330 |
337 class GrDisplacementMapEffect : public GrFragmentProcessor { | 331 class GrDisplacementMapEffect : public GrFragmentProcessor { |
338 public: | 332 public: |
(...skipping 12 matching lines...) Expand all Loading... |
351 { return fXChannelSelector; } | 345 { return fXChannelSelector; } |
352 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector() const | 346 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector() const |
353 { return fYChannelSelector; } | 347 { return fYChannelSelector; } |
354 const SkVector& scale() const { return fScale; } | 348 const SkVector& scale() const { return fScale; } |
355 | 349 |
356 const char* name() const override { return "DisplacementMap"; } | 350 const char* name() const override { return "DisplacementMap"; } |
357 const GrTextureDomain& domain() const { return fDomain; } | 351 const GrTextureDomain& domain() const { return fDomain; } |
358 | 352 |
359 private: | 353 private: |
360 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { | 354 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { |
361 return new GrGLDisplacementMapEffect(*this); | 355 return new GrGLDisplacementMapEffect; |
362 } | 356 } |
363 | 357 |
364 virtual void onGetGLSLProcessorKey(const GrGLSLCaps& caps, | 358 void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b)
const override { |
365 GrProcessorKeyBuilder* b) const override
{ | |
366 GrGLDisplacementMapEffect::GenKey(*this, caps, b); | 359 GrGLDisplacementMapEffect::GenKey(*this, caps, b); |
367 } | 360 } |
368 | 361 |
369 bool onIsEqual(const GrFragmentProcessor&) const override; | 362 bool onIsEqual(const GrFragmentProcessor&) const override; |
370 | 363 |
371 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; | 364 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; |
372 | 365 |
373 GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChanne
lSelector, | 366 GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChanne
lSelector, |
374 SkDisplacementMapEffect::ChannelSelectorType yChanne
lSelector, | 367 SkDisplacementMapEffect::ChannelSelectorType yChanne
lSelector, |
375 const SkVector& scale, | 368 const SkVector& scale, |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 SkISize colorDimensions; | 528 SkISize colorDimensions; |
536 colorDimensions.fWidth = d->fRandom->nextRangeU(0, d->fTextures[texIdxColor]
->width()); | 529 colorDimensions.fWidth = d->fRandom->nextRangeU(0, d->fTextures[texIdxColor]
->width()); |
537 colorDimensions.fHeight = d->fRandom->nextRangeU(0, d->fTextures[texIdxColor
]->height()); | 530 colorDimensions.fHeight = d->fRandom->nextRangeU(0, d->fTextures[texIdxColor
]->height()); |
538 return GrDisplacementMapEffect::Create(xChannelSelector, yChannelSelector, s
cale, | 531 return GrDisplacementMapEffect::Create(xChannelSelector, yChannelSelector, s
cale, |
539 d->fTextures[texIdxDispl], SkMatrix::
I(), | 532 d->fTextures[texIdxDispl], SkMatrix::
I(), |
540 d->fTextures[texIdxColor], colorDimen
sions); | 533 d->fTextures[texIdxColor], colorDimen
sions); |
541 } | 534 } |
542 | 535 |
543 /////////////////////////////////////////////////////////////////////////////// | 536 /////////////////////////////////////////////////////////////////////////////// |
544 | 537 |
545 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrProcessor& proc) | |
546 : fXChannelSelector(proc.cast<GrDisplacementMapEffect>().xChannelSelector()) | |
547 , fYChannelSelector(proc.cast<GrDisplacementMapEffect>().yChannelSelector())
{ | |
548 } | |
549 | |
550 void GrGLDisplacementMapEffect::emitCode(EmitArgs& args) { | 538 void GrGLDisplacementMapEffect::emitCode(EmitArgs& args) { |
551 const GrTextureDomain& domain = args.fFp.cast<GrDisplacementMapEffect>().dom
ain(); | 539 const GrDisplacementMapEffect& displacementMap = args.fFp.cast<GrDisplacemen
tMapEffect>(); |
| 540 const GrTextureDomain& domain = displacementMap.domain(); |
552 | 541 |
553 fScaleUni = args.fUniformHandler->addUniform(GrGLSLUniformHandler::kFragment
_Visibility, | 542 fScaleUni = args.fUniformHandler->addUniform(GrGLSLUniformHandler::kFragment
_Visibility, |
554 kVec2f_GrSLType, kDefault_GrSLP
recision, "Scale"); | 543 kVec2f_GrSLType, kDefault_GrSLP
recision, "Scale"); |
555 const char* scaleUni = args.fUniformHandler->getUniformCStr(fScaleUni); | 544 const char* scaleUni = args.fUniformHandler->getUniformCStr(fScaleUni); |
556 const char* dColor = "dColor"; | 545 const char* dColor = "dColor"; |
557 const char* cCoords = "cCoords"; | 546 const char* cCoords = "cCoords"; |
558 const char* nearZero = "1e-6"; // Since 6.10352e−5 is the smallest half floa
t, use | 547 const char* nearZero = "1e-6"; // Since 6.10352e−5 is the smallest half floa
t, use |
559 // a number smaller than that to approximate
0, but | 548 // a number smaller than that to approximate
0, but |
560 // leave room for 32-bit float GPU rounding e
rrors. | 549 // leave room for 32-bit float GPU rounding e
rrors. |
561 | 550 |
562 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 551 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
563 fragBuilder->codeAppendf("\t\tvec4 %s = ", dColor); | 552 fragBuilder->codeAppendf("\t\tvec4 %s = ", dColor); |
564 fragBuilder->appendTextureLookup(args.fSamplers[0], args.fCoords[0].c_str(), | 553 fragBuilder->appendTextureLookup(args.fSamplers[0], args.fCoords[0].c_str(), |
565 args.fCoords[0].getType()); | 554 args.fCoords[0].getType()); |
566 fragBuilder->codeAppend(";\n"); | 555 fragBuilder->codeAppend(";\n"); |
567 | 556 |
568 // Unpremultiply the displacement | 557 // Unpremultiply the displacement |
569 fragBuilder->codeAppendf( | 558 fragBuilder->codeAppendf( |
570 "\t\t%s.rgb = (%s.a < %s) ? vec3(0.0) : clamp(%s.rgb / %s.a, 0.0, 1.0);"
, | 559 "\t\t%s.rgb = (%s.a < %s) ? vec3(0.0) : clamp(%s.rgb / %s.a, 0.0, 1.0);"
, |
571 dColor, dColor, nearZero, dColor, dColor); | 560 dColor, dColor, nearZero, dColor, dColor); |
572 SkString coords2D = fragBuilder->ensureFSCoords2D(args.fCoords, 1); | 561 SkString coords2D = fragBuilder->ensureFSCoords2D(args.fCoords, 1); |
573 fragBuilder->codeAppendf("\t\tvec2 %s = %s + %s*(%s.", | 562 fragBuilder->codeAppendf("\t\tvec2 %s = %s + %s*(%s.", |
574 cCoords, coords2D.c_str(), scaleUni, dColor); | 563 cCoords, coords2D.c_str(), scaleUni, dColor); |
575 | 564 |
576 switch (fXChannelSelector) { | 565 switch (displacementMap.xChannelSelector()) { |
577 case SkDisplacementMapEffect::kR_ChannelSelectorType: | 566 case SkDisplacementMapEffect::kR_ChannelSelectorType: |
578 fragBuilder->codeAppend("r"); | 567 fragBuilder->codeAppend("r"); |
579 break; | 568 break; |
580 case SkDisplacementMapEffect::kG_ChannelSelectorType: | 569 case SkDisplacementMapEffect::kG_ChannelSelectorType: |
581 fragBuilder->codeAppend("g"); | 570 fragBuilder->codeAppend("g"); |
582 break; | 571 break; |
583 case SkDisplacementMapEffect::kB_ChannelSelectorType: | 572 case SkDisplacementMapEffect::kB_ChannelSelectorType: |
584 fragBuilder->codeAppend("b"); | 573 fragBuilder->codeAppend("b"); |
585 break; | 574 break; |
586 case SkDisplacementMapEffect::kA_ChannelSelectorType: | 575 case SkDisplacementMapEffect::kA_ChannelSelectorType: |
587 fragBuilder->codeAppend("a"); | 576 fragBuilder->codeAppend("a"); |
588 break; | 577 break; |
589 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: | 578 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
590 default: | 579 default: |
591 SkDEBUGFAIL("Unknown X channel selector"); | 580 SkDEBUGFAIL("Unknown X channel selector"); |
592 } | 581 } |
593 | 582 |
594 switch (fYChannelSelector) { | 583 switch (displacementMap.yChannelSelector()) { |
595 case SkDisplacementMapEffect::kR_ChannelSelectorType: | 584 case SkDisplacementMapEffect::kR_ChannelSelectorType: |
596 fragBuilder->codeAppend("r"); | 585 fragBuilder->codeAppend("r"); |
597 break; | 586 break; |
598 case SkDisplacementMapEffect::kG_ChannelSelectorType: | 587 case SkDisplacementMapEffect::kG_ChannelSelectorType: |
599 fragBuilder->codeAppend("g"); | 588 fragBuilder->codeAppend("g"); |
600 break; | 589 break; |
601 case SkDisplacementMapEffect::kB_ChannelSelectorType: | 590 case SkDisplacementMapEffect::kB_ChannelSelectorType: |
602 fragBuilder->codeAppend("b"); | 591 fragBuilder->codeAppend("b"); |
603 break; | 592 break; |
604 case SkDisplacementMapEffect::kA_ChannelSelectorType: | 593 case SkDisplacementMapEffect::kA_ChannelSelectorType: |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 const GrGLSLCaps&, GrProcessorKeyBuilder*
b) { | 625 const GrGLSLCaps&, GrProcessorKeyBuilder*
b) { |
637 const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMap
Effect>(); | 626 const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMap
Effect>(); |
638 | 627 |
639 uint32_t xKey = displacementMap.xChannelSelector(); | 628 uint32_t xKey = displacementMap.xChannelSelector(); |
640 uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBit
s; | 629 uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBit
s; |
641 | 630 |
642 b->add32(xKey | yKey); | 631 b->add32(xKey | yKey); |
643 } | 632 } |
644 #endif | 633 #endif |
645 | 634 |
OLD | NEW |