From de4166a3b45d859512e27e3257841f064d67549c Mon Sep 17 00:00:00 2001 From: ethannicholas Date: Mon, 30 Nov 2015 08:57:38 -0800 Subject: [PATCH] APIs which took colorPOI / coveragePOI pairs updated to take a GrPipelineOptimizations struct TBR=bsalomon@google.com Review URL: https://codereview.chromium.org/1480353002 --- include/gpu/GrXferProcessor.h | 20 ++- include/gpu/effects/GrCoverageSetOpXP.h | 6 +- .../gpu/effects/GrPorterDuffXferProcessor.h | 12 +- src/effects/SkArithmeticMode_gpu.cpp | 16 +-- src/effects/SkArithmeticMode_gpu.h | 6 +- src/gpu/GrDrawTarget.cpp | 8 +- src/gpu/GrDrawTarget.h | 3 +- src/gpu/GrPipeline.cpp | 9 +- src/gpu/GrPipelineBuilder.cpp | 7 +- src/gpu/GrPipelineBuilder.h | 4 +- src/gpu/GrXferProcessor.cpp | 28 ++-- src/gpu/effects/GrCoverageSetOpXP.cpp | 9 +- src/gpu/effects/GrCustomXfermode.cpp | 27 ++-- src/gpu/effects/GrDisableColorXP.cpp | 6 +- src/gpu/effects/GrDisableColorXP.h | 6 +- src/gpu/effects/GrPorterDuffXferProcessor.cpp | 76 ++++++----- tests/GrPorterDuffTest.cpp | 121 +++++++++--------- 17 files changed, 166 insertions(+), 198 deletions(-) diff --git a/include/gpu/GrXferProcessor.h b/include/gpu/GrXferProcessor.h index 64a0e1ab55..0aa09d8780 100644 --- a/include/gpu/GrXferProcessor.h +++ b/include/gpu/GrXferProcessor.h @@ -19,6 +19,7 @@ class GrShaderCaps; class GrGLSLCaps; class GrGLSLXferProcessor; class GrProcOptInfo; +struct GrPipelineOptimizations; /** * Barriers for blending. When a shader reads the dst directly, an Xfer barrier is sometimes @@ -141,8 +142,7 @@ public: * A caller who calls this function on a XP is required to honor the returned OptFlags * and color values for its draw. */ - OptFlags getOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + OptFlags getOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps); @@ -246,8 +246,7 @@ protected: private: void notifyRefCntIsZero() const final {} - virtual OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + virtual OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) = 0; @@ -311,8 +310,7 @@ GR_MAKE_BITFIELD_OPS(GrXferProcessor::OptFlags); class GrXPFactory : public SkRefCnt { public: typedef GrXferProcessor::DstTexture DstTexture; - GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + GrXferProcessor* createXferProcessor(const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture*, const GrCaps& caps) const; @@ -334,8 +332,8 @@ public: virtual void getInvariantBlendedColor(const GrProcOptInfo& colorPOI, InvariantBlendedColor*) const = 0; - bool willNeedDstTexture(const GrCaps& caps, const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, bool hasMixedSamples) const; + bool willNeedDstTexture(const GrCaps& caps, const GrPipelineOptimizations& optimizations, + bool hasMixedSamples) const; bool isEqual(const GrXPFactory& that) const { if (this->classID() != that.classID()) { @@ -363,8 +361,7 @@ protected: private: virtual GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture*) const = 0; /** @@ -372,8 +369,7 @@ private: * shader. */ virtual bool willReadDstColor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples) const = 0; virtual bool onIsEqual(const GrXPFactory&) const = 0; diff --git a/include/gpu/effects/GrCoverageSetOpXP.h b/include/gpu/effects/GrCoverageSetOpXP.h index a17cf81232..097a890d56 100644 --- a/include/gpu/effects/GrCoverageSetOpXP.h +++ b/include/gpu/effects/GrCoverageSetOpXP.h @@ -30,14 +30,12 @@ private: GrCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage); GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture*) const override; bool willReadDstColor(const GrCaps& /*caps*/, - const GrProcOptInfo& /*colorPOI*/, - const GrProcOptInfo& /*coveragePOI*/, + const GrPipelineOptimizations& /*optimizations*/, bool /*hasMixedSamples*/) const override { return false; } diff --git a/include/gpu/effects/GrPorterDuffXferProcessor.h b/include/gpu/effects/GrPorterDuffXferProcessor.h index 3dc503305f..be014a6b04 100644 --- a/include/gpu/effects/GrPorterDuffXferProcessor.h +++ b/include/gpu/effects/GrPorterDuffXferProcessor.h @@ -22,8 +22,7 @@ public: GrXPFactory::InvariantBlendedColor*) const override; static GrXferProcessor* CreateSrcOverXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const GrXferProcessor::DstTexture*); @@ -44,22 +43,19 @@ public: } static bool SrcOverWillNeedDstTexture(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples); private: GrPorterDuffXPFactory(SkXfermode::Mode); GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture*) const override; bool willReadDstColor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples) const override; bool onIsEqual(const GrXPFactory& xpfBase) const override { diff --git a/src/effects/SkArithmeticMode_gpu.cpp b/src/effects/SkArithmeticMode_gpu.cpp index 4d74082fb3..c9493d7e92 100644 --- a/src/effects/SkArithmeticMode_gpu.cpp +++ b/src/effects/SkArithmeticMode_gpu.cpp @@ -167,8 +167,7 @@ public: bool enforcePMColor() const { return fEnforcePMColor; } private: - GrXferProcessor::OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) override; @@ -257,11 +256,11 @@ void ArithmeticXP::onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyB GrGLSLXferProcessor* ArithmeticXP::createGLSLInstance() const { return new GLArithmeticXP(*this); } -GrXferProcessor::OptFlags ArithmeticXP::onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, - bool doesStencilWrite, - GrColor* overrideColor, - const GrCaps& caps) { +GrXferProcessor::OptFlags ArithmeticXP::onGetOptimizations( + const GrPipelineOptimizations& optimizations, + bool doesStencilWrite, + GrColor* overrideColor, + const GrCaps& caps) { return GrXferProcessor::kNone_OptFlags; } @@ -275,8 +274,7 @@ GrArithmeticXPFactory::GrArithmeticXPFactory(float k1, float k2, float k3, float GrXferProcessor* GrArithmeticXPFactory::onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture* dstTexture) const { return new ArithmeticXP(dstTexture, hasMixedSamples, fK1, fK2, fK3, fK4, fEnforcePMColor); diff --git a/src/effects/SkArithmeticMode_gpu.h b/src/effects/SkArithmeticMode_gpu.h index b24d23a6e6..d6b1f881df 100644 --- a/src/effects/SkArithmeticMode_gpu.h +++ b/src/effects/SkArithmeticMode_gpu.h @@ -88,14 +88,12 @@ private: GrArithmeticXPFactory(float k1, float k2, float k3, float k4, bool enforcePMColor); GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture*) const override; bool willReadDstColor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples) const override { return true; } diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp index 7497702beb..f34e6fc956 100644 --- a/src/gpu/GrDrawTarget.cpp +++ b/src/gpu/GrDrawTarget.cpp @@ -113,14 +113,13 @@ void GrDrawTarget::dump() const { #endif bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuilder, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, GrXferProcessor::DstTexture* dstTexture, const SkRect& batchBounds) { SkRect bounds = batchBounds; bounds.outset(0.5f, 0.5f); - if (!pipelineBuilder.willXPNeedDstTexture(*this->caps(), colorPOI, coveragePOI)) { + if (!pipelineBuilder.willXPNeedDstTexture(*this->caps(), optimizations)) { return true; } @@ -545,8 +544,7 @@ bool GrDrawTarget::installPipelineInDrawBatch(const GrPipelineBuilder* pipelineB args.fOpts.fCoveragePOI.completeCalculations( pipelineBuilder->fCoverageFragmentProcessors.begin(), pipelineBuilder->numCoverageFragmentProcessors()); - if (!this->setupDstReadIfNecessary(*pipelineBuilder, args.fOpts.fColorPOI, - args.fOpts.fCoveragePOI, &args.fDstTexture, + if (!this->setupDstReadIfNecessary(*pipelineBuilder, args.fOpts, &args.fDstTexture, batch->bounds())) { return false; } diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h index 591bbc7361..240731e81b 100644 --- a/src/gpu/GrDrawTarget.h +++ b/src/gpu/GrDrawTarget.h @@ -279,8 +279,7 @@ private: // but couldn't be made. Otherwise, returns true. This method needs to be protected because it // needs to be accessed by GLPrograms to setup a correct drawstate bool setupDstReadIfNecessary(const GrPipelineBuilder&, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, GrXferProcessor::DstTexture*, const SkRect& batchBounds); diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp index aef528d096..3ff6807b3b 100644 --- a/src/gpu/GrPipeline.cpp +++ b/src/gpu/GrPipeline.cpp @@ -24,16 +24,14 @@ GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args, const GrXPFactory* xpFactory = builder.getXPFactory(); SkAutoTUnref xferProcessor; if (xpFactory) { - xferProcessor.reset(xpFactory->createXferProcessor(args.fOpts.fColorPOI, - args.fOpts.fCoveragePOI, + xferProcessor.reset(xpFactory->createXferProcessor(args.fOpts, builder.hasMixedSamples(), &args.fDstTexture, *args.fCaps)); } else { xferProcessor.reset(GrPorterDuffXPFactory::CreateSrcOverXferProcessor( *args.fCaps, - args.fOpts.fColorPOI, - args.fOpts.fCoveragePOI, + args.fOpts, builder.hasMixedSamples(), &args.fDstTexture)); } @@ -49,8 +47,7 @@ GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args, GrXferProcessor::OptFlags optFlags = GrXferProcessor::kNone_OptFlags; - optFlags = xferProcessor->getOptimizations(args.fOpts.fColorPOI, - args.fOpts.fCoveragePOI, + optFlags = xferProcessor->getOptimizations(args.fOpts, builder.getStencil().doesWrite(), &overrideColor, *args.fCaps); diff --git a/src/gpu/GrPipelineBuilder.cpp b/src/gpu/GrPipelineBuilder.cpp index c9dbcd9861..f1d5c26168 100644 --- a/src/gpu/GrPipelineBuilder.cpp +++ b/src/gpu/GrPipelineBuilder.cpp @@ -49,13 +49,12 @@ GrPipelineBuilder::GrPipelineBuilder(const GrPaint& paint, GrRenderTarget* rt, c //////////////////////////////////////////////////////////////////////////////s bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI) const { + const GrPipelineOptimizations& optimizations) const { if (this->getXPFactory()) { - return this->getXPFactory()->willNeedDstTexture(caps, colorPOI, coveragePOI, + return this->getXPFactory()->willNeedDstTexture(caps, optimizations, this->hasMixedSamples()); } - return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, colorPOI, coveragePOI, + return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, optimizations, this->hasMixedSamples()); } diff --git a/src/gpu/GrPipelineBuilder.h b/src/gpu/GrPipelineBuilder.h index 1526b0f68c..f5fe9f80dc 100644 --- a/src/gpu/GrPipelineBuilder.h +++ b/src/gpu/GrPipelineBuilder.h @@ -177,8 +177,8 @@ public: /** * Checks whether the xp will need destination in a texture to correctly blend. */ - bool willXPNeedDstTexture(const GrCaps& caps, const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI) const; + bool willXPNeedDstTexture(const GrCaps& caps, + const GrPipelineOptimizations& optimizations) const; /// @} diff --git a/src/gpu/GrXferProcessor.cpp b/src/gpu/GrXferProcessor.cpp index 655fdfae7b..3bccd6e3f7 100644 --- a/src/gpu/GrXferProcessor.cpp +++ b/src/gpu/GrXferProcessor.cpp @@ -6,6 +6,7 @@ */ #include "GrXferProcessor.h" +#include "GrPipeline.h" #include "GrPipelineBuilder.h" #include "GrProcOptInfo.h" #include "gl/GrGLCaps.h" @@ -33,13 +34,12 @@ GrXferProcessor::GrXferProcessor(const DstTexture* dstTexture, } } -GrXferProcessor::OptFlags GrXferProcessor::getOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, - bool doesStencilWrite, - GrColor* overrideColor, - const GrCaps& caps) { - GrXferProcessor::OptFlags flags = this->onGetOptimizations(colorPOI, - coveragePOI, +GrXferProcessor::OptFlags GrXferProcessor::getOptimizations( + const GrPipelineOptimizations& optimizations, + bool doesStencilWrite, + GrColor* overrideColor, + const GrCaps& caps) { + GrXferProcessor::OptFlags flags = this->onGetOptimizations(optimizations, doesStencilWrite, overrideColor, caps); @@ -47,7 +47,7 @@ GrXferProcessor::OptFlags GrXferProcessor::getOptimizations(const GrProcOptInfo& if (this->willReadDstColor()) { // When performing a dst read we handle coverage in the base class. SkASSERT(!(flags & GrXferProcessor::kIgnoreCoverage_OptFlag)); - if (coveragePOI.isSolidWhite()) { + if (optimizations.fCoveragePOI.isSolidWhite()) { flags |= GrXferProcessor::kIgnoreCoverage_OptFlag; } } @@ -200,13 +200,12 @@ SkString GrXferProcessor::BlendInfo::dump() const { /////////////////////////////////////////////////////////////////////////////// -GrXferProcessor* GrXPFactory::createXferProcessor(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, +GrXferProcessor* GrXPFactory::createXferProcessor(const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture* dstTexture, const GrCaps& caps) const { #ifdef SK_DEBUG - if (this->willReadDstColor(caps, colorPOI, coveragePOI, hasMixedSamples)) { + if (this->willReadDstColor(caps, optimizations, hasMixedSamples)) { if (!caps.shaderCaps()->dstReadInShaderSupport()) { SkASSERT(dstTexture && dstTexture->texture()); } else { @@ -217,13 +216,12 @@ GrXferProcessor* GrXPFactory::createXferProcessor(const GrProcOptInfo& colorPOI, } SkASSERT(!hasMixedSamples || caps.shaderCaps()->dualSourceBlendingSupport()); #endif - return this->onCreateXferProcessor(caps, colorPOI, coveragePOI, hasMixedSamples, dstTexture); + return this->onCreateXferProcessor(caps, optimizations, hasMixedSamples, dstTexture); } bool GrXPFactory::willNeedDstTexture(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples) const { - return (this->willReadDstColor(caps, colorPOI, coveragePOI, hasMixedSamples) && + return (this->willReadDstColor(caps, optimizations, hasMixedSamples) && !caps.shaderCaps()->dstReadInShaderSupport()); } diff --git a/src/gpu/effects/GrCoverageSetOpXP.cpp b/src/gpu/effects/GrCoverageSetOpXP.cpp index bcdb6d81dc..c7226fc80a 100644 --- a/src/gpu/effects/GrCoverageSetOpXP.cpp +++ b/src/gpu/effects/GrCoverageSetOpXP.cpp @@ -32,8 +32,7 @@ public: private: CoverageSetOpXP(SkRegion::Op regionOp, bool fInvertCoverage); - GrXferProcessor::OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* color, const GrCaps& caps) override; @@ -107,8 +106,7 @@ GrGLSLXferProcessor* CoverageSetOpXP::createGLSLInstance() const { } GrXferProcessor::OptFlags -CoverageSetOpXP::onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, +CoverageSetOpXP::onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* color, const GrCaps& caps) { @@ -223,8 +221,7 @@ GrXPFactory* GrCoverageSetOpXPFactory::Create(SkRegion::Op regionOp, bool invert GrXferProcessor* GrCoverageSetOpXPFactory::onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& covPOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture* dst) const { // We don't support inverting coverage with mixed samples. We don't expect to ever want this in diff --git a/src/gpu/effects/GrCustomXfermode.cpp b/src/gpu/effects/GrCustomXfermode.cpp index 90ab030d24..9de178d478 100644 --- a/src/gpu/effects/GrCustomXfermode.cpp +++ b/src/gpu/effects/GrCustomXfermode.cpp @@ -11,6 +11,7 @@ #include "GrContext.h" #include "GrFragmentProcessor.h" #include "GrInvariantOutput.h" +#include "GrPipeline.h" #include "GrProcessor.h" #include "GrTexture.h" #include "GrTextureAccess.h" @@ -99,8 +100,7 @@ public: } private: - GrXferProcessor::OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) override; @@ -192,8 +192,7 @@ bool CustomXP::onIsEqual(const GrXferProcessor& other) const { return fMode == s.fMode && fHWBlendEquation == s.fHWBlendEquation; } -GrXferProcessor::OptFlags CustomXP::onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, +GrXferProcessor::OptFlags CustomXP::onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) { @@ -294,10 +293,10 @@ GrXferProcessor::OptFlags CustomXP::onGetOptimizations(const GrProcOptInfo& colo */ OptFlags flags = kNone_OptFlags; - if (colorPOI.allStagesMultiplyInput()) { + if (optimizations.fColorPOI.allStagesMultiplyInput()) { flags |= kCanTweakAlphaForCoverage_OptFlag; } - if (this->hasHWBlendEquation() && coveragePOI.isSolidWhite()) { + if (this->hasHWBlendEquation() && optimizations.fCoveragePOI.isSolidWhite()) { flags |= kIgnoreCoverage_OptFlag; } return flags; @@ -326,14 +325,12 @@ public: private: GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture*) const override; bool willReadDstColor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples) const override; bool onIsEqual(const GrXPFactory& xpfBase) const override { @@ -357,11 +354,10 @@ CustomXPFactory::CustomXPFactory(SkXfermode::Mode mode) } GrXferProcessor* CustomXPFactory::onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& opt, bool hasMixedSamples, const DstTexture* dstTexture) const { - if (can_use_hw_blend_equation(fHWBlendEquation, coveragePOI, caps)) { + if (can_use_hw_blend_equation(fHWBlendEquation, opt.fCoveragePOI, caps)) { SkASSERT(!dstTexture || !dstTexture->texture()); return new CustomXP(fMode, fHWBlendEquation); } @@ -369,10 +365,9 @@ GrXferProcessor* CustomXPFactory::onCreateXferProcessor(const GrCaps& caps, } bool CustomXPFactory::willReadDstColor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples) const { - return !can_use_hw_blend_equation(fHWBlendEquation, coveragePOI, caps); + return !can_use_hw_blend_equation(fHWBlendEquation, optimizations.fCoveragePOI, caps); } void CustomXPFactory::getInvariantBlendedColor(const GrProcOptInfo& colorPOI, diff --git a/src/gpu/effects/GrDisableColorXP.cpp b/src/gpu/effects/GrDisableColorXP.cpp index 2a0de5feda..abeaa8c1cc 100644 --- a/src/gpu/effects/GrDisableColorXP.cpp +++ b/src/gpu/effects/GrDisableColorXP.cpp @@ -29,8 +29,7 @@ public: private: DisableColorXP(); - GrXferProcessor::OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* color, const GrCaps& caps) override { @@ -96,8 +95,7 @@ GrDisableColorXPFactory::GrDisableColorXPFactory() { GrXferProcessor* GrDisableColorXPFactory::onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& covPOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture* dst) const { return DisableColorXP::Create(); diff --git a/src/gpu/effects/GrDisableColorXP.h b/src/gpu/effects/GrDisableColorXP.h index a79dd9b971..94aae31751 100644 --- a/src/gpu/effects/GrDisableColorXP.h +++ b/src/gpu/effects/GrDisableColorXP.h @@ -27,14 +27,12 @@ private: GrDisableColorXPFactory(); GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture* dstTexture) const override; bool willReadDstColor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples) const override { return false; } diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp index 2323c67040..88275c2bbe 100644 --- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp +++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp @@ -9,6 +9,7 @@ #include "GrBlend.h" #include "GrCaps.h" +#include "GrPipeline.h" #include "GrProcessor.h" #include "GrProcOptInfo.h" #include "GrTypes.h" @@ -352,8 +353,7 @@ public: BlendFormula getBlendFormula() const { return fBlendFormula; } private: - GrXferProcessor::OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) override; @@ -469,8 +469,7 @@ GrGLSLXferProcessor* PorterDuffXferProcessor::createGLSLInstance() const { } GrXferProcessor::OptFlags -PorterDuffXferProcessor::onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, +PorterDuffXferProcessor::onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) { @@ -486,12 +485,12 @@ PorterDuffXferProcessor::onGetOptimizations(const GrProcOptInfo& colorPOI, if (!fBlendFormula.usesInputColor()) { optFlags |= GrXferProcessor::kIgnoreColor_OptFlag; } - if (coveragePOI.isSolidWhite()) { + if (optimizations.fCoveragePOI.isSolidWhite()) { optFlags |= GrXferProcessor::kIgnoreCoverage_OptFlag; } - if (colorPOI.allStagesMultiplyInput() && + if (optimizations.fColorPOI.allStagesMultiplyInput() && fBlendFormula.canTweakAlphaForCoverage() && - !coveragePOI.isFourChannelOutput()) { + !optimizations.fCoveragePOI.isFourChannelOutput()) { optFlags |= GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag; } } @@ -517,8 +516,8 @@ public: SkXfermode::Mode getXfermode() const { return fXfermode; } private: - GrXferProcessor::OptFlags onGetOptimizations(const GrProcOptInfo&, const GrProcOptInfo&, - bool, GrColor*, const GrCaps&) override { + GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations&, bool, GrColor*, + const GrCaps&) override { return kNone_OptFlags; } @@ -586,8 +585,7 @@ public: private: PDLCDXferProcessor(GrColor blendConstant, uint8_t alpha); - GrXferProcessor::OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, + GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) override; @@ -676,8 +674,7 @@ GrGLSLXferProcessor* PDLCDXferProcessor::createGLSLInstance() const { } GrXferProcessor::OptFlags -PDLCDXferProcessor::onGetOptimizations(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, +PDLCDXferProcessor::onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, const GrCaps& caps) { @@ -729,24 +726,24 @@ GrXPFactory* GrPorterDuffXPFactory::Create(SkXfermode::Mode xfermode) { GrXferProcessor* GrPorterDuffXPFactory::onCreateXferProcessor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& covPOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const DstTexture* dstTexture) const { BlendFormula blendFormula; - if (covPOI.isFourChannelOutput()) { + if (optimizations.fCoveragePOI.isFourChannelOutput()) { if (SkXfermode::kSrcOver_Mode == fXfermode && - kRGBA_GrColorComponentFlags == colorPOI.validFlags() && + kRGBA_GrColorComponentFlags == optimizations.fColorPOI.validFlags() && !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(fXfermode, colorPOI); + return PDLCDXferProcessor::Create(fXfermode, optimizations.fColorPOI); } - blendFormula = get_lcd_blend_formula(covPOI, fXfermode); + blendFormula = get_lcd_blend_formula(optimizations.fCoveragePOI, fXfermode); } else { - blendFormula = get_blend_formula(colorPOI, covPOI, hasMixedSamples, fXfermode); + blendFormula = get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI, + hasMixedSamples, fXfermode); } if (blendFormula.hasSecondaryOutput() && !caps.shaderCaps()->dualSourceBlendingSupport()) { @@ -789,8 +786,7 @@ void GrPorterDuffXPFactory::getInvariantBlendedColor(const GrProcOptInfo& colorP } bool GrPorterDuffXPFactory::willReadDstColor(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& covPOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples) const { if (caps.shaderCaps()->dualSourceBlendingSupport()) { return false; @@ -799,17 +795,18 @@ bool GrPorterDuffXPFactory::willReadDstColor(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 (covPOI.isFourChannelOutput()) { + if (optimizations.fCoveragePOI.isFourChannelOutput()) { if (SkXfermode::kSrcOver_Mode == fXfermode && - kRGBA_GrColorComponentFlags == colorPOI.validFlags() && + kRGBA_GrColorComponentFlags == optimizations.fColorPOI.validFlags() && !caps.shaderCaps()->dstReadInShaderSupport()) { return false; } - return get_lcd_blend_formula(covPOI, fXfermode).hasSecondaryOutput(); + return get_lcd_blend_formula(optimizations.fCoveragePOI, fXfermode).hasSecondaryOutput(); } // We fallback on the shader XP when the blend formula would use dual source blending but we // don't have support for it. - return get_blend_formula(colorPOI, covPOI, hasMixedSamples, fXfermode).hasSecondaryOutput(); + return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI, hasMixedSamples, + fXfermode).hasSecondaryOutput(); } GR_DEFINE_XP_FACTORY_TEST(GrPorterDuffXPFactory); @@ -838,25 +835,24 @@ void GrPorterDuffXPFactory::TestGetXPOutputTypes(const GrXferProcessor* xp, GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor( const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& covPOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const GrXferProcessor::DstTexture* dstTexture) { BlendFormula blendFormula; - if (covPOI.isFourChannelOutput()) { - if (kRGBA_GrColorComponentFlags == colorPOI.validFlags() && + if (optimizations.fCoveragePOI.isFourChannelOutput()) { + if (kRGBA_GrColorComponentFlags == optimizations.fColorPOI.validFlags() && !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(SkXfermode::kSrcOver_Mode, colorPOI); + return PDLCDXferProcessor::Create(SkXfermode::kSrcOver_Mode, optimizations.fColorPOI); } - blendFormula = get_lcd_blend_formula(covPOI, SkXfermode::kSrcOver_Mode); + blendFormula = get_lcd_blend_formula(optimizations.fCoveragePOI, SkXfermode::kSrcOver_Mode); } else { - blendFormula = get_blend_formula(colorPOI, covPOI, hasMixedSamples, - SkXfermode::kSrcOver_Mode); + blendFormula = get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI, + hasMixedSamples, SkXfermode::kSrcOver_Mode); } if (blendFormula.hasSecondaryOutput() && !caps.shaderCaps()->dualSourceBlendingSupport()) { @@ -868,8 +864,7 @@ GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor( } bool GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(const GrCaps& caps, - const GrProcOptInfo& colorPOI, - const GrProcOptInfo& covPOI, + const GrPipelineOptimizations& optimizations, bool hasMixedSamples) { if (caps.shaderCaps()->dstReadInShaderSupport() || caps.shaderCaps()->dualSourceBlendingSupport()) { @@ -879,16 +874,17 @@ 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 (covPOI.isFourChannelOutput()) { - if (kRGBA_GrColorComponentFlags == colorPOI.validFlags() && + if (optimizations.fCoveragePOI.isFourChannelOutput()) { + if (kRGBA_GrColorComponentFlags == optimizations.fColorPOI.validFlags() && !caps.shaderCaps()->dstReadInShaderSupport()) { return false; } - return get_lcd_blend_formula(covPOI, SkXfermode::kSrcOver_Mode).hasSecondaryOutput(); + return get_lcd_blend_formula(optimizations.fCoveragePOI, + SkXfermode::kSrcOver_Mode).hasSecondaryOutput(); } // We fallback on the shader XP when the blend formula would use dual source blending but we // don't have support for it. - return get_blend_formula(colorPOI, covPOI, + return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI, hasMixedSamples, SkXfermode::kSrcOver_Mode).hasSecondaryOutput(); } diff --git a/tests/GrPorterDuffTest.cpp b/tests/GrPorterDuffTest.cpp index 0bafdeb9e8..ca732a4551 100644 --- a/tests/GrPorterDuffTest.cpp +++ b/tests/GrPorterDuffTest.cpp @@ -76,13 +76,13 @@ class GrPorterDuffTest { public: struct XPInfo { XPInfo(skiatest::Reporter* reporter, SkXfermode::Mode xfermode, const GrCaps& caps, - const GrProcOptInfo& colorPOI, const GrProcOptInfo& covPOI) { + const GrPipelineOptimizations& optimizations) { SkAutoTUnref xpf(GrPorterDuffXPFactory::Create(xfermode)); SkAutoTUnref xp( - xpf->createXferProcessor(colorPOI, covPOI, false, nullptr, caps)); - TEST_ASSERT(!xpf->willNeedDstTexture(caps, colorPOI, covPOI, false)); - xpf->getInvariantBlendedColor(colorPOI, &fBlendedColor); - fOptFlags = xp->getOptimizations(colorPOI, covPOI, false, nullptr, caps); + xpf->createXferProcessor(optimizations, false, nullptr, caps)); + TEST_ASSERT(!xpf->willNeedDstTexture(caps, optimizations, false)); + xpf->getInvariantBlendedColor(optimizations.fColorPOI, &fBlendedColor); + fOptFlags = xp->getOptimizations(optimizations, false, nullptr, caps); GetXPOutputTypes(xp, &fPrimaryOutputType, &fSecondaryOutputType); xp->getBlendInfo(&fBlendInfo); TEST_ASSERT(!xp->willReadDstColor()); @@ -102,19 +102,19 @@ public: }; static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { - GrProcOptInfo colorPOI, covPOI; - colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false); + GrPipelineOptimizations opt; + opt.fColorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false); // Setting 2nd to last value to false and last to true will force covPOI to LCD coverage. - covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false, true); + opt.fCoveragePOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false, true); - SkASSERT(!colorPOI.isOpaque()); - SkASSERT(!colorPOI.isSolidWhite()); - SkASSERT(!covPOI.isSolidWhite()); - SkASSERT(covPOI.isFourChannelOutput()); + SkASSERT(!opt.fColorPOI.isOpaque()); + SkASSERT(!opt.fColorPOI.isSolidWhite()); + SkASSERT(!opt.fCoveragePOI.isSolidWhite()); + SkASSERT(opt.fCoveragePOI.isFourChannelOutput()); for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { SkXfermode::Mode xfermode = static_cast(m); - const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, covPOI); + const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, opt); switch (xfermode) { case SkXfermode::kClear_Mode: @@ -293,18 +293,20 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) } } static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { - GrProcOptInfo colorPOI, covPOI; - colorPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, false); - covPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, true); + GrPipelineOptimizations optimizations; + optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, + false); + optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, + true); - SkASSERT(!colorPOI.isOpaque()); - SkASSERT(!colorPOI.isSolidWhite()); - SkASSERT(!covPOI.isSolidWhite()); - SkASSERT(!covPOI.isFourChannelOutput()); + SkASSERT(!optimizations.fColorPOI.isOpaque()); + SkASSERT(!optimizations.fColorPOI.isSolidWhite()); + SkASSERT(!optimizations.fCoveragePOI.isSolidWhite()); + SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput()); for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { SkXfermode::Mode xfermode = static_cast(m); - const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, covPOI); + const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations); switch (xfermode) { @@ -485,19 +487,20 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const } static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { - GrProcOptInfo colorPOI, covPOI; - colorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(229, 0, 154, 0), + GrPipelineOptimizations optimizations; + optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(229, 0, 154, 0), kR_GrColorComponentFlag | kB_GrColorComponentFlag, false); - covPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), kRGBA_GrColorComponentFlags, true); + optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), + kRGBA_GrColorComponentFlags, true); - SkASSERT(!colorPOI.isOpaque()); - SkASSERT(!colorPOI.isSolidWhite()); - SkASSERT(covPOI.isSolidWhite()); - SkASSERT(!covPOI.isFourChannelOutput()); + SkASSERT(!optimizations.fColorPOI.isOpaque()); + SkASSERT(!optimizations.fColorPOI.isSolidWhite()); + SkASSERT(optimizations.fCoveragePOI.isSolidWhite()); + SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput()); for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { SkXfermode::Mode xfermode = static_cast(m); - const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, covPOI); + const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations); switch (xfermode) { case SkXfermode::kClear_Mode: @@ -688,18 +691,20 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G } static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { - GrProcOptInfo colorPOI, covPOI; - colorPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), kA_GrColorComponentFlag, false); - covPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, true); + GrPipelineOptimizations optimizations; + optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), + kA_GrColorComponentFlag, false); + optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, + true); - SkASSERT(colorPOI.isOpaque()); - SkASSERT(!colorPOI.isSolidWhite()); - SkASSERT(!covPOI.isSolidWhite()); - SkASSERT(!covPOI.isFourChannelOutput()); + SkASSERT(optimizations.fColorPOI.isOpaque()); + SkASSERT(!optimizations.fColorPOI.isSolidWhite()); + SkASSERT(!optimizations.fCoveragePOI.isSolidWhite()); + SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput()); for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { SkXfermode::Mode xfermode = static_cast(m); - const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, covPOI); + const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations); switch (xfermode) { case SkXfermode::kClear_Mode: @@ -885,19 +890,20 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const } static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { - GrProcOptInfo colorPOI, covPOI; - colorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(0, 82, 0, 255), + GrPipelineOptimizations optimizations; + optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(0, 82, 0, 255), kG_GrColorComponentFlag | kA_GrColorComponentFlag, false); - covPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), kRGBA_GrColorComponentFlags, true); + optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), + kRGBA_GrColorComponentFlags, true); - SkASSERT(colorPOI.isOpaque()); - SkASSERT(!colorPOI.isSolidWhite()); - SkASSERT(covPOI.isSolidWhite()); - SkASSERT(!covPOI.isFourChannelOutput()); + SkASSERT(optimizations.fColorPOI.isOpaque()); + SkASSERT(!optimizations.fColorPOI.isSolidWhite()); + SkASSERT(optimizations.fCoveragePOI.isSolidWhite()); + SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput()); for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { SkXfermode::Mode xfermode = static_cast(m); - const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, covPOI); + const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations); switch (xfermode) { case SkXfermode::kClear_Mode: @@ -1126,10 +1132,10 @@ static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const SkASSERT(covPOI.isFourChannelOutput()); SkAutoTUnref xpf(GrPorterDuffXPFactory::Create(SkXfermode::kSrcOver_Mode)); - TEST_ASSERT(!xpf->willNeedDstTexture(caps, colorPOI, covPOI, false)); + TEST_ASSERT(!xpf->willNeedDstTexture(caps, opts, false)); SkAutoTUnref xp( - xpf->createXferProcessor(colorPOI, covPOI, false, nullptr, caps)); + xpf->createXferProcessor(opts, false, nullptr, caps)); if (!xp) { ERRORF(reporter, "Failed to create an XP with LCD coverage."); return; @@ -1141,7 +1147,7 @@ static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const TEST_ASSERT(kNone_GrColorComponentFlags == blendedColor.fKnownColorFlags); GrColor overrideColor; - xp->getOptimizations(colorPOI, covPOI, false, &overrideColor, caps); + xp->getOptimizations(opts, false, &overrideColor, caps); GrXferProcessor::BlendInfo blendInfo; xp->getBlendInfo(&blendInfo); @@ -1189,29 +1195,30 @@ static void test_no_dual_source_blending(skiatest::Reporter* reporter) { GR_STATIC_ASSERT(SK_ARRAY_COUNT(testColors) == SK_ARRAY_COUNT(testColorFlags)); for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) { - GrProcOptInfo colorPOI; - colorPOI.calcWithInitialValues(nullptr, 0, testColors[c], testColorFlags[c], false); + GrPipelineOptimizations optimizations; + optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, testColors[c], testColorFlags[c], + false); for (int f = 0; f <= 1; f++) { - GrProcOptInfo covPOI; if (!f) { - covPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, true); + optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, + kNone_GrColorComponentFlags, true); } else { - covPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), - kRGBA_GrColorComponentFlags, true); + optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), + kRGBA_GrColorComponentFlags, true); } for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { SkXfermode::Mode xfermode = static_cast(m); SkAutoTUnref xpf(GrPorterDuffXPFactory::Create(xfermode)); GrXferProcessor::DstTexture* dstTexture = - xpf->willNeedDstTexture(caps, colorPOI, covPOI, false) ? &fakeDstTexture : 0; + xpf->willNeedDstTexture(caps, optimizations, false) ? &fakeDstTexture : 0; SkAutoTUnref xp( - xpf->createXferProcessor(colorPOI, covPOI, false, dstTexture, caps)); + xpf->createXferProcessor(optimizations, false, dstTexture, caps)); if (!xp) { ERRORF(reporter, "Failed to create an XP without dual source blending."); return; } TEST_ASSERT(!xp->hasSecondaryOutput()); - xp->getOptimizations(colorPOI, covPOI, false, 0, caps); + xp->getOptimizations(optimizations, false, 0, caps); TEST_ASSERT(!xp->hasSecondaryOutput()); } }