Revert "Better first-class shader & color filter support in runtime effects"
This reverts commit adadb95a9f1ef21ccc5264c7d0bdc83b56cf91e9.
Reason for revert: breaking android
Original change's description:
> Better first-class shader & color filter support in runtime effects
>
> This does a few things, because they're all intertwined:
>
> 1) SkRuntimeEffect's API now includes details about children (which Skia
> stage was declared, not just the name). The factories verify that the
> declared types in the SkSL match up with the C++ types being passed.
> Today, we still only support adding children of the same type, so the
> checks are simple. Once we allow mixing types, we'll be testing the
> declared type against the actual C++ type supplied for each slot.
> 2) Adds sample variants that supply the input color to the child. This
> is now the only way to invoke a colorFilter child. Internally, we
> support passing a color when invoking a child shader, but I'm not
> exposing that. It's not clearly part of the semantics of the Skia
> pipeline, and is almost never useful. It also exposes users to
> several inconsistencies (skbug.com/11942).
> 3) Because of #2, it's possible that we can't compute a reusable program
> to filter individual colors. In that case, we don't set the constant
> output for constant input optimization, and filterColor4f falls back
> to the slower base-class implementation.
>
> Bug: skia:11813 skia:11942
> Change-Id: I06c41e1b35056e486f3163a72acf6b9535d7fed4
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/401917
> Commit-Queue: Brian Osman <brianosman@google.com>
> Reviewed-by: Mike Klein <mtklein@google.com>
TBR=mtklein@google.com,bsalomon@google.com,brianosman@google.com
Change-Id: I94ba57e73305b2302f86fd0c1d76f667d4e45b92
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:11813 skia:11942
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/404117
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
diff --git a/src/sksl/codegen/SkSLVMCodeGenerator.cpp b/src/sksl/codegen/SkSLVMCodeGenerator.cpp
index d0dc4dc..7a772d9 100644
--- a/src/sksl/codegen/SkSLVMCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLVMCodeGenerator.cpp
@@ -116,7 +116,6 @@
SkSpan<skvm::Val> uniforms,
skvm::Coord device,
skvm::Coord local,
- skvm::Color inputColor,
SampleChildFn sampleChild);
void writeFunction(const FunctionDefinition& function,
@@ -288,7 +287,6 @@
skvm::Builder* fBuilder;
const skvm::Coord fLocalCoord;
- const skvm::Color fInputColor;
const SampleChildFn fSampleChild;
// [Variable, first slot in fSlots]
@@ -346,12 +344,10 @@
SkSpan<skvm::Val> uniforms,
skvm::Coord device,
skvm::Coord local,
- skvm::Color inputColor,
SampleChildFn sampleChild)
: fProgram(program)
, fBuilder(builder)
, fLocalCoord(local)
- , fInputColor(inputColor)
, fSampleChild(std::move(sampleChild)) {
fConditionMask = fLoopMask = fBuilder->splat(0xffff'ffff);
@@ -1000,32 +996,25 @@
if (found->second == Intrinsic::kSample) {
// Sample is very special, the first argument is a child (shader/colorFilter), which can't
// be evaluated
- SkASSERT(nargs == 2);
- const Expression* child = c.arguments()[0].get();
- SkASSERT(child->type().isEffectChild());
- SkASSERT(child->is<VariableReference>());
-
- auto fp_it = fVariableMap.find(child->as<VariableReference>().variable());
- SkASSERT(fp_it != fVariableMap.end());
-
- // Shaders require a coordinate argument. Color filters require a color argument.
- // When we call sampleChild, the other value remains the incoming default.
- skvm::Color inColor = fInputColor;
- skvm::Coord coord = fLocalCoord;
- const Expression* arg = c.arguments()[1].get();
- Value argVal = this->writeExpression(*arg);
-
- if (child->type().typeKind() == Type::TypeKind::kShader) {
- SkASSERT(arg->type() == *fProgram.fContext->fTypes.fFloat2);
- coord = {f32(argVal[0]), f32(argVal[1])};
- } else {
- SkASSERT(child->type().typeKind() == Type::TypeKind::kColorFilter);
- SkASSERT(arg->type() == *fProgram.fContext->fTypes.fHalf4 ||
- arg->type() == *fProgram.fContext->fTypes.fFloat4);
- inColor = {f32(argVal[0]), f32(argVal[1]), f32(argVal[2]), f32(argVal[3])};
+ const Context& ctx = *fProgram.fContext;
+ if (nargs > 2 || !c.arguments()[0]->type().isEffectChild() ||
+ (nargs == 2 && (c.arguments()[1]->type() != *ctx.fTypes.fFloat2 &&
+ c.arguments()[1]->type() != *ctx.fTypes.fFloat3x3))) {
+ SkDEBUGFAIL("Invalid call to sample");
+ return {};
}
- skvm::Color color = fSampleChild(fp_it->second, coord, inColor);
+ auto fp_it = fVariableMap.find(c.arguments()[0]->as<VariableReference>().variable());
+ SkASSERT(fp_it != fVariableMap.end());
+
+ skvm::Coord coord = fLocalCoord;
+ if (nargs == 2) {
+ Value arg = this->writeExpression(*c.arguments()[1]);
+ SkASSERT(arg.slots() == 2);
+ coord = {f32(arg[0]), f32(arg[1])};
+ }
+
+ skvm::Color color = fSampleChild(fp_it->second, coord);
Value result(4);
result[0] = color.r;
result[1] = color.g;
@@ -1705,8 +1694,7 @@
}
SkASSERT(argSlots <= SK_ARRAY_COUNT(args));
- SkVMGenerator generator(
- program, builder, uniforms, device, local, inputColor, std::move(sampleChild));
+ SkVMGenerator generator(program, builder, uniforms, device, local, std::move(sampleChild));
generator.writeFunction(function, {args, argSlots}, result);
return skvm::Color{{builder, result[0]},
@@ -1744,11 +1732,9 @@
returnVals.push_back(b->splat(0.0f).id);
}
- skvm::F32 zero = b->splat(0.0f);
- skvm::Coord zeroCoord = {zero, zero};
- skvm::Color zeroColor = {zero, zero, zero, zero};
+ skvm::Coord zeroCoord = {b->splat(0.0f), b->splat(0.0f)};
SkVMGenerator generator(program, b, uniforms, /*device=*/zeroCoord, /*local=*/zeroCoord,
- /*inputColor=*/zeroColor, /*sampleChild=*/{});
+ /*sampleChild=*/{});
generator.writeFunction(function, argVals, returnVals);
// generateCode has updated the contents of 'argVals' for any 'out' or 'inout' parameters.
@@ -1865,7 +1851,7 @@
children.push_back({uniforms.pushPtr(nullptr), builder->uniform32(uniforms.push(0))});
}
- auto sampleChild = [&](int i, skvm::Coord coord, skvm::Color) {
+ auto sampleChild = [&](int i, skvm::Coord coord) {
skvm::PixelFormat pixelFormat = skvm::SkColorType_to_PixelFormat(kRGBA_F32_SkColorType);
skvm::I32 index = trunc(coord.x);
index += trunc(coord.y) * children[i].rowBytesAsPixels;