mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-13 19:29:14 +01:00
[d3d11] Implement format feature check for tiled resources
This commit is contained in:
parent
ca0dedd213
commit
7f856b545a
@ -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();
|
||||
|
@ -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<bool IsKmtHandle>
|
||||
HRESULT OpenSharedResourceGeneric(
|
||||
|
Loading…
x
Reference in New Issue
Block a user