Enable BCSliced3D on D3D12

This re-enables the feature on D3D12 along with fixing the many bugs
that forced us to revert this the last time. With this, all BCSliced3D
image_copy CTS tests now pass
(`'webgpu:api,operation,command_buffer,image_copy:*'`).

- Fixed NeedBufferSizeWorkaroundForBufferTextureCopyOnD3D12 to support
  compressed textures. This formerly only worked for uncompressed
  textures, but is required also for compressed to avoid the same D3D12
  validation errors about the footprint extending beyond the buffer.
  - Note that I cannot unit test these fixes as RecordBufferTextureCopy
    isn't tested. But CTS tests that were failing now pass (e.g.
    `webgpu:api,operation,command_buffer,image_copy:mip_levels:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc4-r-snorm";dimension="3d"`,
    subcase
    `copySizeInBlocks={"width":5,"height":4,"depthOrArrayLayers":2};originInBlocks={"x":3,"y":2,"z":1};mipLevel=2;textureSize=[128,96,12]`).

- Fixed multiple bugs in TextureCopySplitter:
  - Fixed Recompute3DTextureCopyRegionWithEmptyFirstRowAndEvenCopyHeight
    and Recompute3DTextureCopyRegionWithEmptyFirstRowAndOddCopyHeight,
    both of which were micomputing alignment offsets because
    copySize.height was assumed to be in texels rather than blocks.
  - Fixed Compute3DTextureCopySplits, which was testing if
    copySize.height was even or odd to call into the proper handlers,
    but needed to be testing if `copySize.height / blockInfo.height` was
    even or odd instead. Otherwise, we would end up calling the "even"
    handler which assumed at least 2 rows would be copied, but this
    would be incorrect for 2x2 or 4x4 blocks with a copy size of 1 row.
  - Note that we considered making
    GetOptimalBufferToTextureCopyOffsetAlignment return 512 rather than
    the current 1 as this effectively worked around some of the
    aforementioned offset-related bugs. But I decided to investigate and
    fix them properly, so there's no need to force 512-byte alignment on
    each WriteTeture ring buffer allocation.

- Fixed bug in Texture::ClearTexture that was incorrectly passing in
  rowsPerImage in texels rather than block rows.

- CopySplitTest changes:
  - Fixed GetBufferSize computing the wrong bufferSizeForFootprint
  - Fixed ValidateOffset to correctly compute offset values (thanks
    Corentin!)
  - Improved ostream output for TextureSpec and BufferSpec
  - Used designated initializers to improve readability of
    kBaseTextureSpecs
  - Added missing cases for 4x4 blocks with >1 layer
  - Added specific unit tests for CTS failure cases

- Added and clarified comments here and there.

- Enabled Feature::TextureCompressionBCSliced3D

Bug: 415303046
Change-Id: Ib82d3a478ec04a504f6b0221ec2ba1715a303561
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/244836
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
7 files changed
tree: e2dcf2c2126ef375fb882f652be6cc85aeac6646
  1. .github/
  2. .vscode/
  3. build_overrides/
  4. docs/
  5. generator/
  6. include/
  7. infra/
  8. scripts/
  9. src/
  10. test/
  11. third_party/
  12. tools/
  13. webgpu-cts/
  14. .bazelrc
  15. .clang-format
  16. .clang-format-ignore
  17. .clang-tidy
  18. .git-blame-ignore-revs
  19. .gitattributes
  20. .gitignore
  21. .gitmodules
  22. .gn
  23. .style.yapf
  24. .vpython3
  25. AUTHORS
  26. BUILD.bazel
  27. BUILD.gn
  28. CMakeLists.txt
  29. CMakeSettings.json
  30. CODE_OF_CONDUCT.md
  31. codereview.settings
  32. CONTRIBUTING.md
  33. CPPLINT.cfg
  34. DEPS
  35. DIR_METADATA
  36. go.mod
  37. go.sum
  38. go_presubmit_support.py
  39. LICENSE
  40. OWNERS
  41. PRESUBMIT.py
  42. README.chromium
  43. README.md
  44. WATCHLISTS
  45. WORKSPACE.bazel
README.md

Build Status Matrix Space

Dawn, a WebGPU implementation

Dawn is an open-source and cross-platform implementation of the 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)

License

BSD 3-Clause License, please see LICENSE.

Disclaimer

This is not an officially supported Google product.