OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "effects/GrCustomXfermode.h" | 8 #include "effects/GrCustomXfermode.h" |
9 #include "effects/GrCustomXfermodePriv.h" | 9 #include "effects/GrCustomXfermodePriv.h" |
10 | 10 |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 const char* dstColor = "bgColor"; | 420 const char* dstColor = "bgColor"; |
421 fsBuilder->codeAppendf("vec4 %s = ", dstColor); | 421 fsBuilder->codeAppendf("vec4 %s = ", dstColor); |
422 fsBuilder->appendTextureLookup(samplers[0], coords[0].c_str(), coords[0]
.getType()); | 422 fsBuilder->appendTextureLookup(samplers[0], coords[0].c_str(), coords[0]
.getType()); |
423 fsBuilder->codeAppendf(";"); | 423 fsBuilder->codeAppendf(";"); |
424 | 424 |
425 emit_custom_xfermode_code(mode, fsBuilder, outputColor, inputColor, dstC
olor); | 425 emit_custom_xfermode_code(mode, fsBuilder, outputColor, inputColor, dstC
olor); |
426 } | 426 } |
427 | 427 |
428 void setData(const GrGLProgramDataManager&, const GrProcessor&) override {} | 428 void setData(const GrGLProgramDataManager&, const GrProcessor&) override {} |
429 | 429 |
430 static void GenKey(const GrFragmentProcessor& proc, const GrGLCaps&, GrProce
ssorKeyBuilder* b) { | 430 static void GenKey(const GrFragmentProcessor& proc, const GrGLSLCaps&, GrPro
cessorKeyBuilder* b) { |
431 // The background may come from the dst or from a texture. | 431 // The background may come from the dst or from a texture. |
432 uint32_t key = proc.numTextures(); | 432 uint32_t key = proc.numTextures(); |
433 SkASSERT(key <= 1); | 433 SkASSERT(key <= 1); |
434 key |= proc.cast<GrCustomXferFP>().mode() << 1; | 434 key |= proc.cast<GrCustomXferFP>().mode() << 1; |
435 b->add32(key); | 435 b->add32(key); |
436 } | 436 } |
437 | 437 |
438 private: | 438 private: |
439 typedef GrGLFragmentProcessor INHERITED; | 439 typedef GrGLFragmentProcessor INHERITED; |
440 }; | 440 }; |
441 | 441 |
442 /////////////////////////////////////////////////////////////////////////////// | 442 /////////////////////////////////////////////////////////////////////////////// |
443 | 443 |
444 GrCustomXferFP::GrCustomXferFP(SkXfermode::Mode mode, GrTexture* background) | 444 GrCustomXferFP::GrCustomXferFP(SkXfermode::Mode mode, GrTexture* background) |
445 : fMode(mode) { | 445 : fMode(mode) { |
446 this->initClassID<GrCustomXferFP>(); | 446 this->initClassID<GrCustomXferFP>(); |
447 | 447 |
448 SkASSERT(background); | 448 SkASSERT(background); |
449 fBackgroundTransform.reset(kLocal_GrCoordSet, background, | 449 fBackgroundTransform.reset(kLocal_GrCoordSet, background, |
450 GrTextureParams::kNone_FilterMode); | 450 GrTextureParams::kNone_FilterMode); |
451 this->addCoordTransform(&fBackgroundTransform); | 451 this->addCoordTransform(&fBackgroundTransform); |
452 fBackgroundAccess.reset(background); | 452 fBackgroundAccess.reset(background); |
453 this->addTextureAccess(&fBackgroundAccess); | 453 this->addTextureAccess(&fBackgroundAccess); |
454 } | 454 } |
455 | 455 |
456 void GrCustomXferFP::getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuild
er* b) const { | 456 void GrCustomXferFP::getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBui
lder* b) const { |
457 GLCustomXferFP::GenKey(*this, caps, b); | 457 GLCustomXferFP::GenKey(*this, caps, b); |
458 } | 458 } |
459 | 459 |
460 GrGLFragmentProcessor* GrCustomXferFP::createGLInstance() const { | 460 GrGLFragmentProcessor* GrCustomXferFP::createGLInstance() const { |
461 return SkNEW_ARGS(GLCustomXferFP, (*this)); | 461 return SkNEW_ARGS(GLCustomXferFP, (*this)); |
462 } | 462 } |
463 | 463 |
464 bool GrCustomXferFP::onIsEqual(const GrFragmentProcessor& other) const { | 464 bool GrCustomXferFP::onIsEqual(const GrFragmentProcessor& other) const { |
465 const GrCustomXferFP& s = other.cast<GrCustomXferFP>(); | 465 const GrCustomXferFP& s = other.cast<GrCustomXferFP>(); |
466 return fMode == s.fMode; | 466 return fMode == s.fMode; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 const GrProcOptInfo& coveragePOI, | 507 const GrProcOptInfo& coveragePOI, |
508 bool doesStencilWrite, | 508 bool doesStencilWrite, |
509 GrColor* overrideColor, | 509 GrColor* overrideColor, |
510 const GrDrawTargetCaps& caps) ove
rride; | 510 const GrDrawTargetCaps& caps) ove
rride; |
511 | 511 |
512 SkXfermode::Mode mode() const { return fMode; } | 512 SkXfermode::Mode mode() const { return fMode; } |
513 | 513 |
514 private: | 514 private: |
515 CustomXP(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy, bool wi
llReadDstColor); | 515 CustomXP(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy, bool wi
llReadDstColor); |
516 | 516 |
517 void onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) con
st override; | 517 void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c
onst override; |
518 | 518 |
519 bool onIsEqual(const GrXferProcessor& xpBase) const override; | 519 bool onIsEqual(const GrXferProcessor& xpBase) const override; |
520 | 520 |
521 SkXfermode::Mode fMode; | 521 SkXfermode::Mode fMode; |
522 | 522 |
523 typedef GrXferProcessor INHERITED; | 523 typedef GrXferProcessor INHERITED; |
524 }; | 524 }; |
525 | 525 |
526 /////////////////////////////////////////////////////////////////////////////// | 526 /////////////////////////////////////////////////////////////////////////////// |
527 | 527 |
528 GrXPFactory* GrCustomXfermode::CreateXPFactory(SkXfermode::Mode mode) { | 528 GrXPFactory* GrCustomXfermode::CreateXPFactory(SkXfermode::Mode mode) { |
529 if (!GrCustomXfermode::IsSupportedMode(mode)) { | 529 if (!GrCustomXfermode::IsSupportedMode(mode)) { |
530 return NULL; | 530 return NULL; |
531 } else { | 531 } else { |
532 return SkNEW_ARGS(GrCustomXPFactory, (mode)); | 532 return SkNEW_ARGS(GrCustomXPFactory, (mode)); |
533 } | 533 } |
534 } | 534 } |
535 | 535 |
536 /////////////////////////////////////////////////////////////////////////////// | 536 /////////////////////////////////////////////////////////////////////////////// |
537 | 537 |
538 class GLCustomXP : public GrGLXferProcessor { | 538 class GLCustomXP : public GrGLXferProcessor { |
539 public: | 539 public: |
540 GLCustomXP(const GrXferProcessor&) {} | 540 GLCustomXP(const GrXferProcessor&) {} |
541 ~GLCustomXP() override {} | 541 ~GLCustomXP() override {} |
542 | 542 |
543 static void GenKey(const GrXferProcessor& proc, const GrGLCaps&, GrProcessor
KeyBuilder* b) { | 543 static void GenKey(const GrXferProcessor& proc, const GrGLSLCaps&, GrProcess
orKeyBuilder* b) { |
544 uint32_t key = proc.numTextures(); | 544 uint32_t key = proc.numTextures(); |
545 SkASSERT(key <= 1); | 545 SkASSERT(key <= 1); |
546 key |= proc.cast<CustomXP>().mode() << 1; | 546 key |= proc.cast<CustomXP>().mode() << 1; |
547 b->add32(key); | 547 b->add32(key); |
548 } | 548 } |
549 | 549 |
550 private: | 550 private: |
551 void onEmitCode(const EmitArgs& args) override { | 551 void onEmitCode(const EmitArgs& args) override { |
552 SkXfermode::Mode mode = args.fXP.cast<CustomXP>().mode(); | 552 SkXfermode::Mode mode = args.fXP.cast<CustomXP>().mode(); |
553 GrGLFPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 553 GrGLFPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
(...skipping 12 matching lines...) Expand all Loading... |
566 }; | 566 }; |
567 | 567 |
568 /////////////////////////////////////////////////////////////////////////////// | 568 /////////////////////////////////////////////////////////////////////////////// |
569 | 569 |
570 CustomXP::CustomXP(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy, | 570 CustomXP::CustomXP(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy, |
571 bool willReadDstColor) | 571 bool willReadDstColor) |
572 : INHERITED(dstCopy, willReadDstColor), fMode(mode) { | 572 : INHERITED(dstCopy, willReadDstColor), fMode(mode) { |
573 this->initClassID<CustomXP>(); | 573 this->initClassID<CustomXP>(); |
574 } | 574 } |
575 | 575 |
576 void CustomXP::onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder*
b) const { | 576 void CustomXP::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder
* b) const { |
577 GLCustomXP::GenKey(*this, caps, b); | 577 GLCustomXP::GenKey(*this, caps, b); |
578 } | 578 } |
579 | 579 |
580 GrGLXferProcessor* CustomXP::createGLInstance() const { | 580 GrGLXferProcessor* CustomXP::createGLInstance() const { |
581 return SkNEW_ARGS(GLCustomXP, (*this)); | 581 return SkNEW_ARGS(GLCustomXP, (*this)); |
582 } | 582 } |
583 | 583 |
584 bool CustomXP::onIsEqual(const GrXferProcessor& other) const { | 584 bool CustomXP::onIsEqual(const GrXferProcessor& other) const { |
585 const CustomXP& s = other.cast<CustomXP>(); | 585 const CustomXP& s = other.cast<CustomXP>(); |
586 return fMode == s.fMode; | 586 return fMode == s.fMode; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 GR_DEFINE_XP_FACTORY_TEST(GrCustomXPFactory); | 620 GR_DEFINE_XP_FACTORY_TEST(GrCustomXPFactory); |
621 GrXPFactory* GrCustomXPFactory::TestCreate(SkRandom* rand, | 621 GrXPFactory* GrCustomXPFactory::TestCreate(SkRandom* rand, |
622 GrContext*, | 622 GrContext*, |
623 const GrDrawTargetCaps&, | 623 const GrDrawTargetCaps&, |
624 GrTexture*[]) { | 624 GrTexture*[]) { |
625 int mode = rand->nextRangeU(SkXfermode::kLastCoeffMode + 1, SkXfermode::kLas
tSeparableMode); | 625 int mode = rand->nextRangeU(SkXfermode::kLastCoeffMode + 1, SkXfermode::kLas
tSeparableMode); |
626 | 626 |
627 return SkNEW_ARGS(GrCustomXPFactory, (static_cast<SkXfermode::Mode>(mode))); | 627 return SkNEW_ARGS(GrCustomXPFactory, (static_cast<SkXfermode::Mode>(mode))); |
628 } | 628 } |
629 | 629 |
OLD | NEW |