d3d11: Use D3D11 multithread protection

With Graphite on Dawn D3D11 backend, Chrome's media stack uses the same
D3D11 device as Graphite and has no way of synchronizing access to the
immediate context which is otherwise protected internally in Dawn using
a device scoped mutex.

Using ID3D11Multithread::SetMultithreadProtected(TRUE) enables locking
in D3D11 which helps with this, but it has significant overhead since it
acquires/releases a mutex for every API call. However, ID3D11Multithread
provides Enter/Leave methods which allow putting entire sequences of
calls in a critical section minimizing the overhead of using the mutex.

This CL does the following:

1) Call SetMultithreadProtected(TRUE) if D3D11MultithreadProtected
   feature is enabled.

2) Provide a ScopedCriticalSection helper for CommandRecordingContext
   that calls Enter/Leave. This is used by d3d11 CommandBuffer::Execute
   to mark the entire command processing loop as a critical section.

3) In TickImpl, add the debug layer error collection call to before
   NextSerial so it's not skipped if NextSerial fails.

Bug: dawn:1927, chromium:1464550
Change-Id: Ic0a3185d9e3d623a82058142fef4e010da054125
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/142540
Auto-Submit: Sunny Sachanandani <sunnyps@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Sunny Sachanandani <sunnyps@chromium.org>
9 files changed
tree: aa982776c6f1cf12c9e85b4eba2ec6d057096d95
  1. .vscode/
  2. build_overrides/
  3. docs/
  4. generator/
  5. include/
  6. infra/
  7. scripts/
  8. src/
  9. test/
  10. third_party/
  11. tools/
  12. webgpu-cts/
  13. .clang-format
  14. .clang-tidy
  15. .gitattributes
  16. .gitignore
  17. .gn
  18. AUTHORS
  19. BUILD.gn
  20. CMakeLists.txt
  21. CMakeSettings.json
  22. CODE_OF_CONDUCT.md
  23. codereview.settings
  24. CONTRIBUTING.md
  25. CPPLINT.cfg
  26. dawn.json
  27. dawn_wire.json
  28. DEPS
  29. DIR_METADATA
  30. Doxyfile
  31. go.mod
  32. go.sum
  33. go_presubmit_support.py
  34. LICENSE
  35. OWNERS
  36. PRESUBMIT.py
  37. README.chromium
  38. README.md
  39. tint_overrides_with_defaults.gni
README.md

Dawn's logo: a sun rising behind a stylized mountain inspired by the WebGPU logo. The text Dawn is written below it.

Dawn, a WebGPU implementation

Dawn is an open-source and cross-platform implementation of the work-in-progress WebGPU standard. More precisely it implements webgpu.h that is a one-to-one mapping with the WebGPU IDL. Dawn is meant to be integrated as part of a larger system and is the underlying implementation of WebGPU in Chromium.

Dawn provides several WebGPU building blocks:

  • WebGPU C/C++ headers that applications and other building blocks use.
    • The webgpu.h version that Dawn implements.
    • A C++ wrapper for the webgpu.h.
  • A “native” implementation of WebGPU using platforms' GPU APIs: D3D12, Metal, Vulkan and OpenGL. See per API support for more details.
  • A client-server implementation of WebGPU for applications that are in a sandbox without access to native drivers
  • Tint is a compiler for the WebGPU Shader Language (WGSL) that can be used in standalone to convert shaders from and to WGSL.

Helpful links:

Documentation table of content

Developer documentation:

User documentation: (TODO, figure out what overlaps with the webgpu.h docs)

Status

(TODO)

License

Apache 2.0 Public License, please see LICENSE.

Disclaimer

This is not an officially supported Google product.