-
Notifications
You must be signed in to change notification settings - Fork 6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Impeller] Implement draw order optimization. #54067
Conversation
// Enable depth writing for all opaque entities in order to allow | ||
// reordering. Opaque entities are coerced to source blending by | ||
// `EntityPass::AddEntity`. | ||
options.depth_write_enabled = options.blend_mode == BlendMode::kSource; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here's where depth writing gets turned on for all opaque draws.
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. |
a6fdabe
to
d918b47
Compare
I think the remaining goldens are stuck on the previous revision. Can't repro the |
Golden file changes are available for triage from new commit, Click here to view. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Youve got some golden diffs that look unexpected. beyond that - if we forget to update the depth write somewhere is that going to lead to visual bugs? For example filters, runtime effect, et cetera?
/// are order independent, and so we draw them optimally render these | ||
/// elements in reverse painter's order so that they cull one another |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// are order independent, and so we draw them optimally render these | |
/// elements in reverse painter's order so that they cull one another | |
/// are order independent, and so we draw them optimally in reverse painter's order so that they cull one another |
sentence seems weird
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed.
/// The list of backdrop-dependent elements with respect to this draw | ||
/// order layer. These elements are drawn after all of the independent | ||
/// elements. | ||
/// The elements of all child draw layers will be resolved to this list. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The elements of all child draw layers will be resolved to this list
What does this mean?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Meant to say child clips. Removed, it's redundant anyway.
Golden file changes are available for triage from new commit, Click here to view. |
Yes. Color sources are taken care of and filters are considered translucent by default. The corner cases were with stuff like backdrop filters/restores, the advanced blend fallback path, filters that return an |
41309b8
to
d874c32
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RuntimeEffect?
ElementIterator element_iterator; | ||
|
||
if (renderer.GetDeviceCapabilities().SupportsFramebufferFetch()) { | ||
element_iterator = |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this should be fairly straightforward to port to experimental canvas, but we'd need to be able to configure the dispatch behavior.
We'd need to dispatch (per save Layer) once backwards through the draws for backdrop independent elements, and once forward pass for backdrop dependent elements,
FYI @flar
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The storage buffer is not bidirectionally traversable for a couple of reasons
- it is packed rather than indexed with offsets between elements
- if we created an index, much of the state data is recorded incrementally
- this includes transform, clips, paint attributes
The entities are not incremental for any state, they hold all of their state in absolute terms so it is easy to go forwards/backwards or even to just visit a single entity in isolation.
There is a bit of redesign that would have to happen to make that work.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
bidirection iteration isn't strictly necessary, another approach would be to only iterate forwards and record the internal offsets, then allow redispatching a subset of them.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I should have said "... bidirectional, or even random access dispatching ...". Note the second bullet point starts with "If we created an index" meaning that isn't enough to get us where we need to be for this technique...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We might not want to expose that as "here you go save some pointers and offsets", but since the recorded structure is immutable-ish I'd imagine there is a safe interface we could build for that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We might be able to get away with a list of structures containing:
- buffer offset of op
- fully populated Paint representing the attribute state at that offset
- impeller::Matrix representing the fully composed transform at that offset
- (clip stuff??)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure what clip stuff we'd need. Probably whatever the DrawOrder optimizer here is recording.
Yup this is covered. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
…r if no flushes have occurred yet
reason for revert: disappearing fabs and background color in framework golden tests https://flutter-gold.skia.org/search?issue=152354&crs=github&patchsets=2&corpus=flutter |
This reverts commit 1df62d3.
) Reverts: #54067 Initiated by: jonahwilliams Reason for reverting: disappearing fabs and background color in framework golden tests https://flutter-gold.skia.org/search?issue=152354&crs=github&patchsets=2&corpus=flutter Original PR Author: bdero Reviewed By: {jonahwilliams} This change reverts the following previous change: For each clip scope, draw opaque items in reverse order and translucent/backdrop-independent items in their original order afterwards. Clips are treated as translucent by the parent scope. Respects clips, subpass collapse, and the clear color optimization. ### Local new_gallery before/after (iPhone 12 mini): ``` cd ~/projects/flutter/flutter/dev/integration_tests/new_gallery flutter drive --profile --local-engine-src-path ~/projects/flutter/engine/src --local-engine=ios_profile --local-engine-host=host_profile_arm64 --trace-startup -t test_driver/transitions_perf.dart -d 00008101-000A59A93C10001E ``` 
…ions) (#152379) Manual roll requested by zra@google.com flutter/engine@8714b54...342a425 2024-07-26 98614782+auto-submit[bot]@users.noreply.github.com Reverts "[Impeller] Implement draw order optimization. (#54067)" (flutter/engine#54136) 2024-07-26 skia-flutter-autoroll@skia.org Roll Skia from 06b26a1d51d7 to cd892b576ade (1 revision) (flutter/engine#54134) 2024-07-26 chinmaygarde@google.com Directly use 4x4 matrices with surface textures instead of converting to and from the 3x3 variants. (flutter/engine#54126) 2024-07-26 skia-flutter-autoroll@skia.org Roll Skia from e9b8585af6b5 to 06b26a1d51d7 (1 revision) (flutter/engine#54132) 2024-07-26 bdero@google.com [Impeller] Implement draw order optimization. (flutter/engine#54067) 2024-07-26 skia-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from clqtZA8cx4GEXwcOe... to dUCMHqU6ihfIFKAw8... (flutter/engine#54130) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Please CC jonahwilliams@google.com,rmistry@google.com,zra@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Original PR: flutter#54136 Revert PR: flutter#54067
Original PR: flutter#54136 Revert PR: flutter#54067
…" (#54261) Reverts: #54215 Initiated by: bdero Reason for reverting: Causing golden diffs in framework roll https://flutter-gold.skia.org/search?issue=152633&crs=github&patchsets=2&corpus=flutter Original PR Author: bdero Reviewed By: {jonahwilliams} This change reverts the following previous change: Original PR: #54136 Revert PR: #54067 Includes fixes for issue seen in [these goldens](https://flutter-gold.skia.org/search?issue=152354&crs=github&patchsets=2&corpus=flutter). The problem was that the scissor was ending up wrong after clip replay for opaque draws that are supposed to occur outside the parent clip scope(s). To fix it, I made clip replay draws as well as the subpass texture draw apply lazily. For the clip replay, there's no need to apply a given clip until we come across an entity that has a depth less than or equal to the clip. And for the subpass texture (which is often translucent), we can defer drawing it until we come across another translucent draw. Deferring the subpass texture is important because if we draw it immediately, then all of the replay clips need to be drawn immediately too. ## Description For each clip scope, draw opaque items in reverse order and translucent/backdrop-independent items in their original order afterwards. Clips are treated as translucent by the parent scope. Respects clips, subpass collapse, and the clear color optimization. ### Local new_gallery before/after (iPhone 12 mini): ``` cd ~/projects/flutter/flutter/dev/integration_tests/new_gallery flutter drive --profile --local-engine-src-path ~/projects/flutter/engine/src --local-engine=ios_profile --local-engine-host=host_profile_arm64 --trace-startup -t test_driver/transitions_perf.dart -d 00008101-000A59A93C10001E ``` 
Original PR: flutter#54136 Revert PR: flutter#54067
This time for sure! For each clip scope, draw opaque items in reverse order and translucent/backdrop-independent items in their original order afterwards. Clips are treated as translucent by the parent scope. Respects clips, subpass collapse, and the clear color optimization. Attempt 1: #54136 Revert 1: #54067 Attempt 2: #54215 Revert 2: #54261
…ions) (flutter#152379) Manual roll requested by zra@google.com flutter/engine@8714b54...342a425 2024-07-26 98614782+auto-submit[bot]@users.noreply.github.com Reverts "[Impeller] Implement draw order optimization. (flutter#54067)" (flutter/engine#54136) 2024-07-26 skia-flutter-autoroll@skia.org Roll Skia from 06b26a1d51d7 to cd892b576ade (1 revision) (flutter/engine#54134) 2024-07-26 chinmaygarde@google.com Directly use 4x4 matrices with surface textures instead of converting to and from the 3x3 variants. (flutter/engine#54126) 2024-07-26 skia-flutter-autoroll@skia.org Roll Skia from e9b8585af6b5 to 06b26a1d51d7 (1 revision) (flutter/engine#54132) 2024-07-26 bdero@google.com [Impeller] Implement draw order optimization. (flutter/engine#54067) 2024-07-26 skia-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from clqtZA8cx4GEXwcOe... to dUCMHqU6ihfIFKAw8... (flutter/engine#54130) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Please CC jonahwilliams@google.com,rmistry@google.com,zra@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…ions) (flutter#152379) Manual roll requested by zra@google.com flutter/engine@8714b54...342a425 2024-07-26 98614782+auto-submit[bot]@users.noreply.github.com Reverts "[Impeller] Implement draw order optimization. (flutter#54067)" (flutter/engine#54136) 2024-07-26 skia-flutter-autoroll@skia.org Roll Skia from 06b26a1d51d7 to cd892b576ade (1 revision) (flutter/engine#54134) 2024-07-26 chinmaygarde@google.com Directly use 4x4 matrices with surface textures instead of converting to and from the 3x3 variants. (flutter/engine#54126) 2024-07-26 skia-flutter-autoroll@skia.org Roll Skia from e9b8585af6b5 to 06b26a1d51d7 (1 revision) (flutter/engine#54132) 2024-07-26 bdero@google.com [Impeller] Implement draw order optimization. (flutter/engine#54067) 2024-07-26 skia-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from clqtZA8cx4GEXwcOe... to dUCMHqU6ihfIFKAw8... (flutter/engine#54130) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Please CC jonahwilliams@google.com,rmistry@google.com,zra@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
For each clip scope, draw opaque items in reverse order and translucent/backdrop-independent items in their original order afterwards. Clips are treated as translucent by the parent scope.
Respects clips, subpass collapse, and the clear color optimization.
Local new_gallery before/after (iPhone 12 mini):