Skip to content

Conversation

@jonahwilliams
Copy link
Contributor

@jonahwilliams jonahwilliams commented Mar 26, 2025

Fixes #165959

Flame uses a lot of individual calls to drawImageRect w/ blend color filters to color the sprites. This is much slower with Impeller today, because we convert this into:

saveLayer(color filter)
drawImageRect
restore

Instead, we can detect this case and convert to a call to drawAtlas. drawAtlas will use the porter-duff shader which removes the saveLayer entirely. We could do this optimization while recording, but for now its fine to do in dispatch.

We do have a snapshot optimization that catches "normal" image usage, but it doesn't apply in the flame case as the source rects are sampling from a larger texture and we don't have a way to pass those through the snapshot system.

Before

After

@github-actions github-actions bot added engine flutter/engine related. See also e: labels. e: impeller Impeller rendering backend issues and features requests labels Mar 26, 2025
@jonahwilliams
Copy link
Contributor Author

Draft because I don't think my math is quite right yet.

@jonahwilliams jonahwilliams marked this pull request as ready for review March 26, 2025 21:02
@jonahwilliams
Copy link
Contributor Author

Thinking about this some more, I'd think our existing optimizations would cover this case - but actually they seem to be falling down. Investigating more.

@jonahwilliams
Copy link
Contributor Author

So in theory our snapshot optimization handles this - however we don't handle a src/dst rect that are different sizes. Since this is really only an improvement for blend/matrix color filters, I think it makes more sense to add the optimization in canvas than it does to refactor the snapshot system.

@flutter-dashboard
Copy link

Golden file changes have been found for this pull request. Click here to view and triage (e.g. because this is an intentional change).

If you are still iterating on this change and are not ready to resolve the images on the Flutter Gold dashboard, consider marking this PR as a draft pull request above. You will still be able to view image results on the dashboard, commenting will be silenced, and the check will not try to resolve itself until marked ready for review.

For more guidance, visit Writing a golden file test for package:flutter.

Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing.

Changes reported for pull request #165998 at sha d85f40e

@flutter-dashboard flutter-dashboard bot added the will affect goldens Changes to golden files label Mar 28, 2025
@jonahwilliams jonahwilliams changed the title [Impeller] optimize drawImageRect with blend color filter. [Impeller] optimize drawImageRect with blend and matrix color filter. Mar 28, 2025
@jonahwilliams jonahwilliams requested a review from gaaclarke March 28, 2025 18:49
Copy link
Member

@gaaclarke gaaclarke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code looks good to me, the goldens don't look alright though. Check out impeller_Play_AiksTest_ColorFilterBlend_Metal.

paint.image_filter == nullptr && //
!paint.mask_blur_descriptor.has_value() && //
IsPipelineBlendOrMatrixFilter(paint.color_filter)) {
if (paint.color_filter->type() == flutter::DlColorFilterType::kBlend) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: This method is huge, can you split this out into it's own function.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// we should swap out the shader for the porter duff blend shader and avoid a
// saveLayer. This can only be done for imageRects without a strict source
// rect, as the porter duff shader does not support this feature. This
// optimization is important for flame.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// optimization is important for flame.
// optimization is important for Flame.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


/////

class ColorFilterAtlasContents final : public Contents {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add brief docstring

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

RenderPass& pass) const override;

private:
AtlasGeometry* geometry_ = nullptr;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add comment why raw pointer can't result in a dangling pointer.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

@flutter-dashboard
Copy link

Golden file changes are available for triage from new commit, Click here to view.

For more guidance, visit Writing a golden file test for package:flutter.

Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing.

Changes reported for pull request #165998 at sha a83878c

@jonahwilliams jonahwilliams requested a review from gaaclarke March 28, 2025 23:10
Copy link
Member

@gaaclarke gaaclarke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm as long as the goldens are good.

engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 31, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Apr 1, 2025
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Apr 1, 2025
Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions)

Manual roll requested by [email protected]

flutter/flutter@1d954f4...05b5e79

2025-03-29 [email protected] Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202)
2025-03-29 [email protected] Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189)
2025-03-29 [email protected] Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185)
2025-03-29 [email protected] [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120)
2025-03-29 [email protected] Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181)
2025-03-29 [email protected] move around shaders in vertices uber 1/2 (flutter/flutter#166180)
2025-03-29 [email protected] [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998)
2025-03-28 [email protected] Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744)
2025-03-28 [email protected] Started clamping scaled antialias lines size (flutter/flutter#166149)
2025-03-28 [email protected] Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162)
2025-03-28 [email protected] Remove bringup flag for customer tests (flutter/flutter#166161)
2025-03-28 [email protected] Add the ios-reviewers review team (flutter/flutter#166034)
2025-03-28 [email protected] [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035)
2025-03-28 [email protected] [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924)
2025-03-28 [email protected] Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681)
2025-03-28 [email protected] [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520)
2025-03-28 [email protected] [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324)
2025-03-28 [email protected] [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091)
2025-03-28 [email protected] Mark Linux coverage as bringup (flutter/flutter#166144)
2025-03-28 [email protected] Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136)
2025-03-28 [email protected] [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938)
2025-03-28 [email protected] [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409)
2025-03-28 [email protected] Delete some verbose vm service logging (flutter/flutter#162709)
2025-03-28 [email protected] Get analytics welcome message under test (flutter/flutter#162627)
2025-03-28 [email protected] [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080)
2025-03-28 [email protected] Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111)
2025-03-28 [email protected] [CI] remove check for exact golden files. (flutter/flutter#166031)
2025-03-28 [email protected] Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025)
2025-03-27 [email protected] [android] only release background image readers on Android 14. (flutter/flutter#165942)
2025-03-27 [email protected] Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972)
2025-03-27 [email protected] Mark Linux customer tests as flaky (flutter/flutter#166103)
2025-03-27 [email protected] Move app link settings task configuration to kotlin (flutter/flutter#165819)
2025-03-27 [email protected] Make iOS Flutter framework extension-safe (flutter/flutter#165346)
2025-03-27 [email protected] [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005)
2025-03-27 [email protected] Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395)
2025-03-27 [email protected] add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096)
2025-03-27 [email protected] Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077)
2025-03-27 [email protected] Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060)
2025-03-27 [email protected] [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940)
2025-03-27 [email protected] Scale aa lines (flutter/flutter#165917)
2025-03-27 [email protected] Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059)
2025-03-27 [email protected] Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055)
2025-03-27 [email protected] Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046)
2025-03-27 [email protected] [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299)
...
CodixNinja pushed a commit to CodixNinja/packages that referenced this pull request May 15, 2025
… (#8960)

Manual roll Flutter from 1d954f4e96bd to 05b5e7910544 (225 revisions)

Manual roll requested by [email protected]

flutter/flutter@1d954f4...05b5e79

2025-03-29 [email protected] Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202)
2025-03-29 [email protected] Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189)
2025-03-29 [email protected] Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185)
2025-03-29 [email protected] [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120)
2025-03-29 [email protected] Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181)
2025-03-29 [email protected] move around shaders in vertices uber 1/2 (flutter/flutter#166180)
2025-03-29 [email protected] [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998)
2025-03-28 [email protected] Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744)
2025-03-28 [email protected] Started clamping scaled antialias lines size (flutter/flutter#166149)
2025-03-28 [email protected] Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162)
2025-03-28 [email protected] Remove bringup flag for customer tests (flutter/flutter#166161)
2025-03-28 [email protected] Add the ios-reviewers review team (flutter/flutter#166034)
2025-03-28 [email protected] [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035)
2025-03-28 [email protected] [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924)
2025-03-28 [email protected] Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681)
2025-03-28 [email protected] [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520)
2025-03-28 [email protected] [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324)
2025-03-28 [email protected] [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091)
2025-03-28 [email protected] Mark Linux coverage as bringup (flutter/flutter#166144)
2025-03-28 [email protected] Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136)
2025-03-28 [email protected] [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938)
2025-03-28 [email protected] [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409)
2025-03-28 [email protected] Delete some verbose vm service logging (flutter/flutter#162709)
2025-03-28 [email protected] Get analytics welcome message under test (flutter/flutter#162627)
2025-03-28 [email protected] [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080)
2025-03-28 [email protected] Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111)
2025-03-28 [email protected] [CI] remove check for exact golden files. (flutter/flutter#166031)
2025-03-28 [email protected] Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025)
2025-03-27 [email protected] [android] only release background image readers on Android 14. (flutter/flutter#165942)
2025-03-27 [email protected] Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972)
2025-03-27 [email protected] Mark Linux customer tests as flaky (flutter/flutter#166103)
2025-03-27 [email protected] Move app link settings task configuration to kotlin (flutter/flutter#165819)
2025-03-27 [email protected] Make iOS Flutter framework extension-safe (flutter/flutter#165346)
2025-03-27 [email protected] [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005)
2025-03-27 [email protected] Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395)
2025-03-27 [email protected] add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096)
2025-03-27 [email protected] Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077)
2025-03-27 [email protected] Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060)
2025-03-27 [email protected] [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940)
2025-03-27 [email protected] Scale aa lines (flutter/flutter#165917)
2025-03-27 [email protected] Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059)
2025-03-27 [email protected] Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055)
2025-03-27 [email protected] Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046)
2025-03-27 [email protected] [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299)
...
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request May 20, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request May 20, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request May 21, 2025
androidseb pushed a commit to androidseb/packages that referenced this pull request Jun 8, 2025
…8960)

Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions)

Manual roll requested by [email protected]

flutter/flutter@1d954f4...05b5e79

2025-03-29 [email protected] Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202)
2025-03-29 [email protected] Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189)
2025-03-29 [email protected] Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185)
2025-03-29 [email protected] [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120)
2025-03-29 [email protected] Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181)
2025-03-29 [email protected] move around shaders in vertices uber 1/2 (flutter/flutter#166180)
2025-03-29 [email protected] [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998)
2025-03-28 [email protected] Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744)
2025-03-28 [email protected] Started clamping scaled antialias lines size (flutter/flutter#166149)
2025-03-28 [email protected] Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162)
2025-03-28 [email protected] Remove bringup flag for customer tests (flutter/flutter#166161)
2025-03-28 [email protected] Add the ios-reviewers review team (flutter/flutter#166034)
2025-03-28 [email protected] [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035)
2025-03-28 [email protected] [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924)
2025-03-28 [email protected] Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681)
2025-03-28 [email protected] [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520)
2025-03-28 [email protected] [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324)
2025-03-28 [email protected] [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091)
2025-03-28 [email protected] Mark Linux coverage as bringup (flutter/flutter#166144)
2025-03-28 [email protected] Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136)
2025-03-28 [email protected] [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938)
2025-03-28 [email protected] [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409)
2025-03-28 [email protected] Delete some verbose vm service logging (flutter/flutter#162709)
2025-03-28 [email protected] Get analytics welcome message under test (flutter/flutter#162627)
2025-03-28 [email protected] [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080)
2025-03-28 [email protected] Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111)
2025-03-28 [email protected] [CI] remove check for exact golden files. (flutter/flutter#166031)
2025-03-28 [email protected] Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025)
2025-03-27 [email protected] [android] only release background image readers on Android 14. (flutter/flutter#165942)
2025-03-27 [email protected] Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972)
2025-03-27 [email protected] Mark Linux customer tests as flaky (flutter/flutter#166103)
2025-03-27 [email protected] Move app link settings task configuration to kotlin (flutter/flutter#165819)
2025-03-27 [email protected] Make iOS Flutter framework extension-safe (flutter/flutter#165346)
2025-03-27 [email protected] [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005)
2025-03-27 [email protected] Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395)
2025-03-27 [email protected] add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096)
2025-03-27 [email protected] Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077)
2025-03-27 [email protected] Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060)
2025-03-27 [email protected] [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940)
2025-03-27 [email protected] Scale aa lines (flutter/flutter#165917)
2025-03-27 [email protected] Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059)
2025-03-27 [email protected] Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055)
2025-03-27 [email protected] Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046)
2025-03-27 [email protected] [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299)
...
zhangyuang pushed a commit to zhangyuang/flutter-fork that referenced this pull request Jun 9, 2025
…flutter#165998)

Fixes flutter#165959

Flame uses a lot of individual calls to drawImageRect w/ blend color
filters to color the sprites. This is much slower with Impeller today,
because we convert this into:

```
saveLayer(color filter)
drawImageRect
restore
```

Instead, we can detect this case and convert to a call to drawAtlas.
drawAtlas will use the porter-duff shader which removes the saveLayer
entirely. We could do this optimization while recording, but for now its
fine to do in dispatch.

We do have a snapshot optimization that catches "normal" image usage,
but it doesn't apply in the flame case as the source rects are sampling
from a larger texture and we don't have a way to pass those through the
snapshot system.

## Before

<img
src="https://github.com/user-attachments/assets/faada042-843f-4f15-af20-9baf862f66fd"
width="200"/>


## After

<img
src="https://github.com/user-attachments/assets/c83e061c-190f-4613-a725-88e16b776c04"
width="200"/>

---------

Co-authored-by: gaaclarke <[email protected]>
FMorschel pushed a commit to FMorschel/packages that referenced this pull request Jun 9, 2025
…8960)

Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions)

Manual roll requested by [email protected]

flutter/flutter@1d954f4...05b5e79

2025-03-29 [email protected] Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202)
2025-03-29 [email protected] Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189)
2025-03-29 [email protected] Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185)
2025-03-29 [email protected] [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120)
2025-03-29 [email protected] Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181)
2025-03-29 [email protected] move around shaders in vertices uber 1/2 (flutter/flutter#166180)
2025-03-29 [email protected] [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998)
2025-03-28 [email protected] Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744)
2025-03-28 [email protected] Started clamping scaled antialias lines size (flutter/flutter#166149)
2025-03-28 [email protected] Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162)
2025-03-28 [email protected] Remove bringup flag for customer tests (flutter/flutter#166161)
2025-03-28 [email protected] Add the ios-reviewers review team (flutter/flutter#166034)
2025-03-28 [email protected] [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035)
2025-03-28 [email protected] [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924)
2025-03-28 [email protected] Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681)
2025-03-28 [email protected] [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520)
2025-03-28 [email protected] [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324)
2025-03-28 [email protected] [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091)
2025-03-28 [email protected] Mark Linux coverage as bringup (flutter/flutter#166144)
2025-03-28 [email protected] Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136)
2025-03-28 [email protected] [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938)
2025-03-28 [email protected] [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409)
2025-03-28 [email protected] Delete some verbose vm service logging (flutter/flutter#162709)
2025-03-28 [email protected] Get analytics welcome message under test (flutter/flutter#162627)
2025-03-28 [email protected] [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080)
2025-03-28 [email protected] Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111)
2025-03-28 [email protected] [CI] remove check for exact golden files. (flutter/flutter#166031)
2025-03-28 [email protected] Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025)
2025-03-27 [email protected] [android] only release background image readers on Android 14. (flutter/flutter#165942)
2025-03-27 [email protected] Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972)
2025-03-27 [email protected] Mark Linux customer tests as flaky (flutter/flutter#166103)
2025-03-27 [email protected] Move app link settings task configuration to kotlin (flutter/flutter#165819)
2025-03-27 [email protected] Make iOS Flutter framework extension-safe (flutter/flutter#165346)
2025-03-27 [email protected] [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005)
2025-03-27 [email protected] Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395)
2025-03-27 [email protected] add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096)
2025-03-27 [email protected] Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077)
2025-03-27 [email protected] Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060)
2025-03-27 [email protected] [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940)
2025-03-27 [email protected] Scale aa lines (flutter/flutter#165917)
2025-03-27 [email protected] Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059)
2025-03-27 [email protected] Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055)
2025-03-27 [email protected] Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046)
2025-03-27 [email protected] [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299)
...
romanejaquez pushed a commit to romanejaquez/flutter that referenced this pull request Aug 14, 2025
…flutter#165998)

Fixes flutter#165959

Flame uses a lot of individual calls to drawImageRect w/ blend color
filters to color the sprites. This is much slower with Impeller today,
because we convert this into:

```
saveLayer(color filter)
drawImageRect
restore
```

Instead, we can detect this case and convert to a call to drawAtlas.
drawAtlas will use the porter-duff shader which removes the saveLayer
entirely. We could do this optimization while recording, but for now its
fine to do in dispatch.

We do have a snapshot optimization that catches "normal" image usage,
but it doesn't apply in the flame case as the source rects are sampling
from a larger texture and we don't have a way to pass those through the
snapshot system.

## Before

<img
src="https://github.com/user-attachments/assets/faada042-843f-4f15-af20-9baf862f66fd"
width="200"/>


## After

<img
src="https://github.com/user-attachments/assets/c83e061c-190f-4613-a725-88e16b776c04"
width="200"/>

---------

Co-authored-by: gaaclarke <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

e: impeller Impeller rendering backend issues and features requests engine flutter/engine related. See also e: labels. will affect goldens Changes to golden files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Severe performance degradation of drawImageRect

2 participants