diff options
author | bsalomon <bsalomon@google.com> | 2015-09-14 12:26:33 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-14 12:26:34 -0700 |
commit | b5b603241aaa99e07dc4e12ca9f2661aa85e5f74 (patch) | |
tree | 7a36d748255d694e4de95b7d12ea0c7cfab309d7 /src | |
parent | 0faed58bc781adc8f21786943ffada1a0fc69b5a (diff) |
Test that GrFragmentProcessors work without input colors.
Committed: https://skia.googlesource.com/skia/+/72c58e7052af2a0855412ce4b249f977069db751
Review URL: https://codereview.chromium.org/1341853002
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/effects/GrConstColorProcessor.cpp | 6 | ||||
-rw-r--r-- | src/gpu/effects/GrExtractAlphaFragmentProcessor.cpp | 10 | ||||
-rw-r--r-- | src/gpu/effects/GrXfermodeFragmentProcessor.cpp | 25 |
3 files changed, 28 insertions, 13 deletions
diff --git a/src/gpu/effects/GrConstColorProcessor.cpp b/src/gpu/effects/GrConstColorProcessor.cpp index 95a4081d4f..627139fa41 100644 --- a/src/gpu/effects/GrConstColorProcessor.cpp +++ b/src/gpu/effects/GrConstColorProcessor.cpp @@ -19,7 +19,11 @@ public: fColorUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibility, kVec4f_GrSLType, kMedium_GrSLPrecision, "constantColor", &colorUni); - switch (args.fFp.cast<GrConstColorProcessor>().inputMode()) { + GrConstColorProcessor::InputMode mode = args.fFp.cast<GrConstColorProcessor>().inputMode(); + if (!args.fInputColor) { + mode = GrConstColorProcessor::kIgnore_InputMode; + } + switch (mode) { case GrConstColorProcessor::kIgnore_InputMode: fsBuilder->codeAppendf("%s = %s;", args.fOutputColor, colorUni); break; 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) { |