| Index: src/gpu/effects/GrXfermodeFragmentProcessor.cpp | 
| diff --git a/src/gpu/effects/GrXfermodeFragmentProcessor.cpp b/src/gpu/effects/GrXfermodeFragmentProcessor.cpp | 
| index 3cb56d07f7ea2ce74d3a5d08f0118781293a3958..c039db343315b6610ee1d4a62048becd2ffa2ba3 100644 | 
| --- a/src/gpu/effects/GrXfermodeFragmentProcessor.cpp | 
| +++ b/src/gpu/effects/GrXfermodeFragmentProcessor.cpp | 
| @@ -78,12 +78,12 @@ const GrFragmentProcessor* GrComposeTwoFragmentProcessor::TestCreate(GrProcessor | 
| // possibility of an arbitrarily large tree of procs. | 
| SkAutoTUnref<const GrFragmentProcessor> fpA; | 
| do { | 
| -        fpA.reset(GrProcessorTestFactory<GrFragmentProcessor>::CreateStage(d)); | 
| +        fpA.reset(GrProcessorTestFactory<GrFragmentProcessor>::Create(d)); | 
| SkASSERT(fpA); | 
| } while (fpA->numChildProcessors() != 0); | 
| SkAutoTUnref<const GrFragmentProcessor> fpB; | 
| do { | 
| -        fpB.reset(GrProcessorTestFactory<GrFragmentProcessor>::CreateStage(d)); | 
| +        fpB.reset(GrProcessorTestFactory<GrFragmentProcessor>::Create(d)); | 
| SkASSERT(fpB); | 
| } while (fpB->numChildProcessors() != 0); | 
|  | 
| @@ -112,20 +112,26 @@ void GrGLComposeTwoFragmentProcessor::emitCode(EmitArgs& args) { | 
| // This is because we don't want the paint's alpha to affect either child proc's output | 
| // before the blend; we want to apply the paint's alpha AFTER the blend. This mirrors the | 
| // software implementation of SkComposeShader. | 
| -    SkString inputAlpha("inputAlpha"); | 
| -    fsBuilder->codeAppendf("float %s = %s.a;", inputAlpha.c_str(), args.fInputColor); | 
| -    fsBuilder->codeAppendf("%s /= %s.a;", args.fInputColor, args.fInputColor); | 
| +    const char* opaqueInput = nullptr; | 
| +    const char* inputAlpha = nullptr; | 
| +    if (args.fInputColor) { | 
| +        inputAlpha = "inputAlpha"; | 
| +        opaqueInput = "opaqueInput"; | 
| +        fsBuilder->codeAppendf("float inputAlpha = %s.a;", args.fInputColor); | 
| +        fsBuilder->codeAppendf("vec4 opaqueInput = vec4(%s.rgb / inputAlpha, 1);", | 
| +                               args.fInputColor); | 
| +    } | 
|  | 
| // declare outputColor and emit the code for each of the two children | 
| SkString outputColorSrc(args.fOutputColor); | 
| outputColorSrc.append("_src"); | 
| fsBuilder->codeAppendf("vec4 %s;\n", outputColorSrc.c_str()); | 
| -    this->emitChild(0, args.fInputColor, outputColorSrc.c_str(), args); | 
| +    this->emitChild(0, opaqueInput, outputColorSrc.c_str(), args); | 
|  | 
| SkString outputColorDst(args.fOutputColor); | 
| outputColorDst.append("_dst"); | 
| fsBuilder->codeAppendf("vec4 %s;\n", outputColorDst.c_str()); | 
| -    this->emitChild(1, args.fInputColor, outputColorDst.c_str(), args); | 
| +    this->emitChild(1, opaqueInput, outputColorDst.c_str(), args); | 
|  | 
| // emit blend code | 
| SkXfermode::Mode mode = cs.getMode(); | 
| @@ -136,10 +142,11 @@ void GrGLComposeTwoFragmentProcessor::emitCode(EmitArgs& args) { | 
| fsBuilder->codeAppend("}"); | 
|  | 
| // re-multiply the output color by the input color's alpha | 
| -    fsBuilder->codeAppendf("%s *= %s;", args.fOutputColor, inputAlpha.c_str()); | 
| +    if (inputAlpha) { | 
| +        fsBuilder->codeAppendf("%s *= %s;", args.fOutputColor, inputAlpha); | 
| +    } | 
| } | 
|  | 
| - | 
| const GrFragmentProcessor* GrXfermodeFragmentProcessor::CreateFromTwoProcessors( | 
| const GrFragmentProcessor* src, const GrFragmentProcessor* dst, SkXfermode::Mode mode) { | 
| if (SkXfermode::kLastCoeffMode < mode) { | 
|  |