From 5be6c95fa95a518ab109339df4695d6dda6e2419 Mon Sep 17 00:00:00 2001 From: Brian Salomon Date: Fri, 20 Jan 2017 19:06:29 +0000 Subject: Revert "Revert "Make it possible to query GrXPFactory for dst texture without GrPipelineAnalysis."" This reverts commit 3329cceab5feca230df1caee16be045249228dc1. Reason for revert: Bot failures are unrelated to the original change. Change-Id: I21b5927dc4384a25930bdefe16e57bcc9276ffa4 Reviewed-on: https://skia-review.googlesource.com/7347 Commit-Queue: Brian Salomon Reviewed-by: Brian Salomon --- src/gpu/effects/GrPorterDuffXferProcessor.cpp | 43 +++++++++++++-------------- 1 file changed, 21 insertions(+), 22 deletions(-) (limited to 'src/gpu/effects/GrPorterDuffXferProcessor.cpp') diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp index 7f409065f4..59710ebfc0 100644 --- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp +++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp @@ -320,21 +320,17 @@ static const BlendFormula gLCDBlendTable[(int)SkBlendMode::kLastCoeffMode + 1] = /* screen */ COEFF_FORMULA( kOne_GrBlendCoeff, kISC_GrBlendCoeff), }; -static BlendFormula get_blend_formula(const GrProcOptInfo& colorPOI, - const GrProcOptInfo& coveragePOI, +static BlendFormula get_blend_formula(bool isOpaque, + bool hasCoverage, bool hasMixedSamples, SkBlendMode xfermode) { SkASSERT((unsigned)xfermode <= (unsigned)SkBlendMode::kLastCoeffMode); - SkASSERT(!coveragePOI.isLCDCoverage()); - - bool conflatesCoverage = !coveragePOI.isSolidWhite() || hasMixedSamples; - return gBlendTable[colorPOI.isOpaque()][conflatesCoverage][(int)xfermode]; + bool conflatesCoverage = hasCoverage || hasMixedSamples; + return gBlendTable[isOpaque][conflatesCoverage][(int)xfermode]; } -static BlendFormula get_lcd_blend_formula(const GrProcOptInfo& coveragePOI, - SkBlendMode xfermode) { +static BlendFormula get_lcd_blend_formula(SkBlendMode xfermode) { SkASSERT((unsigned)xfermode <= (unsigned)SkBlendMode::kLastCoeffMode); - SkASSERT(coveragePOI.isLCDCoverage()); return gLCDBlendTable[(int)xfermode]; } @@ -759,9 +755,10 @@ GrXferProcessor* GrPorterDuffXPFactory::onCreateXferProcessor(const GrCaps& caps SkASSERT(!dstTexture || !dstTexture->texture()); return PDLCDXferProcessor::Create(fBlendMode, analysis.fColorPOI); } - blendFormula = get_lcd_blend_formula(analysis.fCoveragePOI, fBlendMode); + blendFormula = get_lcd_blend_formula(fBlendMode); } else { - blendFormula = get_blend_formula(analysis.fColorPOI, analysis.fCoveragePOI, hasMixedSamples, + blendFormula = get_blend_formula(analysis.fColorPOI.isOpaque(), + !analysis.fCoveragePOI.isSolidWhite(), hasMixedSamples, fBlendMode); } @@ -804,8 +801,8 @@ void GrPorterDuffXPFactory::getInvariantBlendedColor(const GrProcOptInfo& colorP } } -bool GrPorterDuffXPFactory::onWillReadDstColor(const GrCaps& caps, - const GrPipelineAnalysis& analysis) const { +bool GrPorterDuffXPFactory::willReadDstColor(const GrCaps& caps, ColorType colorType, + CoverageType coverageType) const { if (caps.shaderCaps()->dualSourceBlendingSupport()) { return false; } @@ -813,20 +810,20 @@ bool GrPorterDuffXPFactory::onWillReadDstColor(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 (SkBlendMode::kSrcOver == fBlendMode && - kRGBA_GrColorComponentFlags == analysis.fColorPOI.validFlags() && + if (CoverageType::kLCD == coverageType) { + if (SkBlendMode::kSrcOver == fBlendMode && ColorTypeIsConstant(colorType) && !caps.shaderCaps()->dstReadInShaderSupport()) { return false; } - return get_lcd_blend_formula(analysis.fCoveragePOI, fBlendMode).hasSecondaryOutput(); + return get_lcd_blend_formula(fBlendMode).hasSecondaryOutput(); } // 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; SkASSERT(!caps.usesMixedSamples()); // We never use mixed samples without dual source blending. - auto formula = get_blend_formula(analysis.fColorPOI, analysis.fCoveragePOI, kHasMixedSamples, + auto formula = get_blend_formula(ColorTypeIsOpaque(colorType), + CoverageType::kSingleChannel == coverageType, kHasMixedSamples, fBlendMode); return formula.hasSecondaryOutput(); } @@ -893,7 +890,7 @@ GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor( } BlendFormula blendFormula; - blendFormula = get_lcd_blend_formula(analysis.fCoveragePOI, SkBlendMode::kSrcOver); + blendFormula = get_lcd_blend_formula(SkBlendMode::kSrcOver); if (blendFormula.hasSecondaryOutput() && !caps.shaderCaps()->dualSourceBlendingSupport()) { return new ShaderPDXferProcessor(dstTexture, hasMixedSamples, SkBlendMode::kSrcOver); } @@ -917,15 +914,17 @@ bool GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(const GrCaps& caps, !caps.shaderCaps()->dstReadInShaderSupport()) { return false; } - auto formula = get_lcd_blend_formula(analysis.fCoveragePOI, SkBlendMode::kSrcOver); + auto formula = get_lcd_blend_formula(SkBlendMode::kSrcOver); return formula.hasSecondaryOutput(); } // 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(); SkASSERT(!caps.usesMixedSamples()); // We never use mixed samples without dual source blending. - auto formula = get_blend_formula(analysis.fColorPOI, analysis.fCoveragePOI, kHasMixedSamples, - SkBlendMode::kSrcOver); + auto formula = + get_blend_formula(isOpaque, hasCoverage, kHasMixedSamples, SkBlendMode::kSrcOver); return formula.hasSecondaryOutput(); } -- cgit v1.2.3