| Index: src/gpu/effects/GrPorterDuffXferProcessor.cpp
|
| diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
|
| index 83c72f934255f9bd6ac674b77313bf52cb802e41..ecaa87f941cb80f840d74f7f45ca589fcc4cfc21 100644
|
| --- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp
|
| +++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
|
| @@ -306,7 +306,6 @@ public:
|
| }
|
|
|
| const char* name() const override { return "Porter Duff"; }
|
| - bool hasSecondaryOutput() const override { return fBlendFormula.hasSecondaryOutput(); }
|
|
|
| GrGLXferProcessor* createGLInstance() const override;
|
|
|
| @@ -325,6 +324,8 @@ private:
|
|
|
| void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
|
|
|
| + bool onHasSecondaryOutput() const override { return fBlendFormula.hasSecondaryOutput(); }
|
| +
|
| void onGetBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const override {
|
| blendInfo->fEquation = fBlendFormula.fBlendEquation;
|
| blendInfo->fSrcBlend = fBlendFormula.fSrcCoeff;
|
| @@ -393,7 +394,7 @@ public:
|
| };
|
|
|
| private:
|
| - void onEmitCode(const EmitArgs& args) override {
|
| + void emitOutputsForBlendState(const EmitArgs& args) override {
|
| const PorterDuffXferProcessor& xp = args.fXP.cast<PorterDuffXferProcessor>();
|
| GrGLXPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
|
|
|
| @@ -459,7 +460,6 @@ public:
|
| }
|
|
|
| const char* name() const override { return "Porter Duff Shader"; }
|
| - bool hasSecondaryOutput() const override { return false; }
|
|
|
| GrGLXferProcessor* createGLInstance() const override;
|
|
|
| @@ -543,29 +543,22 @@ public:
|
| }
|
|
|
| private:
|
| - void onEmitCode(const EmitArgs& args) override {
|
| - const ShaderPDXferProcessor& xp = args.fXP.cast<ShaderPDXferProcessor>();
|
| - GrGLXPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
|
| + void emitBlendCodeForDstRead(GrGLXPBuilder* pb, const char* srcColor, const char* dstColor,
|
| + const char* outColor, const GrXferProcessor& proc) override {
|
| + const ShaderPDXferProcessor& xp = proc.cast<ShaderPDXferProcessor>();
|
| + GrGLXPFragmentBuilder* fsBuilder = pb->getFragmentShaderBuilder();
|
|
|
| SkXfermode::Coeff srcCoeff, dstCoeff;
|
| SkXfermode::ModeAsCoeff(xp.getXfermode(), &srcCoeff, &dstCoeff);
|
|
|
| - const char* dstColor = fsBuilder->dstColor();
|
| -
|
| - fsBuilder->codeAppend("vec4 colorBlend =");
|
| + fsBuilder->codeAppendf("%s =", outColor);
|
| // append src blend
|
| - bool didAppend = append_porterduff_term(fsBuilder, srcCoeff,
|
| - args.fInputColor, args.fInputColor,
|
| - dstColor, false);
|
| + bool didAppend = append_porterduff_term(fsBuilder, srcCoeff, srcColor, srcColor, dstColor,
|
| + false);
|
| // append dst blend
|
| - SkAssertResult(append_porterduff_term(fsBuilder, dstCoeff,
|
| - dstColor, args.fInputColor,
|
| - dstColor, didAppend));
|
| + SkAssertResult(append_porterduff_term(fsBuilder, dstCoeff, dstColor, srcColor, dstColor,
|
| + didAppend));
|
| fsBuilder->codeAppend(";");
|
| -
|
| - fsBuilder->codeAppendf("%s = %s * colorBlend + (vec4(1.0) - %s) * %s;",
|
| - args.fOutputPrimary, args.fInputCoverage, args.fInputCoverage,
|
| - dstColor);
|
| }
|
|
|
| void onSetData(const GrGLProgramDataManager&, const GrXferProcessor&) override {}
|
| @@ -596,8 +589,6 @@ public:
|
|
|
| GrGLXferProcessor* createGLInstance() const override;
|
|
|
| - bool hasSecondaryOutput() const override { return false; }
|
| -
|
| private:
|
| PDLCDXferProcessor(GrColor blendConstant, uint8_t alpha);
|
|
|
| @@ -642,7 +633,7 @@ public:
|
| GrProcessorKeyBuilder* b) {}
|
|
|
| private:
|
| - void onEmitCode(const EmitArgs& args) override {
|
| + void emitOutputsForBlendState(const EmitArgs& args) override {
|
| GrGLXPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
|
|
|
| fsBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, args.fInputColor,
|
|
|