From 882072e13404c597ca79fef63d1f3e4cb9725a75 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 3 Sep 2022 23:39:51 +0200 Subject: [PATCH] [d3d11] Move maximum feature level check to D3D11DeviceFeatures --- src/d3d11/d3d11_device.cpp | 51 ++---------------------------------- src/d3d11/d3d11_device.h | 4 --- src/d3d11/d3d11_features.cpp | 35 +++++++++++++++++++++++++ src/d3d11/d3d11_features.h | 13 +++++++++ 4 files changed, 50 insertions(+), 53 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index b052c3e34..daaa5475f 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1824,28 +1824,8 @@ namespace dxvk { if (entry != s_featureLevels.end()) return entry->second; - // Check Feature Level 11_0 features - if (!features.core.features.drawIndirectFirstInstance - || !features.core.features.fragmentStoresAndAtomics - || !features.core.features.multiDrawIndirect - || !features.core.features.tessellationShader) - return D3D_FEATURE_LEVEL_10_1; - - // Check Feature Level 11_1 features - if (!features.core.features.logicOp - || !features.core.features.variableMultisampleRate - || !features.core.features.vertexPipelineStoresAndAtomics) - return D3D_FEATURE_LEVEL_11_0; - - // Check Feature Level 12_0 features - D3D11_TILED_RESOURCES_TIER tiledResourcesTier = DetermineTiledResourcesTier( - Adapter->features(), - Adapter->devicePropertiesExt()); - - if (tiledResourcesTier < D3D11_TILED_RESOURCES_TIER_2) - return D3D_FEATURE_LEVEL_11_1; - - return D3D_FEATURE_LEVEL_12_0; + // Otherwise, check the actually available device features + return D3D11DeviceFeatures::GetMaxFeatureLevel(Instance, Adapter); } @@ -2368,33 +2348,6 @@ namespace dxvk { } - D3D11_TILED_RESOURCES_TIER D3D11Device::DetermineTiledResourcesTier( - const DxvkDeviceFeatures& Features, - const DxvkDeviceInfo& Properties) { - if (!Features.core.features.sparseBinding - || !Features.core.features.sparseResidencyBuffer - || !Features.core.features.sparseResidencyImage2D - || !Features.core.features.sparseResidencyAliased - || !Properties.core.properties.sparseProperties.residencyStandard2DBlockShape) - return D3D11_TILED_RESOURCES_NOT_SUPPORTED; - - if (!Features.core.features.shaderResourceResidency - || !Features.core.features.shaderResourceMinLod - || !Features.vk12.samplerFilterMinmax - || !Properties.vk12.filterMinmaxSingleComponentFormats - || !Properties.core.properties.sparseProperties.residencyNonResidentStrict - || Properties.core.properties.sparseProperties.residencyAlignedMipSize) - return D3D11_TILED_RESOURCES_TIER_1; - - if (!Features.core.features.sparseResidencyImage3D - || !Properties.core.properties.sparseProperties.residencyStandard3DBlockShape) - return D3D11_TILED_RESOURCES_TIER_2; - - return D3D11_TILED_RESOURCES_TIER_3; - } - - - D3D11DeviceExt::D3D11DeviceExt( D3D11DXGIDevice* pContainer, diff --git a/src/d3d11/d3d11_device.h b/src/d3d11/d3d11_device.h index cfa2369c3..5da3ae3f2 100644 --- a/src/d3d11/d3d11_device.h +++ b/src/d3d11/d3d11_device.h @@ -494,10 +494,6 @@ namespace dxvk { UINT Subresource, const D3D11_BOX* pBox); - static D3D11_TILED_RESOURCES_TIER DetermineTiledResourcesTier( - const DxvkDeviceFeatures& Features, - const DxvkDeviceInfo& Properties); - }; diff --git a/src/d3d11/d3d11_features.cpp b/src/d3d11/d3d11_features.cpp index 88ed7bd9e..65b21b002 100644 --- a/src/d3d11/d3d11_features.cpp +++ b/src/d3d11/d3d11_features.cpp @@ -177,6 +177,14 @@ namespace dxvk { } + D3D_FEATURE_LEVEL D3D11DeviceFeatures::GetMaxFeatureLevel( + const Rc& Instance, + const Rc& Adapter) { + D3D11DeviceFeatures features(Instance, Adapter, D3D_FEATURE_LEVEL_12_1); + return features.GetMaxFeatureLevel(); + } + + D3D11_CONSERVATIVE_RASTERIZATION_TIER D3D11DeviceFeatures::DetermineConservativeRasterizationTier( D3D_FEATURE_LEVEL FeatureLevel) { if (FeatureLevel < D3D_FEATURE_LEVEL_11_1 @@ -265,4 +273,31 @@ namespace dxvk { return TRUE; } + + D3D_FEATURE_LEVEL D3D11DeviceFeatures::GetMaxFeatureLevel() const { + // Check Feature Level 11_0 features + if (!m_features.core.features.drawIndirectFirstInstance + || !m_features.core.features.fragmentStoresAndAtomics + || !m_features.core.features.multiDrawIndirect + || !m_features.core.features.tessellationShader) + return D3D_FEATURE_LEVEL_10_1; + + // Check Feature Level 11_1 features + if (!m_d3d11Options.OutputMergerLogicOp + || !m_features.core.features.vertexPipelineStoresAndAtomics) + return D3D_FEATURE_LEVEL_11_0; + + // Check Feature Level 12_0 features + if (m_d3d11Options2.TiledResourcesTier < D3D11_TILED_RESOURCES_TIER_2 + || !m_d3d11Options2.TypedUAVLoadAdditionalFormats) + return D3D_FEATURE_LEVEL_11_1; + + // Check Feature Level 12_1 features + if (!m_d3d11Options2.ConservativeRasterizationTier + || !m_d3d11Options2.ROVsSupported) + return D3D_FEATURE_LEVEL_12_0; + + return D3D_FEATURE_LEVEL_12_1; + } + } diff --git a/src/d3d11/d3d11_features.h b/src/d3d11/d3d11_features.h index bf5e48305..052eec6a5 100644 --- a/src/d3d11/d3d11_features.h +++ b/src/d3d11/d3d11_features.h @@ -54,6 +54,17 @@ namespace dxvk { return m_d3d11Options2.ConservativeRasterizationTier; } + /** + * \brief Tests maximum supported feature level + * + * \param [in] Instance DXVK instance + * \param [in] Adapter DXVK adapter + * \returns Highest supported feature level + */ + static D3D_FEATURE_LEVEL GetMaxFeatureLevel( + const Rc& Instance, + const Rc& Adapter); + private: DxvkDeviceFeatures m_features; @@ -100,6 +111,8 @@ namespace dxvk { const Rc& Adapter, D3D_FEATURE_LEVEL FeatureLevel); + D3D_FEATURE_LEVEL GetMaxFeatureLevel() const; + }; } \ No newline at end of file