Remove the CcLayer check in RecreateCRPFor2DContext

The function RecreateCanvasResourceProviderFor2DContext uses a very
cryptic condition where it aborts if CcLayer() is set. This check
originates from https://codereview.chromium.org/1372463002, where the
presence of m_layer (as it was called backed then) was used as a
proxy to check if the canvas was GPU accelerated. The idea was that
if m_layer was valid but m_surface was not, it was because the
context was lost and a surface shouldn't be recreated until the
context is later restored.

The concern still exists, but the surrounding code change a lot since
then. We now clear the layer as soon as we lose the context, via
LoseContext() -> DiscardResourceProvider() -> ResetLayer() [1]. We
also don't recreate the resource provider (formally known as
m_surface) if the context is lost [2].

There is still a way we can hit the CcLayer() early abort though. If
the GPU context was lost in the middle of render task, the provider
could become invalid. Until NotifyGpuContextLost is later called in a
following task, we'll have an invalid provider but a valid CcLayer.
It turns out that everything would still work even without the CcLayer
check tough, because if we removed it, the following call to
GetOrCreateCanvasResourceProviderImpl would simply return because
a provider already exists, and RecreateCRPFor2DContext would then
return nullptr because the provider would still be invalid.

Regardless, it's worth bringing attention to this particular edge
case. Instead of a cryptic CcLayer check though, the intent is
clearer if we abort when context isn't lost but the provider is
invalid (with an appropriate comment describing the situation). In
the future, we could decide to change this logic to lose canvas
context and start the restore sequence as soon as we observe the
provider go invalid.

[1]: https://crsrc.org/c/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc;l=226;drc=78883e6c824fd669688b9943096a7b01f87c1cb5

[2]: https://crsrc.org/c/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc;l=2127;drc=78883e6c824fd669688b9943096a7b01f87c1cb5

Bug: 346766781
Change-Id: I3846b92a369f2d21dfeed66ac1e5aa3f911c82c7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6299497
Reviewed-by: Colin Blundell <blundell@chromium.org>
Commit-Queue: Jean-Philippe Gravel <jpgravel@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1443532}
2 files changed
tree: 92c95020a276a34ffcaa076c0366f7d7499bfd2c
  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. crypto/
  16. dbus/
  17. device/
  18. docs/
  19. extensions/
  20. fuchsia_web/
  21. gin/
  22. google_apis/
  23. gpu/
  24. headless/
  25. infra/
  26. ios/
  27. ipc/
  28. media/
  29. mojo/
  30. native_client_sdk/
  31. net/
  32. pdf/
  33. ppapi/
  34. printing/
  35. remoting/
  36. rlz/
  37. sandbox/
  38. services/
  39. skia/
  40. sql/
  41. storage/
  42. styleguide/
  43. testing/
  44. third_party/
  45. tools/
  46. ui/
  47. url/
  48. webkit/
  49. .clang-format
  50. .clang-tidy
  51. .clangd
  52. .git-blame-ignore-revs
  53. .gitallowed
  54. .gitattributes
  55. .gitignore
  56. .gitmodules
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython3
  61. .yapfignore
  62. ATL_OWNERS
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. CPPLINT.cfg
  68. CRYPTO_OWNERS
  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.