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>
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.h version that Dawn implements.webgpu.h.Helpful links:
Developer documentation:
User documentation: (TODO, figure out what overlaps with the webgpu.h docs)
BSD 3-Clause License, please see LICENSE.
This is not an officially supported Google product.