diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index f196dc7be..42124597f 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -2217,9 +2217,21 @@ namespace dxvk { if (imgFeatures & (VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT)) { const VkFormat depthFormat = LookupFormat(Format, DXGI_VK_FORMAT_MODE_DEPTH).Format; - if (GetImageTypeSupport(fmtMapping.Format, VK_IMAGE_TYPE_1D)) flags1 |= D3D11_FORMAT_SUPPORT_TEXTURE1D; - if (GetImageTypeSupport(fmtMapping.Format, VK_IMAGE_TYPE_2D)) flags1 |= D3D11_FORMAT_SUPPORT_TEXTURE2D; - if (GetImageTypeSupport(fmtMapping.Format, VK_IMAGE_TYPE_3D)) flags1 |= D3D11_FORMAT_SUPPORT_TEXTURE3D; + if (GetImageTypeSupport(fmtMapping.Format, VK_IMAGE_TYPE_1D, 0)) flags1 |= D3D11_FORMAT_SUPPORT_TEXTURE1D; + if (GetImageTypeSupport(fmtMapping.Format, VK_IMAGE_TYPE_2D, 0)) flags1 |= D3D11_FORMAT_SUPPORT_TEXTURE2D; + if (GetImageTypeSupport(fmtMapping.Format, VK_IMAGE_TYPE_3D, 0)) flags1 |= D3D11_FORMAT_SUPPORT_TEXTURE3D; + + // We only support tiled resources with a single aspect + VkImageAspectFlags sparseAspects = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; + + if (m_tiledResourcesTier && !(fmtProperties->aspectMask & ~sparseAspects)) { + VkImageCreateFlags flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT + | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT + | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT; + + if (GetImageTypeSupport(fmtMapping.Format, VK_IMAGE_TYPE_2D, flags)) + flags2 |= D3D11_FORMAT_SUPPORT2_TILED; + } flags1 |= D3D11_FORMAT_SUPPORT_MIP | D3D11_FORMAT_SUPPORT_CAST_WITHIN_BIT_LAYOUT; @@ -2327,13 +2339,13 @@ namespace dxvk { } - BOOL D3D11Device::GetImageTypeSupport(VkFormat Format, VkImageType Type) const { + BOOL D3D11Device::GetImageTypeSupport(VkFormat Format, VkImageType Type, VkImageCreateFlags Flags) const { auto properties = m_dxvkDevice->getFormatLimits(Format, - Type, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT, 0); + Type, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT, Flags); if (!properties) { properties = m_dxvkDevice->getFormatLimits(Format, - Type, VK_IMAGE_TILING_LINEAR, VK_IMAGE_USAGE_SAMPLED_BIT, 0); + Type, VK_IMAGE_TILING_LINEAR, VK_IMAGE_USAGE_SAMPLED_BIT, Flags); } return properties.has_value(); diff --git a/src/d3d11/d3d11_device.h b/src/d3d11/d3d11_device.h index 0fe42524b..fef0dca11 100644 --- a/src/d3d11/d3d11_device.h +++ b/src/d3d11/d3d11_device.h @@ -464,13 +464,14 @@ namespace dxvk { const DxbcModuleInfo* pModuleInfo); HRESULT GetFormatSupportFlags( - DXGI_FORMAT Format, - UINT* pFlags1, - UINT* pFlags2) const; + DXGI_FORMAT Format, + UINT* pFlags1, + UINT* pFlags2) const; BOOL GetImageTypeSupport( - VkFormat Format, - VkImageType Type) const; + VkFormat Format, + VkImageType Type, + VkImageCreateFlags Flags) const; template HRESULT OpenSharedResourceGeneric(