From fb3dbd8bcd4e7acdfe8c956633ec1b703a323afc Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 5 May 2018 20:16:01 +0200 Subject: [PATCH] [d3d11] Relaxed view format compatibility check Fixes regressions in multiple games. MSDN docs regarding format compatibility are wrong in every way. --- src/d3d11/d3d11_device.cpp | 6 - src/d3d11/d3d11_device.h | 3 - src/d3d11/d3d11_texture.cpp | 41 +++-- src/dxgi/dxgi_adapter.cpp | 6 - src/dxgi/dxgi_adapter.h | 3 - src/dxgi/dxgi_format.cpp | 314 +++++++++++++----------------------- src/dxgi/dxgi_format.h | 10 -- src/dxgi/dxgi_interfaces.h | 13 -- 8 files changed, 132 insertions(+), 264 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index fa5df8fb..be397366 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1695,12 +1695,6 @@ namespace dxvk { } - DXGI_VK_FORMAT_MAPPING D3D11Device::GetFormatMapping( - DXGI_FORMAT Format) const { - return m_dxgiAdapter->GetFormatMapping(Format); - } - - DXGI_VK_FORMAT_INFO D3D11Device::LookupFormat( DXGI_FORMAT Format, DXGI_VK_FORMAT_MODE Mode) const { diff --git a/src/d3d11/d3d11_device.h b/src/d3d11/d3d11_device.h index 2842684d..abc09a2c 100644 --- a/src/d3d11/d3d11_device.h +++ b/src/d3d11/d3d11_device.h @@ -322,9 +322,6 @@ namespace dxvk { VkPipelineStageFlags GetEnabledShaderStages() const; - DXGI_VK_FORMAT_MAPPING GetFormatMapping( - DXGI_FORMAT Format) const; - DXGI_VK_FORMAT_INFO LookupFormat( DXGI_FORMAT Format, DXGI_VK_FORMAT_MODE Mode) const; diff --git a/src/d3d11/d3d11_texture.cpp b/src/d3d11/d3d11_texture.cpp index 830948d7..746e898e 100644 --- a/src/d3d11/d3d11_texture.cpp +++ b/src/d3d11/d3d11_texture.cpp @@ -29,16 +29,16 @@ namespace dxvk { imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; imageInfo.layout = VK_IMAGE_LAYOUT_GENERAL; - // Typeless formats require MUTABLE_FORMAT_BIT to be set, but we - // only need to do that for color images since depth-stencil formats - // are not compatible to any other depth-stencil formats + DecodeSampleCount(m_desc.SampleDesc.Count, &imageInfo.sampleCount); + + // Color formats require MUTABLE_FORMAT_BIT to be set since + // they can be reinterpreted, especially typeless formats. + // Depth-stencil formats are not compatible to each other. VkImageAspectFlags formatAspect = imageFormatInfo(formatInfo.Format)->aspectMask; - if (formatInfo.Aspect == 0 && formatAspect == VK_IMAGE_ASPECT_COLOR_BIT) + if (formatAspect & VK_IMAGE_ASPECT_COLOR_BIT) imageInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; - DecodeSampleCount(m_desc.SampleDesc.Count, &imageInfo.sampleCount); - // Adjust image flags based on the corresponding D3D flags if (m_desc.BindFlags & D3D11_BIND_SHADER_RESOURCE) { imageInfo.usage |= VK_IMAGE_USAGE_SAMPLED_BIT; @@ -167,21 +167,28 @@ namespace dxvk { bool D3D11CommonTexture::CheckViewFormatCompatibility(DXGI_FORMAT Format) const { - DXGI_VK_FORMAT_MAPPING baseFormat = m_device->GetFormatMapping(m_desc.Format); - DXGI_VK_FORMAT_MAPPING viewFormat = m_device->GetFormatMapping(Format); + DXGI_VK_FORMAT_MODE formatMode = GetFormatMode(); + DXGI_VK_FORMAT_INFO baseFormat = m_device->LookupFormat(m_desc.Format, formatMode); + DXGI_VK_FORMAT_INFO viewFormat = m_device->LookupFormat(Format, formatMode); - // The view format cannot be typeless - if (Format == viewFormat.FormatFamily) + // Identical formats always pass this test + if (baseFormat.Format == viewFormat.Format) + return true; + + // The available image aspects must match + auto baseFormatInfo = imageFormatInfo(baseFormat.Format); + auto viewFormatInfo = imageFormatInfo(viewFormat.Format); + + if (baseFormatInfo->aspectMask != viewFormatInfo->aspectMask) return false; - // If the resource is strongly typed, the view - // format must be identical to the base format. - if (m_desc.Format != baseFormat.FormatFamily) - return Format == m_desc.Format; + // Color formats can be reinterpreted. This is not restricted + // to typeless formats, we we can create SRGB views for UNORM + // textures as well etc. as long as they are bit-compatible. + if (baseFormatInfo->aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) + return baseFormatInfo->elementSize == viewFormatInfo->elementSize; - // If the resource is typeless, the view format - // must be part of the same format family. - return viewFormat.FormatFamily == baseFormat.FormatFamily; + return false; } diff --git a/src/dxgi/dxgi_adapter.cpp b/src/dxgi/dxgi_adapter.cpp index 7500c33f..f38e3604 100644 --- a/src/dxgi/dxgi_adapter.cpp +++ b/src/dxgi/dxgi_adapter.cpp @@ -188,12 +188,6 @@ namespace dxvk { } - DXGI_VK_FORMAT_MAPPING STDMETHODCALLTYPE DxgiAdapter::GetFormatMapping( - DXGI_FORMAT Format) { - return *GetDXGIFormatMapping(Format); - } - - DXGI_VK_FORMAT_INFO STDMETHODCALLTYPE DxgiAdapter::LookupFormat( DXGI_FORMAT Format, DXGI_VK_FORMAT_MODE Mode) { diff --git a/src/dxgi/dxgi_adapter.h b/src/dxgi/dxgi_adapter.h index c67decde..0976544a 100644 --- a/src/dxgi/dxgi_adapter.h +++ b/src/dxgi/dxgi_adapter.h @@ -54,9 +54,6 @@ namespace dxvk { const VkPhysicalDeviceFeatures* pFeatures, IDXGIVkDevice** ppDevice) final; - DXGI_VK_FORMAT_MAPPING STDMETHODCALLTYPE GetFormatMapping( - DXGI_FORMAT Format) final; - DXGI_VK_FORMAT_INFO STDMETHODCALLTYPE LookupFormat( DXGI_FORMAT Format, DXGI_VK_FORMAT_MODE Mode) final; diff --git a/src/dxgi/dxgi_format.cpp b/src/dxgi/dxgi_format.cpp index 5763150e..b18e1ce1 100644 --- a/src/dxgi/dxgi_format.cpp +++ b/src/dxgi/dxgi_format.cpp @@ -8,381 +8,316 @@ namespace dxvk { // DXGI_FORMAT_UNKNOWN { }, // DXGI_FORMAT_R32G32B32A32_TYPELESS - { DXGI_FORMAT_R32G32B32A32_TYPELESS, - VK_FORMAT_R32G32B32A32_UINT, + { VK_FORMAT_R32G32B32A32_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32B32A32_UINT }, // DXGI_FORMAT_R32G32B32A32_FLOAT - { DXGI_FORMAT_R32G32B32A32_TYPELESS, - VK_FORMAT_R32G32B32A32_SFLOAT, + { VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32B32A32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32G32B32A32_UINT - { DXGI_FORMAT_R32G32B32A32_TYPELESS, - VK_FORMAT_R32G32B32A32_UINT, + { VK_FORMAT_R32G32B32A32_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32B32A32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32G32B32A32_SINT - { DXGI_FORMAT_R32G32B32A32_TYPELESS, - VK_FORMAT_R32G32B32A32_SINT, + { VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32B32A32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32G32B32_TYPELESS - { DXGI_FORMAT_R32G32B32_TYPELESS, - VK_FORMAT_R32G32B32_UINT, + { VK_FORMAT_R32G32B32_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32B32_UINT }, // DXGI_FORMAT_R32G32B32_FLOAT - { DXGI_FORMAT_R32G32B32_TYPELESS, - VK_FORMAT_R32G32B32_SFLOAT, + { VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32B32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32G32B32_UINT - { DXGI_FORMAT_R32G32B32_TYPELESS, - VK_FORMAT_R32G32B32_UINT, + { VK_FORMAT_R32G32B32_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32B32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32G32B32_SINT - { DXGI_FORMAT_R32G32B32_TYPELESS, - VK_FORMAT_R32G32B32_SINT, + { VK_FORMAT_R32G32B32_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32B32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16G16B16A16_TYPELESS - { DXGI_FORMAT_R16G16B16A16_TYPELESS, - VK_FORMAT_R16G16B16A16_UINT, + { VK_FORMAT_R16G16B16A16_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16B16A16_UINT }, // DXGI_FORMAT_R16G16B16A16_FLOAT - { DXGI_FORMAT_R16G16B16A16_TYPELESS, - VK_FORMAT_R16G16B16A16_SFLOAT, + { VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16G16B16A16_UNORM - { DXGI_FORMAT_R16G16B16A16_TYPELESS, - VK_FORMAT_R16G16B16A16_UNORM, + { VK_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16G16B16A16_UINT - { DXGI_FORMAT_R16G16B16A16_TYPELESS, - VK_FORMAT_R16G16B16A16_UINT, + { VK_FORMAT_R16G16B16A16_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16G16B16A16_SNORM - { DXGI_FORMAT_R16G16B16A16_TYPELESS, - VK_FORMAT_R16G16B16A16_SNORM, + { VK_FORMAT_R16G16B16A16_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16G16B16A16_SINT - { DXGI_FORMAT_R16G16B16A16_TYPELESS, - VK_FORMAT_R16G16B16A16_SINT, + { VK_FORMAT_R16G16B16A16_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32G32_TYPELESS - { DXGI_FORMAT_R32G32_TYPELESS, - VK_FORMAT_R32G32_UINT, + { VK_FORMAT_R32G32_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32_UINT }, // DXGI_FORMAT_R32G32_FLOAT - { DXGI_FORMAT_R32G32_TYPELESS, - VK_FORMAT_R32G32_SFLOAT, + { VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32G32_UINT - { DXGI_FORMAT_R32G32_TYPELESS, - VK_FORMAT_R32G32_UINT, + { VK_FORMAT_R32G32_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32G32_SINT - { DXGI_FORMAT_R32G32_TYPELESS, - VK_FORMAT_R32G32_SINT, + { VK_FORMAT_R32G32_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32G32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32G8X24_TYPELESS - { DXGI_FORMAT_R32G8X24_TYPELESS, - VK_FORMAT_UNDEFINED, + { VK_FORMAT_UNDEFINED, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_UNDEFINED }, // DXGI_FORMAT_D32_FLOAT_S8X24_UINT - { DXGI_FORMAT_R32G8X24_TYPELESS, - VK_FORMAT_UNDEFINED, + { VK_FORMAT_UNDEFINED, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_UNDEFINED, 0, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT }, // DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS - { DXGI_FORMAT_R32G8X24_TYPELESS, - VK_FORMAT_UNDEFINED, + { VK_FORMAT_UNDEFINED, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_UNDEFINED, 0, VK_IMAGE_ASPECT_DEPTH_BIT }, // DXGI_FORMAT_X32_TYPELESS_G8X24_UINT - { DXGI_FORMAT_R32G8X24_TYPELESS, - VK_FORMAT_UNDEFINED, + { VK_FORMAT_UNDEFINED, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_UNDEFINED, 0, VK_IMAGE_ASPECT_STENCIL_BIT }, // DXGI_FORMAT_R10G10B10A2_TYPELESS - { DXGI_FORMAT_R10G10B10A2_TYPELESS, - VK_FORMAT_A2B10G10R10_UINT_PACK32, + { VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_A2B10G10R10_UINT_PACK32 }, // DXGI_FORMAT_R10G10B10A2_UNORM - { DXGI_FORMAT_R10G10B10A2_TYPELESS, - VK_FORMAT_A2B10G10R10_UNORM_PACK32, + { VK_FORMAT_A2B10G10R10_UNORM_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R10G10B10A2_UINT - { DXGI_FORMAT_R10G10B10A2_TYPELESS, - VK_FORMAT_A2B10G10R10_UINT_PACK32, + { VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R11G11B10_FLOAT - { DXGI_FORMAT_R10G10B10A2_TYPELESS, - VK_FORMAT_B10G11R11_UFLOAT_PACK32, + { VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8G8B8A8_TYPELESS - { DXGI_FORMAT_R8G8B8A8_TYPELESS, - VK_FORMAT_R8G8B8A8_UINT, + { VK_FORMAT_R8G8B8A8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8A8_UINT }, // DXGI_FORMAT_R8G8B8A8_UNORM - { DXGI_FORMAT_R8G8B8A8_TYPELESS, - VK_FORMAT_R8G8B8A8_UNORM, + { VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8A8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8G8B8A8_UNORM_SRGB - { DXGI_FORMAT_R8G8B8A8_TYPELESS, - VK_FORMAT_R8G8B8A8_SRGB, + { VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8A8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8G8B8A8_UINT - { DXGI_FORMAT_R8G8B8A8_TYPELESS, - VK_FORMAT_R8G8B8A8_UINT, + { VK_FORMAT_R8G8B8A8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8A8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8G8B8A8_SNORM - { DXGI_FORMAT_R8G8B8A8_TYPELESS, - VK_FORMAT_R8G8B8A8_SNORM, + { VK_FORMAT_R8G8B8A8_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8A8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8G8B8A8_SINT - { DXGI_FORMAT_R8G8B8A8_TYPELESS, - VK_FORMAT_R8G8B8A8_SINT, + { VK_FORMAT_R8G8B8A8_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8A8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16G16_TYPELESS - { DXGI_FORMAT_R16G16_TYPELESS, - VK_FORMAT_R16G16_UINT, + { VK_FORMAT_R16G16_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16_UINT }, // DXGI_FORMAT_R16G16_FLOAT - { DXGI_FORMAT_R16G16_TYPELESS, - VK_FORMAT_R16G16_SFLOAT, + { VK_FORMAT_R16G16_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16G16_UNORM - { DXGI_FORMAT_R16G16_TYPELESS, - VK_FORMAT_R16G16_UNORM, + { VK_FORMAT_R16G16_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16G16_UINT - { DXGI_FORMAT_R16G16_TYPELESS, - VK_FORMAT_R16G16_UINT, + { VK_FORMAT_R16G16_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16G16_SNORM - { DXGI_FORMAT_R16G16_TYPELESS, - VK_FORMAT_R16G16_SNORM, + { VK_FORMAT_R16G16_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16G16_SINT - { DXGI_FORMAT_R16G16_TYPELESS, - VK_FORMAT_R16G16_SINT, + { VK_FORMAT_R16G16_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16G16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32_TYPELESS - { DXGI_FORMAT_R32_TYPELESS, - VK_FORMAT_R32_UINT, + { VK_FORMAT_R32_UINT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_R32_UINT }, // DXGI_FORMAT_D32_FLOAT - { DXGI_FORMAT_R32_TYPELESS, - VK_FORMAT_UNDEFINED, + { VK_FORMAT_UNDEFINED, VK_FORMAT_D32_SFLOAT, VK_FORMAT_UNDEFINED, 0, VK_IMAGE_ASPECT_DEPTH_BIT }, // DXGI_FORMAT_R32_FLOAT - { DXGI_FORMAT_R32_TYPELESS, - VK_FORMAT_R32_SFLOAT, + { VK_FORMAT_R32_SFLOAT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_R32_UINT, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_ASPECT_DEPTH_BIT }, // DXGI_FORMAT_R32_UINT - { DXGI_FORMAT_R32_TYPELESS, - VK_FORMAT_R32_UINT, + { VK_FORMAT_R32_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R32_SINT - { DXGI_FORMAT_R32_TYPELESS, - VK_FORMAT_R32_SINT, + { VK_FORMAT_R32_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R32_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R24G8_TYPELESS - { DXGI_FORMAT_R24G8_TYPELESS, - VK_FORMAT_UNDEFINED, + { VK_FORMAT_UNDEFINED, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_UNDEFINED }, // DXGI_FORMAT_D24_UNORM_S8_UINT - { DXGI_FORMAT_R24G8_TYPELESS, - VK_FORMAT_UNDEFINED, + { VK_FORMAT_UNDEFINED, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_UNDEFINED, 0, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT }, // DXGI_FORMAT_R24_UNORM_X8_TYPELESS - { DXGI_FORMAT_R24G8_TYPELESS, - VK_FORMAT_UNDEFINED, + { VK_FORMAT_UNDEFINED, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_UNDEFINED, 0, VK_IMAGE_ASPECT_DEPTH_BIT }, // DXGI_FORMAT_X24_TYPELESS_G8_UINT - { DXGI_FORMAT_R24G8_TYPELESS, - VK_FORMAT_UNDEFINED, + { VK_FORMAT_UNDEFINED, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_UNDEFINED, 0, VK_IMAGE_ASPECT_STENCIL_BIT }, // DXGI_FORMAT_R8G8_TYPELESS - { DXGI_FORMAT_R8G8_TYPELESS, - VK_FORMAT_R8G8_UINT, + { VK_FORMAT_R8G8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8_UINT }, // DXGI_FORMAT_R8G8_UNORM - { DXGI_FORMAT_R8G8_TYPELESS, - VK_FORMAT_R8G8_UNORM, + { VK_FORMAT_R8G8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8G8_UINT - { DXGI_FORMAT_R8G8_TYPELESS, - VK_FORMAT_R8G8_UINT, + { VK_FORMAT_R8G8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8G8_SNORM - { DXGI_FORMAT_R8G8_TYPELESS, - VK_FORMAT_R8G8_SNORM, + { VK_FORMAT_R8G8_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8G8_SINT - { DXGI_FORMAT_R8G8_TYPELESS, - VK_FORMAT_R8G8_SINT, + { VK_FORMAT_R8G8_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16_TYPELESS - { DXGI_FORMAT_R16_TYPELESS, - VK_FORMAT_R16_UINT, + { VK_FORMAT_R16_UINT, VK_FORMAT_D16_UNORM, VK_FORMAT_R16_UINT }, // DXGI_FORMAT_R16_FLOAT - { DXGI_FORMAT_R16_TYPELESS, - VK_FORMAT_R16_SFLOAT, + { VK_FORMAT_R16_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_D16_UNORM - { DXGI_FORMAT_R16_TYPELESS, - VK_FORMAT_UNDEFINED, + { VK_FORMAT_UNDEFINED, VK_FORMAT_D16_UNORM, VK_FORMAT_UNDEFINED, 0, VK_IMAGE_ASPECT_DEPTH_BIT }, // DXGI_FORMAT_R16_UNORM - { DXGI_FORMAT_R16_TYPELESS, - VK_FORMAT_R16_UNORM, + { VK_FORMAT_R16_UNORM, VK_FORMAT_D16_UNORM, VK_FORMAT_R16_UINT, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_ASPECT_DEPTH_BIT }, // DXGI_FORMAT_R16_UINT - { DXGI_FORMAT_R16_TYPELESS, - VK_FORMAT_R16_UINT, + { VK_FORMAT_R16_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16_SNORM - { DXGI_FORMAT_R16_TYPELESS, - VK_FORMAT_R16_SNORM, + { VK_FORMAT_R16_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R16_SINT - { DXGI_FORMAT_R16_TYPELESS, - VK_FORMAT_R16_SINT, + { VK_FORMAT_R16_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R16_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8_TYPELESS - { DXGI_FORMAT_R8_TYPELESS, - VK_FORMAT_R8_UINT, + { VK_FORMAT_R8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8_UINT }, // DXGI_FORMAT_R8_UNORM - { DXGI_FORMAT_R8_TYPELESS, - VK_FORMAT_R8_UNORM, + { VK_FORMAT_R8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8_UINT - { DXGI_FORMAT_R8_TYPELESS, - VK_FORMAT_R8_UINT, + { VK_FORMAT_R8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8_SNORM - { DXGI_FORMAT_R8_TYPELESS, - VK_FORMAT_R8_SNORM, + { VK_FORMAT_R8_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8_SINT - { DXGI_FORMAT_R8_TYPELESS, - VK_FORMAT_R8_SINT, + { VK_FORMAT_R8_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8_UINT, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_A8_UNORM - { DXGI_FORMAT_R8_TYPELESS, - VK_FORMAT_R8_UNORM, + { VK_FORMAT_R8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT, 0, @@ -391,133 +326,111 @@ namespace dxvk { // DXGI_FORMAT_R1_UNORM { }, // Unsupported // DXGI_FORMAT_R9G9B9E5_SHAREDEXP - { DXGI_FORMAT_UNKNOWN, - VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, + { VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_R8G8_B8G8_UNORM - { DXGI_FORMAT_UNKNOWN, - VK_FORMAT_B8G8R8G8_422_UNORM_KHR, + { VK_FORMAT_B8G8R8G8_422_UNORM_KHR, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT, 0, { VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_ONE }}, // DXGI_FORMAT_G8R8_G8B8_UNORM - { DXGI_FORMAT_UNKNOWN, - VK_FORMAT_G8B8G8R8_422_UNORM_KHR, + { VK_FORMAT_G8B8G8R8_422_UNORM_KHR, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT, 0, { VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_ONE }}, // DXGI_FORMAT_BC1_TYPELESS - { DXGI_FORMAT_BC1_TYPELESS, - VK_FORMAT_BC1_RGBA_UNORM_BLOCK, + { VK_FORMAT_BC1_RGBA_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // DXGI_FORMAT_BC1_UNORM - { DXGI_FORMAT_BC1_TYPELESS, - VK_FORMAT_BC1_RGBA_UNORM_BLOCK, + { VK_FORMAT_BC1_RGBA_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC1_UNORM_SRGB - { DXGI_FORMAT_BC1_TYPELESS, - VK_FORMAT_BC1_RGBA_SRGB_BLOCK, + { VK_FORMAT_BC1_RGBA_SRGB_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC2_TYPELESS - { DXGI_FORMAT_BC2_TYPELESS, - VK_FORMAT_BC2_UNORM_BLOCK, + { VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // DXGI_FORMAT_BC2_UNORM - { DXGI_FORMAT_BC2_TYPELESS, - VK_FORMAT_BC2_UNORM_BLOCK, + { VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC2_UNORM_SRGB - { DXGI_FORMAT_BC2_TYPELESS, - VK_FORMAT_BC2_SRGB_BLOCK, + { VK_FORMAT_BC2_SRGB_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC3_TYPELESS - { DXGI_FORMAT_BC3_TYPELESS, - VK_FORMAT_BC3_UNORM_BLOCK, + { VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // DXGI_FORMAT_BC3_UNORM - { DXGI_FORMAT_BC3_TYPELESS, - VK_FORMAT_BC3_UNORM_BLOCK, + { VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC3_UNORM_SRGB - { DXGI_FORMAT_BC3_TYPELESS, - VK_FORMAT_BC3_SRGB_BLOCK, + { VK_FORMAT_BC3_SRGB_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC4_TYPELESS - { DXGI_FORMAT_BC4_TYPELESS, - VK_FORMAT_BC4_UNORM_BLOCK, + { VK_FORMAT_BC4_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // DXGI_FORMAT_BC4_UNORM - { DXGI_FORMAT_BC4_TYPELESS, - VK_FORMAT_BC4_UNORM_BLOCK, + { VK_FORMAT_BC4_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC4_SNORM - { DXGI_FORMAT_BC4_TYPELESS, - VK_FORMAT_BC4_SNORM_BLOCK, + { VK_FORMAT_BC4_SNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC5_TYPELESS - { DXGI_FORMAT_BC5_TYPELESS, - VK_FORMAT_BC5_UNORM_BLOCK, + { VK_FORMAT_BC5_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // DXGI_FORMAT_BC5_UNORM - { DXGI_FORMAT_BC5_TYPELESS, - VK_FORMAT_BC5_UNORM_BLOCK, + { VK_FORMAT_BC5_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC5_SNORM - { DXGI_FORMAT_BC5_TYPELESS, - VK_FORMAT_BC5_SNORM_BLOCK, + { VK_FORMAT_BC5_SNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_B5G6R5_UNORM - { DXGI_FORMAT_UNKNOWN, - VK_FORMAT_R5G6B5_UNORM_PACK16, + { VK_FORMAT_R5G6B5_UNORM_PACK16, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_B5G5R5A1_UNORM - { DXGI_FORMAT_UNKNOWN, - VK_FORMAT_A1R5G5B5_UNORM_PACK16, + { VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_B8G8R8A8_UNORM - { DXGI_FORMAT_B8G8R8A8_TYPELESS, - VK_FORMAT_B8G8R8A8_UNORM, + { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_B8G8R8X8_UNORM - { DXGI_FORMAT_B8G8R8X8_TYPELESS, - VK_FORMAT_B8G8R8A8_UNORM, + { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT, 0, @@ -526,61 +439,51 @@ namespace dxvk { // DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM { }, // Unsupported // DXGI_FORMAT_B8G8R8A8_TYPELESS - { DXGI_FORMAT_B8G8R8A8_TYPELESS, - VK_FORMAT_B8G8R8A8_UNORM, + { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // DXGI_FORMAT_B8G8R8A8_UNORM_SRGB - { DXGI_FORMAT_B8G8R8A8_TYPELESS, - VK_FORMAT_B8G8R8A8_SRGB, + { VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_B8G8R8X8_TYPELESS - { DXGI_FORMAT_B8G8R8X8_TYPELESS, - VK_FORMAT_B8G8R8A8_UNORM, + { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_B8G8R8X8_UNORM_SRGB - { DXGI_FORMAT_B8G8R8X8_TYPELESS, - VK_FORMAT_B8G8R8A8_SRGB, + { VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT, 0, { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_ONE }}, // DXGI_FORMAT_BC6H_TYPELESS - { DXGI_FORMAT_BC6H_TYPELESS, - VK_FORMAT_BC6H_UFLOAT_BLOCK, + { VK_FORMAT_BC6H_UFLOAT_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // DXGI_FORMAT_BC6H_UF16 - { DXGI_FORMAT_BC6H_TYPELESS, - VK_FORMAT_BC6H_UFLOAT_BLOCK, + { VK_FORMAT_BC6H_UFLOAT_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC6H_SF16 - { DXGI_FORMAT_BC6H_TYPELESS, - VK_FORMAT_BC6H_SFLOAT_BLOCK, + { VK_FORMAT_BC6H_SFLOAT_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC7_TYPELESS - { DXGI_FORMAT_BC7_TYPELESS, - VK_FORMAT_BC7_UNORM_BLOCK, + { VK_FORMAT_BC7_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // DXGI_FORMAT_BC7_UNORM - { DXGI_FORMAT_BC7_TYPELESS, - VK_FORMAT_BC7_UNORM_BLOCK, + { VK_FORMAT_BC7_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, // DXGI_FORMAT_BC7_UNORM_SRGB - { DXGI_FORMAT_BC7_TYPELESS, - VK_FORMAT_BC7_SRGB_BLOCK, + { VK_FORMAT_BC7_SRGB_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT }, @@ -615,8 +518,7 @@ namespace dxvk { // DXGI_FORMAT_A8P8 { }, // Unsupported // DXGI_FORMAT_B4G4R4A4_UNORM - { DXGI_FORMAT_UNKNOWN, - VK_FORMAT_B4G4R4A4_UNORM_PACK16, + { VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_IMAGE_ASPECT_COLOR_BIT, 0, @@ -631,36 +533,36 @@ namespace dxvk { }}; - const DXGI_VK_FORMAT_MAPPING* GetDXGIFormatMapping( + const DXGI_VK_FORMAT_MAPPING& GetDXGIFormatMapping( DXGI_FORMAT Format) { const size_t formatId = size_t(Format); return formatId < g_dxgiFormats.size() - ? &g_dxgiFormats[formatId] - : &g_dxgiFormats[0]; + ? g_dxgiFormats[formatId] + : g_dxgiFormats[0]; } DXGI_VK_FORMAT_INFO GetDXGIFormatInfo( DXGI_FORMAT Format, DXGI_VK_FORMAT_MODE Mode) { - const DXGI_VK_FORMAT_MAPPING* mapping + const DXGI_VK_FORMAT_MAPPING& mapping = GetDXGIFormatMapping(Format); switch (Mode) { case DXGI_VK_FORMAT_MODE_ANY: - return mapping->FormatColor != VK_FORMAT_UNDEFINED - ? DXGI_VK_FORMAT_INFO { mapping->FormatColor, mapping->AspectColor, mapping->Swizzle } - : DXGI_VK_FORMAT_INFO { mapping->FormatDepth, mapping->AspectDepth }; + return mapping.FormatColor != VK_FORMAT_UNDEFINED + ? DXGI_VK_FORMAT_INFO { mapping.FormatColor, mapping.AspectColor, mapping.Swizzle } + : DXGI_VK_FORMAT_INFO { mapping.FormatDepth, mapping.AspectDepth }; case DXGI_VK_FORMAT_MODE_COLOR: - return { mapping->FormatColor, mapping->AspectColor, mapping->Swizzle }; + return { mapping.FormatColor, mapping.AspectColor, mapping.Swizzle }; case DXGI_VK_FORMAT_MODE_DEPTH: - return { mapping->FormatDepth, mapping->AspectDepth }; + return { mapping.FormatDepth, mapping.AspectDepth }; case DXGI_VK_FORMAT_MODE_RAW: - return { mapping->FormatRaw, mapping->AspectColor }; + return { mapping.FormatRaw, mapping.AspectColor }; } Logger::err("DXGI: GetDXGIFormatInfo: Internal error"); diff --git a/src/dxgi/dxgi_format.h b/src/dxgi/dxgi_format.h index 3fcf7f5a..86e6ee6b 100644 --- a/src/dxgi/dxgi_format.h +++ b/src/dxgi/dxgi_format.h @@ -12,7 +12,6 @@ namespace dxvk { * Maps a DXGI format to a set of Vulkan formats. */ struct DXGI_VK_FORMAT_MAPPING { - DXGI_FORMAT FormatFamily = DXGI_FORMAT_UNKNOWN; ///< Typeless format family VkFormat FormatColor = VK_FORMAT_UNDEFINED; ///< Corresponding color format VkFormat FormatDepth = VK_FORMAT_UNDEFINED; ///< Corresponding depth format VkFormat FormatRaw = VK_FORMAT_UNDEFINED; ///< Bit-compatible integer format @@ -54,15 +53,6 @@ namespace dxvk { DXGI_VK_FORMAT_MODE_RAW = 3, ///< Unsigned integer format }; - /** - * \brief Retrieves a format mapping entry - * - * \param [in] Format The format to look up - * \returns Pointer to the map entry - */ - const DXGI_VK_FORMAT_MAPPING* GetDXGIFormatMapping( - DXGI_FORMAT Format); - /** * \brief Retrieves info for a given DXGI format * diff --git a/src/dxgi/dxgi_interfaces.h b/src/dxgi/dxgi_interfaces.h index bd69bf2a..7f76f257 100644 --- a/src/dxgi/dxgi_interfaces.h +++ b/src/dxgi/dxgi_interfaces.h @@ -58,19 +58,6 @@ IDXGIVkAdapter : public IDXGIAdapter1 { const VkPhysicalDeviceFeatures* pFeatures, IDXGIVkDevice** ppDevice) = 0; - /** - * \brief Retrieves a format mapping entry for a DXGI format - * - * Returns the raw format mapping entry, which contains - * the corresponding Vulkan formats for color images, - * depth images, and raw image operations, as well as - * some generic info about the format. - * \param [in] Format The DXGI format - * \returns The format mapping entry - */ - virtual dxvk::DXGI_VK_FORMAT_MAPPING STDMETHODCALLTYPE GetFormatMapping( - DXGI_FORMAT Format) = 0; - /** * \brief Maps a DXGI format to a compatible Vulkan format *