diff options
author | 2015-02-05 11:11:13 -0800 | |
---|---|---|
committer | 2015-02-05 11:11:13 -0800 | |
commit | 5e1378d0e075a323144ba14e0a4cbcca35eccc69 (patch) | |
tree | 70156a081890aa64ae91a71d992191d980c21d4e /src/gpu/effects | |
parent | 2fdd29d6e53d3c550bce711363a1d0d5b8069ee3 (diff) |
Move DstCopy on gpu into the GrXferProcessor.
BUG=skia:
Committed: https://skia.googlesource.com/skia/+/74a11753604768bf461b80cabb66060e8564d82c
Review URL: https://codereview.chromium.org/885923002
Diffstat (limited to 'src/gpu/effects')
-rw-r--r-- | src/gpu/effects/GrCoverageSetOpXP.cpp | 28 | ||||
-rw-r--r-- | src/gpu/effects/GrCoverageSetOpXP.h | 15 | ||||
-rw-r--r-- | src/gpu/effects/GrCustomXfermode.cpp | 28 | ||||
-rw-r--r-- | src/gpu/effects/GrCustomXfermodePriv.h | 27 | ||||
-rw-r--r-- | src/gpu/effects/GrDisableColorXP.cpp | 18 | ||||
-rw-r--r-- | src/gpu/effects/GrDisableColorXP.h | 15 | ||||
-rw-r--r-- | src/gpu/effects/GrPorterDuffXferProcessor.cpp | 47 |
7 files changed, 99 insertions, 79 deletions
diff --git a/src/gpu/effects/GrCoverageSetOpXP.cpp b/src/gpu/effects/GrCoverageSetOpXP.cpp index fe286f6bf5..7025d20395 100644 --- a/src/gpu/effects/GrCoverageSetOpXP.cpp +++ b/src/gpu/effects/GrCoverageSetOpXP.cpp @@ -21,7 +21,15 @@ public: ~GrGLCoverageSetOpXP() SK_OVERRIDE {} - void emitCode(const EmitArgs& args) SK_OVERRIDE { + static void GenKey(const GrProcessor& processor, const GrGLCaps& caps, + GrProcessorKeyBuilder* b) { + const GrCoverageSetOpXP& xp = processor.cast<GrCoverageSetOpXP>(); + uint32_t key = xp.invertCoverage() ? 0x0 : 0x1; + b->add32(key); + }; + +private: + void onEmitCode(const EmitArgs& args) SK_OVERRIDE { const GrCoverageSetOpXP& xp = args.fXP.cast<GrCoverageSetOpXP>(); GrGLFPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); @@ -32,16 +40,8 @@ public: } } - void setData(const GrGLProgramDataManager&, const GrXferProcessor&) SK_OVERRIDE {}; + void onSetData(const GrGLProgramDataManager&, const GrXferProcessor&) SK_OVERRIDE {}; - static void GenKey(const GrProcessor& processor, const GrGLCaps& caps, - GrProcessorKeyBuilder* b) { - const GrCoverageSetOpXP& xp = processor.cast<GrCoverageSetOpXP>(); - uint32_t key = xp.invertCoverage() ? 0x0 : 0x1; - b->add32(key); - }; - -private: typedef GrGLXferProcessor INHERITED; }; @@ -56,7 +56,7 @@ GrCoverageSetOpXP::GrCoverageSetOpXP(SkRegion::Op regionOp, bool invertCoverage) GrCoverageSetOpXP::~GrCoverageSetOpXP() { } -void GrCoverageSetOpXP::getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const { +void GrCoverageSetOpXP::onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const { GrGLCoverageSetOpXP::GenKey(*this, caps, b); } @@ -179,8 +179,10 @@ GrXPFactory* GrCoverageSetOpXPFactory::Create(SkRegion::Op regionOp, bool invert } } -GrXferProcessor* GrCoverageSetOpXPFactory::createXferProcessor(const GrProcOptInfo& /* colorPOI*/, - const GrProcOptInfo& covPOI) const { +GrXferProcessor* +GrCoverageSetOpXPFactory::onCreateXferProcessor(const GrProcOptInfo& colorPOI, + const GrProcOptInfo& covPOI, + const GrDeviceCoordTexture* dstCopy) const { return GrCoverageSetOpXP::Create(fRegionOp, fInvertCoverage); } diff --git a/src/gpu/effects/GrCoverageSetOpXP.h b/src/gpu/effects/GrCoverageSetOpXP.h index a144f975b7..0bc9e91170 100644 --- a/src/gpu/effects/GrCoverageSetOpXP.h +++ b/src/gpu/effects/GrCoverageSetOpXP.h @@ -29,8 +29,6 @@ public: const char* name() const SK_OVERRIDE { return "Coverage Set Op"; } - void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE; - GrGLXferProcessor* createGLInstance() const SK_OVERRIDE; bool hasSecondaryOutput() const SK_OVERRIDE { return false; } @@ -48,6 +46,8 @@ public: private: GrCoverageSetOpXP(SkRegion::Op regionOp, bool fInvertCoverage); + void onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE; + bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE { const GrCoverageSetOpXP& xp = xpBase.cast<GrCoverageSetOpXP>(); return (fRegionOp == xp.fRegionOp && @@ -66,9 +66,6 @@ class GrCoverageSetOpXPFactory : public GrXPFactory { public: static GrXPFactory* Create(SkRegion::Op regionOp, bool invertCoverage = false); - GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI) const SK_OVERRIDE; - bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const SK_OVERRIDE { return true; } @@ -83,11 +80,15 @@ public: void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI, GrXPFactory::InvariantOutput*) const SK_OVERRIDE; - bool willReadDst() const SK_OVERRIDE { return false; } - private: GrCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage); + GrXferProcessor* onCreateXferProcessor(const GrProcOptInfo& colorPOI, + const GrProcOptInfo& coveragePOI, + const GrDeviceCoordTexture* dstCopy) const SK_OVERRIDE; + + bool willReadDstColor() const SK_OVERRIDE { return false; } + bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE { const GrCoverageSetOpXPFactory& xpf = xpfBase.cast<GrCoverageSetOpXPFactory>(); return fRegionOp == xpf.fRegionOp; diff --git a/src/gpu/effects/GrCustomXfermode.cpp b/src/gpu/effects/GrCustomXfermode.cpp index 9aa7153109..b77bf2fad1 100644 --- a/src/gpu/effects/GrCustomXfermode.cpp +++ b/src/gpu/effects/GrCustomXfermode.cpp @@ -499,7 +499,15 @@ public: GLCustomXP(const GrXferProcessor&) {} ~GLCustomXP() SK_OVERRIDE {} - void emitCode(const EmitArgs& args) SK_OVERRIDE { + static void GenKey(const GrXferProcessor& proc, const GrGLCaps&, GrProcessorKeyBuilder* b) { + uint32_t key = proc.numTextures(); + SkASSERT(key <= 1); + key |= proc.cast<GrCustomXP>().mode() << 1; + b->add32(key); + } + +private: + void onEmitCode(const EmitArgs& args) SK_OVERRIDE { SkXfermode::Mode mode = args.fXP.cast<GrCustomXP>().mode(); GrGLFPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); const char* dstColor = fsBuilder->dstColor(); @@ -511,28 +519,20 @@ public: args.fInputCoverage, dstColor); } - void setData(const GrGLProgramDataManager&, const GrXferProcessor&) SK_OVERRIDE {} + void onSetData(const GrGLProgramDataManager&, const GrXferProcessor&) SK_OVERRIDE {} - static void GenKey(const GrXferProcessor& proc, const GrGLCaps&, GrProcessorKeyBuilder* b) { - uint32_t key = proc.numTextures(); - SkASSERT(key <= 1); - key |= proc.cast<GrCustomXP>().mode() << 1; - b->add32(key); - } - -private: typedef GrGLFragmentProcessor INHERITED; }; /////////////////////////////////////////////////////////////////////////////// -GrCustomXP::GrCustomXP(SkXfermode::Mode mode) - : fMode(mode) { +GrCustomXP::GrCustomXP(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy, + bool willReadDstColor) + : INHERITED(dstCopy, willReadDstColor), fMode(mode) { this->initClassID<GrCustomXP>(); - this->setWillReadDstColor(); } -void GrCustomXP::getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const { +void GrCustomXP::onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const { GLCustomXP::GenKey(*this, caps, b); } diff --git a/src/gpu/effects/GrCustomXfermodePriv.h b/src/gpu/effects/GrCustomXfermodePriv.h index 45a9d3005d..681c805ba7 100644 --- a/src/gpu/effects/GrCustomXfermodePriv.h +++ b/src/gpu/effects/GrCustomXfermodePriv.h @@ -9,6 +9,7 @@ #define GrCustomXfermodePriv_DEFINED #include "GrCoordTransform.h" +#include "GrDrawTargetCaps.h" #include "GrFragmentProcessor.h" #include "GrTextureAccess.h" #include "GrXferProcessor.h" @@ -57,11 +58,12 @@ private: class GrCustomXP : public GrXferProcessor { public: - static GrXferProcessor* Create(SkXfermode::Mode mode) { + static GrXferProcessor* Create(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy, + bool willReadDstColor) { if (!GrCustomXfermode::IsSupportedMode(mode)) { return NULL; } else { - return SkNEW_ARGS(GrCustomXP, (mode)); + return SkNEW_ARGS(GrCustomXP, (mode, dstCopy, willReadDstColor)); } } @@ -69,8 +71,6 @@ public: const char* name() const SK_OVERRIDE { return "Custom Xfermode"; } - void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE; - GrGLXferProcessor* createGLInstance() const SK_OVERRIDE; bool hasSecondaryOutput() const SK_OVERRIDE { return false; } @@ -90,7 +90,9 @@ public: SkXfermode::Mode mode() const { return fMode; } private: - GrCustomXP(SkXfermode::Mode mode); + GrCustomXP(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy, bool willReadDstColor); + + void onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE; bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE; @@ -105,11 +107,6 @@ class GrCustomXPFactory : public GrXPFactory { public: GrCustomXPFactory(SkXfermode::Mode mode); - GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI) const SK_OVERRIDE { - return GrCustomXP::Create(fMode); - } - bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const SK_OVERRIDE { return true; } @@ -126,9 +123,15 @@ public: void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI, GrXPFactory::InvariantOutput*) const SK_OVERRIDE; - bool willReadDst() const SK_OVERRIDE { return true; } - private: + GrXferProcessor* onCreateXferProcessor(const GrProcOptInfo& colorPOI, + const GrProcOptInfo& coveragePOI, + const GrDeviceCoordTexture* dstCopy) const SK_OVERRIDE { + return GrCustomXP::Create(fMode, dstCopy, this->willReadDstColor()); + } + + bool willReadDstColor() const SK_OVERRIDE { return true; } + bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE { const GrCustomXPFactory& xpf = xpfBase.cast<GrCustomXPFactory>(); return fMode == xpf.fMode; diff --git a/src/gpu/effects/GrDisableColorXP.cpp b/src/gpu/effects/GrDisableColorXP.cpp index 9383385192..83b6d23119 100644 --- a/src/gpu/effects/GrDisableColorXP.cpp +++ b/src/gpu/effects/GrDisableColorXP.cpp @@ -17,7 +17,10 @@ public: ~GrGLDisableColorXP() SK_OVERRIDE {} - void emitCode(const EmitArgs& args) SK_OVERRIDE { + static void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*) {} + +private: + void onEmitCode(const EmitArgs& args) SK_OVERRIDE { // This emit code should be empty. However, on the nexus 6 there is a driver bug where if // you do not give gl_FragColor a value, the gl context is lost and we end up drawing // nothing. So this fix just sets the gl_FragColor arbitrarily to 0. @@ -25,11 +28,8 @@ public: fsBuilder->codeAppendf("%s = vec4(0);", args.fOutputPrimary); } - void setData(const GrGLProgramDataManager&, const GrXferProcessor&) SK_OVERRIDE {} + void onSetData(const GrGLProgramDataManager&, const GrXferProcessor&) SK_OVERRIDE {} - static void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*) {} - -private: typedef GrGLXferProcessor INHERITED; }; @@ -39,7 +39,7 @@ GrDisableColorXP::GrDisableColorXP() { this->initClassID<GrDisableColorXP>(); } -void GrDisableColorXP::getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const { +void GrDisableColorXP::onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const { GrGLDisableColorXP::GenKey(*this, caps, b); } @@ -57,8 +57,10 @@ GrDisableColorXPFactory::GrDisableColorXPFactory() { this->initClassID<GrDisableColorXPFactory>(); } -GrXferProcessor* GrDisableColorXPFactory::createXferProcessor(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& covPOI) const { +GrXferProcessor* +GrDisableColorXPFactory::onCreateXferProcessor(const GrProcOptInfo& colorPOI, + const GrProcOptInfo& covPOI, + const GrDeviceCoordTexture* dstCopy) const { return GrDisableColorXP::Create(); } diff --git a/src/gpu/effects/GrDisableColorXP.h b/src/gpu/effects/GrDisableColorXP.h index d62c3201dd..da6fa4523b 100644 --- a/src/gpu/effects/GrDisableColorXP.h +++ b/src/gpu/effects/GrDisableColorXP.h @@ -27,8 +27,6 @@ public: const char* name() const SK_OVERRIDE { return "Disable Color"; } - void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE; - GrGLXferProcessor* createGLInstance() const SK_OVERRIDE; bool hasSecondaryOutput() const SK_OVERRIDE { return false; } @@ -46,6 +44,8 @@ public: private: GrDisableColorXP(); + void onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE; + bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE { return true; } @@ -61,9 +61,6 @@ public: return SkNEW(GrDisableColorXPFactory); } - GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI) const SK_OVERRIDE; - bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const SK_OVERRIDE { return true; } @@ -81,11 +78,15 @@ public: output->fWillBlendWithDst = 0; } - bool willReadDst() const SK_OVERRIDE { return false; } - private: GrDisableColorXPFactory(); + GrXferProcessor* onCreateXferProcessor(const GrProcOptInfo& colorPOI, + const GrProcOptInfo& coveragePOI, + const GrDeviceCoordTexture* dstCopy) const SK_OVERRIDE; + + bool willReadDstColor() const SK_OVERRIDE { return false; } + bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE { return true; } diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp index 5038aa333f..320d943392 100644 --- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp +++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp @@ -38,7 +38,15 @@ public: virtual ~GrGLPorterDuffXferProcessor() {} - void emitCode(const EmitArgs& args) SK_OVERRIDE { + static void GenKey(const GrProcessor& processor, const GrGLCaps& caps, + GrProcessorKeyBuilder* b) { + const GrPorterDuffXferProcessor& xp = processor.cast<GrPorterDuffXferProcessor>(); + b->add32(xp.primaryOutputType()); + b->add32(xp.secondaryOutputType()); + }; + +private: + void onEmitCode(const EmitArgs& args) SK_OVERRIDE { const GrPorterDuffXferProcessor& xp = args.fXP.cast<GrPorterDuffXferProcessor>(); GrGLFPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); if (xp.hasSecondaryOutput()) { @@ -80,23 +88,18 @@ public: } } - void setData(const GrGLProgramDataManager&, const GrXferProcessor&) SK_OVERRIDE {}; + void onSetData(const GrGLProgramDataManager&, const GrXferProcessor&) SK_OVERRIDE {}; - static void GenKey(const GrProcessor& processor, const GrGLCaps& caps, - GrProcessorKeyBuilder* b) { - const GrPorterDuffXferProcessor& xp = processor.cast<GrPorterDuffXferProcessor>(); - b->add32(xp.primaryOutputType()); - b->add32(xp.secondaryOutputType()); - }; - -private: typedef GrGLXferProcessor INHERITED; }; /////////////////////////////////////////////////////////////////////////////// -GrPorterDuffXferProcessor::GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, - GrColor constant) +GrPorterDuffXferProcessor::GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, + GrBlendCoeff dstBlend, + GrColor constant, + const GrDeviceCoordTexture* dstCopy, + bool willReadDstColor) : fSrcBlend(srcBlend) , fDstBlend(dstBlend) , fBlendConstant(constant) @@ -108,8 +111,8 @@ GrPorterDuffXferProcessor::GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, GrBl GrPorterDuffXferProcessor::~GrPorterDuffXferProcessor() { } -void GrPorterDuffXferProcessor::getGLProcessorKey(const GrGLCaps& caps, - GrProcessorKeyBuilder* b) const { +void GrPorterDuffXferProcessor::onGetGLProcessorKey(const GrGLCaps& caps, + GrProcessorKeyBuilder* b) const { GrGLPorterDuffXferProcessor::GenKey(*this, caps, b); } @@ -353,16 +356,20 @@ GrXPFactory* GrPorterDuffXPFactory::Create(SkXfermode::Mode mode) { } } -GrXferProcessor* GrPorterDuffXPFactory::createXferProcessor(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& covPOI) const { +GrXferProcessor* +GrPorterDuffXPFactory::onCreateXferProcessor(const GrProcOptInfo& colorPOI, + const GrProcOptInfo& covPOI, + const GrDeviceCoordTexture* dstCopy) const { if (!covPOI.isFourChannelOutput()) { - return GrPorterDuffXferProcessor::Create(fSrcCoeff, fDstCoeff); + return GrPorterDuffXferProcessor::Create(fSrcCoeff, fDstCoeff, 0, dstCopy, + this->willReadDstColor()); } else { if (this->supportsRGBCoverage(colorPOI.color(), colorPOI.validFlags())) { SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags()); GrColor blendConstant = GrUnPreMulColor(colorPOI.color()); return GrPorterDuffXferProcessor::Create(kConstC_GrBlendCoeff, kISC_GrBlendCoeff, - blendConstant); + blendConstant, dstCopy, + this->willReadDstColor()); } else { return NULL; } @@ -484,6 +491,10 @@ void GrPorterDuffXPFactory::getInvariantOutput(const GrProcOptInfo& colorPOI, output->fWillBlendWithDst = false; } +bool GrPorterDuffXPFactory::willReadDstColor() const { + return false; +} + GR_DEFINE_XP_FACTORY_TEST(GrPorterDuffXPFactory); GrXPFactory* GrPorterDuffXPFactory::TestCreate(SkRandom* random, |