| Index: src/gpu/effects/GrPorterDuffXferProcessor.cpp
|
| diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
|
| index 2323c67040f9e8052251b6e7c3ca1e8216a8db24..88275c2bbed85ce370821e9b3a1c8257f3c2c872 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();
|
| }
|
|
|
|
|