gpu: Only import a single plane into Vulkan for Y/UV buffers

For workloads that use the WebGraphicsContext3DVideoFramePool (e.g.
visual effects on Meet), Chrome will create separate SharedImages
for the Y and UV planes. Both planes are stored in the same buffer
allocation, with the UV plane with an offset immediately after the
Y plane. Chrome passes the metadata for both planes (via the GMB)
when creating either the Y or the UV SharedImage, but varies the
gfx::BufferPlane [1].

When Chrome later wants to composite this content, it will pull a
SkiaGanesh SharedImage representation from the OzoneImageBacking
(assuming CrOS). If Chrome is using the Skia Vulkan backend, this
will require importing the underlying buffer into Vulkan via the
dmabuf extensions which is encapsulated in VulkanImage [2].

VulkanImage then sets up the plane layout used for Vulkan import
from the GMB's list of planes [3]. As mentioned earlier, however,
this list of planes includes both the Y and UV planes even though
the SharedImage refers to a single plane. For example, when
importing the UV plane, the GMB's list of planes could be
[{ offset: 0 }, { offset: 921600 }], but the VkFormat of image is
VK_FORMAT_R8G8_UNORM. Specifying two planes for import on a non-
planar VkFormat seems like undefined behavior, but in practice, I've
found that it imports the first plane in the list (which corresponds
to the Y plane) as the UV plane. This results in Chrome using the Y
plane for both the Y and UV planes which leads to the artifacting
seen in the bug.

This CL works around this issue by selectively choosing a single
plane when importing these legacy multiplanar SharedImages into
Vulkan.

[1] https://source.chromium.org/chromium/chromium/src/+/main:media/video/renderable_gpu_memory_buffer_video_frame_pool.cc;l=222;drc=f5bdc89c7395ed24f1b8d196a3bdd6232d5bf771
[2] https://source.chromium.org/chromium/chromium/src/+/main:gpu/command_buffer/service/shared_image/ozone_image_backing.cc;l=225;drc=cce9492faf8ca9996ddb08f67db5a5008c4850c1
[3] https://source.chromium.org/chromium/chromium/src/+/main:gpu/vulkan/vulkan_image_linux.cc;l=68;drc=7e2bf5a68186120ed918fd67f1497777cb60b4de

Bug: b:294095802
Change-Id: I3450a9a5ef8bfabc0aaaa7274df55780ba38bd3d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4918547
Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Commit-Queue: Brian Ho <hob@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1213779}
4 files changed
tree: 478ccb282f07a536baca4312059a24d0b6041d71
  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. .eslintrc.js
  54. .git-blame-ignore-revs
  55. .gitattributes
  56. .gitignore
  57. .gitmodules
  58. .gn
  59. .mailmap
  60. .rustfmt.toml
  61. .vpython3
  62. .yapfignore
  63. ATL_OWNERS
  64. AUTHORS
  65. BUILD.gn
  66. CODE_OF_CONDUCT.md
  67. codereview.settings
  68. DEPS
  69. DIR_METADATA
  70. LICENSE
  71. LICENSE.chromium_os
  72. OWNERS
  73. PRESUBMIT.py
  74. PRESUBMIT_test.py
  75. PRESUBMIT_test_mocks.py
  76. README.md
  77. 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.