diff options
author | bsalomon <bsalomon@google.com> | 2015-09-14 11:55:51 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-14 11:55:52 -0700 |
commit | 72c58e7052af2a0855412ce4b249f977069db751 (patch) | |
tree | ede198f2a29caa2b188235d738bd3cf731f769f6 /src/gpu/effects | |
parent | 3833daaa663db7e655a8077cdab42cca19d3a276 (diff) |
Test that GrFragmentProcessors work without input colors.
Review URL: https://codereview.chromium.org/1341853002
Diffstat (limited to 'src/gpu/effects')
-rw-r--r-- | src/gpu/effects/GrExtractAlphaFragmentProcessor.cpp | 10 | ||||
-rw-r--r-- | src/gpu/effects/GrXfermodeFragmentProcessor.cpp | 25 |
2 files changed, 23 insertions, 12 deletions
diff --git a/src/gpu/effects/GrExtractAlphaFragmentProcessor.cpp b/src/gpu/effects/GrExtractAlphaFragmentProcessor.cpp index c5ee9b8571..8f6af65ca7 100644 --- a/src/gpu/effects/GrExtractAlphaFragmentProcessor.cpp +++ b/src/gpu/effects/GrExtractAlphaFragmentProcessor.cpp @@ -14,9 +14,13 @@ public: GLExtractAlphaFragmentProcessor() {} void emitCode(EmitArgs& args) override { - GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); - fsBuilder->codeAppendf("vec4 alpha4 = %s.aaaa;", args.fInputColor); - this->emitChild(0, "alpha4", args.fOutputColor, args); + if (args.fInputColor) { + GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); + fsBuilder->codeAppendf("vec4 alpha4 = %s.aaaa;", args.fInputColor); + this->emitChild(0, "alpha4", args.fOutputColor, args); + } else { + this->emitChild(0, nullptr, args.fOutputColor, args); + } } private: diff --git a/src/gpu/effects/GrXfermodeFragmentProcessor.cpp b/src/gpu/effects/GrXfermodeFragmentProcessor.cpp index 3cb56d07f7..c039db3433 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) { |