diff --git a/src/dawn/native/d3d/UtilsD3D.cpp b/src/dawn/native/d3d/UtilsD3D.cpp index 057e730273..4aaaa3172f 100644 --- a/src/dawn/native/d3d/UtilsD3D.cpp +++ b/src/dawn/native/d3d/UtilsD3D.cpp @@ -74,4 +74,322 @@ uint64_t MakeDXCVersion(uint64_t majorVersion, uint64_t minorVersion) { return (majorVersion << 32) + minorVersion; } +DXGI_FORMAT DXGITypelessTextureFormat(wgpu::TextureFormat format) { + switch (format) { + case wgpu::TextureFormat::R8Unorm: + case wgpu::TextureFormat::R8Snorm: + case wgpu::TextureFormat::R8Uint: + case wgpu::TextureFormat::R8Sint: + return DXGI_FORMAT_R8_TYPELESS; + + case wgpu::TextureFormat::R16Uint: + case wgpu::TextureFormat::R16Sint: + case wgpu::TextureFormat::R16Float: + case wgpu::TextureFormat::Depth16Unorm: + return DXGI_FORMAT_R16_TYPELESS; + + case wgpu::TextureFormat::RG8Unorm: + case wgpu::TextureFormat::RG8Snorm: + case wgpu::TextureFormat::RG8Uint: + case wgpu::TextureFormat::RG8Sint: + return DXGI_FORMAT_R8G8_TYPELESS; + + case wgpu::TextureFormat::R32Uint: + case wgpu::TextureFormat::R32Sint: + case wgpu::TextureFormat::R32Float: + return DXGI_FORMAT_R32_TYPELESS; + + case wgpu::TextureFormat::RG16Uint: + case wgpu::TextureFormat::RG16Sint: + case wgpu::TextureFormat::RG16Float: + return DXGI_FORMAT_R16G16_TYPELESS; + + case wgpu::TextureFormat::RGBA8Unorm: + case wgpu::TextureFormat::RGBA8UnormSrgb: + case wgpu::TextureFormat::RGBA8Snorm: + case wgpu::TextureFormat::RGBA8Uint: + case wgpu::TextureFormat::RGBA8Sint: + return DXGI_FORMAT_R8G8B8A8_TYPELESS; + + case wgpu::TextureFormat::BGRA8Unorm: + case wgpu::TextureFormat::BGRA8UnormSrgb: + return DXGI_FORMAT_B8G8R8A8_TYPELESS; + + case wgpu::TextureFormat::RGB10A2Unorm: + return DXGI_FORMAT_R10G10B10A2_TYPELESS; + + case wgpu::TextureFormat::RG11B10Ufloat: + return DXGI_FORMAT_R11G11B10_FLOAT; + case wgpu::TextureFormat::RGB9E5Ufloat: + return DXGI_FORMAT_R9G9B9E5_SHAREDEXP; + + case wgpu::TextureFormat::RG32Uint: + case wgpu::TextureFormat::RG32Sint: + case wgpu::TextureFormat::RG32Float: + return DXGI_FORMAT_R32G32_TYPELESS; + + case wgpu::TextureFormat::RGBA16Uint: + case wgpu::TextureFormat::RGBA16Sint: + case wgpu::TextureFormat::RGBA16Float: + return DXGI_FORMAT_R16G16B16A16_TYPELESS; + + case wgpu::TextureFormat::RGBA32Uint: + case wgpu::TextureFormat::RGBA32Sint: + case wgpu::TextureFormat::RGBA32Float: + return DXGI_FORMAT_R32G32B32A32_TYPELESS; + + case wgpu::TextureFormat::Depth32Float: + case wgpu::TextureFormat::Depth24Plus: + return DXGI_FORMAT_R32_TYPELESS; + + // DXGI_FORMAT_D24_UNORM_S8_UINT is the smallest format supported on D3D12 that has stencil, + // for which the typeless equivalent is DXGI_FORMAT_R24G8_TYPELESS. + case wgpu::TextureFormat::Stencil8: + return DXGI_FORMAT_R24G8_TYPELESS; + case wgpu::TextureFormat::Depth24PlusStencil8: + case wgpu::TextureFormat::Depth32FloatStencil8: + return DXGI_FORMAT_R32G8X24_TYPELESS; + + case wgpu::TextureFormat::BC1RGBAUnorm: + case wgpu::TextureFormat::BC1RGBAUnormSrgb: + return DXGI_FORMAT_BC1_TYPELESS; + + case wgpu::TextureFormat::BC2RGBAUnorm: + case wgpu::TextureFormat::BC2RGBAUnormSrgb: + return DXGI_FORMAT_BC2_TYPELESS; + + case wgpu::TextureFormat::BC3RGBAUnorm: + case wgpu::TextureFormat::BC3RGBAUnormSrgb: + return DXGI_FORMAT_BC3_TYPELESS; + + case wgpu::TextureFormat::BC4RSnorm: + case wgpu::TextureFormat::BC4RUnorm: + return DXGI_FORMAT_BC4_TYPELESS; + + case wgpu::TextureFormat::BC5RGSnorm: + case wgpu::TextureFormat::BC5RGUnorm: + return DXGI_FORMAT_BC5_TYPELESS; + + case wgpu::TextureFormat::BC6HRGBFloat: + case wgpu::TextureFormat::BC6HRGBUfloat: + return DXGI_FORMAT_BC6H_TYPELESS; + + case wgpu::TextureFormat::BC7RGBAUnorm: + case wgpu::TextureFormat::BC7RGBAUnormSrgb: + return DXGI_FORMAT_BC7_TYPELESS; + + case wgpu::TextureFormat::ETC2RGB8Unorm: + case wgpu::TextureFormat::ETC2RGB8UnormSrgb: + case wgpu::TextureFormat::ETC2RGB8A1Unorm: + case wgpu::TextureFormat::ETC2RGB8A1UnormSrgb: + case wgpu::TextureFormat::ETC2RGBA8Unorm: + case wgpu::TextureFormat::ETC2RGBA8UnormSrgb: + case wgpu::TextureFormat::EACR11Unorm: + case wgpu::TextureFormat::EACR11Snorm: + case wgpu::TextureFormat::EACRG11Unorm: + case wgpu::TextureFormat::EACRG11Snorm: + + case wgpu::TextureFormat::ASTC4x4Unorm: + case wgpu::TextureFormat::ASTC4x4UnormSrgb: + case wgpu::TextureFormat::ASTC5x4Unorm: + case wgpu::TextureFormat::ASTC5x4UnormSrgb: + case wgpu::TextureFormat::ASTC5x5Unorm: + case wgpu::TextureFormat::ASTC5x5UnormSrgb: + case wgpu::TextureFormat::ASTC6x5Unorm: + case wgpu::TextureFormat::ASTC6x5UnormSrgb: + case wgpu::TextureFormat::ASTC6x6Unorm: + case wgpu::TextureFormat::ASTC6x6UnormSrgb: + case wgpu::TextureFormat::ASTC8x5Unorm: + case wgpu::TextureFormat::ASTC8x5UnormSrgb: + case wgpu::TextureFormat::ASTC8x6Unorm: + case wgpu::TextureFormat::ASTC8x6UnormSrgb: + case wgpu::TextureFormat::ASTC8x8Unorm: + case wgpu::TextureFormat::ASTC8x8UnormSrgb: + case wgpu::TextureFormat::ASTC10x5Unorm: + case wgpu::TextureFormat::ASTC10x5UnormSrgb: + case wgpu::TextureFormat::ASTC10x6Unorm: + case wgpu::TextureFormat::ASTC10x6UnormSrgb: + case wgpu::TextureFormat::ASTC10x8Unorm: + case wgpu::TextureFormat::ASTC10x8UnormSrgb: + case wgpu::TextureFormat::ASTC10x10Unorm: + case wgpu::TextureFormat::ASTC10x10UnormSrgb: + case wgpu::TextureFormat::ASTC12x10Unorm: + case wgpu::TextureFormat::ASTC12x10UnormSrgb: + case wgpu::TextureFormat::ASTC12x12Unorm: + case wgpu::TextureFormat::ASTC12x12UnormSrgb: + + case wgpu::TextureFormat::R8BG8Biplanar420Unorm: + case wgpu::TextureFormat::Undefined: + UNREACHABLE(); + } +} + +DXGI_FORMAT DXGITextureFormat(wgpu::TextureFormat format) { + switch (format) { + case wgpu::TextureFormat::R8Unorm: + return DXGI_FORMAT_R8_UNORM; + case wgpu::TextureFormat::R8Snorm: + return DXGI_FORMAT_R8_SNORM; + case wgpu::TextureFormat::R8Uint: + return DXGI_FORMAT_R8_UINT; + case wgpu::TextureFormat::R8Sint: + return DXGI_FORMAT_R8_SINT; + + case wgpu::TextureFormat::R16Uint: + return DXGI_FORMAT_R16_UINT; + case wgpu::TextureFormat::R16Sint: + return DXGI_FORMAT_R16_SINT; + case wgpu::TextureFormat::R16Float: + return DXGI_FORMAT_R16_FLOAT; + case wgpu::TextureFormat::RG8Unorm: + return DXGI_FORMAT_R8G8_UNORM; + case wgpu::TextureFormat::RG8Snorm: + return DXGI_FORMAT_R8G8_SNORM; + case wgpu::TextureFormat::RG8Uint: + return DXGI_FORMAT_R8G8_UINT; + case wgpu::TextureFormat::RG8Sint: + return DXGI_FORMAT_R8G8_SINT; + + case wgpu::TextureFormat::R32Uint: + return DXGI_FORMAT_R32_UINT; + case wgpu::TextureFormat::R32Sint: + return DXGI_FORMAT_R32_SINT; + case wgpu::TextureFormat::R32Float: + return DXGI_FORMAT_R32_FLOAT; + case wgpu::TextureFormat::RG16Uint: + return DXGI_FORMAT_R16G16_UINT; + case wgpu::TextureFormat::RG16Sint: + return DXGI_FORMAT_R16G16_SINT; + case wgpu::TextureFormat::RG16Float: + return DXGI_FORMAT_R16G16_FLOAT; + case wgpu::TextureFormat::RGBA8Unorm: + return DXGI_FORMAT_R8G8B8A8_UNORM; + case wgpu::TextureFormat::RGBA8UnormSrgb: + return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + case wgpu::TextureFormat::RGBA8Snorm: + return DXGI_FORMAT_R8G8B8A8_SNORM; + case wgpu::TextureFormat::RGBA8Uint: + return DXGI_FORMAT_R8G8B8A8_UINT; + case wgpu::TextureFormat::RGBA8Sint: + return DXGI_FORMAT_R8G8B8A8_SINT; + case wgpu::TextureFormat::BGRA8Unorm: + return DXGI_FORMAT_B8G8R8A8_UNORM; + case wgpu::TextureFormat::BGRA8UnormSrgb: + return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + case wgpu::TextureFormat::RGB10A2Unorm: + return DXGI_FORMAT_R10G10B10A2_UNORM; + case wgpu::TextureFormat::RG11B10Ufloat: + return DXGI_FORMAT_R11G11B10_FLOAT; + case wgpu::TextureFormat::RGB9E5Ufloat: + return DXGI_FORMAT_R9G9B9E5_SHAREDEXP; + + case wgpu::TextureFormat::RG32Uint: + return DXGI_FORMAT_R32G32_UINT; + case wgpu::TextureFormat::RG32Sint: + return DXGI_FORMAT_R32G32_SINT; + case wgpu::TextureFormat::RG32Float: + return DXGI_FORMAT_R32G32_FLOAT; + case wgpu::TextureFormat::RGBA16Uint: + return DXGI_FORMAT_R16G16B16A16_UINT; + case wgpu::TextureFormat::RGBA16Sint: + return DXGI_FORMAT_R16G16B16A16_SINT; + case wgpu::TextureFormat::RGBA16Float: + return DXGI_FORMAT_R16G16B16A16_FLOAT; + + case wgpu::TextureFormat::RGBA32Uint: + return DXGI_FORMAT_R32G32B32A32_UINT; + case wgpu::TextureFormat::RGBA32Sint: + return DXGI_FORMAT_R32G32B32A32_SINT; + case wgpu::TextureFormat::RGBA32Float: + return DXGI_FORMAT_R32G32B32A32_FLOAT; + + case wgpu::TextureFormat::Depth16Unorm: + return DXGI_FORMAT_D16_UNORM; + case wgpu::TextureFormat::Depth32Float: + case wgpu::TextureFormat::Depth24Plus: + return DXGI_FORMAT_D32_FLOAT; + // DXGI_FORMAT_D24_UNORM_S8_UINT is the smallest format supported on D3D12 that has stencil. + case wgpu::TextureFormat::Stencil8: + return DXGI_FORMAT_D24_UNORM_S8_UINT; + case wgpu::TextureFormat::Depth24PlusStencil8: + case wgpu::TextureFormat::Depth32FloatStencil8: + return DXGI_FORMAT_D32_FLOAT_S8X24_UINT; + + case wgpu::TextureFormat::BC1RGBAUnorm: + return DXGI_FORMAT_BC1_UNORM; + case wgpu::TextureFormat::BC1RGBAUnormSrgb: + return DXGI_FORMAT_BC1_UNORM_SRGB; + case wgpu::TextureFormat::BC2RGBAUnorm: + return DXGI_FORMAT_BC2_UNORM; + case wgpu::TextureFormat::BC2RGBAUnormSrgb: + return DXGI_FORMAT_BC2_UNORM_SRGB; + case wgpu::TextureFormat::BC3RGBAUnorm: + return DXGI_FORMAT_BC3_UNORM; + case wgpu::TextureFormat::BC3RGBAUnormSrgb: + return DXGI_FORMAT_BC3_UNORM_SRGB; + case wgpu::TextureFormat::BC4RSnorm: + return DXGI_FORMAT_BC4_SNORM; + case wgpu::TextureFormat::BC4RUnorm: + return DXGI_FORMAT_BC4_UNORM; + case wgpu::TextureFormat::BC5RGSnorm: + return DXGI_FORMAT_BC5_SNORM; + case wgpu::TextureFormat::BC5RGUnorm: + return DXGI_FORMAT_BC5_UNORM; + case wgpu::TextureFormat::BC6HRGBFloat: + return DXGI_FORMAT_BC6H_SF16; + case wgpu::TextureFormat::BC6HRGBUfloat: + return DXGI_FORMAT_BC6H_UF16; + case wgpu::TextureFormat::BC7RGBAUnorm: + return DXGI_FORMAT_BC7_UNORM; + case wgpu::TextureFormat::BC7RGBAUnormSrgb: + return DXGI_FORMAT_BC7_UNORM_SRGB; + + case wgpu::TextureFormat::R8BG8Biplanar420Unorm: + return DXGI_FORMAT_NV12; + + case wgpu::TextureFormat::ETC2RGB8Unorm: + case wgpu::TextureFormat::ETC2RGB8UnormSrgb: + case wgpu::TextureFormat::ETC2RGB8A1Unorm: + case wgpu::TextureFormat::ETC2RGB8A1UnormSrgb: + case wgpu::TextureFormat::ETC2RGBA8Unorm: + case wgpu::TextureFormat::ETC2RGBA8UnormSrgb: + case wgpu::TextureFormat::EACR11Unorm: + case wgpu::TextureFormat::EACR11Snorm: + case wgpu::TextureFormat::EACRG11Unorm: + case wgpu::TextureFormat::EACRG11Snorm: + + case wgpu::TextureFormat::ASTC4x4Unorm: + case wgpu::TextureFormat::ASTC4x4UnormSrgb: + case wgpu::TextureFormat::ASTC5x4Unorm: + case wgpu::TextureFormat::ASTC5x4UnormSrgb: + case wgpu::TextureFormat::ASTC5x5Unorm: + case wgpu::TextureFormat::ASTC5x5UnormSrgb: + case wgpu::TextureFormat::ASTC6x5Unorm: + case wgpu::TextureFormat::ASTC6x5UnormSrgb: + case wgpu::TextureFormat::ASTC6x6Unorm: + case wgpu::TextureFormat::ASTC6x6UnormSrgb: + case wgpu::TextureFormat::ASTC8x5Unorm: + case wgpu::TextureFormat::ASTC8x5UnormSrgb: + case wgpu::TextureFormat::ASTC8x6Unorm: + case wgpu::TextureFormat::ASTC8x6UnormSrgb: + case wgpu::TextureFormat::ASTC8x8Unorm: + case wgpu::TextureFormat::ASTC8x8UnormSrgb: + case wgpu::TextureFormat::ASTC10x5Unorm: + case wgpu::TextureFormat::ASTC10x5UnormSrgb: + case wgpu::TextureFormat::ASTC10x6Unorm: + case wgpu::TextureFormat::ASTC10x6UnormSrgb: + case wgpu::TextureFormat::ASTC10x8Unorm: + case wgpu::TextureFormat::ASTC10x8UnormSrgb: + case wgpu::TextureFormat::ASTC10x10Unorm: + case wgpu::TextureFormat::ASTC10x10UnormSrgb: + case wgpu::TextureFormat::ASTC12x10Unorm: + case wgpu::TextureFormat::ASTC12x10UnormSrgb: + case wgpu::TextureFormat::ASTC12x12Unorm: + case wgpu::TextureFormat::ASTC12x12UnormSrgb: + + case wgpu::TextureFormat::Undefined: + UNREACHABLE(); + } +} + } // namespace dawn::native::d3d diff --git a/src/dawn/native/d3d/UtilsD3D.h b/src/dawn/native/d3d/UtilsD3D.h index f820279f8c..6f0ea19b29 100644 --- a/src/dawn/native/d3d/UtilsD3D.h +++ b/src/dawn/native/d3d/UtilsD3D.h @@ -28,6 +28,10 @@ bool IsTypeless(DXGI_FORMAT format); uint64_t MakeDXCVersion(uint64_t majorVersion, uint64_t minorVersion); +DXGI_FORMAT DXGITypelessTextureFormat(wgpu::TextureFormat format); + +DXGI_FORMAT DXGITextureFormat(wgpu::TextureFormat format); + } // namespace dawn::native::d3d #endif // SRC_DAWN_NATIVE_D3D_UTILSD3D_H_ diff --git a/src/dawn/native/d3d12/DeviceD3D12.cpp b/src/dawn/native/d3d12/DeviceD3D12.cpp index 892af599d6..8c6051ac3c 100644 --- a/src/dawn/native/d3d12/DeviceD3D12.cpp +++ b/src/dawn/native/d3d12/DeviceD3D12.cpp @@ -584,7 +584,7 @@ std::unique_ptr Device::CreateExternalImageDXGIImpl( const Format* format = GetInternalFormat(textureDescriptor->format).AcquireSuccess(); if (format->IsMultiPlanar()) { if (ConsumedError(ValidateD3D12VideoTextureCanBeShared( - this, D3D12TextureFormat(textureDescriptor->format)))) { + this, d3d::DXGITextureFormat(textureDescriptor->format)))) { return nullptr; } } diff --git a/src/dawn/native/d3d12/NativeSwapChainImplD3D12.cpp b/src/dawn/native/d3d12/NativeSwapChainImplD3D12.cpp index de70081ef5..91b96871cf 100644 --- a/src/dawn/native/d3d12/NativeSwapChainImplD3D12.cpp +++ b/src/dawn/native/d3d12/NativeSwapChainImplD3D12.cpp @@ -15,6 +15,7 @@ #include "dawn/native/d3d12/NativeSwapChainImplD3D12.h" #include "dawn/common/Assert.h" +#include "dawn/native/d3d/UtilsD3D.h" #include "dawn/native/d3d12/DeviceD3D12.h" #include "dawn/native/d3d12/TextureD3D12.h" @@ -62,7 +63,7 @@ DawnSwapChainError NativeSwapChainImpl::Configure(WGPUTextureFormat format, DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {}; swapChainDesc.Width = width; swapChainDesc.Height = height; - swapChainDesc.Format = D3D12TextureFormat(GetPreferredFormat()); + swapChainDesc.Format = d3d::DXGITextureFormat(GetPreferredFormat()); swapChainDesc.BufferUsage = D3D12SwapChainBufferUsage(usage); swapChainDesc.BufferCount = kFrameCount; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; diff --git a/src/dawn/native/d3d12/RenderPipelineD3D12.cpp b/src/dawn/native/d3d12/RenderPipelineD3D12.cpp index e6988e4049..ab9cbb1126 100644 --- a/src/dawn/native/d3d12/RenderPipelineD3D12.cpp +++ b/src/dawn/native/d3d12/RenderPipelineD3D12.cpp @@ -431,7 +431,7 @@ MaybeError RenderPipeline::Initialize() { descriptorD3D12.RasterizerState.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF; if (HasDepthStencilAttachment()) { - descriptorD3D12.DSVFormat = D3D12TextureFormat(GetDepthStencilFormat()); + descriptorD3D12.DSVFormat = d3d::DXGITextureFormat(GetDepthStencilFormat()); } static_assert(kMaxColorAttachments == 8); @@ -443,7 +443,7 @@ MaybeError RenderPipeline::Initialize() { GetHighestBitIndexPlusOne(GetColorAttachmentsMask()); for (ColorAttachmentIndex i : IterateBitSet(GetColorAttachmentsMask())) { descriptorD3D12.RTVFormats[static_cast(i)] = - D3D12TextureFormat(GetColorAttachmentFormat(i)); + d3d::DXGITextureFormat(GetColorAttachmentFormat(i)); descriptorD3D12.BlendState.RenderTarget[static_cast(i)] = ComputeColorDesc(device, GetColorTargetState(i)); } diff --git a/src/dawn/native/d3d12/SwapChainD3D12.cpp b/src/dawn/native/d3d12/SwapChainD3D12.cpp index 7e814f8aba..ae6531990c 100644 --- a/src/dawn/native/d3d12/SwapChainD3D12.cpp +++ b/src/dawn/native/d3d12/SwapChainD3D12.cpp @@ -21,6 +21,7 @@ #include "dawn/dawn_wsi.h" #include "dawn/native/Surface.h" #include "dawn/native/d3d/D3DError.h" +#include "dawn/native/d3d/UtilsD3D.h" #include "dawn/native/d3d12/DeviceD3D12.h" #include "dawn/native/d3d12/TextureD3D12.h" @@ -156,7 +157,7 @@ MaybeError SwapChain::Initialize(NewSwapChainBase* previousSwapChain) { // Precompute the configuration parameters we want for the DXGI swapchain. mConfig.bufferCount = PresentModeToBufferCount(GetPresentMode()); - mConfig.format = D3D12TextureFormat(GetFormat()); + mConfig.format = d3d::DXGITextureFormat(GetFormat()); mConfig.swapChainFlags = PresentModeToSwapChainFlags(GetPresentMode()); mConfig.usage = ToDXGIUsage(GetUsage()); diff --git a/src/dawn/native/d3d12/TextureD3D12.cpp b/src/dawn/native/d3d12/TextureD3D12.cpp index f87078ac72..bcfaf8ad0c 100644 --- a/src/dawn/native/d3d12/TextureD3D12.cpp +++ b/src/dawn/native/d3d12/TextureD3D12.cpp @@ -111,326 +111,8 @@ D3D12_RESOURCE_DIMENSION D3D12TextureDimension(wgpu::TextureDimension dimension) } } -DXGI_FORMAT D3D12TypelessTextureFormat(wgpu::TextureFormat format) { - switch (format) { - case wgpu::TextureFormat::R8Unorm: - case wgpu::TextureFormat::R8Snorm: - case wgpu::TextureFormat::R8Uint: - case wgpu::TextureFormat::R8Sint: - return DXGI_FORMAT_R8_TYPELESS; - - case wgpu::TextureFormat::R16Uint: - case wgpu::TextureFormat::R16Sint: - case wgpu::TextureFormat::R16Float: - case wgpu::TextureFormat::Depth16Unorm: - return DXGI_FORMAT_R16_TYPELESS; - - case wgpu::TextureFormat::RG8Unorm: - case wgpu::TextureFormat::RG8Snorm: - case wgpu::TextureFormat::RG8Uint: - case wgpu::TextureFormat::RG8Sint: - return DXGI_FORMAT_R8G8_TYPELESS; - - case wgpu::TextureFormat::R32Uint: - case wgpu::TextureFormat::R32Sint: - case wgpu::TextureFormat::R32Float: - return DXGI_FORMAT_R32_TYPELESS; - - case wgpu::TextureFormat::RG16Uint: - case wgpu::TextureFormat::RG16Sint: - case wgpu::TextureFormat::RG16Float: - return DXGI_FORMAT_R16G16_TYPELESS; - - case wgpu::TextureFormat::RGBA8Unorm: - case wgpu::TextureFormat::RGBA8UnormSrgb: - case wgpu::TextureFormat::RGBA8Snorm: - case wgpu::TextureFormat::RGBA8Uint: - case wgpu::TextureFormat::RGBA8Sint: - return DXGI_FORMAT_R8G8B8A8_TYPELESS; - - case wgpu::TextureFormat::BGRA8Unorm: - case wgpu::TextureFormat::BGRA8UnormSrgb: - return DXGI_FORMAT_B8G8R8A8_TYPELESS; - - case wgpu::TextureFormat::RGB10A2Unorm: - return DXGI_FORMAT_R10G10B10A2_TYPELESS; - - case wgpu::TextureFormat::RG11B10Ufloat: - return DXGI_FORMAT_R11G11B10_FLOAT; - case wgpu::TextureFormat::RGB9E5Ufloat: - return DXGI_FORMAT_R9G9B9E5_SHAREDEXP; - - case wgpu::TextureFormat::RG32Uint: - case wgpu::TextureFormat::RG32Sint: - case wgpu::TextureFormat::RG32Float: - return DXGI_FORMAT_R32G32_TYPELESS; - - case wgpu::TextureFormat::RGBA16Uint: - case wgpu::TextureFormat::RGBA16Sint: - case wgpu::TextureFormat::RGBA16Float: - return DXGI_FORMAT_R16G16B16A16_TYPELESS; - - case wgpu::TextureFormat::RGBA32Uint: - case wgpu::TextureFormat::RGBA32Sint: - case wgpu::TextureFormat::RGBA32Float: - return DXGI_FORMAT_R32G32B32A32_TYPELESS; - - case wgpu::TextureFormat::Depth32Float: - case wgpu::TextureFormat::Depth24Plus: - return DXGI_FORMAT_R32_TYPELESS; - - // DXGI_FORMAT_D24_UNORM_S8_UINT is the smallest format supported on D3D12 that has stencil, - // for which the typeless equivalent is DXGI_FORMAT_R24G8_TYPELESS. - case wgpu::TextureFormat::Stencil8: - return DXGI_FORMAT_R24G8_TYPELESS; - case wgpu::TextureFormat::Depth24PlusStencil8: - case wgpu::TextureFormat::Depth32FloatStencil8: - return DXGI_FORMAT_R32G8X24_TYPELESS; - - case wgpu::TextureFormat::BC1RGBAUnorm: - case wgpu::TextureFormat::BC1RGBAUnormSrgb: - return DXGI_FORMAT_BC1_TYPELESS; - - case wgpu::TextureFormat::BC2RGBAUnorm: - case wgpu::TextureFormat::BC2RGBAUnormSrgb: - return DXGI_FORMAT_BC2_TYPELESS; - - case wgpu::TextureFormat::BC3RGBAUnorm: - case wgpu::TextureFormat::BC3RGBAUnormSrgb: - return DXGI_FORMAT_BC3_TYPELESS; - - case wgpu::TextureFormat::BC4RSnorm: - case wgpu::TextureFormat::BC4RUnorm: - return DXGI_FORMAT_BC4_TYPELESS; - - case wgpu::TextureFormat::BC5RGSnorm: - case wgpu::TextureFormat::BC5RGUnorm: - return DXGI_FORMAT_BC5_TYPELESS; - - case wgpu::TextureFormat::BC6HRGBFloat: - case wgpu::TextureFormat::BC6HRGBUfloat: - return DXGI_FORMAT_BC6H_TYPELESS; - - case wgpu::TextureFormat::BC7RGBAUnorm: - case wgpu::TextureFormat::BC7RGBAUnormSrgb: - return DXGI_FORMAT_BC7_TYPELESS; - - case wgpu::TextureFormat::ETC2RGB8Unorm: - case wgpu::TextureFormat::ETC2RGB8UnormSrgb: - case wgpu::TextureFormat::ETC2RGB8A1Unorm: - case wgpu::TextureFormat::ETC2RGB8A1UnormSrgb: - case wgpu::TextureFormat::ETC2RGBA8Unorm: - case wgpu::TextureFormat::ETC2RGBA8UnormSrgb: - case wgpu::TextureFormat::EACR11Unorm: - case wgpu::TextureFormat::EACR11Snorm: - case wgpu::TextureFormat::EACRG11Unorm: - case wgpu::TextureFormat::EACRG11Snorm: - - case wgpu::TextureFormat::ASTC4x4Unorm: - case wgpu::TextureFormat::ASTC4x4UnormSrgb: - case wgpu::TextureFormat::ASTC5x4Unorm: - case wgpu::TextureFormat::ASTC5x4UnormSrgb: - case wgpu::TextureFormat::ASTC5x5Unorm: - case wgpu::TextureFormat::ASTC5x5UnormSrgb: - case wgpu::TextureFormat::ASTC6x5Unorm: - case wgpu::TextureFormat::ASTC6x5UnormSrgb: - case wgpu::TextureFormat::ASTC6x6Unorm: - case wgpu::TextureFormat::ASTC6x6UnormSrgb: - case wgpu::TextureFormat::ASTC8x5Unorm: - case wgpu::TextureFormat::ASTC8x5UnormSrgb: - case wgpu::TextureFormat::ASTC8x6Unorm: - case wgpu::TextureFormat::ASTC8x6UnormSrgb: - case wgpu::TextureFormat::ASTC8x8Unorm: - case wgpu::TextureFormat::ASTC8x8UnormSrgb: - case wgpu::TextureFormat::ASTC10x5Unorm: - case wgpu::TextureFormat::ASTC10x5UnormSrgb: - case wgpu::TextureFormat::ASTC10x6Unorm: - case wgpu::TextureFormat::ASTC10x6UnormSrgb: - case wgpu::TextureFormat::ASTC10x8Unorm: - case wgpu::TextureFormat::ASTC10x8UnormSrgb: - case wgpu::TextureFormat::ASTC10x10Unorm: - case wgpu::TextureFormat::ASTC10x10UnormSrgb: - case wgpu::TextureFormat::ASTC12x10Unorm: - case wgpu::TextureFormat::ASTC12x10UnormSrgb: - case wgpu::TextureFormat::ASTC12x12Unorm: - case wgpu::TextureFormat::ASTC12x12UnormSrgb: - - case wgpu::TextureFormat::R8BG8Biplanar420Unorm: - case wgpu::TextureFormat::Undefined: - UNREACHABLE(); - } -} - } // namespace -DXGI_FORMAT D3D12TextureFormat(wgpu::TextureFormat format) { - switch (format) { - case wgpu::TextureFormat::R8Unorm: - return DXGI_FORMAT_R8_UNORM; - case wgpu::TextureFormat::R8Snorm: - return DXGI_FORMAT_R8_SNORM; - case wgpu::TextureFormat::R8Uint: - return DXGI_FORMAT_R8_UINT; - case wgpu::TextureFormat::R8Sint: - return DXGI_FORMAT_R8_SINT; - - case wgpu::TextureFormat::R16Uint: - return DXGI_FORMAT_R16_UINT; - case wgpu::TextureFormat::R16Sint: - return DXGI_FORMAT_R16_SINT; - case wgpu::TextureFormat::R16Float: - return DXGI_FORMAT_R16_FLOAT; - case wgpu::TextureFormat::RG8Unorm: - return DXGI_FORMAT_R8G8_UNORM; - case wgpu::TextureFormat::RG8Snorm: - return DXGI_FORMAT_R8G8_SNORM; - case wgpu::TextureFormat::RG8Uint: - return DXGI_FORMAT_R8G8_UINT; - case wgpu::TextureFormat::RG8Sint: - return DXGI_FORMAT_R8G8_SINT; - - case wgpu::TextureFormat::R32Uint: - return DXGI_FORMAT_R32_UINT; - case wgpu::TextureFormat::R32Sint: - return DXGI_FORMAT_R32_SINT; - case wgpu::TextureFormat::R32Float: - return DXGI_FORMAT_R32_FLOAT; - case wgpu::TextureFormat::RG16Uint: - return DXGI_FORMAT_R16G16_UINT; - case wgpu::TextureFormat::RG16Sint: - return DXGI_FORMAT_R16G16_SINT; - case wgpu::TextureFormat::RG16Float: - return DXGI_FORMAT_R16G16_FLOAT; - case wgpu::TextureFormat::RGBA8Unorm: - return DXGI_FORMAT_R8G8B8A8_UNORM; - case wgpu::TextureFormat::RGBA8UnormSrgb: - return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - case wgpu::TextureFormat::RGBA8Snorm: - return DXGI_FORMAT_R8G8B8A8_SNORM; - case wgpu::TextureFormat::RGBA8Uint: - return DXGI_FORMAT_R8G8B8A8_UINT; - case wgpu::TextureFormat::RGBA8Sint: - return DXGI_FORMAT_R8G8B8A8_SINT; - case wgpu::TextureFormat::BGRA8Unorm: - return DXGI_FORMAT_B8G8R8A8_UNORM; - case wgpu::TextureFormat::BGRA8UnormSrgb: - return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; - case wgpu::TextureFormat::RGB10A2Unorm: - return DXGI_FORMAT_R10G10B10A2_UNORM; - case wgpu::TextureFormat::RG11B10Ufloat: - return DXGI_FORMAT_R11G11B10_FLOAT; - case wgpu::TextureFormat::RGB9E5Ufloat: - return DXGI_FORMAT_R9G9B9E5_SHAREDEXP; - - case wgpu::TextureFormat::RG32Uint: - return DXGI_FORMAT_R32G32_UINT; - case wgpu::TextureFormat::RG32Sint: - return DXGI_FORMAT_R32G32_SINT; - case wgpu::TextureFormat::RG32Float: - return DXGI_FORMAT_R32G32_FLOAT; - case wgpu::TextureFormat::RGBA16Uint: - return DXGI_FORMAT_R16G16B16A16_UINT; - case wgpu::TextureFormat::RGBA16Sint: - return DXGI_FORMAT_R16G16B16A16_SINT; - case wgpu::TextureFormat::RGBA16Float: - return DXGI_FORMAT_R16G16B16A16_FLOAT; - - case wgpu::TextureFormat::RGBA32Uint: - return DXGI_FORMAT_R32G32B32A32_UINT; - case wgpu::TextureFormat::RGBA32Sint: - return DXGI_FORMAT_R32G32B32A32_SINT; - case wgpu::TextureFormat::RGBA32Float: - return DXGI_FORMAT_R32G32B32A32_FLOAT; - - case wgpu::TextureFormat::Depth16Unorm: - return DXGI_FORMAT_D16_UNORM; - case wgpu::TextureFormat::Depth32Float: - case wgpu::TextureFormat::Depth24Plus: - return DXGI_FORMAT_D32_FLOAT; - // DXGI_FORMAT_D24_UNORM_S8_UINT is the smallest format supported on D3D12 that has stencil. - case wgpu::TextureFormat::Stencil8: - return DXGI_FORMAT_D24_UNORM_S8_UINT; - case wgpu::TextureFormat::Depth24PlusStencil8: - case wgpu::TextureFormat::Depth32FloatStencil8: - return DXGI_FORMAT_D32_FLOAT_S8X24_UINT; - - case wgpu::TextureFormat::BC1RGBAUnorm: - return DXGI_FORMAT_BC1_UNORM; - case wgpu::TextureFormat::BC1RGBAUnormSrgb: - return DXGI_FORMAT_BC1_UNORM_SRGB; - case wgpu::TextureFormat::BC2RGBAUnorm: - return DXGI_FORMAT_BC2_UNORM; - case wgpu::TextureFormat::BC2RGBAUnormSrgb: - return DXGI_FORMAT_BC2_UNORM_SRGB; - case wgpu::TextureFormat::BC3RGBAUnorm: - return DXGI_FORMAT_BC3_UNORM; - case wgpu::TextureFormat::BC3RGBAUnormSrgb: - return DXGI_FORMAT_BC3_UNORM_SRGB; - case wgpu::TextureFormat::BC4RSnorm: - return DXGI_FORMAT_BC4_SNORM; - case wgpu::TextureFormat::BC4RUnorm: - return DXGI_FORMAT_BC4_UNORM; - case wgpu::TextureFormat::BC5RGSnorm: - return DXGI_FORMAT_BC5_SNORM; - case wgpu::TextureFormat::BC5RGUnorm: - return DXGI_FORMAT_BC5_UNORM; - case wgpu::TextureFormat::BC6HRGBFloat: - return DXGI_FORMAT_BC6H_SF16; - case wgpu::TextureFormat::BC6HRGBUfloat: - return DXGI_FORMAT_BC6H_UF16; - case wgpu::TextureFormat::BC7RGBAUnorm: - return DXGI_FORMAT_BC7_UNORM; - case wgpu::TextureFormat::BC7RGBAUnormSrgb: - return DXGI_FORMAT_BC7_UNORM_SRGB; - - case wgpu::TextureFormat::R8BG8Biplanar420Unorm: - return DXGI_FORMAT_NV12; - - case wgpu::TextureFormat::ETC2RGB8Unorm: - case wgpu::TextureFormat::ETC2RGB8UnormSrgb: - case wgpu::TextureFormat::ETC2RGB8A1Unorm: - case wgpu::TextureFormat::ETC2RGB8A1UnormSrgb: - case wgpu::TextureFormat::ETC2RGBA8Unorm: - case wgpu::TextureFormat::ETC2RGBA8UnormSrgb: - case wgpu::TextureFormat::EACR11Unorm: - case wgpu::TextureFormat::EACR11Snorm: - case wgpu::TextureFormat::EACRG11Unorm: - case wgpu::TextureFormat::EACRG11Snorm: - - case wgpu::TextureFormat::ASTC4x4Unorm: - case wgpu::TextureFormat::ASTC4x4UnormSrgb: - case wgpu::TextureFormat::ASTC5x4Unorm: - case wgpu::TextureFormat::ASTC5x4UnormSrgb: - case wgpu::TextureFormat::ASTC5x5Unorm: - case wgpu::TextureFormat::ASTC5x5UnormSrgb: - case wgpu::TextureFormat::ASTC6x5Unorm: - case wgpu::TextureFormat::ASTC6x5UnormSrgb: - case wgpu::TextureFormat::ASTC6x6Unorm: - case wgpu::TextureFormat::ASTC6x6UnormSrgb: - case wgpu::TextureFormat::ASTC8x5Unorm: - case wgpu::TextureFormat::ASTC8x5UnormSrgb: - case wgpu::TextureFormat::ASTC8x6Unorm: - case wgpu::TextureFormat::ASTC8x6UnormSrgb: - case wgpu::TextureFormat::ASTC8x8Unorm: - case wgpu::TextureFormat::ASTC8x8UnormSrgb: - case wgpu::TextureFormat::ASTC10x5Unorm: - case wgpu::TextureFormat::ASTC10x5UnormSrgb: - case wgpu::TextureFormat::ASTC10x6Unorm: - case wgpu::TextureFormat::ASTC10x6UnormSrgb: - case wgpu::TextureFormat::ASTC10x8Unorm: - case wgpu::TextureFormat::ASTC10x8UnormSrgb: - case wgpu::TextureFormat::ASTC10x10Unorm: - case wgpu::TextureFormat::ASTC10x10UnormSrgb: - case wgpu::TextureFormat::ASTC12x10Unorm: - case wgpu::TextureFormat::ASTC12x10UnormSrgb: - case wgpu::TextureFormat::ASTC12x12Unorm: - case wgpu::TextureFormat::ASTC12x12UnormSrgb: - - case wgpu::TextureFormat::Undefined: - UNREACHABLE(); - } -} - MaybeError ValidateTextureDescriptorCanBeWrapped(const TextureDescriptor* descriptor) { DAWN_INVALID_IF(descriptor->dimension != wgpu::TextureDimension::e2D, "Texture dimension (%s) is not %s.", descriptor->dimension, @@ -460,7 +142,7 @@ MaybeError ValidateD3D12TextureCanBeWrapped(ID3D12Resource* d3d12Resource, d3dDescriptor.Width, d3dDescriptor.Height, dawnDescriptor->size.width, dawnDescriptor->size.height, dawnDescriptor->size.depthOrArrayLayers); - const DXGI_FORMAT dxgiFormatFromDescriptor = D3D12TextureFormat(dawnDescriptor->format); + const DXGI_FORMAT dxgiFormatFromDescriptor = d3d::DXGITextureFormat(dawnDescriptor->format); DAWN_INVALID_IF(dxgiFormatFromDescriptor != d3dDescriptor.Format, "D3D12 texture format (%x) is not compatible with Dawn descriptor format (%s).", d3dDescriptor.Format, dawnDescriptor->format); @@ -595,8 +277,9 @@ MaybeError Texture::InitializeAsInternalTexture() { (GetFormat().HasDepthOrStencil() && (GetInternalUsage() & wgpu::TextureUsage::TextureBinding) != 0); - DXGI_FORMAT dxgiFormat = needsTypelessFormat ? D3D12TypelessTextureFormat(GetFormat().format) - : D3D12TextureFormat(GetFormat().format); + DXGI_FORMAT dxgiFormat = needsTypelessFormat + ? d3d::DXGITypelessTextureFormat(GetFormat().format) + : d3d::DXGITextureFormat(GetFormat().format); resourceDescriptor.MipLevels = static_cast(GetNumMipLevels()); resourceDescriptor.Format = dxgiFormat; @@ -702,7 +385,7 @@ ResultOrError Texture::EndAccess() { } DXGI_FORMAT Texture::GetD3D12Format() const { - return D3D12TextureFormat(GetFormat().format); + return d3d::DXGITextureFormat(GetFormat().format); } ID3D12Resource* Texture::GetD3D12Resource() const { @@ -983,7 +666,7 @@ D3D12_RENDER_TARGET_VIEW_DESC Texture::GetRTVDescriptor(const Format& format, uint32_t baseSlice, uint32_t sliceCount) const { D3D12_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = D3D12TextureFormat(format.format); + rtvDesc.Format = d3d::DXGITextureFormat(format.format); if (IsMultisampledTexture()) { ASSERT(GetDimension() == wgpu::TextureDimension::e2D); ASSERT(GetNumMipLevels() == 1); @@ -1238,7 +921,7 @@ Ref TextureView::Create(TextureBase* texture, TextureView::TextureView(TextureBase* texture, const TextureViewDescriptor* descriptor) : TextureViewBase(texture, descriptor) { - mSrvDesc.Format = D3D12TextureFormat(descriptor->format); + mSrvDesc.Format = d3d::DXGITextureFormat(descriptor->format); mSrvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; UINT planeSlice = 0; @@ -1329,7 +1012,7 @@ TextureView::TextureView(TextureBase* texture, const TextureViewDescriptor* desc const Aspect planeAspect = ConvertViewAspect(GetFormat(), descriptor->aspect); planeSlice = GetAspectIndex(planeAspect); mSrvDesc.Format = - D3D12TextureFormat(texture->GetFormat().GetAspectInfo(planeAspect).format); + d3d::DXGITextureFormat(texture->GetFormat().GetAspectInfo(planeAspect).format); } // Currently we always use D3D12_TEX2D_ARRAY_SRV because we cannot specify base array layer @@ -1398,7 +1081,7 @@ TextureView::TextureView(TextureBase* texture, const TextureViewDescriptor* desc } DXGI_FORMAT TextureView::GetD3D12Format() const { - return D3D12TextureFormat(GetFormat().format); + return d3d::DXGITextureFormat(GetFormat().format); } const D3D12_SHADER_RESOURCE_VIEW_DESC& TextureView::GetSRVDescriptor() const { diff --git a/src/dawn/native/d3d12/TextureD3D12.h b/src/dawn/native/d3d12/TextureD3D12.h index f12121e030..a46ca02264 100644 --- a/src/dawn/native/d3d12/TextureD3D12.h +++ b/src/dawn/native/d3d12/TextureD3D12.h @@ -35,7 +35,6 @@ class CommandRecordingContext; class Device; class D3D11on12ResourceCacheEntry; -DXGI_FORMAT D3D12TextureFormat(wgpu::TextureFormat format); MaybeError ValidateD3D12TextureCanBeWrapped(ID3D12Resource* d3d12Resource, const TextureDescriptor* descriptor); MaybeError ValidateTextureDescriptorCanBeWrapped(const TextureDescriptor* descriptor);