aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2017-03-03 14:30:15 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-03-06 13:39:09 +0000
commit1c10fddd1f563412f501e49db1d21844c4d5b058 (patch)
treef064c851fffd89726f648d6fe68e5af8a96983be
parentfc75b5afdef9bf896e20de9e88ca99f336616559 (diff)
Remove XP override color.
The only use case for this was using the blend constant for LCD text. Now instead of overriding the op's color with an alpha we upload the alpha as a uniform. This also removes two unused parameters from GrXferProcessor::getOptimizations. Change-Id: I8268da9904a5d26649c6ae81a5705b0930893904 Reviewed-on: https://skia-review.googlesource.com/9221 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Greg Daniel <egdaniel@google.com>
-rw-r--r--src/gpu/GrPipeline.cpp7
-rw-r--r--src/gpu/GrUserStencilSettings.h3
-rw-r--r--src/gpu/GrXferProcessor.cpp9
-rw-r--r--src/gpu/GrXferProcessor.h25
-rw-r--r--src/gpu/effects/GrCoverageSetOpXP.cpp13
-rw-r--r--src/gpu/effects/GrCustomXfermode.cpp11
-rw-r--r--src/gpu/effects/GrDisableColorXP.cpp5
-rw-r--r--src/gpu/effects/GrPorterDuffXferProcessor.cpp62
-rw-r--r--tests/GrPorterDuffTest.cpp9
9 files changed, 50 insertions, 94 deletions
diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp
index 60f80f8aa4..e1cbd65588 100644
--- a/src/gpu/GrPipeline.cpp
+++ b/src/gpu/GrPipeline.cpp
@@ -68,9 +68,7 @@ GrPipelineOptimizations GrPipeline::init(const InitArgs& args) {
const GrXferProcessor* xpForOpts = xferProcessor ? xferProcessor.get() :
&GrPorterDuffXPFactory::SimpleSrcOverXP();
- optFlags = xpForOpts->getOptimizations(
- *args.fAnalysis, args.fUserStencil->doesWrite(args.fAppliedClip->hasStencilClip()),
- &overrideColor, *args.fCaps);
+ optFlags = xpForOpts->getOptimizations(*args.fAnalysis);
// No need to have an override color if it isn't even going to be used.
if (SkToBool(GrXferProcessor::kIgnoreColor_OptFlag & optFlags)) {
@@ -79,8 +77,7 @@ GrPipelineOptimizations GrPipeline::init(const InitArgs& args) {
fXferProcessor.reset(xferProcessor.get());
- if ((optFlags & GrXferProcessor::kIgnoreColor_OptFlag) ||
- (optFlags & GrXferProcessor::kOverrideColor_OptFlag)) {
+ if ((optFlags & GrXferProcessor::kIgnoreColor_OptFlag)) {
colorFPsToEliminate = args.fProcessors->numColorFragmentProcessors();
}
diff --git a/src/gpu/GrUserStencilSettings.h b/src/gpu/GrUserStencilSettings.h
index 3cbadfd3b3..2549c44237 100644
--- a/src/gpu/GrUserStencilSettings.h
+++ b/src/gpu/GrUserStencilSettings.h
@@ -188,9 +188,6 @@ struct GrUserStencilSettings {
bool isDisabled(bool hasStencilClip) const {
return this->flags(hasStencilClip) & kDisabled_StencilFlag;
}
- bool doesWrite(bool hasStencilClip) const {
- return !(this->flags(hasStencilClip) & kNoModifyStencil_StencilFlag);
- }
bool isTwoSided(bool hasStencilClip) const {
return !(this->flags(hasStencilClip) & kSingleSided_StencilFlag);
}
diff --git a/src/gpu/GrXferProcessor.cpp b/src/gpu/GrXferProcessor.cpp
index 56653b5eb1..a926812818 100644
--- a/src/gpu/GrXferProcessor.cpp
+++ b/src/gpu/GrXferProcessor.cpp
@@ -31,13 +31,8 @@ GrXferProcessor::GrXferProcessor(const DstTexture* dstTexture,
}
GrXferProcessor::OptFlags GrXferProcessor::getOptimizations(
- const FragmentProcessorAnalysis& analysis,
- bool doesStencilWrite,
- GrColor* overrideColor,
- const GrCaps& caps) const {
- GrXferProcessor::OptFlags flags =
- this->onGetOptimizations(analysis, doesStencilWrite, overrideColor, caps);
- return flags;
+ const FragmentProcessorAnalysis& analysis) const {
+ return this->onGetOptimizations(analysis);
}
bool GrXferProcessor::hasSecondaryOutput() const {
diff --git a/src/gpu/GrXferProcessor.h b/src/gpu/GrXferProcessor.h
index e837ed00dd..c00bcbeff2 100644
--- a/src/gpu/GrXferProcessor.h
+++ b/src/gpu/GrXferProcessor.h
@@ -111,13 +111,9 @@ public:
*/
kIgnoreColor_OptFlag = 0x1,
/**
- * Clear color stages and override input color to that returned by getOptimizations
+ * Can tweak alpha for coverage.
*/
- kOverrideColor_OptFlag = 0x2,
- /**
- * Can tweak alpha for coverage. Currently this flag should only be used by a GrDrawOp.
- */
- kCanTweakAlphaForCoverage_OptFlag = 0x4,
+ kCanTweakAlphaForCoverage_OptFlag = 0x2,
};
static const OptFlags kNone_OptFlags = (OptFlags)0;
@@ -127,16 +123,10 @@ public:
/**
* Determines which optimizations (as described by the ptFlags above) can be performed by
* the draw with this xfer processor. If this function is called, the xfer processor may change
- * its state to reflected the given blend optimizations. If the XP needs to see a specific input
- * color to blend correctly, it will set the OverrideColor flag and the output parameter
- * overrideColor will be the required value that should be passed into the XP.
- * A caller who calls this function on a XP is required to honor the returned OptFlags
- * and color values for its draw.
+ * its state to reflected the given blend optimizations. Callers are required to honor the
+ * returned OptFlags.
*/
- OptFlags getOptimizations(const FragmentProcessorAnalysis&,
- bool doesStencilWrite,
- GrColor* overrideColor,
- const GrCaps& caps) const;
+ OptFlags getOptimizations(const FragmentProcessorAnalysis&) const;
/**
* Returns whether this XP will require an Xfer barrier on the given rt. If true, outBarrierType
@@ -229,10 +219,7 @@ protected:
private:
void notifyRefCntIsZero() const final {}
- virtual OptFlags onGetOptimizations(const FragmentProcessorAnalysis&,
- bool doesStencilWrite,
- GrColor* overrideColor,
- const GrCaps& caps) const = 0;
+ virtual OptFlags onGetOptimizations(const FragmentProcessorAnalysis&) const = 0;
/**
* Sets a unique key on the GrProcessorKeyBuilder that is directly associated with this xfer
diff --git a/src/gpu/effects/GrCoverageSetOpXP.cpp b/src/gpu/effects/GrCoverageSetOpXP.cpp
index d8eb0d950f..d86467e668 100644
--- a/src/gpu/effects/GrCoverageSetOpXP.cpp
+++ b/src/gpu/effects/GrCoverageSetOpXP.cpp
@@ -34,10 +34,7 @@ public:
private:
CoverageSetOpXP(SkRegion::Op regionOp, bool fInvertCoverage);
- GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis& analysis,
- bool doesStencilWrite,
- GrColor* color,
- const GrCaps& caps) const override;
+ GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&) const override;
void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
@@ -108,10 +105,7 @@ GrGLSLXferProcessor* CoverageSetOpXP::createGLSLInstance() const {
}
GrXferProcessor::OptFlags CoverageSetOpXP::onGetOptimizations(
- const FragmentProcessorAnalysis& analysis,
- bool doesStencilWrite,
- GrColor* color,
- const GrCaps& caps) const {
+ const FragmentProcessorAnalysis&) const {
// We never look at the color input
return GrXferProcessor::kIgnoreColor_OptFlag;
}
@@ -168,8 +162,7 @@ public:
bool invertCoverage() const { return fInvertCoverage; }
private:
- GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&, bool, GrColor*,
- const GrCaps&) const override {
+ GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&) const override {
// 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 a33d2925ca..ccbab73f86 100644
--- a/src/gpu/effects/GrCustomXfermode.cpp
+++ b/src/gpu/effects/GrCustomXfermode.cpp
@@ -103,10 +103,7 @@ public:
}
private:
- GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&,
- bool doesStencilWrite,
- GrColor* overrideColor,
- const GrCaps& caps) const override;
+ GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&) const override;
void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
@@ -197,10 +194,8 @@ bool CustomXP::onIsEqual(const GrXferProcessor& other) const {
return fMode == s.fMode && fHWBlendEquation == s.fHWBlendEquation;
}
-GrXferProcessor::OptFlags CustomXP::onGetOptimizations(const FragmentProcessorAnalysis& analysis,
- bool doesStencilWrite,
- GrColor* overrideColor,
- const GrCaps& caps) const {
+GrXferProcessor::OptFlags CustomXP::onGetOptimizations(
+ const FragmentProcessorAnalysis& analysis) 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 9c0228fae9..6bdf1885e9 100644
--- a/src/gpu/effects/GrDisableColorXP.cpp
+++ b/src/gpu/effects/GrDisableColorXP.cpp
@@ -29,10 +29,7 @@ public:
private:
DisableColorXP();
- GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&,
- bool doesStencilWrite,
- GrColor* color,
- const GrCaps& caps) const override {
+ GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&) const override {
return GrXferProcessor::kIgnoreColor_OptFlag;
}
diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
index 7dd7be6b0b..7378874da9 100644
--- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp
+++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
@@ -350,10 +350,7 @@ public:
BlendFormula getBlendFormula() const { return fBlendFormula; }
private:
- GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&,
- bool doesStencilWrite,
- GrColor* overrideColor,
- const GrCaps&) const override;
+ GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&) const override;
void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
@@ -450,10 +447,7 @@ GrGLSLXferProcessor* PorterDuffXferProcessor::createGLSLInstance() const {
}
GrXferProcessor::OptFlags PorterDuffXferProcessor::onGetOptimizations(
- const FragmentProcessorAnalysis& analysis,
- bool doesStencilWrite,
- GrColor* overrideColor,
- const GrCaps& caps) const {
+ const FragmentProcessorAnalysis& analysis) const {
GrXferProcessor::OptFlags optFlags = GrXferProcessor::kNone_OptFlags;
if (!fBlendFormula.modifiesDst()) {
optFlags |= (GrXferProcessor::kIgnoreColor_OptFlag |
@@ -489,8 +483,7 @@ public:
SkBlendMode getXfermode() const { return fXfermode; }
private:
- GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&, bool, GrColor*,
- const GrCaps&) const override {
+ GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&) const override {
return kNone_OptFlags;
}
@@ -561,13 +554,12 @@ public:
GrGLSLXferProcessor* createGLSLInstance() const override;
+ uint8_t alpha() const { return fAlpha; }
+
private:
PDLCDXferProcessor(GrColor blendConstant, uint8_t alpha);
- GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&,
- bool doesStencilWrite,
- GrColor* overrideColor,
- const GrCaps&) const override;
+ GrXferProcessor::OptFlags onGetOptimizations(const FragmentProcessorAnalysis&) const override;
void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
@@ -579,15 +571,14 @@ private:
bool onIsEqual(const GrXferProcessor& xpBase) const override {
const PDLCDXferProcessor& xp = xpBase.cast<PDLCDXferProcessor>();
- if (fBlendConstant != xp.fBlendConstant ||
- fAlpha != xp.fAlpha) {
+ if (fBlendConstant != xp.fBlendConstant || fAlpha != xp.fAlpha) {
return false;
}
return true;
}
- GrColor fBlendConstant;
- uint8_t fAlpha;
+ GrColor fBlendConstant;
+ uint8_t fAlpha;
typedef GrXferProcessor INHERITED;
};
@@ -596,7 +587,7 @@ private:
class GLPDLCDXferProcessor : public GrGLSLXferProcessor {
public:
- GLPDLCDXferProcessor(const GrProcessor&) {}
+ GLPDLCDXferProcessor(const GrProcessor&) : fLastAlpha(SK_MaxU32) {}
virtual ~GLPDLCDXferProcessor() {}
@@ -605,14 +596,28 @@ public:
private:
void emitOutputsForBlendState(const EmitArgs& args) override {
+ const char* alpha;
+ fAlphaUniform = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kFloat_GrSLType,
+ kDefault_GrSLPrecision, "alpha", &alpha);
GrGLSLXPFragmentBuilder* fragBuilder = args.fXPFragBuilder;
+ // We want to force our primary output to be alpha * Coverage, where alpha is the alpha
+ // value of the src color. We know that there are no color stages (or we wouldn't have
+ // created this xp) and the r,g, and b channels of the op's input color are baked into the
+ // blend constant.
SkASSERT(args.fInputCoverage);
- fragBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, args.fInputColor,
- args.fInputCoverage);
+ fragBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, alpha, args.fInputCoverage);
}
- void onSetData(const GrGLSLProgramDataManager&, const GrXferProcessor&) override {}
+ void onSetData(const GrGLSLProgramDataManager& pdm, const GrXferProcessor& xp) override {
+ uint32_t alpha = SkToU32(xp.cast<PDLCDXferProcessor>().alpha());
+ if (fLastAlpha != alpha) {
+ pdm.set1f(fAlphaUniform, alpha / 255.f);
+ fLastAlpha = alpha;
+ }
+ }
+ GrGLSLUniformHandler::UniformHandle fAlphaUniform;
+ uint32_t fLastAlpha;
typedef GrGLSLXferProcessor INHERITED;
};
@@ -651,16 +656,9 @@ GrGLSLXferProcessor* PDLCDXferProcessor::createGLSLInstance() const {
return new GLPDLCDXferProcessor(*this);
}
-GrXferProcessor::OptFlags PDLCDXferProcessor::onGetOptimizations(const FragmentProcessorAnalysis&,
- bool doesStencilWrite,
- GrColor* overrideColor,
- 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
- // output is already baked into the blendConstant.
- *overrideColor = GrColorPackRGBA(fAlpha, fAlpha, fAlpha, fAlpha);
- return GrXferProcessor::kOverrideColor_OptFlag;
+GrXferProcessor::OptFlags PDLCDXferProcessor::onGetOptimizations(
+ const FragmentProcessorAnalysis&) const {
+ return GrXferProcessor::kIgnoreColor_OptFlag;
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/tests/GrPorterDuffTest.cpp b/tests/GrPorterDuffTest.cpp
index c1d73ef251..89067cfe69 100644
--- a/tests/GrPorterDuffTest.cpp
+++ b/tests/GrPorterDuffTest.cpp
@@ -71,8 +71,7 @@ public:
fReadsDst = GrXPFactory::WillReadDst(xpf, analysis);
sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
TEST_ASSERT(!GrXPFactory::WillNeedDstTexture(xpf, caps, analysis));
- GrColor ignoredOverrideColor;
- fOptFlags = xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
+ fOptFlags = xp->getOptimizations(analysis);
GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
xp->getBlendInfo(&fBlendInfo);
TEST_ASSERT(!xp->willReadDstColor());
@@ -986,8 +985,7 @@ static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const
TEST_ASSERT(GrXPFactory::WillReadDst(xpf, analysis));
- GrColor overrideColor;
- xp->getOptimizations(analysis, false, &overrideColor, caps);
+ xp->getOptimizations(analysis);
GrXferProcessor::BlendInfo blendInfo;
xp->getBlendInfo(&blendInfo);
@@ -1047,8 +1045,7 @@ DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
return;
}
TEST_ASSERT(!xp->hasSecondaryOutput());
- GrColor ignoredOverrideColor;
- xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
+ xp->getOptimizations(analysis);
TEST_ASSERT(!xp->hasSecondaryOutput());
}
}