Update GrBlurredEdgeFragmentProcessor to use a child FP.
We are updating FPs to receive their input via a child FP where
possible, instead of relying on the input color.
Change-Id: Ib2bac2c7865d4285fbbf45c9de29bbd4d139d04b
Bug: skia:10217
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/294396
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
diff --git a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.fp b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.fp
index 6126c7d..df06e55 100644
--- a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.fp
+++ b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.fp
@@ -10,10 +10,12 @@
kSmoothStep = 1
};
+in fragmentProcessor? inputFP;
layout(key) in Mode mode;
void main() {
- half factor = 1.0 - sk_InColor.a;
+ half inputAlpha = (inputFP != null) ? sample(inputFP).a : sk_InColor.a;
+ half factor = 1.0 - inputAlpha;
@switch (mode) {
case Mode::kGaussian:
factor = half(exp(-factor * factor * 4.0) - 0.018);
diff --git a/src/gpu/effects/generated/GrBlurredEdgeFragmentProcessor.cpp b/src/gpu/effects/generated/GrBlurredEdgeFragmentProcessor.cpp
index 5c6dbc3..736ceba 100644
--- a/src/gpu/effects/generated/GrBlurredEdgeFragmentProcessor.cpp
+++ b/src/gpu/effects/generated/GrBlurredEdgeFragmentProcessor.cpp
@@ -26,12 +26,19 @@
(void)_outer;
auto mode = _outer.mode;
(void)mode;
+ SkString _sample328;
+ if (_outer.inputFP_index >= 0) {
+ _sample328 = this->invokeChild(_outer.inputFP_index, args);
+ } else {
+ _sample328 = "half4(1)";
+ }
fragBuilder->codeAppendf(
- "half factor = 1.0 - %s.w;\n@switch (%d) {\n case 0:\n factor = "
- "exp((-factor * factor) * 4.0) - 0.017999999225139618;\n break;\n case "
- "1:\n factor = smoothstep(1.0, 0.0, factor);\n break;\n}\n%s = "
- "half4(factor);\n",
- args.fInputColor, (int)_outer.mode, args.fOutputColor);
+ "half inputAlpha = %s ? %s.w : %s.w;\nhalf factor = 1.0 - inputAlpha;\n@switch "
+ "(%d) {\n case 0:\n factor = exp((-factor * factor) * 4.0) - "
+ "0.017999999225139618;\n break;\n case 1:\n factor = "
+ "smoothstep(1.0, 0.0, factor);\n break;\n}\n%s = half4(factor);\n",
+ _outer.inputFP_index >= 0 ? "true" : "false", _sample328.c_str(), args.fInputColor,
+ (int)_outer.mode, args.fOutputColor);
}
private:
@@ -54,7 +61,16 @@
GrBlurredEdgeFragmentProcessor::GrBlurredEdgeFragmentProcessor(
const GrBlurredEdgeFragmentProcessor& src)
: INHERITED(kGrBlurredEdgeFragmentProcessor_ClassID, src.optimizationFlags())
- , mode(src.mode) {}
+ , inputFP_index(src.inputFP_index)
+ , mode(src.mode) {
+ if (inputFP_index >= 0) {
+ auto clone = src.childProcessor(inputFP_index).clone();
+ if (src.childProcessor(inputFP_index).isSampledWithExplicitCoords()) {
+ clone->setSampledWithExplicitCoords();
+ }
+ this->registerChildProcessor(std::move(clone));
+ }
+}
std::unique_ptr<GrFragmentProcessor> GrBlurredEdgeFragmentProcessor::clone() const {
return std::unique_ptr<GrFragmentProcessor>(new GrBlurredEdgeFragmentProcessor(*this));
}
diff --git a/src/gpu/effects/generated/GrBlurredEdgeFragmentProcessor.h b/src/gpu/effects/generated/GrBlurredEdgeFragmentProcessor.h
index 1882803..8ad611c 100644
--- a/src/gpu/effects/generated/GrBlurredEdgeFragmentProcessor.h
+++ b/src/gpu/effects/generated/GrBlurredEdgeFragmentProcessor.h
@@ -18,18 +18,26 @@
class GrBlurredEdgeFragmentProcessor : public GrFragmentProcessor {
public:
enum class Mode { kGaussian = 0, kSmoothStep = 1 };
- static std::unique_ptr<GrFragmentProcessor> Make(Mode mode) {
- return std::unique_ptr<GrFragmentProcessor>(new GrBlurredEdgeFragmentProcessor(mode));
+ static std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> inputFP,
+ Mode mode) {
+ return std::unique_ptr<GrFragmentProcessor>(
+ new GrBlurredEdgeFragmentProcessor(std::move(inputFP), mode));
}
GrBlurredEdgeFragmentProcessor(const GrBlurredEdgeFragmentProcessor& src);
std::unique_ptr<GrFragmentProcessor> clone() const override;
const char* name() const override { return "BlurredEdgeFragmentProcessor"; }
+ int inputFP_index = -1;
Mode mode;
private:
- GrBlurredEdgeFragmentProcessor(Mode mode)
+ GrBlurredEdgeFragmentProcessor(std::unique_ptr<GrFragmentProcessor> inputFP, Mode mode)
: INHERITED(kGrBlurredEdgeFragmentProcessor_ClassID, kNone_OptimizationFlags)
- , mode(mode) {}
+ , mode(mode) {
+ if (inputFP) {
+ inputFP_index = this->numChildProcessors();
+ this->registerChildProcessor(std::move(inputFP));
+ }
+ }
GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
bool onIsEqual(const GrFragmentProcessor&) const override;
diff --git a/src/utils/SkShadowUtils.cpp b/src/utils/SkShadowUtils.cpp
index ade48e3..f287fc0 100644
--- a/src/utils/SkShadowUtils.cpp
+++ b/src/utils/SkShadowUtils.cpp
@@ -84,7 +84,8 @@
std::unique_ptr<GrFragmentProcessor> SkGaussianColorFilter::asFragmentProcessor(
GrRecordingContext*, const GrColorInfo&) const {
- return GrBlurredEdgeFragmentProcessor::Make(GrBlurredEdgeFragmentProcessor::Mode::kGaussian);
+ return GrBlurredEdgeFragmentProcessor::Make(
+ /*inputFP=*/nullptr, GrBlurredEdgeFragmentProcessor::Mode::kGaussian);
}
#endif