Introduces a mechanism to allow backdrop filters to 1) share backdrop inputs and 2) fuse filter applications for faster blurs.
This is a proposed solution to https://github.com/flutter/flutter/issues/131568
Implemented:
* Developer can specify a "backdrop id" which indicates that a backdrop layer should share the input texture and potentially cached filter for a layer.
* Removes second save layer for each backdrop filter
* Removes save layer trace event for backdrop filter
* Can fuse backdrop filters if there is more than one identical filter
TBD:
* Adjust heruristic to avoid applying bdf filter to entire screen
Suggestions: applying a bdf should be a distinct operation from a save layer in the DL builder/dispatcher. The saveLayer implmenentation in the impeller dispatcher is super convoluted because it needs to handle both.
### Video
Video starts with normal bdf then I hot reload to specify that the bdfs share inputs/filters. This is running on a pixel 8 pro
Change to the macrobenchmark app is just:
```dart
Widget build(BuildContext context) {
Widget addBlur(Widget child, bool shouldBlur) {
if (shouldBlur) {
return ClipRect(
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
backdropId: 1, // Added ID
child: child,
),
);
} else {
return child;
}
}
```
https://github.com/user-attachments/assets/22707f97-5825-43f1-91b4-1a02a43437f5
Requires framework changes in https://github.com/jonahwilliams/flutter/pull/new/backdrop_id
The MatrixClipTracker was nothing more than a vector of MatrixClipState objects and a whole lot of duplicate delegation methods. It provided little value since nearly every use of it already had a state stack that was kept in synch with it's internal stack and so it was just adding an extra layer of delegation and extra allocations.
During some new development work that might make transform resets more expensive we realized that the resets were mostly coming from the calls to snap the transform to a pixel translate value and many of those were NOPs since the transform was already on a pixel translate value. This PR will avoid those trivially unnecessary reset operations.
* Revert "Revert "Reland layer state stack" (#37178)"
This reverts commit 21cc000359d8a4da097e8849e83dcbe8ac941e01.
* fix double-transform rendering issues in #114359
* adjust recently added unit test to state_stack APIs
* introduce LSS delegates to simplify some code and reduce overhead
* Fix ShellTest.OnServiceProtocolEstimateRasterCacheMemoryWorks
* add unit test for tracker.setTransform(4x4) and fix bug
* fix culling issue in LayerTree::Flatten
* Revert "Fix a clang-tidy warning in display_list_canvas_unittests.cc (#37062)"
This reverts commit 709c6735fc7ed34df36cee23805bdaa7f6969774.
* Revert "Create a mechanism to manage layer state (#36458)"
This reverts commit 501916deb19a8303ca2a3a9bb37692a873d4679e.