diff options
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/GrPipeline.cpp | 1 | ||||
-rw-r--r-- | src/gpu/GrPipeline.h | 2 | ||||
-rw-r--r-- | src/gpu/GrProgramDesc.h | 3 | ||||
-rw-r--r-- | src/gpu/GrXferProcessor.cpp | 12 | ||||
-rw-r--r-- | src/gpu/effects/GrCoverageSetOpXP.cpp | 4 | ||||
-rw-r--r-- | src/gpu/effects/GrCustomXfermode.cpp | 7 | ||||
-rw-r--r-- | src/gpu/effects/GrDisableColorXP.cpp | 2 | ||||
-rw-r--r-- | src/gpu/effects/GrPorterDuffXferProcessor.cpp | 43 | ||||
-rw-r--r-- | src/gpu/gl/GrGLProgramDesc.cpp | 7 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLProgramBuilder.cpp | 8 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLProgramBuilder.h | 3 | ||||
-rw-r--r-- | src/gpu/glsl/GrGLSLXferProcessor.cpp | 6 |
12 files changed, 59 insertions, 39 deletions
diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp index e5cf044972..02edd4201e 100644 --- a/src/gpu/GrPipeline.cpp +++ b/src/gpu/GrPipeline.cpp @@ -184,6 +184,7 @@ void GrPipeline::adjustProgramFromOptimizations(const GrPipelineBuilder& pipelin const GrProcOptInfo& coveragePOI, int* firstColorProcessorIdx, int* firstCoverageProcessorIdx) { + fIgnoresCoverage = SkToBool(flags & GrXferProcessor::kIgnoreCoverage_OptFlag); fReadsFragPosition = fXferProcessor->willReadFragmentPosition(); if ((flags & GrXferProcessor::kIgnoreColor_OptFlag) || diff --git a/src/gpu/GrPipeline.h b/src/gpu/GrPipeline.h index 2d909be482..fbfe119ac0 100644 --- a/src/gpu/GrPipeline.h +++ b/src/gpu/GrPipeline.h @@ -150,6 +150,7 @@ public: /////////////////////////////////////////////////////////////////////////// bool readsFragPosition() const { return fReadsFragPosition; } + bool ignoresCoverage() const { return fIgnoresCoverage; } private: GrPipeline() { /** Initialized in factory function*/ } @@ -189,6 +190,7 @@ private: ProgramXferProcessor fXferProcessor; FragmentProcessorArray fFragmentProcessors; bool fReadsFragPosition; + bool fIgnoresCoverage; // This value is also the index in fFragmentProcessors where coverage processors begin. int fNumColorProcessors; diff --git a/src/gpu/GrProgramDesc.h b/src/gpu/GrProgramDesc.h index 15106305fa..13dd14935d 100644 --- a/src/gpu/GrProgramDesc.h +++ b/src/gpu/GrProgramDesc.h @@ -76,8 +76,9 @@ public: uint8_t fSnapVerticesToPixelCenters; int8_t fColorEffectCnt; int8_t fCoverageEffectCnt; + uint8_t fIgnoresCoverage; }; - GR_STATIC_ASSERT(sizeof(KeyHeader) == 4); + GR_STATIC_ASSERT(sizeof(KeyHeader) == 5); int numColorEffects() const { return this->header().fColorEffectCnt; diff --git a/src/gpu/GrXferProcessor.cpp b/src/gpu/GrXferProcessor.cpp index 3bccd6e3f7..b07b9720df 100644 --- a/src/gpu/GrXferProcessor.cpp +++ b/src/gpu/GrXferProcessor.cpp @@ -14,7 +14,6 @@ GrXferProcessor::GrXferProcessor() : fWillReadDstColor(false) , fDstReadUsesMixedSamples(false) - , fReadsCoverage(true) , fDstTextureOffset() { } @@ -23,7 +22,6 @@ GrXferProcessor::GrXferProcessor(const DstTexture* dstTexture, bool hasMixedSamples) : fWillReadDstColor(willReadDstColor) , fDstReadUsesMixedSamples(willReadDstColor && hasMixedSamples) - , fReadsCoverage(true) , fDstTextureOffset() { if (dstTexture && dstTexture->texture()) { SkASSERT(willReadDstColor); @@ -38,7 +36,7 @@ GrXferProcessor::OptFlags GrXferProcessor::getOptimizations( const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, - const GrCaps& caps) { + const GrCaps& caps) const { GrXferProcessor::OptFlags flags = this->onGetOptimizations(optimizations, doesStencilWrite, overrideColor, @@ -51,9 +49,6 @@ GrXferProcessor::OptFlags GrXferProcessor::getOptimizations( flags |= GrXferProcessor::kIgnoreCoverage_OptFlag; } } - if (flags & GrXferProcessor::kIgnoreCoverage_OptFlag) { - fReadsCoverage = false; - } return flags; } @@ -82,11 +77,8 @@ void GrXferProcessor::getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKey key |= 0x4; } } - if (this->readsCoverage()) { - key |= 0x8; - } if (this->dstReadUsesMixedSamples()) { - key |= 0x10; + key |= 0x8; } } b->add32(key); diff --git a/src/gpu/effects/GrCoverageSetOpXP.cpp b/src/gpu/effects/GrCoverageSetOpXP.cpp index c7226fc80a..43bb4887cf 100644 --- a/src/gpu/effects/GrCoverageSetOpXP.cpp +++ b/src/gpu/effects/GrCoverageSetOpXP.cpp @@ -35,7 +35,7 @@ private: GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* color, - const GrCaps& caps) override; + const GrCaps& caps) const override; void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override; @@ -109,7 +109,7 @@ GrXferProcessor::OptFlags CoverageSetOpXP::onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* color, - const GrCaps& caps) { + const GrCaps& caps) const { // We never look at the color input return GrXferProcessor::kIgnoreColor_OptFlag; } diff --git a/src/gpu/effects/GrCustomXfermode.cpp b/src/gpu/effects/GrCustomXfermode.cpp index 9de178d478..93999dda98 100644 --- a/src/gpu/effects/GrCustomXfermode.cpp +++ b/src/gpu/effects/GrCustomXfermode.cpp @@ -103,7 +103,7 @@ private: GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, - const GrCaps& caps) override; + const GrCaps& caps) const override; void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override; @@ -132,7 +132,6 @@ public: if (xp.hasHWBlendEquation()) { SkASSERT(caps.advBlendEqInteraction() > 0); // 0 will mean !xp.hasHWBlendEquation(). key |= caps.advBlendEqInteraction(); - key |= xp.readsCoverage() << 2; GR_STATIC_ASSERT(GrGLSLCaps::kLast_AdvBlendEqInteraction < 4); } if (!xp.hasHWBlendEquation() || caps.mustEnableSpecificAdvBlendEqs()) { @@ -151,7 +150,7 @@ private: // Apply coverage by multiplying it into the src color before blending. Mixed samples will // "just work" automatically. (See onGetOptimizations()) - if (xp.readsCoverage()) { + if (args.fInputCoverage) { fragBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, args.fInputCoverage, args.fInputColor); } else { @@ -195,7 +194,7 @@ bool CustomXP::onIsEqual(const GrXferProcessor& other) const { GrXferProcessor::OptFlags CustomXP::onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, - const GrCaps& caps) { + const GrCaps& caps) const { /* Most the optimizations we do here are based on tweaking alpha for coverage. diff --git a/src/gpu/effects/GrDisableColorXP.cpp b/src/gpu/effects/GrDisableColorXP.cpp index abeaa8c1cc..e669f8b024 100644 --- a/src/gpu/effects/GrDisableColorXP.cpp +++ b/src/gpu/effects/GrDisableColorXP.cpp @@ -32,7 +32,7 @@ private: GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* color, - const GrCaps& caps) override { + const GrCaps& caps) const override { return GrXferProcessor::kIgnoreColor_OptFlag | GrXferProcessor::kIgnoreCoverage_OptFlag; } diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp index 88275c2bbe..e288f0c8bd 100644 --- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp +++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp @@ -356,7 +356,7 @@ private: GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, - const GrCaps& caps) override; + const GrCaps& caps) const override; void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override; @@ -391,32 +391,35 @@ static void append_color_output(const PorterDuffXferProcessor& xp, break; case BlendFormula::kCoverage_OutputType: // We can have a coverage formula while not reading coverage if there are mixed samples. - fragBuilder->codeAppendf("%s = %s;", - output, xp.readsCoverage() ? inCoverage : "vec4(1.0)"); + if (inCoverage) { + fragBuilder->codeAppendf("%s = %s;", output, inCoverage); + } else { + fragBuilder->codeAppendf("%s = vec4(1.0);", output); + } break; case BlendFormula::kModulate_OutputType: - if (xp.readsCoverage()) { + if (inCoverage) { fragBuilder->codeAppendf("%s = %s * %s;", output, inColor, inCoverage); } else { fragBuilder->codeAppendf("%s = %s;", output, inColor); } break; case BlendFormula::kSAModulate_OutputType: - if (xp.readsCoverage()) { + if (inCoverage) { fragBuilder->codeAppendf("%s = %s.a * %s;", output, inColor, inCoverage); } else { fragBuilder->codeAppendf("%s = %s;", output, inColor); } break; case BlendFormula::kISAModulate_OutputType: - if (xp.readsCoverage()) { + if (inCoverage) { fragBuilder->codeAppendf("%s = (1.0 - %s.a) * %s;", output, inColor, inCoverage); } else { fragBuilder->codeAppendf("%s = vec4(1.0 - %s.a);", output, inColor); } break; case BlendFormula::kISCModulate_OutputType: - if (xp.readsCoverage()) { + if (inCoverage) { fragBuilder->codeAppendf("%s = (vec4(1.0) - %s) * %s;", output, inColor, inCoverage); } else { fragBuilder->codeAppendf("%s = vec4(1.0) - %s;", output, inColor); @@ -432,9 +435,8 @@ class GLPorterDuffXferProcessor : public GrGLSLXferProcessor { public: static void GenKey(const GrProcessor& processor, GrProcessorKeyBuilder* b) { const PorterDuffXferProcessor& xp = processor.cast<PorterDuffXferProcessor>(); - b->add32(SkToInt(xp.readsCoverage()) | - (xp.getBlendFormula().fPrimaryOutputType << 1) | - (xp.getBlendFormula().fSecondaryOutputType << 4)); + b->add32(xp.getBlendFormula().fPrimaryOutputType | + (xp.getBlendFormula().fSecondaryOutputType << 3)); GR_STATIC_ASSERT(BlendFormula::kLast_OutputType < 8); }; @@ -472,7 +474,7 @@ GrXferProcessor::OptFlags PorterDuffXferProcessor::onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, - const GrCaps& caps) { + const GrCaps& caps) const { GrXferProcessor::OptFlags optFlags = GrXferProcessor::kNone_OptFlags; if (!fBlendFormula.modifiesDst()) { if (!doesStencilWrite) { @@ -517,7 +519,7 @@ public: private: GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations&, bool, GrColor*, - const GrCaps&) override { + const GrCaps&) const override { return kNone_OptFlags; } @@ -588,7 +590,7 @@ private: GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, - const GrCaps& caps) override; + const GrCaps& caps) const override; void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override; @@ -627,6 +629,7 @@ public: private: void emitOutputsForBlendState(const EmitArgs& args) override { GrGLSLXPFragmentBuilder* fragBuilder = args.fXPFragBuilder; + SkASSERT(args.fInputCoverage); fragBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, args.fInputColor, args.fInputCoverage); } @@ -677,7 +680,7 @@ GrXferProcessor::OptFlags PDLCDXferProcessor::onGetOptimizations(const GrPipelineOptimizations& optimizations, bool doesStencilWrite, GrColor* overrideColor, - const GrCaps& caps) { + const GrCaps& caps) const { // We want to force our primary output to be alpha * Coverage, where alpha is the alpha // value of the blend the constant. We should already have valid blend coeff's if we are at // a point where we have RGB coverage. We don't need any color stages since the known color @@ -838,6 +841,18 @@ GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor( const GrPipelineOptimizations& optimizations, bool hasMixedSamples, const GrXferProcessor::DstTexture* dstTexture) { + if (!optimizations.fCoveragePOI.isFourChannelOutput() && + !(optimizations.fCoveragePOI.isSolidWhite() && + !hasMixedSamples && + optimizations.fColorPOI.isOpaque())) { + static BlendFormula gSrcOverBlendFormula = COEFF_FORMULA(kOne_GrBlendCoeff, + kISA_GrBlendCoeff); + static PorterDuffXferProcessor gSrcOverXP(gSrcOverBlendFormula); + SkASSERT(!dstTexture || !dstTexture->texture()); + gSrcOverXP.ref(); + return &gSrcOverXP; + } + BlendFormula blendFormula; if (optimizations.fCoveragePOI.isFourChannelOutput()) { if (kRGBA_GrColorComponentFlags == optimizations.fColorPOI.validFlags() && diff --git a/src/gpu/gl/GrGLProgramDesc.cpp b/src/gpu/gl/GrGLProgramDesc.cpp index e3ee9139c2..e3d292c062 100644 --- a/src/gpu/gl/GrGLProgramDesc.cpp +++ b/src/gpu/gl/GrGLProgramDesc.cpp @@ -147,6 +147,13 @@ bool GrGLProgramDescBuilder::Build(GrProgramDesc* desc, } else { header->fFragPosKey = 0; } + + if (pipeline.ignoresCoverage()) { + header->fIgnoresCoverage = 1; + } else { + header->fIgnoresCoverage = 0; + } + header->fSnapVerticesToPixelCenters = pipeline.snapVerticesToPixelCenters(); header->fColorEffectCnt = pipeline.numColorFragmentProcessors(); header->fCoverageEffectCnt = pipeline.numCoverageFragmentProcessors(); diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp index b5108a74d0..86264c02de 100644 --- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp +++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp @@ -140,7 +140,8 @@ bool GrGLProgramBuilder::emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr this->emitAndInstallFragProcs(0, this->pipeline().numColorFragmentProcessors(), inputColor); this->emitAndInstallFragProcs(this->pipeline().numColorFragmentProcessors(), numProcs, inputCoverage); - this->emitAndInstallXferProc(*this->pipeline().getXferProcessor(), *inputColor, *inputCoverage); + this->emitAndInstallXferProc(*this->pipeline().getXferProcessor(), *inputColor, *inputCoverage, + this->pipeline().ignoresCoverage()); return true; } @@ -266,7 +267,8 @@ void GrGLProgramBuilder::emitAndInstallProc(const GrPrimitiveProcessor& gp, void GrGLProgramBuilder::emitAndInstallXferProc(const GrXferProcessor& xp, const GrGLSLExpr4& colorIn, - const GrGLSLExpr4& coverageIn) { + const GrGLSLExpr4& coverageIn, + bool ignoresCoverage) { // Program builders have a bit of state we need to clear with each effect AutoStageAdvance adv(this); @@ -295,7 +297,7 @@ void GrGLProgramBuilder::emitAndInstallXferProc(const GrXferProcessor& xp, &fFS, this->glslCaps(), xp, colorIn.c_str(), - coverageIn.c_str(), + ignoresCoverage ? nullptr : coverageIn.c_str(), fFS.getPrimaryColorOutputName(), fFS.getSecondaryColorOutputName(), samplers); diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h index edc467c407..329e5d7d08 100644 --- a/src/gpu/gl/builders/GrGLProgramBuilder.h +++ b/src/gpu/gl/builders/GrGLProgramBuilder.h @@ -108,7 +108,8 @@ private: const char* outCoverage); void emitAndInstallXferProc(const GrXferProcessor&, const GrGLSLExpr4& colorIn, - const GrGLSLExpr4& coverageIn); + const GrGLSLExpr4& coverageIn, + bool ignoresCoverage); void verify(const GrPrimitiveProcessor&); void verify(const GrXferProcessor&); diff --git a/src/gpu/glsl/GrGLSLXferProcessor.cpp b/src/gpu/glsl/GrGLSLXferProcessor.cpp index 4d2ec1074b..7382660f42 100644 --- a/src/gpu/glsl/GrGLSLXferProcessor.cpp +++ b/src/gpu/glsl/GrGLSLXferProcessor.cpp @@ -24,7 +24,7 @@ void GrGLSLXferProcessor::emitCode(const EmitArgs& args) { if (args.fXP.getDstTexture()) { bool topDown = kTopLeft_GrSurfaceOrigin == args.fXP.getDstTexture()->origin(); - if (args.fXP.readsCoverage()) { + if (args.fInputCoverage) { // We don't think any shaders actually output negative coverage, but just as a safety // check for floating point precision errors we compare with <= here fragBuilder->codeAppendf("if (all(lessThanEqual(%s, vec4(0)))) {" @@ -69,13 +69,13 @@ void GrGLSLXferProcessor::emitCode(const EmitArgs& args) { // Apply coverage. if (args.fXP.dstReadUsesMixedSamples()) { - if (args.fXP.readsCoverage()) { + if (args.fInputCoverage) { fragBuilder->codeAppendf("%s *= %s;", args.fOutputPrimary, args.fInputCoverage); fragBuilder->codeAppendf("%s = %s;", args.fOutputSecondary, args.fInputCoverage); } else { fragBuilder->codeAppendf("%s = vec4(1.0);", args.fOutputSecondary); } - } else if (args.fXP.readsCoverage()) { + } else if (args.fInputCoverage) { fragBuilder->codeAppendf("%s = %s * %s + (vec4(1.0) - %s) * %s;", args.fOutputPrimary, args.fInputCoverage, args.fOutputPrimary, args.fInputCoverage, dstColor); |