diff options
Diffstat (limited to 'src/gpu/effects')
-rw-r--r-- | src/gpu/effects/GrCoverageSetOpXP.cpp | 24 | ||||
-rw-r--r-- | src/gpu/effects/GrCoverageSetOpXP.h | 6 | ||||
-rw-r--r-- | src/gpu/effects/GrCustomXfermode.cpp | 27 | ||||
-rw-r--r-- | src/gpu/effects/GrDisableColorXP.cpp | 13 | ||||
-rw-r--r-- | src/gpu/effects/GrDisableColorXP.h | 9 | ||||
-rw-r--r-- | src/gpu/effects/GrPorterDuffXferProcessor.cpp | 91 | ||||
-rw-r--r-- | src/gpu/effects/GrPorterDuffXferProcessor.h | 14 |
7 files changed, 88 insertions, 96 deletions
diff --git a/src/gpu/effects/GrCoverageSetOpXP.cpp b/src/gpu/effects/GrCoverageSetOpXP.cpp index 9cf994f07a..d8eb0d950f 100644 --- a/src/gpu/effects/GrCoverageSetOpXP.cpp +++ b/src/gpu/effects/GrCoverageSetOpXP.cpp @@ -34,7 +34,7 @@ public: private: CoverageSetOpXP(SkRegion::Op regionOp, bool fInvertCoverage); - GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineAnalysis& analysis, + GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis& analysis, bool doesStencilWrite, GrColor* color, const GrCaps& caps) const override; @@ -107,10 +107,11 @@ GrGLSLXferProcessor* CoverageSetOpXP::createGLSLInstance() const { return new GLCoverageSetOpXP(*this); } -GrXferProcessor::OptFlags CoverageSetOpXP::onGetOptimizations(const GrPipelineAnalysis& analysis, - bool doesStencilWrite, - GrColor* color, - const GrCaps& caps) const { +GrXferProcessor::OptFlags CoverageSetOpXP::onGetOptimizations( + const FragmentProcessorAnalysis& analysis, + bool doesStencilWrite, + GrColor* color, + const GrCaps& caps) const { // We never look at the color input return GrXferProcessor::kIgnoreColor_OptFlag; } @@ -167,7 +168,7 @@ public: bool invertCoverage() const { return fInvertCoverage; } private: - GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineAnalysis&, bool, GrColor*, + GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&, bool, GrColor*, const GrCaps&) const override { // We never look at the color input return GrXferProcessor::kIgnoreColor_OptFlag; @@ -321,10 +322,11 @@ const GrXPFactory* GrCoverageSetOpXPFactory::Get(SkRegion::Op regionOp, bool inv return nullptr; } -GrXferProcessor* GrCoverageSetOpXPFactory::onCreateXferProcessor(const GrCaps& caps, - const GrPipelineAnalysis& analysis, - bool hasMixedSamples, - const DstTexture* dst) const { +GrXferProcessor* GrCoverageSetOpXPFactory::onCreateXferProcessor( + const GrCaps& caps, + const FragmentProcessorAnalysis& analysis, + bool hasMixedSamples, + const DstTexture* dst) const { // We don't support inverting coverage with mixed samples. We don't expect to ever want this in // the future, however we could at some point make this work using an inverted coverage // modulation table. Note that an inverted table still won't work if there are coverage procs. @@ -333,7 +335,7 @@ GrXferProcessor* GrCoverageSetOpXPFactory::onCreateXferProcessor(const GrCaps& c return nullptr; } - if (analysis.fUsesPLSDstRead) { + if (analysis.usesPLSDstRead()) { return new ShaderCSOXferProcessor(dst, hasMixedSamples, fRegionOp, fInvertCoverage); } return CoverageSetOpXP::Create(fRegionOp, fInvertCoverage); diff --git a/src/gpu/effects/GrCoverageSetOpXP.h b/src/gpu/effects/GrCoverageSetOpXP.h index 7c9f909978..ed6b9aa9f0 100644 --- a/src/gpu/effects/GrCoverageSetOpXP.h +++ b/src/gpu/effects/GrCoverageSetOpXP.h @@ -32,16 +32,16 @@ public: private: constexpr GrCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage); - bool willReadsDst(const GrProcOptInfo&, const GrProcOptInfo&) const override { + bool willReadsDst(const FragmentProcessorAnalysis&) const override { return fRegionOp != SkRegion::kReplace_Op; } GrXferProcessor* onCreateXferProcessor(const GrCaps&, - const GrPipelineAnalysis&, + const FragmentProcessorAnalysis&, bool hasMixedSamples, const DstTexture*) const override; - bool willReadDstInShader(const GrCaps&, ColorType, CoverageType) const override { + bool onWillReadDstInShader(const GrCaps&, const FragmentProcessorAnalysis&) const override { return false; } diff --git a/src/gpu/effects/GrCustomXfermode.cpp b/src/gpu/effects/GrCustomXfermode.cpp index 43042e2366..a33d2925ca 100644 --- a/src/gpu/effects/GrCustomXfermode.cpp +++ b/src/gpu/effects/GrCustomXfermode.cpp @@ -103,7 +103,7 @@ public: } private: - GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineAnalysis&, + GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) const override; @@ -197,7 +197,7 @@ bool CustomXP::onIsEqual(const GrXferProcessor& other) const { return fMode == s.fMode && fHWBlendEquation == s.fHWBlendEquation; } -GrXferProcessor::OptFlags CustomXP::onGetOptimizations(const GrPipelineAnalysis& analysis, +GrXferProcessor::OptFlags CustomXP::onGetOptimizations(const FragmentProcessorAnalysis& analysis, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) const { @@ -300,8 +300,7 @@ GrXferProcessor::OptFlags CustomXP::onGetOptimizations(const GrPipelineAnalysis& */ OptFlags flags = kNone_OptFlags; - if (analysis.fColorPOI.allProcessorsCompatibleWithCoverageAsAlpha() && - analysis.fCoveragePOI.allProcessorsCompatibleWithCoverageAsAlpha()) { + if (analysis.isCompatibleWithCoverageAsAlpha()) { flags |= kCanTweakAlphaForCoverage_OptFlag; } return flags; @@ -334,13 +333,13 @@ public: private: GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, - const GrPipelineAnalysis&, + const FragmentProcessorAnalysis&, bool hasMixedSamples, const DstTexture*) const override; - bool willReadsDst(const GrProcOptInfo&, const GrProcOptInfo&) const override { return true; } + bool willReadsDst(const FragmentProcessorAnalysis&) const override { return true; } - bool willReadDstInShader(const GrCaps&, ColorType, CoverageType) const override; + bool onWillReadDstInShader(const GrCaps&, const FragmentProcessorAnalysis&) const override; GR_DECLARE_XP_FACTORY_TEST; @@ -354,24 +353,24 @@ private: #endif GrXferProcessor* CustomXPFactory::onCreateXferProcessor(const GrCaps& caps, - const GrPipelineAnalysis& analysis, + const FragmentProcessorAnalysis& analysis, bool hasMixedSamples, const DstTexture* dstTexture) const { SkASSERT(GrCustomXfermode::IsSupportedMode(fMode)); - if (can_use_hw_blend_equation(fHWBlendEquation, analysis.fUsesPLSDstRead, - analysis.fCoveragePOI.isLCDCoverage(), caps)) { + if (can_use_hw_blend_equation(fHWBlendEquation, analysis.usesPLSDstRead(), + analysis.hasLCDCoverage(), caps)) { SkASSERT(!dstTexture || !dstTexture->texture()); return new CustomXP(fMode, fHWBlendEquation); } return new CustomXP(dstTexture, hasMixedSamples, fMode); } -bool CustomXPFactory::willReadDstInShader(const GrCaps& caps, ColorType colorType, - CoverageType coverageType) const { +bool CustomXPFactory::onWillReadDstInShader(const GrCaps& caps, + const FragmentProcessorAnalysis& analysis) const { // This should not be called if we're using PLS dst read. static constexpr bool kUsesPLSRead = false; - return !can_use_hw_blend_equation(fHWBlendEquation, kUsesPLSRead, - CoverageType::kLCD == coverageType, caps); + return !can_use_hw_blend_equation(fHWBlendEquation, kUsesPLSRead, analysis.hasLCDCoverage(), + caps); } GR_DEFINE_XP_FACTORY_TEST(CustomXPFactory); diff --git a/src/gpu/effects/GrDisableColorXP.cpp b/src/gpu/effects/GrDisableColorXP.cpp index 7323331a67..9c0228fae9 100644 --- a/src/gpu/effects/GrDisableColorXP.cpp +++ b/src/gpu/effects/GrDisableColorXP.cpp @@ -29,7 +29,7 @@ public: private: DisableColorXP(); - GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineAnalysis&, + GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&, bool doesStencilWrite, GrColor* color, const GrCaps& caps) const override { @@ -88,11 +88,12 @@ void DisableColorXP::onGetBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const } /////////////////////////////////////////////////////////////////////////////// -GrXferProcessor* GrDisableColorXPFactory::onCreateXferProcessor(const GrCaps& caps, - const GrPipelineAnalysis& analysis, - bool hasMixedSamples, - const DstTexture* dst) const { - SkASSERT(!analysis.fUsesPLSDstRead); +GrXferProcessor* GrDisableColorXPFactory::onCreateXferProcessor( + const GrCaps& caps, + const FragmentProcessorAnalysis& analysis, + bool hasMixedSamples, + const DstTexture* dst) const { + SkASSERT(!analysis.usesPLSDstRead()); return DisableColorXP::Create(); } diff --git a/src/gpu/effects/GrDisableColorXP.h b/src/gpu/effects/GrDisableColorXP.h index e6a8d595e8..b4cd00a599 100644 --- a/src/gpu/effects/GrDisableColorXP.h +++ b/src/gpu/effects/GrDisableColorXP.h @@ -24,19 +24,16 @@ public: static const GrXPFactory* Get(); private: - bool willReadsDst(const GrProcOptInfo& colorInput, - const GrProcOptInfo& coverageInput) const override { - return false; - } + bool willReadsDst(const FragmentProcessorAnalysis&) const override { return false; } constexpr GrDisableColorXPFactory() {} - bool willReadDstInShader(const GrCaps&, ColorType, CoverageType) const override { + bool onWillReadDstInShader(const GrCaps&, const FragmentProcessorAnalysis&) const override { return false; } GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, - const GrPipelineAnalysis&, + const FragmentProcessorAnalysis&, bool hasMixedSamples, const DstTexture* dstTexture) const override; diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp index 1554b0cce0..4803c2d6ac 100644 --- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp +++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp @@ -350,7 +350,7 @@ public: BlendFormula getBlendFormula() const { return fBlendFormula; } private: - GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineAnalysis&, + GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&, bool doesStencilWrite, GrColor* overrideColor, const GrCaps&) const override; @@ -450,7 +450,7 @@ GrGLSLXferProcessor* PorterDuffXferProcessor::createGLSLInstance() const { } GrXferProcessor::OptFlags PorterDuffXferProcessor::onGetOptimizations( - const GrPipelineAnalysis& analysis, + const FragmentProcessorAnalysis& analysis, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) const { @@ -465,8 +465,7 @@ GrXferProcessor::OptFlags PorterDuffXferProcessor::onGetOptimizations( if (!fBlendFormula.usesInputColor()) { optFlags |= GrXferProcessor::kIgnoreColor_OptFlag; } - if (analysis.fColorPOI.allProcessorsCompatibleWithCoverageAsAlpha() && - analysis.fCoveragePOI.allProcessorsCompatibleWithCoverageAsAlpha() && + if (analysis.isCompatibleWithCoverageAsAlpha() && fBlendFormula.canTweakAlphaForCoverage()) { optFlags |= GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag; } @@ -493,7 +492,7 @@ public: SkBlendMode getXfermode() const { return fXfermode; } private: - GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineAnalysis&, bool, GrColor*, + GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&, bool, GrColor*, const GrCaps&) const override { return kNone_OptFlags; } @@ -557,7 +556,7 @@ GrGLSLXferProcessor* ShaderPDXferProcessor::createGLSLInstance() const { class PDLCDXferProcessor : public GrXferProcessor { public: - static GrXferProcessor* Create(SkBlendMode xfermode, const GrProcOptInfo& colorPOI); + static GrXferProcessor* Create(SkBlendMode xfermode, const FragmentProcessorAnalysis& analysis); ~PDLCDXferProcessor() override; @@ -568,7 +567,7 @@ public: private: PDLCDXferProcessor(GrColor blendConstant, uint8_t alpha); - GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineAnalysis&, + GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&, bool doesStencilWrite, GrColor* overrideColor, const GrCaps&) const override; @@ -628,12 +627,13 @@ PDLCDXferProcessor::PDLCDXferProcessor(GrColor blendConstant, uint8_t alpha) this->initClassID<PDLCDXferProcessor>(); } -GrXferProcessor* PDLCDXferProcessor::Create(SkBlendMode xfermode, const GrProcOptInfo& colorPOI) { +GrXferProcessor* PDLCDXferProcessor::Create(SkBlendMode xfermode, + const FragmentProcessorAnalysis& analysis) { if (SkBlendMode::kSrcOver != xfermode) { return nullptr; } GrColor blendConstant; - if (!colorPOI.hasKnownOutputColor(&blendConstant)) { + if (!analysis.hasKnownOutputColor(&blendConstant)) { return nullptr; } uint8_t alpha = GrColorUnpackA(blendConstant); @@ -653,7 +653,7 @@ GrGLSLXferProcessor* PDLCDXferProcessor::createGLSLInstance() const { return new GLPDLCDXferProcessor(*this); } -GrXferProcessor::OptFlags PDLCDXferProcessor::onGetOptimizations(const GrPipelineAnalysis&, +GrXferProcessor::OptFlags PDLCDXferProcessor::onGetOptimizations(const FragmentProcessorAnalysis&, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) const { @@ -734,28 +734,28 @@ const GrXPFactory* GrPorterDuffXPFactory::Get(SkBlendMode blendMode) { } } -GrXferProcessor* GrPorterDuffXPFactory::onCreateXferProcessor(const GrCaps& caps, - const GrPipelineAnalysis& analysis, - bool hasMixedSamples, - const DstTexture* dstTexture) const { - if (analysis.fUsesPLSDstRead) { +GrXferProcessor* GrPorterDuffXPFactory::onCreateXferProcessor( + const GrCaps& caps, + const FragmentProcessorAnalysis& analysis, + bool hasMixedSamples, + const DstTexture* dstTexture) const { + if (analysis.usesPLSDstRead()) { return new ShaderPDXferProcessor(dstTexture, hasMixedSamples, fBlendMode); } BlendFormula blendFormula; - if (analysis.fCoveragePOI.isLCDCoverage()) { - if (SkBlendMode::kSrcOver == fBlendMode && analysis.fColorPOI.hasKnownOutputColor() && + if (analysis.hasLCDCoverage()) { + if (SkBlendMode::kSrcOver == fBlendMode && analysis.hasKnownOutputColor() && !caps.shaderCaps()->dualSourceBlendingSupport() && !caps.shaderCaps()->dstReadInShaderSupport()) { // If we don't have dual source blending or in shader dst reads, we fall back to this // trick for rendering SrcOver LCD text instead of doing a dst copy. SkASSERT(!dstTexture || !dstTexture->texture()); - return PDLCDXferProcessor::Create(fBlendMode, analysis.fColorPOI); + return PDLCDXferProcessor::Create(fBlendMode, analysis); } blendFormula = get_lcd_blend_formula(fBlendMode); } else { - blendFormula = get_blend_formula(analysis.fColorPOI.isOpaque(), - !analysis.fCoveragePOI.isSolidWhite(), hasMixedSamples, - fBlendMode); + blendFormula = get_blend_formula(analysis.isOutputColorOpaque(), analysis.hasCoverage(), + hasMixedSamples, fBlendMode); } if (blendFormula.hasSecondaryOutput() && !caps.shaderCaps()->dualSourceBlendingSupport()) { @@ -766,15 +766,14 @@ GrXferProcessor* GrPorterDuffXPFactory::onCreateXferProcessor(const GrCaps& caps return new PorterDuffXferProcessor(blendFormula); } -bool GrPorterDuffXPFactory::willReadsDst(const GrProcOptInfo& colorInput, - const GrProcOptInfo& coverageInput) const { - BlendFormula colorFormula = gBlendTable[colorInput.isOpaque()][0][(int)fBlendMode]; +bool GrPorterDuffXPFactory::willReadsDst(const FragmentProcessorAnalysis& analysis) const { + BlendFormula colorFormula = gBlendTable[analysis.isOutputColorOpaque()][0][(int)fBlendMode]; SkASSERT(kAdd_GrBlendEquation == colorFormula.fBlendEquation); - return (colorFormula.usesDstColor() || !coverageInput.isSolidWhite()); + return (colorFormula.usesDstColor() || analysis.hasCoverage()); } -bool GrPorterDuffXPFactory::willReadDstInShader(const GrCaps& caps, ColorType colorType, - CoverageType coverageType) const { +bool GrPorterDuffXPFactory::onWillReadDstInShader(const GrCaps& caps, + const FragmentProcessorAnalysis& analysis) const { if (caps.shaderCaps()->dualSourceBlendingSupport()) { return false; } @@ -782,8 +781,8 @@ bool GrPorterDuffXPFactory::willReadDstInShader(const GrCaps& caps, ColorType co // When we have four channel coverage we always need to read the dst in order to correctly // blend. The one exception is when we are using srcover mode and we know the input color into // the XP. - if (CoverageType::kLCD == coverageType) { - if (SkBlendMode::kSrcOver == fBlendMode && ColorTypeIsConstant(colorType) && + if (analysis.hasLCDCoverage()) { + if (SkBlendMode::kSrcOver == fBlendMode && analysis.hasKnownOutputColor() && !caps.shaderCaps()->dstReadInShaderSupport()) { return false; } @@ -794,9 +793,8 @@ bool GrPorterDuffXPFactory::willReadDstInShader(const GrCaps& caps, ColorType co // don't have support for it. static const bool kHasMixedSamples = false; SkASSERT(!caps.usesMixedSamples()); // We never use mixed samples without dual source blending. - auto formula = get_blend_formula(ColorTypeIsOpaque(colorType), - CoverageType::kSingleChannel == coverageType, kHasMixedSamples, - fBlendMode); + auto formula = get_blend_formula(analysis.isOutputColorOpaque(), analysis.hasCoverage(), + kHasMixedSamples, fBlendMode); return formula.hasSecondaryOutput(); } @@ -833,10 +831,10 @@ const GrXferProcessor& GrPorterDuffXPFactory::SimpleSrcOverXP() { GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor( const GrCaps& caps, - const GrPipelineAnalysis& analysis, + const FragmentProcessorAnalysis& analysis, bool hasMixedSamples, const GrXferProcessor::DstTexture* dstTexture) { - if (analysis.fUsesPLSDstRead) { + if (analysis.usesPLSDstRead()) { return new ShaderPDXferProcessor(dstTexture, hasMixedSamples, SkBlendMode::kSrcOver); } @@ -844,7 +842,7 @@ GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor( // doing lcd blending we will just use our global SimpleSrcOverXP. This slightly differs from // the general case where we convert a src-over blend that has solid coverage and an opaque // color to src-mode, which allows disabling of blending. - if (!analysis.fCoveragePOI.isLCDCoverage()) { + if (!analysis.hasLCDCoverage()) { // We return nullptr here, which our caller interprets as meaning "use SimpleSrcOverXP". // We don't simply return the address of that XP here because our caller would have to unref // it and since it is a global object and GrProgramElement's ref-cnting system is not thread @@ -852,14 +850,13 @@ GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor( return nullptr; } - if (analysis.fColorPOI.hasKnownOutputColor() && - !caps.shaderCaps()->dualSourceBlendingSupport() && + if (analysis.hasKnownOutputColor() && !caps.shaderCaps()->dualSourceBlendingSupport() && !caps.shaderCaps()->dstReadInShaderSupport()) { // If we don't have dual source blending or in shader dst reads, we fall // back to this trick for rendering SrcOver LCD text instead of doing a // dst copy. SkASSERT(!dstTexture || !dstTexture->texture()); - return PDLCDXferProcessor::Create(SkBlendMode::kSrcOver, analysis.fColorPOI); + return PDLCDXferProcessor::Create(SkBlendMode::kSrcOver, analysis); } BlendFormula blendFormula; @@ -877,9 +874,8 @@ sk_sp<GrXferProcessor> GrPorterDuffXPFactory::CreateNoCoverageXP(SkBlendMode ble return sk_make_sp<PorterDuffXferProcessor>(formula); } -bool GrPorterDuffXPFactory::WillSrcOverReadDst(const GrProcOptInfo& colorInput, - const GrProcOptInfo& coverageInput) { - return !coverageInput.isSolidWhite() || !colorInput.isOpaque(); +bool GrPorterDuffXPFactory::WillSrcOverReadDst(const FragmentProcessorAnalysis& analysis) { + return analysis.hasCoverage() || !analysis.isOutputColorOpaque(); } bool GrPorterDuffXPFactory::IsSrcOverPreCoverageBlendedColorConstant( @@ -890,8 +886,8 @@ bool GrPorterDuffXPFactory::IsSrcOverPreCoverageBlendedColorConstant( return colorInput.hasKnownOutputColor(color); } -bool GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(const GrCaps& caps, - const GrPipelineAnalysis& analysis) { +bool GrPorterDuffXPFactory::WillSrcOverNeedDstTexture(const GrCaps& caps, + const FragmentProcessorAnalysis& analysis) { if (caps.shaderCaps()->dstReadInShaderSupport() || caps.shaderCaps()->dualSourceBlendingSupport()) { return false; @@ -900,9 +896,8 @@ bool GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(const GrCaps& caps, // When we have four channel coverage we always need to read the dst in order to correctly // blend. The one exception is when we are using srcover mode and we know the input color // into the XP. - if (analysis.fCoveragePOI.isLCDCoverage()) { - if (analysis.fColorPOI.hasKnownOutputColor() && - !caps.shaderCaps()->dstReadInShaderSupport()) { + if (analysis.hasLCDCoverage()) { + if (analysis.hasKnownOutputColor() && !caps.shaderCaps()->dstReadInShaderSupport()) { return false; } auto formula = get_lcd_blend_formula(SkBlendMode::kSrcOver); @@ -912,8 +907,8 @@ bool GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(const GrCaps& caps, // We fallback on the shader XP when the blend formula would use dual source blending but we // don't have support for it. static const bool kHasMixedSamples = false; - bool isOpaque = analysis.fColorPOI.isOpaque(); - bool hasCoverage = !analysis.fCoveragePOI.isSolidWhite(); + bool isOpaque = analysis.isOutputColorOpaque(); + bool hasCoverage = analysis.hasCoverage(); SkASSERT(!caps.usesMixedSamples()); // We never use mixed samples without dual source blending. auto formula = get_blend_formula(isOpaque, hasCoverage, kHasMixedSamples, SkBlendMode::kSrcOver); diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.h b/src/gpu/effects/GrPorterDuffXferProcessor.h index e6e676d6cc..6d7dc90fcf 100644 --- a/src/gpu/effects/GrPorterDuffXferProcessor.h +++ b/src/gpu/effects/GrPorterDuffXferProcessor.h @@ -26,7 +26,7 @@ public: /** Because src-over is so common we special case it for performance reasons. If this returns null then the SimpleSrcOverXP() below should be used. */ static GrXferProcessor* CreateSrcOverXferProcessor(const GrCaps& caps, - const GrPipelineAnalysis&, + const FragmentProcessorAnalysis&, bool hasMixedSamples, const GrXferProcessor::DstTexture*); @@ -37,24 +37,22 @@ public: by reference because it is global and its ref-cnting methods are not thread safe. */ static const GrXferProcessor& SimpleSrcOverXP(); - static bool WillSrcOverReadDst(const GrProcOptInfo& colorInput, - const GrProcOptInfo& coverageInput); + static bool WillSrcOverReadDst(const FragmentProcessorAnalysis& analysis); static bool IsSrcOverPreCoverageBlendedColorConstant(const GrProcOptInfo& colorInput, GrColor* color); - - static bool SrcOverWillNeedDstTexture(const GrCaps&, const GrPipelineAnalysis&); + static bool WillSrcOverNeedDstTexture(const GrCaps&, const FragmentProcessorAnalysis&); private: constexpr GrPorterDuffXPFactory(SkBlendMode); - bool willReadsDst(const GrProcOptInfo&, const GrProcOptInfo&) const override; + bool willReadsDst(const FragmentProcessorAnalysis&) const override; GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, - const GrPipelineAnalysis&, + const FragmentProcessorAnalysis&, bool hasMixedSamples, const DstTexture*) const override; - bool willReadDstInShader(const GrCaps&, ColorType, CoverageType) const override; + bool onWillReadDstInShader(const GrCaps&, const FragmentProcessorAnalysis&) const override; GR_DECLARE_XP_FACTORY_TEST; static void TestGetXPOutputTypes(const GrXferProcessor*, int* outPrimary, int* outSecondary); |