Skip to content

Conversation

@flar
Copy link
Contributor

@flar flar commented Aug 29, 2025

Fixes #174579

Vertex lists for stroked rects were fixed by being more careful about the creation of the vertices so that they have no inherent overdraw. These operations continue to use the fastest kNormal vertex mode but no longer create rendering artifacts due to multiple triangles covering the same area.

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

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request addresses an overdraw issue in DrawRect geometry for stroked rectangles. For Bevel and Miter joins, the vertex generation has been updated to create geometry without inherent overdraw, and a special case has been added for thick strokes that collapse on themselves. For Round joins, the geometry is now flagged to use the pipeline's overdraw prevention, which fixes the visual artifact at a performance cost as noted. New tests are included to verify the rendering of wide stroked rectangles.

@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 #174735 at sha f2d7718

@flutter-dashboard flutter-dashboard bot added the will affect goldens Changes to golden files label Aug 30, 2025
@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 #174735 at sha 40ed227

@flar
Copy link
Contributor Author

flar commented Aug 31, 2025

All tests passed and the goldens for the new tests look correct (no overdraw anomalies that I could see). This PR is ready for review now.

@flar flar requested review from chinmaygarde and gaaclarke August 31, 2025 23:53
@flar flar changed the title [Impeller] Fix overdraw in Impeller DrawRect geomtry [Impeller] Fix overdraw in Impeller DrawRect geometry Sep 2, 2025
@flar flar changed the title [Impeller] Fix overdraw in Impeller DrawRect geometry [Impeller] Fix overdraw in DrawRect geometry Sep 2, 2025
@flar
Copy link
Contributor Author

flar commented Sep 2, 2025

ping @gaaclarke @chinmaygarde

// Most(all?) of our geometry is produced in full with an explicit mode
// specified in the returned GeometryResult, but just in case we missed
// a case, the safest mode to return here is kPreventOverdraw.
return GeometryResult::Mode::kPreventOverdraw;
Copy link
Member

Choose a reason for hiding this comment

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

I may be missing something obvious. But this should no longer be necessary now right?

Copy link
Member

Choose a reason for hiding this comment

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

My reading of "PreventOverdraw" is "there may be overlapping triangles produced by this geometry but I want you to render them as though there aren't". The fix for the linked issue is either to just specify this result mode, or not produce any overlapping trianges. Not both I'd think.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

In case anyone adds a new case somewhere that isn't explicitly tagged, I wanted to make sure that we returned the safest option.

This "you can specify it if you want, the default is the one that is least safe but fastest, or you can return it from a method and some of our code might fill it in for you" spectrum of how this Mode is handled can be confusing and I don't think we are doing anyone any maintenance favors by having all of the defaults be "do it the fastest you can and don't worry about the consequences"...?

Copy link
Member

Choose a reason for hiding this comment

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

Put another way, I bet the test passes if you only specify this and literally nothing else. So, why not just specify this for simplicity. As I understand, this specification forces a slower path to account for overlaps.

Or am I just mistaken?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It also runs 50% slower.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

kPreventOverdraw isn't magic. It costs - a lot.

Copy link
Member

Choose a reason for hiding this comment

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

Yeah, so why specify that as the default on the off chance we missed some edge case.

Copy link
Member

Choose a reason for hiding this comment

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

Oh poop, I missed the spot where you explicitly set the mode to be normal for the known fast cases.

I take it that its by far the most common case? If so, all good 😊

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It's not just the most common case, it never falls through. I removed it for now, but I don't like the entire design of this API that assumes things that have consequences that aren't immediately obvious and we construct an entire operation.

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

vertex_count * sizeof(Point), alignof(Point),
[hsw = half_stroke_width, &rect, vertex_count,
&trigs](uint8_t* buffer) {
[hsw = half_stroke_width, &rect, vertex_count, &trigs,
Copy link
Member

Choose a reason for hiding this comment

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

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not going to change this. The following code would become unreadable and unmaintainable.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

However, a name should not distract the reader by repeating information that's present in the immediate context. Generally, this means that descriptiveness should be proportional to the name's scope of visibility.

hsw has a short scope of visibility and is defined in the calls of each of these lambdas. It also keeps the coordinate equations well-aligned and balanced.

Scalar right = rect.GetRight();
Scalar bottom = rect.GetBottom();
auto vertices = reinterpret_cast<Point*>(buffer);
// Zig-zag pattern: UL, UR, LL, LR
Copy link
Member

Choose a reason for hiding this comment

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

Upper-left, upper-right, lower-left, lower-right?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes.

Copy link
Member

Choose a reason for hiding this comment

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

Please, update the comment to avoid these abbreviations.

Copy link
Member

@chinmaygarde chinmaygarde left a comment

Choose a reason for hiding this comment

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

Sorry about the confusion regarding overlap content mode in the default case.

I can totally empathize with the argument that we should fall back to a known safe but slow technique in case we missed something. OTOH, if we missed something, I'd rather folks report it to us as a bug instead of a mysterious performance issue that we'd have a harder time tracking down. Right now, I don't think there are cases we know we will miss. So I don't want to introduce a potential performance cliff.

Perhaps @gaaclarke has a different take but the current state of the patch without the fallback lgtm.

@gaaclarke
Copy link
Member

Perhaps @gaaclarke has a different take but the current state of the patch without the fallback lgtm.

I'm not as familiar as you guys are with the ramifications of using different GeometryResult::Mode values. LGTM.

@chinmaygarde
Copy link
Member

chinmaygarde commented Sep 2, 2025

The gist of it is that strokes that overlap but also have a translucent stroke color will look weird where they overlap. I'll need to lookup the technique used to render them right but the a solid stroke is rendered offscreen and composited with the alpha component onscreen. Hence the slowness.

@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 #174735 at sha f32d65a

@chinmaygarde
Copy link
Member

Looks like the golden diffs are for the test cases you added 🎉

@flar flar added the autosubmit Merge PR when tree becomes green via auto submit App label Sep 2, 2025
@auto-submit auto-submit bot added this pull request to the merge queue Sep 2, 2025
Merged via the queue into flutter:master with commit dbe229e Sep 3, 2025
183 of 184 checks passed
@flutter-dashboard flutter-dashboard bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Sep 3, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Sep 3, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Sep 3, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Sep 3, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Sep 4, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Sep 4, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Sep 4, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Sep 4, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Sep 5, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Sep 5, 2025
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Sep 5, 2025
Roll Flutter from 6b18740d5a23 to 87d5b753196c (88 revisions)

flutter/flutter@6b18740...87d5b75

2025-09-05 [email protected] [ Device Lab ] Add regression testing for flutter/flutter#174952 (flutter/flutter#174956)
2025-09-05 [email protected] Roll Skia from 0ca53adfc6cc to 845ec125e94c (2 revisions) (flutter/flutter#174978)
2025-09-05 [email protected] [a11y-app] Fix NavigationRail leading and trailing labels (flutter/flutter#174861)
2025-09-05 [email protected] Roll Skia from d7e99be07d5d to 0ca53adfc6cc (5 revisions) (flutter/flutter#174972)
2025-09-05 [email protected] Roll Fuchsia Linux SDK from izfNA3o_2zL4Cjqmy... to xG_uERsxHvUwFHpF2... (flutter/flutter#174970)
2025-09-04 [email protected] Fix IconButton.color overrided by IconButtomTheme (flutter/flutter#174515)
2025-09-04 [email protected] [web] Reuse chrome instance to run all flutter tests (flutter/flutter#174957)
2025-09-04 [email protected] fix(Semantics): Ensure semantics properties take priority over button's (flutter/flutter#174473)
2025-09-04 [email protected] Make every LLDB Init error message actionable (flutter/flutter#174726)
2025-09-04 [email protected] Fix table cell semantics rect alignment issues.  (flutter/flutter#174914)
2025-09-04 [email protected] Fix: Use route navigator for CupertinoSheetRoute pop (flutter/flutter#173103)
2025-09-04 [email protected] [ Widget Preview] Add `group` property to `Preview` (flutter/flutter#174849)
2025-09-04 [email protected] Allow OverlayPortal.overlayChildLayoutBuilder to choose root Overlay (flutter/flutter#174239)
2025-09-04 [email protected] Roll Skia from 7c2f502e3304 to d7e99be07d5d (18 revisions) (flutter/flutter#174936)
2025-09-04 [email protected] Remove 'terms of use' wording from web_unicode (flutter/flutter#174939)
2025-09-04 [email protected] [ Tool ] Remove leftover Android x86 deprecation warning constant (flutter/flutter#174941)
2025-09-04 [email protected] Prevent potential crash when accessing window in FlutterSceneDelegate (flutter/flutter#174873)
2025-09-04 [email protected] Roll Packages from 42bb347 to 98580c6 (5 revisions) (flutter/flutter#174943)
2025-09-04 [email protected] [ Device Lab ] Fix wakefulness check to only match log entries with string values (flutter/flutter#174953)
2025-09-04 [email protected] Fix expanded DropdownMenu panel is shorter than text field (flutter/flutter#174443)
2025-09-04 [email protected] Add a `viewController` property to the ios/macOS `FlutterPluginRegistrar` protocol  (flutter/flutter#174168)
2025-09-03 [email protected] Roll Fuchsia Linux SDK from J3T_wZqL_57mRfWky... to izfNA3o_2zL4Cjqmy... (flutter/flutter#174908)
2025-09-03 [email protected] Wires up Android API to set section locale (flutter/flutter#173364)
2025-09-03 [email protected] Delete impeller::SPrintF. (flutter/flutter#174900)
2025-09-03 [email protected] Make sure that a DropdownMenuFormField doesn't crash in 0x0 environment (flutter/flutter#174777)
2025-09-03 [email protected] Remove unnecessary `presubmit_max_attempts` from .ci.yaml (flutter/flutter#174885)
2025-09-03 [email protected] Use local canvaskit in `dart_data_asset_test.dart` (flutter/flutter#174891)
2025-09-03 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Mark Linux web_canvaskit_tests_7_last as bringup (#174878)" (flutter/flutter#174897)
2025-09-03 [email protected] Correct intrinsics calculation for CupertinoTextField with placeholder (flutter/flutter#174889)
2025-09-03 [email protected] Considers large title height in CupertinoNavigationBar's preferred size (flutter/flutter#173722)
2025-09-03 [email protected] [A11y] Add semantics for CupertinoExpansionTile (flutter/flutter#174480)
2025-09-03 [email protected] Fix LinearProgressIndicator track painting. (flutter/flutter#173108)
2025-09-03 [email protected] update triage documentation to include team-android (flutter/flutter#174850)
2025-09-03 [email protected] Update `test_timeout_secs` to match `timeout` for `Linux web_skwasm_tests_*` and `Linux web_canvaskit_tests_*` (flutter/flutter#174881)
2025-09-03 [email protected] Roll Packages from 5d785a0 to 42bb347 (10 revisions) (flutter/flutter#174876)
2025-09-03 [email protected] Fixup formatting of gn files in the old buildroot. (flutter/flutter#174852)
2025-09-03 [email protected] Roll Dart SDK to 3.10.0-162.1.beta (flutter/flutter#174834)
2025-09-03 [email protected] Mark Linux web_canvaskit_tests_7_last as bringup (flutter/flutter#174878)
2025-09-02 [email protected] [Impeller] Fix overdraw in DrawRect geometry (flutter/flutter#174735)
2025-09-02 [email protected] Patch .clang-format files to specify C++20. (flutter/flutter#174848)
2025-09-02 [email protected] Add data assets (flutter/flutter#174685)
2025-09-02 [email protected] refactors `FlutterPlugin.kt` to use one line statement in the `into` bloc (flutter/flutter#174759)
2025-09-02 [email protected] Ensures initial semantics state is sent to engine (flutter/flutter#174845)
2025-09-02 [email protected] [Android] Break up plugin_test integration tests (flutter/flutter#174728)
2025-09-02 [email protected] Fix: Assertion failure in RawScrollbarState with dynamic controller assignment (flutter/flutter#173156)
2025-09-02 [email protected] Roll Skia from 359f3d7cc7ed to 7c2f502e3304 (1 revision) (flutter/flutter#174844)
...
mboetger pushed a commit to mboetger/flutter that referenced this pull request Sep 18, 2025
Fixes flutter#174579

Vertex lists for stroked rects were fixed by being more careful about
the creation of the vertices so that they have no inherent overdraw.
These operations continue to use the fastest kNormal vertex mode but no
longer create rendering artifacts due to multiple triangles covering the
same area.
Jaineel-Mamtora pushed a commit to Jaineel-Mamtora/flutter_forked that referenced this pull request Sep 24, 2025
Fixes flutter#174579

Vertex lists for stroked rects were fixed by being more careful about
the creation of the vertices so that they have no inherent overdraw.
These operations continue to use the fastest kNormal vertex mode but no
longer create rendering artifacts due to multiple triangles covering the
same area.
danferreira pushed a commit to danferreira/packages that referenced this pull request Oct 22, 2025
…r#9962)

Roll Flutter from 6b18740d5a23 to 87d5b753196c (88 revisions)

flutter/flutter@6b18740...87d5b75

2025-09-05 [email protected] [ Device Lab ] Add regression testing for flutter/flutter#174952 (flutter/flutter#174956)
2025-09-05 [email protected] Roll Skia from 0ca53adfc6cc to 845ec125e94c (2 revisions) (flutter/flutter#174978)
2025-09-05 [email protected] [a11y-app] Fix NavigationRail leading and trailing labels (flutter/flutter#174861)
2025-09-05 [email protected] Roll Skia from d7e99be07d5d to 0ca53adfc6cc (5 revisions) (flutter/flutter#174972)
2025-09-05 [email protected] Roll Fuchsia Linux SDK from izfNA3o_2zL4Cjqmy... to xG_uERsxHvUwFHpF2... (flutter/flutter#174970)
2025-09-04 [email protected] Fix IconButton.color overrided by IconButtomTheme (flutter/flutter#174515)
2025-09-04 [email protected] [web] Reuse chrome instance to run all flutter tests (flutter/flutter#174957)
2025-09-04 [email protected] fix(Semantics): Ensure semantics properties take priority over button's (flutter/flutter#174473)
2025-09-04 [email protected] Make every LLDB Init error message actionable (flutter/flutter#174726)
2025-09-04 [email protected] Fix table cell semantics rect alignment issues.  (flutter/flutter#174914)
2025-09-04 [email protected] Fix: Use route navigator for CupertinoSheetRoute pop (flutter/flutter#173103)
2025-09-04 [email protected] [ Widget Preview] Add `group` property to `Preview` (flutter/flutter#174849)
2025-09-04 [email protected] Allow OverlayPortal.overlayChildLayoutBuilder to choose root Overlay (flutter/flutter#174239)
2025-09-04 [email protected] Roll Skia from 7c2f502e3304 to d7e99be07d5d (18 revisions) (flutter/flutter#174936)
2025-09-04 [email protected] Remove 'terms of use' wording from web_unicode (flutter/flutter#174939)
2025-09-04 [email protected] [ Tool ] Remove leftover Android x86 deprecation warning constant (flutter/flutter#174941)
2025-09-04 [email protected] Prevent potential crash when accessing window in FlutterSceneDelegate (flutter/flutter#174873)
2025-09-04 [email protected] Roll Packages from 42bb347 to 98580c6 (5 revisions) (flutter/flutter#174943)
2025-09-04 [email protected] [ Device Lab ] Fix wakefulness check to only match log entries with string values (flutter/flutter#174953)
2025-09-04 [email protected] Fix expanded DropdownMenu panel is shorter than text field (flutter/flutter#174443)
2025-09-04 [email protected] Add a `viewController` property to the ios/macOS `FlutterPluginRegistrar` protocol  (flutter/flutter#174168)
2025-09-03 [email protected] Roll Fuchsia Linux SDK from J3T_wZqL_57mRfWky... to izfNA3o_2zL4Cjqmy... (flutter/flutter#174908)
2025-09-03 [email protected] Wires up Android API to set section locale (flutter/flutter#173364)
2025-09-03 [email protected] Delete impeller::SPrintF. (flutter/flutter#174900)
2025-09-03 [email protected] Make sure that a DropdownMenuFormField doesn't crash in 0x0 environment (flutter/flutter#174777)
2025-09-03 [email protected] Remove unnecessary `presubmit_max_attempts` from .ci.yaml (flutter/flutter#174885)
2025-09-03 [email protected] Use local canvaskit in `dart_data_asset_test.dart` (flutter/flutter#174891)
2025-09-03 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Mark Linux web_canvaskit_tests_7_last as bringup (#174878)" (flutter/flutter#174897)
2025-09-03 [email protected] Correct intrinsics calculation for CupertinoTextField with placeholder (flutter/flutter#174889)
2025-09-03 [email protected] Considers large title height in CupertinoNavigationBar's preferred size (flutter/flutter#173722)
2025-09-03 [email protected] [A11y] Add semantics for CupertinoExpansionTile (flutter/flutter#174480)
2025-09-03 [email protected] Fix LinearProgressIndicator track painting. (flutter/flutter#173108)
2025-09-03 [email protected] update triage documentation to include team-android (flutter/flutter#174850)
2025-09-03 [email protected] Update `test_timeout_secs` to match `timeout` for `Linux web_skwasm_tests_*` and `Linux web_canvaskit_tests_*` (flutter/flutter#174881)
2025-09-03 [email protected] Roll Packages from 5d785a0 to 42bb347 (10 revisions) (flutter/flutter#174876)
2025-09-03 [email protected] Fixup formatting of gn files in the old buildroot. (flutter/flutter#174852)
2025-09-03 [email protected] Roll Dart SDK to 3.10.0-162.1.beta (flutter/flutter#174834)
2025-09-03 [email protected] Mark Linux web_canvaskit_tests_7_last as bringup (flutter/flutter#174878)
2025-09-02 [email protected] [Impeller] Fix overdraw in DrawRect geometry (flutter/flutter#174735)
2025-09-02 [email protected] Patch .clang-format files to specify C++20. (flutter/flutter#174848)
2025-09-02 [email protected] Add data assets (flutter/flutter#174685)
2025-09-02 [email protected] refactors `FlutterPlugin.kt` to use one line statement in the `into` bloc (flutter/flutter#174759)
2025-09-02 [email protected] Ensures initial semantics state is sent to engine (flutter/flutter#174845)
2025-09-02 [email protected] [Android] Break up plugin_test integration tests (flutter/flutter#174728)
2025-09-02 [email protected] Fix: Assertion failure in RawScrollbarState with dynamic controller assignment (flutter/flutter#173156)
2025-09-02 [email protected] Roll Skia from 359f3d7cc7ed to 7c2f502e3304 (1 revision) (flutter/flutter#174844)
...
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Nov 12, 2025
lucaantonelli pushed a commit to lucaantonelli/flutter that referenced this pull request Nov 21, 2025
Fixes flutter#174579

Vertex lists for stroked rects were fixed by being more careful about
the creation of the vertices so that they have no inherent overdraw.
These operations continue to use the fastest kNormal vertex mode but no
longer create rendering artifacts due to multiple triangles covering the
same area.
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.

[iOS]: Paint not rendering correctly in 3.35.x

3 participants