Reland "gpu: win: Implement IDCompositionTexture for SCANOUT D3DImageBackings"

This is a reland of commit ed42105df5e6d41b3c8ce9b1d44791fb8a66c91f

The issue was that the original change returned true for
`D3DImageBackingFactory::IsSupported`, because we would hit the new
DComp texture check if `is_scanout && !is_video_decode && gmb_type !=
DXGI_SHARED_HANDLE`. However, in some video  cases, `gmb_type` can be
`SHARED_MEMORY_BUFFER`, which we want to always return false for, but
would return true in the original change if we supported DComp
textures.

Original change's description:
> gpu: win: Implement IDCompositionTexture for SCANOUT D3DImageBackings
>
> This change adds support for the SCANOUT usage for D3DImageBacking. It
> uses IDCompositionTexture, which is a new API introduced in Windows 11,
> version 10.0.22621.2428. IDCompositionTexture can be placed directly in
> a DComp tree, enabling delegated compositing of renderer quads.
>
> D3DImageBacking already has multiple "SCANOUT" usage implementations:
> swap chain and video frame textures. These should not conflict with the
> IDCompositionTexture backings, since both swap chains and video frame
> textures directly create D3DImageBackings (bypassing the
> SharedImageFactory) or use the GMB CreateSharedImage overloads.
> IDCompositionTextures are only created for compatible textures created
> through the normal, non-GMB CreateSharedImage overloads.
>
> For the purpose of delegated compositing, SCANOUT textures overlay read
> accesses are required to be held by the output device for potentially
> multiple frames (while the image is being used by the OS compositor).
> Due to this, these textures are incompatible with textures needing a
> keyed mutex, since the expectation for those textures is minimal read
> access scope. This shouldn't be an issue, but I've added a CHECK to
> ensure it's the case.
>
> This API was added in a patch version of build 22621, which causes some
> complications for detecting the SDK version. The SDK installs to a
> folder that does not include the patch version, so this change modifies
> the vs_toolchain.py to emit a custom error message if we're on build
> 22621 but do not have the new APIs.
>
> Bug: 1132392
> Change-Id: I2a99ed4bcd8790dd77e8011debde92db86c23e14
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5341660
> Commit-Queue: Michael Tang <tangm@microsoft.com>
> Reviewed-by: Sunny Sachanandani <sunnyps@chromium.org>
> Reviewed-by: Rafael Cintron <rafael.cintron@microsoft.com>
> Reviewed-by: Dirk Pranke <dpranke@google.com>
> Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1331926}

Cq-Include-Trybots: luci.chromium.try:gpu-fyi-try-win11-qualcomm-rel-64
Bug: 1132392
Change-Id: I5f923474df039f1724e85bf5f4ef37211200968a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5738088
Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
Reviewed-by: Sunny Sachanandani <sunnyps@chromium.org>
Reviewed-by: Rafael Cintron <rafael.cintron@microsoft.com>
Commit-Queue: Michael Tang <tangm@microsoft.com>
Reviewed-by: Dirk Pranke <dpranke@google.com>
Cr-Commit-Position: refs/heads/main@{#1333853}
12 files changed
tree: a6c4b1eb22b04faee1e0a83277d71a57dd1327d4
  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. CPPLINT.cfg
  71. DEPS
  72. DIR_METADATA
  73. LICENSE
  74. LICENSE.chromium_os
  75. OWNERS
  76. PRESUBMIT.py
  77. PRESUBMIT_test.py
  78. PRESUBMIT_test_mocks.py
  79. README.md
  80. 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.