| 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 |