aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects
diff options
context:
space:
mode:
authorGravatar bsalomon <bsalomon@google.com>2015-09-14 11:55:51 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-09-14 11:55:52 -0700
commit72c58e7052af2a0855412ce4b249f977069db751 (patch)
treeede198f2a29caa2b188235d738bd3cf731f769f6 /src/gpu/effects
parent3833daaa663db7e655a8077cdab42cca19d3a276 (diff)
Test that GrFragmentProcessors work without input colors.
Diffstat (limited to 'src/gpu/effects')
-rw-r--r--src/gpu/effects/GrExtractAlphaFragmentProcessor.cpp10
-rw-r--r--src/gpu/effects/GrXfermodeFragmentProcessor.cpp25
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) {