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

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

Issue 1170553002: Apply coverage in XP base class when using dst reads (Closed) Base URL: https://skia.googlesource.com/skia.git@upload2_reenablebea
Patch Set: names Created 5 years, 6 months 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/GrCoverageSetOpXP.cpp ('k') | src/gpu/effects/GrDisableColorXP.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/effects/GrCustomXfermode.cpp
diff --git a/src/gpu/effects/GrCustomXfermode.cpp b/src/gpu/effects/GrCustomXfermode.cpp
index 5110cdf72346e07bc67d1e1be523341b9e8f3772..1f652aca95706e4dfeab119c2d3d18458539951e 100644
--- a/src/gpu/effects/GrCustomXfermode.cpp
+++ b/src/gpu/effects/GrCustomXfermode.cpp
@@ -540,8 +540,6 @@ public:
GrGLXferProcessor* createGLInstance() const override;
- bool hasSecondaryOutput() const override { return false; }
-
SkXfermode::Mode mode() const { return fMode; }
bool hasHWBlendEquation() const { return -1 != static_cast<int>(fHWBlendEquation); }
@@ -592,48 +590,46 @@ public:
static void GenKey(const GrXferProcessor& p, const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) {
const CustomXP& xp = p.cast<CustomXP>();
- uint32_t key = xp.numTextures();
- SkASSERT(key <= 1);
- key |= xp.readsCoverage() << 1;
+ uint32_t key = 0;
if (xp.hasHWBlendEquation()) {
SkASSERT(caps.advBlendEqInteraction() > 0); // 0 will mean !xp.hasHWBlendEquation().
- key |= caps.advBlendEqInteraction() << 2;
+ key |= caps.advBlendEqInteraction();
+ key |= xp.readsCoverage() << 2;
+ GR_STATIC_ASSERT(GrGLSLCaps::kLast_AdvBlendEqInteraction < 4);
}
if (!xp.hasHWBlendEquation() || caps.mustEnableSpecificAdvBlendEqs()) {
- GR_STATIC_ASSERT(GrGLSLCaps::kLast_AdvBlendEqInteraction < 4);
- key |= xp.mode() << 4;
+ key |= xp.mode() << 3;
}
b->add32(key);
}
private:
- void onEmitCode(const EmitArgs& args) override {
+ void emitOutputsForBlendState(const EmitArgs& args) override {
const CustomXP& xp = args.fXP.cast<CustomXP>();
+ SkASSERT(xp.hasHWBlendEquation());
+
GrGLXPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
+ fsBuilder->enableAdvancedBlendEquationIfNeeded(xp.hwBlendEquation());
- if (xp.hasHWBlendEquation()) {
- // The blend mode will be implemented in hardware; only output the src color.
- fsBuilder->enableAdvancedBlendEquationIfNeeded(xp.hwBlendEquation());
- if (xp.readsCoverage()) {
- // Do coverage modulation by multiplying it into the src color before blending.
- // (See getOptimizations())
- fsBuilder->codeAppendf("%s = %s * %s;",
- args.fOutputPrimary, args.fInputCoverage, args.fInputColor);
- } else {
- fsBuilder->codeAppendf("%s = %s;", args.fOutputPrimary, args.fInputColor);
- }
+ // Apply coverage by multiplying it into the src color before blending.
+ // (See onGetOptimizations())
+ if (xp.readsCoverage()) {
+ fsBuilder->codeAppendf("%s = %s * %s;",
+ args.fOutputPrimary, args.fInputCoverage, args.fInputColor);
} else {
- const char* dstColor = fsBuilder->dstColor();
- emit_custom_xfermode_code(xp.mode(), fsBuilder, args.fOutputPrimary, args.fInputColor,
- dstColor);
- if (xp.readsCoverage()) {
- fsBuilder->codeAppendf("%s = %s * %s + (vec4(1.0) - %s) * %s;",
- args.fOutputPrimary, args.fOutputPrimary,
- args.fInputCoverage, args.fInputCoverage, dstColor);
- }
+ fsBuilder->codeAppendf("%s = %s;", args.fOutputPrimary, args.fInputColor);
}
}
+ void emitBlendCodeForDstRead(GrGLXPBuilder* pb, const char* srcColor, const char* dstColor,
+ const char* outColor, const GrXferProcessor& proc) override {
+ const CustomXP& xp = proc.cast<CustomXP>();
+ SkASSERT(!xp.hasHWBlendEquation());
+
+ GrGLXPFragmentBuilder* fsBuilder = pb->getFragmentShaderBuilder();
+ emit_custom_xfermode_code(xp.mode(), fsBuilder, outColor, srcColor, dstColor);
+ }
+
void onSetData(const GrGLProgramDataManager&, const GrXferProcessor&) override {}
typedef GrGLFragmentProcessor INHERITED;
@@ -760,7 +756,7 @@ GrXferProcessor::OptFlags CustomXP::onGetOptimizations(const GrProcOptInfo& colo
if (colorPOI.allStagesMultiplyInput()) {
flags |= kCanTweakAlphaForCoverage_OptFlag;
}
- if (coveragePOI.isSolidWhite()) {
+ if (this->hasHWBlendEquation() && coveragePOI.isSolidWhite()) {
flags |= kIgnoreCoverage_OptFlag;
}
return flags;
« no previous file with comments | « src/gpu/effects/GrCoverageSetOpXP.cpp ('k') | src/gpu/effects/GrDisableColorXP.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698