Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(291)

Unified Diff: src/gpu/effects/GrPorterDuffXferProcessor.cpp

Issue 1471293003: Create a static instances of SrcOver XferProcessor (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix Build Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/effects/GrDisableColorXP.cpp ('k') | src/gpu/gl/GrGLProgramDesc.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/effects/GrPorterDuffXferProcessor.cpp
diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
index 88275c2bbed85ce370821e9b3a1c8257f3c2c872..e288f0c8bd6be7a5861e9f76f5bdc1ca66a00a7e 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() &&
« no previous file with comments | « src/gpu/effects/GrDisableColorXP.cpp ('k') | src/gpu/gl/GrGLProgramDesc.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698