aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrFragmentProcessor.cpp
diff options
context:
space:
mode:
authorGravatar Ethan Nicholas <ethannicholas@google.com>2017-11-17 13:44:05 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-11-17 20:11:36 +0000
commitbe0a042dcfbc05a10d592521cae9e2ad253c2f78 (patch)
tree4551e7ac5ffb508a601a7f063bc413a396fe7aef /src/gpu/GrFragmentProcessor.cpp
parentb092cea5b17420926557d0e8b8d2df6db894725c (diff)
converted Premul / Unpremul to SkSL
Bug: skia: Change-Id: I4944badbb530e17b9ff7cca389f943e0b5982e01 Reviewed-on: https://skia-review.googlesource.com/72983 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Diffstat (limited to 'src/gpu/GrFragmentProcessor.cpp')
-rw-r--r--src/gpu/GrFragmentProcessor.cpp97
1 files changed, 5 insertions, 92 deletions
diff --git a/src/gpu/GrFragmentProcessor.cpp b/src/gpu/GrFragmentProcessor.cpp
index 90bbb33e60..a50be79872 100644
--- a/src/gpu/GrFragmentProcessor.cpp
+++ b/src/gpu/GrFragmentProcessor.cpp
@@ -10,7 +10,9 @@
#include "GrPipeline.h"
#include "GrProcessorAnalysis.h"
#include "effects/GrConstColorProcessor.h"
+#include "effects/GrPremulInputFragmentProcessor.h"
#include "effects/GrXfermodeFragmentProcessor.h"
+#include "effects/GrUnpremulInputFragmentProcessor.h"
#include "glsl/GrGLSLFragmentProcessor.h"
#include "glsl/GrGLSLFragmentShaderBuilder.h"
#include "glsl/GrGLSLProgramDataManager.h"
@@ -109,101 +111,12 @@ std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::MulOutputByInputAlpha(
return GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(fp), SkBlendMode::kDstIn);
}
-namespace {
-
-class PremulInputFragmentProcessor : public GrFragmentProcessor {
-public:
- static std::unique_ptr<GrFragmentProcessor> Make() {
- return std::unique_ptr<GrFragmentProcessor>(new PremulInputFragmentProcessor);
- }
-
- const char* name() const override { return "PremultiplyInput"; }
-
- std::unique_ptr<GrFragmentProcessor> clone() const override { return Make(); }
-
-private:
- PremulInputFragmentProcessor()
- : INHERITED(kPremulInputFragmentProcessor_ClassID,
- kPreservesOpaqueInput_OptimizationFlag |
- kConstantOutputForConstantInput_OptimizationFlag) {
- }
-
- GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
- class GLFP : public GrGLSLFragmentProcessor {
- public:
- void emitCode(EmitArgs& args) override {
- GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
-
- fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, args.fInputColor);
- fragBuilder->codeAppendf("%s.rgb *= %s.a;",
- args.fOutputColor, args.fInputColor);
- }
- };
- return new GLFP;
- }
-
- void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {}
-
- bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
-
- GrColor4f constantOutputForConstantInput(GrColor4f input) const override {
- return input.premul();
- }
-
- typedef GrFragmentProcessor INHERITED;
-};
-
-class UnpremulInputFragmentProcessor : public GrFragmentProcessor {
-public:
- static std::unique_ptr<GrFragmentProcessor> Make() {
- return std::unique_ptr<GrFragmentProcessor>(new UnpremulInputFragmentProcessor);
- }
-
- const char* name() const override { return "UnpremultiplyInput"; }
-
- std::unique_ptr<GrFragmentProcessor> clone() const override { return Make(); }
-
-private:
- UnpremulInputFragmentProcessor()
- : INHERITED(kUnpremulInputFragmentProcessor_ClassID,
- kPreservesOpaqueInput_OptimizationFlag |
- kConstantOutputForConstantInput_OptimizationFlag) {
- }
-
- GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
- class GLFP : public GrGLSLFragmentProcessor {
- public:
- void emitCode(EmitArgs& args) override {
- GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
-
- fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, args.fInputColor);
- fragBuilder->codeAppendf("half invAlpha = %s.a <= 0.0 ? 0.0 : 1.0 / %s.a;",
- args.fInputColor, args.fInputColor);
- fragBuilder->codeAppendf("%s.rgb *= invAlpha;", args.fOutputColor);
- }
- };
- return new GLFP;
- }
-
- void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {}
-
- bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
-
- GrColor4f constantOutputForConstantInput(GrColor4f input) const override {
- return input.unpremul();
- }
-
- typedef GrFragmentProcessor INHERITED;
-};
-
-}
-
std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::PremulInput(
std::unique_ptr<GrFragmentProcessor> fp) {
if (!fp) {
return nullptr;
}
- std::unique_ptr<GrFragmentProcessor> fpPipeline[] = { PremulInputFragmentProcessor::Make(),
+ std::unique_ptr<GrFragmentProcessor> fpPipeline[] = { GrPremulInputFragmentProcessor::Make(),
std::move(fp) };
return GrFragmentProcessor::RunInSeries(fpPipeline, 2);
}
@@ -214,7 +127,7 @@ std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::PremulOutput(
return nullptr;
}
std::unique_ptr<GrFragmentProcessor> fpPipeline[] = { std::move(fp),
- PremulInputFragmentProcessor::Make() };
+ GrPremulInputFragmentProcessor::Make() };
return GrFragmentProcessor::RunInSeries(fpPipeline, 2);
}
@@ -224,7 +137,7 @@ std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::UnpremulOutput(
return nullptr;
}
std::unique_ptr<GrFragmentProcessor> fpPipeline[] = { std::move(fp),
- UnpremulInputFragmentProcessor::Make() };
+ GrUnpremulInputFragmentProcessor::Make() };
return GrFragmentProcessor::RunInSeries(fpPipeline, 2);
}