[viz] Add a feature to return overlays without frame production

On platforms with delegated compositing, tiles (for instance) are passed
to the display compositor to handle compositing itself. However, by the
time we are swapping to frame N, the tiles of frame N-1 have likely not
been released by the display compositor, since it would need them to
produce a frame if something else happens on screen (outside of
Chromium) at the next VSync.

To make sure that we release resources, we will check these overlays
again when frame N+1, N+2, etc. are swapped, and then we eventually
release the overlays, returning exported resources to the client.

This breaks down... where there is no frame N+1. While this may sound
like a corner case, it happens in practice locally with the browser UI
compositor, which can spend a lot of time without producing a new frame,
or a page with an animation that stops.

On macOS, for a simple page with a large non-looping GIF, this wastes
~30MiB of memory, since tiles for the second to last frame are retained
service-side (because we don't check). Similar cases would happen with
e.g. a fade-in animation, ads with non-repeating animations, or a page
with layout changes during loading (since its tiles would be entirely
dirty). It may also happen with PDF scrolling, since the way we
currently render creates a new set of tiles for each frame. The same
test case shows ~9MiB of memory lost this way for the browser UI
compositor.

This CL fixes the issue by checking 1s later whether the overlays are
still in use, and returning the resources to the client.

Bug: 1503162
Change-Id: I8bffb20aacdbfaa3a17c044d50ca9387dcdef391
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5038622
Reviewed-by: ccameron chromium <ccameron@chromium.org>
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1254431}
14 files changed
tree: c66201bf72e7f1e9fd856a18a2d5ec2d639f724e
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  32. native_client_sdk/
  33. net/
  34. pdf/
  35. ppapi/
  36. printing/
  37. remoting/
  38. rlz/
  39. sandbox/
  40. services/
  41. skia/
  42. sql/
  43. storage/
  44. styleguide/
  45. testing/
  46. third_party/
  47. tools/
  48. ui/
  49. url/
  50. webkit/
  51. .clang-format
  52. .clang-tidy
  53. .clangd
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitallowed
  57. .gitattributes
  58. .gitignore
  59. .gitmodules
  60. .gn
  61. .mailmap
  62. .rustfmt.toml
  63. .vpython3
  64. .yapfignore
  65. ATL_OWNERS
  66. AUTHORS
  67. BUILD.gn
  68. CODE_OF_CONDUCT.md
  69. codereview.settings
  70. DEPS
  71. DIR_METADATA
  72. LICENSE
  73. LICENSE.chromium_os
  74. OWNERS
  75. PRESUBMIT.py
  76. PRESUBMIT_test.py
  77. PRESUBMIT_test_mocks.py
  78. README.md
  79. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure.

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.