[go: nahoru, domu]

Add cc::CommitState to snapshot state for compositor commit

Currently, compositor commit accesses LayerTreeHost directly from the
impl thread. This is safe because the main thread is blocked during
commit. However, Non-Blocking Commit is a project to eliminate main
thread blocking during commit; so accessing LayerTreeHost from the
impl thread during commit will no longer be safe.

This CL adds struct CommitState, which contains a snapshot of (almost)
all the information from LayerTreeHost needed for compositor commit. A
bunch of member fields are moved out of LayerTreeHost and into
CommitState; and LayerTreeHost gets pending_commit_state_ and
active_commit_state_. pending_commit_state_ is read and written from
the main thread while an animation frame is being prepared.
active_commit_state_ is passed to the impl thread, which uses it to
drive commit; it is only non-null while commit is running.

Broadly speaking, LayerTreeHost data that is used by commit falls into
two categories: attributes that persist from one commit to the next;
and queues that are drained and passed to commit for processing.
CommitState makes this distinction explicit. Rather than copying data
from the pending state to the active state, LTH::ActivateCommitState()
simply swaps pointers; assigns pending_commit_state_ to a new empty
CommitState; and then copies back all persistent fields from the
now-active CommitState.

With this CL, there are still three data sources used during commit
that are not thread safe: the layer tree, the property trees, and
animation state. The strategy for Non-BlockingCommit is to enforce
thread safety for these data by blocking the main thread only at the
point where the main thread needs to modify them. Subsequent CL's will
do that by adding calls to LTH::WaitForCommitCompletion() where
necessary.

Bug: 1237973,1255972
Change-Id: I3e9742e87539632ba1b0a7a13a79ccc5e08df1c7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3228195
Reviewed-by: Khushal <khushalsagar@chromium.org>
Reviewed-by: Jonathan Ross <jonross@chromium.org>
Reviewed-by: vmpstr <vmpstr@chromium.org>
Reviewed-by: enne <enne@chromium.org>
Commit-Queue: Stefan Zager <szager@chromium.org>
Cr-Commit-Position: refs/heads/main@{#936106}
81 files changed
tree: 73ebfa080519d99536fc589d68e83cc15c36ac12
  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. cloud_print/
  13. codelabs/
  14. components/
  15. content/
  16. courgette/
  17. crypto/
  18. dbus/
  19. device/
  20. docs/
  21. extensions/
  22. fuchsia/
  23. gin/
  24. google_apis/
  25. google_update/
  26. gpu/
  27. headless/
  28. infra/
  29. ios/
  30. ipc/
  31. jingle/
  32. media/
  33. mojo/
  34. native_client_sdk/
  35. net/
  36. pdf/
  37. ppapi/
  38. printing/
  39. remoting/
  40. rlz/
  41. sandbox/
  42. services/
  43. skia/
  44. sql/
  45. storage/
  46. styleguide/
  47. testing/
  48. third_party/
  49. tools/
  50. ui/
  51. url/
  52. weblayer/
  53. .clang-format
  54. .clang-tidy
  55. .eslintrc.js
  56. .git-blame-ignore-revs
  57. .gitattributes
  58. .gitignore
  59. .gn
  60. .mailmap
  61. .rustfmt.toml
  62. .vpython
  63. .vpython3
  64. .yapfignore
  65. AUTHORS
  66. BUILD.gn
  67. CODE_OF_CONDUCT.md
  68. codereview.settings
  69. DEPS
  70. DIR_METADATA
  71. ENG_REVIEW_OWNERS
  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.