Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Conversation

@knopp
Copy link
Member

@knopp knopp commented Apr 12, 2024

Fixes flutter/flutter#138936

Currently the engine hold a single backbuffer per flutter view layer, which gets swapped with front buffer. This however is too optimistic, as the front buffer in some cases might not get immediately picked up by the compositor. When that happens, during next frame the cache may return a backbuffer that is in fact still being used by the compositor. Rendering to such surface will result in artifacts seen in the video. This seems more likely to happen with busy platform thread. It is also more likely to happen with the presence of "heavy" platform views such as WKWebView.

IOSurface is able to report when it is being used by the compositor (IOSurfaceIsInUse). This PR ensures that the backing store cache never returns surface that is being used by compositor. This may result in transiently keeping more surfaces than before, as the compositor sometimes seems to holds on to the surface longer than it is displayed, but that's preferable outcome to visual glitches.

This PR adds age field to FlutterSurface. When returning buffers to the surface cache (during compositor commit), the age of each surface currently present in cache increases by one, while the newly returned surfaces have their age set to 0.

When returning surfaces from cache, a surface with lowest age that is not in use by compositor is returned.

Surfaces with age that reaches 5 are evicted from the pool. Reaching this age means one of two things:

  • When surface is still in use at age 5 it means the compositor is holding on to it much longer than we expect. In this case just forget about the surface, we can't really do anything about it.
  • When surface is not in use at age 5, it means it hasn't been removed from cache for 4 subsequent frames. That means the cache is holding more surfaces than needed.

Removing all surfaces from cache after idle period remains unchanged.

Before:

flicker-before.mov

After:

drag-after.mov

If you had to change anything in the flutter/tests repo, include a link to the migration guide as per the breaking change policy.

Pre-launch Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I read the Tree Hygiene wiki page, which explains my responsibilities.
  • I read and followed the Flutter Style Guide and the C++, Objective-C, Java style guides.
  • I listed at least one issue that this PR fixes in the description above.
  • I added new tests to check the change I am making or feature I am adding, or the PR is test-exempt. See testing the engine for instructions on writing and running engine tests.
  • I updated/added relevant documentation (doc comments with ///).
  • I signed the CLA.
  • All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel on Discord.

@knopp knopp force-pushed the macos_surface_in_use branch from edf46d3 to e9a9b87 Compare April 12, 2024 18:19
@knopp knopp requested a review from cbracken April 12, 2024 18:48
Copy link
Member

@cbracken cbracken left a comment

Choose a reason for hiding this comment

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

LGTM stamp from a Japanese personal seal

lgtm with one suggestion.

knopp added 2 commits April 17, 2024 13:44
Increase max age to 30 to reduce potential surface allocations and deallocations. age of 30 is still only 500ms at 60 FPS, and there is idle timeout at 1 second which deallocates all surfaces.
@knopp knopp force-pushed the macos_surface_in_use branch from 1fd5c09 to d11e4da Compare April 17, 2024 12:45
@knopp knopp merged commit c81730e into flutter:main Apr 17, 2024
@knopp knopp deleted the macos_surface_in_use branch April 17, 2024 13:23
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 17, 2024
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 17, 2024
auto-submit bot pushed a commit to flutter/flutter that referenced this pull request Apr 17, 2024
…146898)

flutter/engine@25b09e8...818191d

2024-04-17 [email protected] [Impeller] added static check that fragment shader and vertex shaders slots match (flutter/engine#52174)
2024-04-17 [email protected] [macOS] FlutterSurfaceManager should not return surfaces that are in use (flutter/engine#52082)
2024-04-17 [email protected] [macOS] FlutterView should not override platform view cursor (flutter/engine#52159)

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 [email protected],[email protected],[email protected] 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
gilnobrega pushed a commit to gilnobrega/flutter that referenced this pull request Apr 22, 2024
…lutter#146898)

flutter/engine@25b09e8...818191d

2024-04-17 [email protected] [Impeller] added static check that fragment shader and vertex shaders slots match (flutter/engine#52174)
2024-04-17 [email protected] [macOS] FlutterSurfaceManager should not return surfaces that are in use (flutter/engine#52082)
2024-04-17 [email protected] [macOS] FlutterView should not override platform view cursor (flutter/engine#52159)

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 [email protected],[email protected],[email protected] 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
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

macos platformview UI blinking

2 participants