aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/GrPipeline.cpp1
-rw-r--r--src/gpu/GrPipeline.h2
-rw-r--r--src/gpu/GrProgramDesc.h3
-rw-r--r--src/gpu/GrXferProcessor.cpp12
-rw-r--r--src/gpu/effects/GrCoverageSetOpXP.cpp4
-rw-r--r--src/gpu/effects/GrCustomXfermode.cpp7
-rw-r--r--src/gpu/effects/GrDisableColorXP.cpp2
-rw-r--r--src/gpu/effects/GrPorterDuffXferProcessor.cpp43
-rw-r--r--src/gpu/gl/GrGLProgramDesc.cpp7
-rw-r--r--src/gpu/gl/builders/GrGLProgramBuilder.cpp8
-rw-r--r--src/gpu/gl/builders/GrGLProgramBuilder.h3
-rw-r--r--src/gpu/glsl/GrGLSLXferProcessor.cpp6
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);