aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/effects')
-rw-r--r--src/gpu/effects/GrCoverageSetOpXP.cpp24
-rw-r--r--src/gpu/effects/GrCoverageSetOpXP.h6
-rw-r--r--src/gpu/effects/GrCustomXfermode.cpp27
-rw-r--r--src/gpu/effects/GrDisableColorXP.cpp13
-rw-r--r--src/gpu/effects/GrDisableColorXP.h9
-rw-r--r--src/gpu/effects/GrPorterDuffXferProcessor.cpp91
-rw-r--r--src/gpu/effects/GrPorterDuffXferProcessor.h14
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);