Remove the last use of fragmentProcessor field access in .fp files

This is a complex feature that was propping up this one use-case. After
this CL, it can be removed.

Change-Id: Ia391565daddeba46adfb325980d10ad653e269c8
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375019
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
This commit is contained in:
Brian Osman 2021-02-24 15:04:40 -05:00
parent 948baff2b5
commit c826a1caec
6 changed files with 76 additions and 26 deletions

View File

@ -23,6 +23,7 @@ layout(ctype=SkPMColor4f, tracked) in uniform half4 rightBorderColor; // t > 1.0
layout(key) in bool makePremul; layout(key) in bool makePremul;
// Trust the creator that this matches the color spec of the gradient // Trust the creator that this matches the color spec of the gradient
in bool colorsAreOpaque; in bool colorsAreOpaque;
layout(key) in bool layoutPreservesOpacity;
half4 main() { half4 main() {
half4 t = sample(gradLayout); half4 t = sample(gradLayout);
@ -31,7 +32,7 @@ half4 main() {
// If t.x is below 0, use the left border color without invoking the child processor. If any t.x // If t.x is below 0, use the left border color without invoking the child processor. If any t.x
// is above 1, use the right border color. Otherwise, t is in the [0, 1] range assumed by the // is above 1, use the right border color. Otherwise, t is in the [0, 1] range assumed by the
// colorizer FP, so delegate to the child processor. // colorizer FP, so delegate to the child processor.
if (!gradLayout.preservesOpaqueInput && t.y < 0) { if (!layoutPreservesOpacity && t.y < 0) {
// layout has rejected this fragment (rely on sksl to remove this branch if the layout FP // layout has rejected this fragment (rely on sksl to remove this branch if the layout FP
// preserves opacity is false) // preserves opacity is false)
outColor = half4(0); outColor = half4(0);
@ -56,6 +57,21 @@ half4 main() {
// into account the opacity of the border colors). // into account the opacity of the border colors).
@optimizationFlags { @optimizationFlags {
kCompatibleWithCoverageAsAlpha_OptimizationFlag | kCompatibleWithCoverageAsAlpha_OptimizationFlag |
(colorsAreOpaque && gradLayout->preservesOpaqueInput() ? kPreservesOpaqueInput_OptimizationFlag (colorsAreOpaque && layoutPreservesOpacity ? kPreservesOpaqueInput_OptimizationFlag
: kNone_OptimizationFlags) : kNone_OptimizationFlags)
} }
@make{
static std::unique_ptr<GrFragmentProcessor> Make(
std::unique_ptr<GrFragmentProcessor> colorizer,
std::unique_ptr<GrFragmentProcessor> gradLayout,
SkPMColor4f leftBorderColor,
SkPMColor4f rightBorderColor,
bool makePremul,
bool colorsAreOpaque) {
bool layoutPreservesOpacity = gradLayout->preservesOpaqueInput();
return std::unique_ptr<GrFragmentProcessor>(new GrClampedGradientEffect(
std::move(colorizer), std::move(gradLayout), leftBorderColor, rightBorderColor,
makePremul, colorsAreOpaque, layoutPreservesOpacity));
}
}

View File

@ -14,11 +14,12 @@ layout(key) in bool mirror;
layout(key) in bool makePremul; layout(key) in bool makePremul;
// Trust the creator that this matches the color spec of the gradient // Trust the creator that this matches the color spec of the gradient
in bool colorsAreOpaque; in bool colorsAreOpaque;
layout(key) in bool layoutPreservesOpacity;
half4 main() { half4 main() {
half4 t = sample(gradLayout); half4 t = sample(gradLayout);
if (!gradLayout.preservesOpaqueInput && t.y < 0) { if (!layoutPreservesOpacity && t.y < 0) {
// layout has rejected this fragment (rely on sksl to remove this branch if the layout FP // layout has rejected this fragment (rely on sksl to remove this branch if the layout FP
// preserves opacity is false) // preserves opacity is false)
return half4(0); return half4(0);
@ -54,6 +55,20 @@ half4 main() {
// but otherwise respect the provided color opacity state. // but otherwise respect the provided color opacity state.
@optimizationFlags { @optimizationFlags {
kCompatibleWithCoverageAsAlpha_OptimizationFlag | kCompatibleWithCoverageAsAlpha_OptimizationFlag |
(colorsAreOpaque && gradLayout->preservesOpaqueInput() ? kPreservesOpaqueInput_OptimizationFlag (colorsAreOpaque && layoutPreservesOpacity ? kPreservesOpaqueInput_OptimizationFlag
: kNone_OptimizationFlags) : kNone_OptimizationFlags)
} }
@make{
static std::unique_ptr<GrFragmentProcessor> Make(
std::unique_ptr<GrFragmentProcessor> colorizer,
std::unique_ptr<GrFragmentProcessor> gradLayout,
bool mirror,
bool makePremul,
bool colorsAreOpaque) {
bool layoutPreservesOpacity = gradLayout->preservesOpaqueInput();
return std::unique_ptr<GrFragmentProcessor>(new GrTiledGradientEffect(
std::move(colorizer), std::move(gradLayout), mirror, makePremul, colorsAreOpaque,
layoutPreservesOpacity));
}
}

View File

@ -32,6 +32,8 @@ public:
(void)makePremul; (void)makePremul;
auto colorsAreOpaque = _outer.colorsAreOpaque; auto colorsAreOpaque = _outer.colorsAreOpaque;
(void)colorsAreOpaque; (void)colorsAreOpaque;
auto layoutPreservesOpacity = _outer.layoutPreservesOpacity;
(void)layoutPreservesOpacity;
leftBorderColorVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag, leftBorderColorVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
kHalf4_GrSLType, "leftBorderColor"); kHalf4_GrSLType, "leftBorderColor");
rightBorderColorVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag, rightBorderColorVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
@ -47,8 +49,7 @@ if (!%s && t.y < 0.0) {
} else if (t.x > 1.0) { } else if (t.x > 1.0) {
outColor = %s; outColor = %s;
} else {)SkSL", } else {)SkSL",
_sample0.c_str(), _sample0.c_str(), (_outer.layoutPreservesOpacity ? "true" : "false"),
(_outer.childProcessor(1)->preservesOpaqueInput() ? "true" : "false"),
args.fUniformHandler->getUniformCStr(leftBorderColorVar), args.fUniformHandler->getUniformCStr(leftBorderColorVar),
args.fUniformHandler->getUniformCStr(rightBorderColorVar)); args.fUniformHandler->getUniformCStr(rightBorderColorVar));
SkString _coords1("float2(half2(t.x, 0.0))"); SkString _coords1("float2(half2(t.x, 0.0))");
@ -93,6 +94,7 @@ std::unique_ptr<GrGLSLFragmentProcessor> GrClampedGradientEffect::onMakeProgramI
void GrClampedGradientEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, void GrClampedGradientEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
GrProcessorKeyBuilder* b) const { GrProcessorKeyBuilder* b) const {
b->add32((uint32_t)makePremul); b->add32((uint32_t)makePremul);
b->add32((uint32_t)layoutPreservesOpacity);
} }
bool GrClampedGradientEffect::onIsEqual(const GrFragmentProcessor& other) const { bool GrClampedGradientEffect::onIsEqual(const GrFragmentProcessor& other) const {
const GrClampedGradientEffect& that = other.cast<GrClampedGradientEffect>(); const GrClampedGradientEffect& that = other.cast<GrClampedGradientEffect>();
@ -101,6 +103,7 @@ bool GrClampedGradientEffect::onIsEqual(const GrFragmentProcessor& other) const
if (rightBorderColor != that.rightBorderColor) return false; if (rightBorderColor != that.rightBorderColor) return false;
if (makePremul != that.makePremul) return false; if (makePremul != that.makePremul) return false;
if (colorsAreOpaque != that.colorsAreOpaque) return false; if (colorsAreOpaque != that.colorsAreOpaque) return false;
if (layoutPreservesOpacity != that.layoutPreservesOpacity) return false;
return true; return true;
} }
GrClampedGradientEffect::GrClampedGradientEffect(const GrClampedGradientEffect& src) GrClampedGradientEffect::GrClampedGradientEffect(const GrClampedGradientEffect& src)
@ -108,7 +111,8 @@ GrClampedGradientEffect::GrClampedGradientEffect(const GrClampedGradientEffect&
, leftBorderColor(src.leftBorderColor) , leftBorderColor(src.leftBorderColor)
, rightBorderColor(src.rightBorderColor) , rightBorderColor(src.rightBorderColor)
, makePremul(src.makePremul) , makePremul(src.makePremul)
, colorsAreOpaque(src.colorsAreOpaque) { , colorsAreOpaque(src.colorsAreOpaque)
, layoutPreservesOpacity(src.layoutPreservesOpacity) {
this->cloneAndRegisterAllChildProcessors(src); this->cloneAndRegisterAllChildProcessors(src);
} }
std::unique_ptr<GrFragmentProcessor> GrClampedGradientEffect::clone() const { std::unique_ptr<GrFragmentProcessor> GrClampedGradientEffect::clone() const {
@ -118,9 +122,10 @@ std::unique_ptr<GrFragmentProcessor> GrClampedGradientEffect::clone() const {
SkString GrClampedGradientEffect::onDumpInfo() const { SkString GrClampedGradientEffect::onDumpInfo() const {
return SkStringPrintf( return SkStringPrintf(
"(leftBorderColor=half4(%f, %f, %f, %f), rightBorderColor=half4(%f, %f, %f, %f), " "(leftBorderColor=half4(%f, %f, %f, %f), rightBorderColor=half4(%f, %f, %f, %f), "
"makePremul=%s, colorsAreOpaque=%s)", "makePremul=%s, colorsAreOpaque=%s, layoutPreservesOpacity=%s)",
leftBorderColor.fR, leftBorderColor.fG, leftBorderColor.fB, leftBorderColor.fA, leftBorderColor.fR, leftBorderColor.fG, leftBorderColor.fB, leftBorderColor.fA,
rightBorderColor.fR, rightBorderColor.fG, rightBorderColor.fB, rightBorderColor.fA, rightBorderColor.fR, rightBorderColor.fG, rightBorderColor.fB, rightBorderColor.fA,
(makePremul ? "true" : "false"), (colorsAreOpaque ? "true" : "false")); (makePremul ? "true" : "false"), (colorsAreOpaque ? "true" : "false"),
(layoutPreservesOpacity ? "true" : "false"));
} }
#endif #endif

View File

@ -25,9 +25,10 @@ public:
SkPMColor4f rightBorderColor, SkPMColor4f rightBorderColor,
bool makePremul, bool makePremul,
bool colorsAreOpaque) { bool colorsAreOpaque) {
bool layoutPreservesOpacity = gradLayout->preservesOpaqueInput();
return std::unique_ptr<GrFragmentProcessor>(new GrClampedGradientEffect( return std::unique_ptr<GrFragmentProcessor>(new GrClampedGradientEffect(
std::move(colorizer), std::move(gradLayout), leftBorderColor, rightBorderColor, std::move(colorizer), std::move(gradLayout), leftBorderColor, rightBorderColor,
makePremul, colorsAreOpaque)); makePremul, colorsAreOpaque, layoutPreservesOpacity));
} }
GrClampedGradientEffect(const GrClampedGradientEffect& src); GrClampedGradientEffect(const GrClampedGradientEffect& src);
std::unique_ptr<GrFragmentProcessor> clone() const override; std::unique_ptr<GrFragmentProcessor> clone() const override;
@ -36,6 +37,7 @@ public:
SkPMColor4f rightBorderColor; SkPMColor4f rightBorderColor;
bool makePremul; bool makePremul;
bool colorsAreOpaque; bool colorsAreOpaque;
bool layoutPreservesOpacity;
private: private:
GrClampedGradientEffect(std::unique_ptr<GrFragmentProcessor> colorizer, GrClampedGradientEffect(std::unique_ptr<GrFragmentProcessor> colorizer,
@ -43,16 +45,18 @@ private:
SkPMColor4f leftBorderColor, SkPMColor4f leftBorderColor,
SkPMColor4f rightBorderColor, SkPMColor4f rightBorderColor,
bool makePremul, bool makePremul,
bool colorsAreOpaque) bool colorsAreOpaque,
bool layoutPreservesOpacity)
: INHERITED(kGrClampedGradientEffect_ClassID, : INHERITED(kGrClampedGradientEffect_ClassID,
(OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag | (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag |
(colorsAreOpaque && gradLayout->preservesOpaqueInput() (colorsAreOpaque && layoutPreservesOpacity
? kPreservesOpaqueInput_OptimizationFlag ? kPreservesOpaqueInput_OptimizationFlag
: kNone_OptimizationFlags)) : kNone_OptimizationFlags))
, leftBorderColor(leftBorderColor) , leftBorderColor(leftBorderColor)
, rightBorderColor(rightBorderColor) , rightBorderColor(rightBorderColor)
, makePremul(makePremul) , makePremul(makePremul)
, colorsAreOpaque(colorsAreOpaque) { , colorsAreOpaque(colorsAreOpaque)
, layoutPreservesOpacity(layoutPreservesOpacity) {
this->registerChild(std::move(colorizer), SkSL::SampleUsage::Explicit()); this->registerChild(std::move(colorizer), SkSL::SampleUsage::Explicit());
this->registerChild(std::move(gradLayout), SkSL::SampleUsage::PassThrough()); this->registerChild(std::move(gradLayout), SkSL::SampleUsage::PassThrough());
} }

View File

@ -30,6 +30,8 @@ public:
(void)makePremul; (void)makePremul;
auto colorsAreOpaque = _outer.colorsAreOpaque; auto colorsAreOpaque = _outer.colorsAreOpaque;
(void)colorsAreOpaque; (void)colorsAreOpaque;
auto layoutPreservesOpacity = _outer.layoutPreservesOpacity;
(void)layoutPreservesOpacity;
SkString _sample0 = this->invokeChild(1, args); SkString _sample0 = this->invokeChild(1, args);
fragBuilder->codeAppendf( fragBuilder->codeAppendf(
R"SkSL(half4 t = %s; R"SkSL(half4 t = %s;
@ -47,8 +49,7 @@ if (!%s && t.y < 0.0) {
t.x = fract(t.x); t.x = fract(t.x);
} }
@if (!%s) {)SkSL", @if (!%s) {)SkSL",
_sample0.c_str(), _sample0.c_str(), (_outer.layoutPreservesOpacity ? "true" : "false"),
(_outer.childProcessor(1)->preservesOpaqueInput() ? "true" : "false"),
(_outer.mirror ? "true" : "false"), (_outer.makePremul ? "true" : "false")); (_outer.mirror ? "true" : "false"), (_outer.makePremul ? "true" : "false"));
SkString _coords1("float2(half2(t.x, 0.0))"); SkString _coords1("float2(half2(t.x, 0.0))");
SkString _sample1 = this->invokeChild(0, args, _coords1.c_str()); SkString _sample1 = this->invokeChild(0, args, _coords1.c_str());
@ -80,6 +81,7 @@ void GrTiledGradientEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
GrProcessorKeyBuilder* b) const { GrProcessorKeyBuilder* b) const {
b->add32((uint32_t)mirror); b->add32((uint32_t)mirror);
b->add32((uint32_t)makePremul); b->add32((uint32_t)makePremul);
b->add32((uint32_t)layoutPreservesOpacity);
} }
bool GrTiledGradientEffect::onIsEqual(const GrFragmentProcessor& other) const { bool GrTiledGradientEffect::onIsEqual(const GrFragmentProcessor& other) const {
const GrTiledGradientEffect& that = other.cast<GrTiledGradientEffect>(); const GrTiledGradientEffect& that = other.cast<GrTiledGradientEffect>();
@ -87,13 +89,15 @@ bool GrTiledGradientEffect::onIsEqual(const GrFragmentProcessor& other) const {
if (mirror != that.mirror) return false; if (mirror != that.mirror) return false;
if (makePremul != that.makePremul) return false; if (makePremul != that.makePremul) return false;
if (colorsAreOpaque != that.colorsAreOpaque) return false; if (colorsAreOpaque != that.colorsAreOpaque) return false;
if (layoutPreservesOpacity != that.layoutPreservesOpacity) return false;
return true; return true;
} }
GrTiledGradientEffect::GrTiledGradientEffect(const GrTiledGradientEffect& src) GrTiledGradientEffect::GrTiledGradientEffect(const GrTiledGradientEffect& src)
: INHERITED(kGrTiledGradientEffect_ClassID, src.optimizationFlags()) : INHERITED(kGrTiledGradientEffect_ClassID, src.optimizationFlags())
, mirror(src.mirror) , mirror(src.mirror)
, makePremul(src.makePremul) , makePremul(src.makePremul)
, colorsAreOpaque(src.colorsAreOpaque) { , colorsAreOpaque(src.colorsAreOpaque)
, layoutPreservesOpacity(src.layoutPreservesOpacity) {
this->cloneAndRegisterAllChildProcessors(src); this->cloneAndRegisterAllChildProcessors(src);
} }
std::unique_ptr<GrFragmentProcessor> GrTiledGradientEffect::clone() const { std::unique_ptr<GrFragmentProcessor> GrTiledGradientEffect::clone() const {
@ -101,8 +105,9 @@ std::unique_ptr<GrFragmentProcessor> GrTiledGradientEffect::clone() const {
} }
#if GR_TEST_UTILS #if GR_TEST_UTILS
SkString GrTiledGradientEffect::onDumpInfo() const { SkString GrTiledGradientEffect::onDumpInfo() const {
return SkStringPrintf("(mirror=%s, makePremul=%s, colorsAreOpaque=%s)", return SkStringPrintf(
"(mirror=%s, makePremul=%s, colorsAreOpaque=%s, layoutPreservesOpacity=%s)",
(mirror ? "true" : "false"), (makePremul ? "true" : "false"), (mirror ? "true" : "false"), (makePremul ? "true" : "false"),
(colorsAreOpaque ? "true" : "false")); (colorsAreOpaque ? "true" : "false"), (layoutPreservesOpacity ? "true" : "false"));
} }
#endif #endif

View File

@ -24,8 +24,10 @@ public:
bool mirror, bool mirror,
bool makePremul, bool makePremul,
bool colorsAreOpaque) { bool colorsAreOpaque) {
return std::unique_ptr<GrFragmentProcessor>(new GrTiledGradientEffect( bool layoutPreservesOpacity = gradLayout->preservesOpaqueInput();
std::move(colorizer), std::move(gradLayout), mirror, makePremul, colorsAreOpaque)); return std::unique_ptr<GrFragmentProcessor>(
new GrTiledGradientEffect(std::move(colorizer), std::move(gradLayout), mirror,
makePremul, colorsAreOpaque, layoutPreservesOpacity));
} }
GrTiledGradientEffect(const GrTiledGradientEffect& src); GrTiledGradientEffect(const GrTiledGradientEffect& src);
std::unique_ptr<GrFragmentProcessor> clone() const override; std::unique_ptr<GrFragmentProcessor> clone() const override;
@ -33,21 +35,24 @@ public:
bool mirror; bool mirror;
bool makePremul; bool makePremul;
bool colorsAreOpaque; bool colorsAreOpaque;
bool layoutPreservesOpacity;
private: private:
GrTiledGradientEffect(std::unique_ptr<GrFragmentProcessor> colorizer, GrTiledGradientEffect(std::unique_ptr<GrFragmentProcessor> colorizer,
std::unique_ptr<GrFragmentProcessor> gradLayout, std::unique_ptr<GrFragmentProcessor> gradLayout,
bool mirror, bool mirror,
bool makePremul, bool makePremul,
bool colorsAreOpaque) bool colorsAreOpaque,
bool layoutPreservesOpacity)
: INHERITED(kGrTiledGradientEffect_ClassID, : INHERITED(kGrTiledGradientEffect_ClassID,
(OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag | (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag |
(colorsAreOpaque && gradLayout->preservesOpaqueInput() (colorsAreOpaque && layoutPreservesOpacity
? kPreservesOpaqueInput_OptimizationFlag ? kPreservesOpaqueInput_OptimizationFlag
: kNone_OptimizationFlags)) : kNone_OptimizationFlags))
, mirror(mirror) , mirror(mirror)
, makePremul(makePremul) , makePremul(makePremul)
, colorsAreOpaque(colorsAreOpaque) { , colorsAreOpaque(colorsAreOpaque)
, layoutPreservesOpacity(layoutPreservesOpacity) {
this->registerChild(std::move(colorizer), SkSL::SampleUsage::Explicit()); this->registerChild(std::move(colorizer), SkSL::SampleUsage::Explicit());
this->registerChild(std::move(gradLayout), SkSL::SampleUsage::PassThrough()); this->registerChild(std::move(gradLayout), SkSL::SampleUsage::PassThrough());
} }