[cc/tiles] Fix transfer cache entry deletion in GpuImageDecodeCache

The renderer-side GpuImageDecodeCache is referencing GPU process side
memory in the transfer cache. When memory is deleted from it, the
deletion can actually happen much later, since the delete command may
sit in a buffer. A previous commit
(https://chromium-review.googlesource.com/c/chromium/src/+/4704673)
added a "flush" call to make sure that the deletion makes its way to the
GPU process even when no outside event forces it (e.g. a frame commit,
or other memory reclaim action). However, it doesn't work, because it
only flushes "deferred messages" (see GpuChannelHost::InternalFlush()),
but transfer cache entry deletion is a regular command buffer command
(see DeleteTransferCacheEntryINTERNAL()).

This means that we need a shallow command buffer flush to ensure that
deletion commands are actually processed. This has been a longstanding
bug in (at least) GpuImageDecodeCache, impacting
GpuImageDecodeCache::ClearCache() (and its callers), in particular
memory pressure signals processing.

Locally, loading a static page with lots of images, we observe that
prior to this commit, >200MiB can be used by the transfer cache, and not
go away as planned until a new frame is produced. On an ARM64 mac
laptop, this is verified with IOAccelerator memory, which is backing
transfer cache memory GPU-side.

$ vmmap $GPU_PROCESS_PID
[...]
                                VIRTUAL RESIDENT    DIRTY  SWAPPED VOLATILE   NONVOL    EMPTY   REGION
REGION TYPE                        SIZE     SIZE     SIZE     SIZE     SIZE     SIZE     SIZE    COUNT (non-coalesced)
===========                     ======= ========    =====  ======= ========   ======    =====  =======
[...]
IOAccelerator                     22.4M     112K     112K    6880K       0K       0K    15.4M      198

Bug: 1441409
Change-Id: Ib49eb8283ac969fb219a3524ff54ce4715897f3a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4859345
Reviewed-by: Vladimir Levin <vmpstr@chromium.org>
Commit-Queue: Benoit Lize <lizeb@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1195900}
1 file changed
tree: 70838bc0117f79b3c69a72f0e192c4fe873490a3
  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. weblayer/
  52. .clang-format
  53. .clang-tidy
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitattributes
  57. .gitignore
  58. .gitmodules
  59. .gn
  60. .mailmap
  61. .rustfmt.toml
  62. .vpython3
  63. .yapfignore
  64. ATL_OWNERS
  65. AUTHORS
  66. BUILD.gn
  67. CODE_OF_CONDUCT.md
  68. codereview.settings
  69. DEPS
  70. DIR_METADATA
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. 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.