Stencil8 support fixups
Addressing issues that showed up after the initial stencil8 CL landed.
D3D12:
- Selecting the `all` aspect of a `stencil8` texture was ASSERTing
Metal:
- Using the `stencil` aspect of a `stencil8` texture was hitting an
UNREACHABLE().
Bug: dawn:666
Change-Id: Ic2931dbb915e109727ca24e3216a661fba84e508
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/85021
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Brandon Jones <bajones@chromium.org>
diff --git a/src/dawn/native/d3d12/TextureD3D12.cpp b/src/dawn/native/d3d12/TextureD3D12.cpp
index 78b2676..bc80c00 100644
--- a/src/dawn/native/d3d12/TextureD3D12.cpp
+++ b/src/dawn/native/d3d12/TextureD3D12.cpp
@@ -1184,7 +1184,21 @@
case wgpu::TextureFormat::Depth16Unorm:
mSrvDesc.Format = DXGI_FORMAT_R16_UNORM;
break;
- case wgpu::TextureFormat::Stencil8:
+ case wgpu::TextureFormat::Stencil8: {
+ // Stencil8 is always backed by a DXGI_FORMAT_R24G8_TYPELESS texture in D3D12,
+ // so always treat it as if the StencilOnly aspect of a Depth24UnormStencil8 was
+ // selected.
+ planeSlice = 1;
+ mSrvDesc.Format = DXGI_FORMAT_X24_TYPELESS_G8_UINT;
+ // Stencil is accessed using the .g component in the shader.
+ // Map it to the zeroth component to match other APIs.
+ mSrvDesc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(
+ D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_1,
+ D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,
+ D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,
+ D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1);
+ break;
+ }
case wgpu::TextureFormat::Depth24UnormStencil8:
switch (descriptor->aspect) {
case wgpu::TextureAspect::DepthOnly:
diff --git a/src/dawn/native/metal/TextureMTL.mm b/src/dawn/native/metal/TextureMTL.mm
index d75510a..20c5650 100644
--- a/src/dawn/native/metal/TextureMTL.mm
+++ b/src/dawn/native/metal/TextureMTL.mm
@@ -1060,7 +1060,8 @@
}
} else {
MTLPixelFormat format = MetalPixelFormat(descriptor->format);
- if (descriptor->aspect == wgpu::TextureAspect::StencilOnly) {
+ if (descriptor->aspect == wgpu::TextureAspect::StencilOnly &&
+ format != MTLPixelFormatStencil8) {
if (@available(macOS 10.12, iOS 10.0, *)) {
if (format == MTLPixelFormatDepth32Float_Stencil8) {
format = MTLPixelFormatX32_Stencil8;