From 0ba00b3f590ca26866ea4a79a2c949cf96073721 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 31 Jul 2018 16:58:25 +0200 Subject: [PATCH] [dxvk] Add extended device feature structure This allows the client API to query and enable extended features in the future, should it become necessary, much like the extende feature queries. --- src/d3d11/d3d11_device.cpp | 84 ++++++++-------- src/d3d11/d3d11_device.h | 2 +- src/d3d11/d3d11_main.cpp | 2 +- src/dxbc/dxbc_options.cpp | 4 +- src/dxgi/dxgi_adapter.cpp | 2 +- src/dxgi/dxgi_adapter.h | 2 +- src/dxgi/dxgi_device.cpp | 2 +- src/dxgi/dxgi_device.h | 2 +- src/dxgi/dxgi_interfaces.h | 2 +- src/dxvk/dxvk_adapter.cpp | 193 +++++++++++++++++++++++------------- src/dxvk/dxvk_adapter.h | 24 +++-- src/dxvk/dxvk_device.cpp | 2 +- src/dxvk/dxvk_device.h | 7 +- src/dxvk/dxvk_device_info.h | 12 +++ 14 files changed, 207 insertions(+), 133 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index a1a48e69..512b2cbc 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1563,10 +1563,9 @@ namespace dxvk { if (FeatureSupportDataSize != sizeof(D3D11_FEATURE_DATA_DOUBLES)) return E_INVALIDARG; - const VkPhysicalDeviceFeatures& features = m_dxvkDevice->features(); - auto info = static_cast(pFeatureSupportData); - info->DoublePrecisionFloatShaderOps = features.shaderFloat64 && features.shaderInt64; + info->DoublePrecisionFloatShaderOps = m_dxvkDevice->features().core.features.shaderFloat64 + && m_dxvkDevice->features().core.features.shaderInt64; } return S_OK; case D3D11_FEATURE_FORMAT_SUPPORT: { @@ -1599,10 +1598,10 @@ namespace dxvk { // TODO implement, most of these are required for FL 11.1 // https://msdn.microsoft.com/en-us/library/windows/desktop/hh404457(v=vs.85).aspx - const VkPhysicalDeviceFeatures& features = m_dxvkDevice->features(); + const DxvkDeviceFeatures& features = m_dxvkDevice->features(); auto info = static_cast(pFeatureSupportData); - info->OutputMergerLogicOp = features.logicOp; + info->OutputMergerLogicOp = features.core.features.logicOp; info->UAVOnlyRenderingForcedSampleCount = FALSE; info->DiscardAPIsSeenByDriver = FALSE; info->FlagsForUpdateAndCopySeenByDriver = FALSE; @@ -1760,10 +1759,10 @@ namespace dxvk { | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; - if (m_dxvkDevice->features().geometryShader) + if (m_dxvkDevice->features().core.features.geometryShader) enabledShaderPipelineStages |= VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT; - if (m_dxvkDevice->features().tessellationShader) { + if (m_dxvkDevice->features().core.features.tessellationShader) { enabledShaderPipelineStages |= VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT; } @@ -1780,7 +1779,7 @@ namespace dxvk { return false; // Check whether all features are supported - const VkPhysicalDeviceFeatures features + const DxvkDeviceFeatures features = GetDeviceFeatures(adapter, featureLevel); if (!adapter->checkFeatureSupport(features)) @@ -1791,60 +1790,63 @@ namespace dxvk { } - VkPhysicalDeviceFeatures D3D11Device::GetDeviceFeatures( + DxvkDeviceFeatures D3D11Device::GetDeviceFeatures( const Rc& adapter, D3D_FEATURE_LEVEL featureLevel) { - VkPhysicalDeviceFeatures supported = adapter->features(); - VkPhysicalDeviceFeatures enabled = {}; + DxvkDeviceFeatures supported = adapter->features(); + DxvkDeviceFeatures enabled = {}; + + enabled.core.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; + enabled.core.pNext = nullptr; if (featureLevel >= D3D_FEATURE_LEVEL_9_1) { - enabled.depthClamp = VK_TRUE; - enabled.depthBiasClamp = VK_TRUE; - enabled.fillModeNonSolid = VK_TRUE; - enabled.pipelineStatisticsQuery = supported.pipelineStatisticsQuery; - enabled.sampleRateShading = VK_TRUE; - enabled.samplerAnisotropy = VK_TRUE; - enabled.shaderClipDistance = VK_TRUE; - enabled.shaderCullDistance = VK_TRUE; - enabled.robustBufferAccess = VK_TRUE; + enabled.core.features.depthClamp = VK_TRUE; + enabled.core.features.depthBiasClamp = VK_TRUE; + enabled.core.features.fillModeNonSolid = VK_TRUE; + enabled.core.features.pipelineStatisticsQuery = supported.core.features.pipelineStatisticsQuery; + enabled.core.features.sampleRateShading = VK_TRUE; + enabled.core.features.samplerAnisotropy = VK_TRUE; + enabled.core.features.shaderClipDistance = VK_TRUE; + enabled.core.features.shaderCullDistance = VK_TRUE; + enabled.core.features.robustBufferAccess = VK_TRUE; } if (featureLevel >= D3D_FEATURE_LEVEL_9_2) { - enabled.occlusionQueryPrecise = VK_TRUE; + enabled.core.features.occlusionQueryPrecise = VK_TRUE; } if (featureLevel >= D3D_FEATURE_LEVEL_9_3) { - enabled.multiViewport = VK_TRUE; - enabled.independentBlend = VK_TRUE; + enabled.core.features.multiViewport = VK_TRUE; + enabled.core.features.independentBlend = VK_TRUE; } if (featureLevel >= D3D_FEATURE_LEVEL_10_0) { - enabled.fullDrawIndexUint32 = VK_TRUE; - enabled.fragmentStoresAndAtomics = VK_TRUE; - enabled.geometryShader = VK_TRUE; - enabled.logicOp = supported.logicOp; - enabled.shaderImageGatherExtended = VK_TRUE; - enabled.textureCompressionBC = VK_TRUE; + enabled.core.features.fullDrawIndexUint32 = VK_TRUE; + enabled.core.features.fragmentStoresAndAtomics = VK_TRUE; + enabled.core.features.geometryShader = VK_TRUE; + enabled.core.features.logicOp = supported.core.features.logicOp; + enabled.core.features.shaderImageGatherExtended = VK_TRUE; + enabled.core.features.textureCompressionBC = VK_TRUE; } if (featureLevel >= D3D_FEATURE_LEVEL_10_1) { - enabled.dualSrcBlend = VK_TRUE; - enabled.imageCubeArray = VK_TRUE; + enabled.core.features.dualSrcBlend = VK_TRUE; + enabled.core.features.imageCubeArray = VK_TRUE; } if (featureLevel >= D3D_FEATURE_LEVEL_11_0) { - enabled.shaderFloat64 = supported.shaderFloat64; - enabled.shaderInt64 = supported.shaderInt64; - enabled.tessellationShader = VK_TRUE; + enabled.core.features.shaderFloat64 = supported.core.features.shaderFloat64; + enabled.core.features.shaderInt64 = supported.core.features.shaderInt64; + enabled.core.features.tessellationShader = VK_TRUE; // TODO enable unconditionally once RADV gains support - enabled.shaderStorageImageMultisample = supported.shaderStorageImageMultisample; - enabled.shaderStorageImageReadWithoutFormat = supported.shaderStorageImageReadWithoutFormat; - enabled.shaderStorageImageWriteWithoutFormat = VK_TRUE; + enabled.core.features.shaderStorageImageMultisample = supported.core.features.shaderStorageImageMultisample; + enabled.core.features.shaderStorageImageReadWithoutFormat = supported.core.features.shaderStorageImageReadWithoutFormat; + enabled.core.features.shaderStorageImageWriteWithoutFormat = VK_TRUE; } if (featureLevel >= D3D_FEATURE_LEVEL_11_1) { - enabled.logicOp = VK_TRUE; - enabled.vertexPipelineStoresAndAtomics = VK_TRUE; + enabled.core.features.logicOp = VK_TRUE; + enabled.core.features.vertexPipelineStoresAndAtomics = VK_TRUE; } return enabled; @@ -1936,7 +1938,7 @@ namespace dxvk { flags1 |= D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_MIP_AUTOGEN; - if (m_dxvkDevice->features().logicOp) + if (m_dxvkDevice->features().core.features.logicOp) flags2 |= D3D11_FORMAT_SUPPORT2_OUTPUT_MERGER_LOGIC_OP; } @@ -1981,7 +1983,7 @@ namespace dxvk { flags1 |= D3D11_FORMAT_SUPPORT_TYPED_UNORDERED_ACCESS_VIEW; flags2 |= D3D11_FORMAT_SUPPORT2_UAV_TYPED_STORE; - if (m_dxvkDevice->features().shaderStorageImageReadWithoutFormat + if (m_dxvkDevice->features().core.features.shaderStorageImageReadWithoutFormat || Format == DXGI_FORMAT_R32_UINT || Format == DXGI_FORMAT_R32_SINT || Format == DXGI_FORMAT_R32_FLOAT) diff --git a/src/d3d11/d3d11_device.h b/src/d3d11/d3d11_device.h index 28d801a5..0967ecd6 100644 --- a/src/d3d11/d3d11_device.h +++ b/src/d3d11/d3d11_device.h @@ -340,7 +340,7 @@ namespace dxvk { const Rc& adapter, D3D_FEATURE_LEVEL featureLevel); - static VkPhysicalDeviceFeatures GetDeviceFeatures( + static DxvkDeviceFeatures GetDeviceFeatures( const Rc& adapter, D3D_FEATURE_LEVEL featureLevel); diff --git a/src/d3d11/d3d11_main.cpp b/src/d3d11/d3d11_main.cpp index 59ebf95c..92db016c 100644 --- a/src/d3d11/d3d11_main.cpp +++ b/src/d3d11/d3d11_main.cpp @@ -69,7 +69,7 @@ extern "C" { Logger::info(str::format("D3D11CoreCreateDevice: Using feature level ", fl)); Com container = new D3D11DeviceContainer(); - const VkPhysicalDeviceFeatures deviceFeatures + const DxvkDeviceFeatures deviceFeatures = D3D11Device::GetDeviceFeatures(adapter, fl); if (FAILED(dxvkAdapter->CreateDevice(container.ptr(), &deviceFeatures, &container->m_dxgiDevice))) { diff --git a/src/dxbc/dxbc_options.cpp b/src/dxbc/dxbc_options.cpp index 2ddc942d..c7c408ae 100644 --- a/src/dxbc/dxbc_options.cpp +++ b/src/dxbc/dxbc_options.cpp @@ -21,9 +21,9 @@ namespace dxvk { DxbcOptions getDxbcDeviceOptions(const Rc& device) { DxbcOptions flags; - VkPhysicalDeviceFeatures devFeatures = device->features(); + const DxvkDeviceFeatures& devFeatures = device->features(); - if (devFeatures.shaderStorageImageReadWithoutFormat) + if (devFeatures.core.features.shaderStorageImageReadWithoutFormat) flags.set(DxbcOption::UseStorageImageReadWithoutFormat); flags.set(DxbcOption::DeferKill); diff --git a/src/dxgi/dxgi_adapter.cpp b/src/dxgi/dxgi_adapter.cpp index 7c0fa62c..0a076c94 100644 --- a/src/dxgi/dxgi_adapter.cpp +++ b/src/dxgi/dxgi_adapter.cpp @@ -210,7 +210,7 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE DxgiAdapter::CreateDevice( IDXGIObject* pContainer, - const VkPhysicalDeviceFeatures* pFeatures, + const DxvkDeviceFeatures* pFeatures, IDXGIVkDevice** ppDevice) { InitReturnPtr(ppDevice); diff --git a/src/dxgi/dxgi_adapter.h b/src/dxgi/dxgi_adapter.h index 674a502f..9ca692bb 100644 --- a/src/dxgi/dxgi_adapter.h +++ b/src/dxgi/dxgi_adapter.h @@ -50,7 +50,7 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE CreateDevice( IDXGIObject* pContainer, - const VkPhysicalDeviceFeatures* pFeatures, + const DxvkDeviceFeatures* pFeatures, IDXGIVkDevice** ppDevice) final; DXGI_VK_FORMAT_INFO STDMETHODCALLTYPE LookupFormat( diff --git a/src/dxgi/dxgi_device.cpp b/src/dxgi/dxgi_device.cpp index dfba4b9d..38cb3da9 100644 --- a/src/dxgi/dxgi_device.cpp +++ b/src/dxgi/dxgi_device.cpp @@ -8,7 +8,7 @@ namespace dxvk { DxgiDevice::DxgiDevice( IDXGIObject* pContainer, IDXGIVkAdapter* pAdapter, - const VkPhysicalDeviceFeatures* pFeatures) + const DxvkDeviceFeatures* pFeatures) : m_container (pContainer), m_adapter (pAdapter) { m_device = m_adapter->GetDXVKAdapter()->createDevice(*pFeatures); diff --git a/src/dxgi/dxgi_device.h b/src/dxgi/dxgi_device.h index 54114a06..3a1e64a3 100644 --- a/src/dxgi/dxgi_device.h +++ b/src/dxgi/dxgi_device.h @@ -16,7 +16,7 @@ namespace dxvk { DxgiDevice( IDXGIObject* pContainer, IDXGIVkAdapter* pAdapter, - const VkPhysicalDeviceFeatures* pFeatures); + const DxvkDeviceFeatures* pFeatures); ~DxgiDevice(); ULONG STDMETHODCALLTYPE AddRef() final; diff --git a/src/dxgi/dxgi_interfaces.h b/src/dxgi/dxgi_interfaces.h index 7ed83a4c..fd1d2e0d 100644 --- a/src/dxgi/dxgi_interfaces.h +++ b/src/dxgi/dxgi_interfaces.h @@ -55,7 +55,7 @@ IDXGIVkAdapter : public IDXGIAdapter2 { */ virtual HRESULT STDMETHODCALLTYPE CreateDevice( IDXGIObject* pContainer, - const VkPhysicalDeviceFeatures* pFeatures, + const dxvk::DxvkDeviceFeatures* pFeatures, IDXGIVkDevice** ppDevice) = 0; /** diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index 17b7b27b..fb32d910 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -15,6 +15,7 @@ namespace dxvk { m_handle (handle) { this->queryExtensions(); this->queryDeviceInfo(); + this->queryDeviceFeatures(); this->queryDeviceQueues(); } @@ -36,13 +37,6 @@ namespace dxvk { } - VkPhysicalDeviceFeatures DxvkAdapter::features() const { - VkPhysicalDeviceFeatures features; - m_vki->vkGetPhysicalDeviceFeatures(m_handle, &features); - return features; - } - - VkFormatProperties DxvkAdapter::formatProperties(VkFormat format) const { VkFormatProperties formatProperties; m_vki->vkGetPhysicalDeviceFormatProperties(m_handle, format, &formatProperties); @@ -78,69 +72,121 @@ namespace dxvk { } - bool DxvkAdapter::checkFeatureSupport( - const VkPhysicalDeviceFeatures& required) const { - const VkPhysicalDeviceFeatures supported = this->features(); - - return (supported.robustBufferAccess || !required.robustBufferAccess) - && (supported.fullDrawIndexUint32 || !required.fullDrawIndexUint32) - && (supported.imageCubeArray || !required.imageCubeArray) - && (supported.independentBlend || !required.independentBlend) - && (supported.geometryShader || !required.geometryShader) - && (supported.tessellationShader || !required.tessellationShader) - && (supported.sampleRateShading || !required.sampleRateShading) - && (supported.dualSrcBlend || !required.dualSrcBlend) - && (supported.logicOp || !required.logicOp) - && (supported.multiDrawIndirect || !required.multiDrawIndirect) - && (supported.drawIndirectFirstInstance || !required.drawIndirectFirstInstance) - && (supported.depthClamp || !required.depthClamp) - && (supported.depthBiasClamp || !required.depthBiasClamp) - && (supported.fillModeNonSolid || !required.fillModeNonSolid) - && (supported.depthBounds || !required.depthBounds) - && (supported.wideLines || !required.wideLines) - && (supported.largePoints || !required.largePoints) - && (supported.alphaToOne || !required.alphaToOne) - && (supported.multiViewport || !required.multiViewport) - && (supported.samplerAnisotropy || !required.samplerAnisotropy) - && (supported.textureCompressionETC2 || !required.textureCompressionETC2) - && (supported.textureCompressionASTC_LDR || !required.textureCompressionASTC_LDR) - && (supported.textureCompressionBC || !required.textureCompressionBC) - && (supported.occlusionQueryPrecise || !required.occlusionQueryPrecise) - && (supported.pipelineStatisticsQuery || !required.pipelineStatisticsQuery) - && (supported.vertexPipelineStoresAndAtomics || !required.vertexPipelineStoresAndAtomics) - && (supported.fragmentStoresAndAtomics || !required.fragmentStoresAndAtomics) - && (supported.shaderTessellationAndGeometryPointSize || !required.shaderTessellationAndGeometryPointSize) - && (supported.shaderImageGatherExtended || !required.shaderImageGatherExtended) - && (supported.shaderStorageImageExtendedFormats || !required.shaderStorageImageExtendedFormats) - && (supported.shaderStorageImageMultisample || !required.shaderStorageImageMultisample) - && (supported.shaderStorageImageReadWithoutFormat || !required.shaderStorageImageReadWithoutFormat) - && (supported.shaderStorageImageWriteWithoutFormat || !required.shaderStorageImageWriteWithoutFormat) - && (supported.shaderUniformBufferArrayDynamicIndexing || !required.shaderUniformBufferArrayDynamicIndexing) - && (supported.shaderSampledImageArrayDynamicIndexing || !required.shaderSampledImageArrayDynamicIndexing) - && (supported.shaderStorageBufferArrayDynamicIndexing || !required.shaderStorageBufferArrayDynamicIndexing) - && (supported.shaderStorageImageArrayDynamicIndexing || !required.shaderStorageImageArrayDynamicIndexing) - && (supported.shaderClipDistance || !required.shaderClipDistance) - && (supported.shaderCullDistance || !required.shaderCullDistance) - && (supported.shaderFloat64 || !required.shaderFloat64) - && (supported.shaderInt64 || !required.shaderInt64) - && (supported.shaderInt16 || !required.shaderInt16) - && (supported.shaderResourceResidency || !required.shaderResourceResidency) - && (supported.shaderResourceMinLod || !required.shaderResourceMinLod) - && (supported.sparseBinding || !required.sparseBinding) - && (supported.sparseResidencyBuffer || !required.sparseResidencyBuffer) - && (supported.sparseResidencyImage2D || !required.sparseResidencyImage2D) - && (supported.sparseResidencyImage3D || !required.sparseResidencyImage3D) - && (supported.sparseResidency2Samples || !required.sparseResidency2Samples) - && (supported.sparseResidency4Samples || !required.sparseResidency4Samples) - && (supported.sparseResidency8Samples || !required.sparseResidency8Samples) - && (supported.sparseResidency16Samples || !required.sparseResidency16Samples) - && (supported.sparseResidencyAliased || !required.sparseResidencyAliased) - && (supported.variableMultisampleRate || !required.variableMultisampleRate) - && (supported.inheritedQueries || !required.inheritedQueries); + bool DxvkAdapter::checkFeatureSupport(const DxvkDeviceFeatures& required) const { + return (m_deviceFeatures.core.features.robustBufferAccess + || !required.core.features.robustBufferAccess) + && (m_deviceFeatures.core.features.fullDrawIndexUint32 + || !required.core.features.fullDrawIndexUint32) + && (m_deviceFeatures.core.features.imageCubeArray + || !required.core.features.imageCubeArray) + && (m_deviceFeatures.core.features.independentBlend + || !required.core.features.independentBlend) + && (m_deviceFeatures.core.features.geometryShader + || !required.core.features.geometryShader) + && (m_deviceFeatures.core.features.tessellationShader + || !required.core.features.tessellationShader) + && (m_deviceFeatures.core.features.sampleRateShading + || !required.core.features.sampleRateShading) + && (m_deviceFeatures.core.features.dualSrcBlend + || !required.core.features.dualSrcBlend) + && (m_deviceFeatures.core.features.logicOp + || !required.core.features.logicOp) + && (m_deviceFeatures.core.features.multiDrawIndirect + || !required.core.features.multiDrawIndirect) + && (m_deviceFeatures.core.features.drawIndirectFirstInstance + || !required.core.features.drawIndirectFirstInstance) + && (m_deviceFeatures.core.features.depthClamp + || !required.core.features.depthClamp) + && (m_deviceFeatures.core.features.depthBiasClamp + || !required.core.features.depthBiasClamp) + && (m_deviceFeatures.core.features.fillModeNonSolid + || !required.core.features.fillModeNonSolid) + && (m_deviceFeatures.core.features.depthBounds + || !required.core.features.depthBounds) + && (m_deviceFeatures.core.features.wideLines + || !required.core.features.wideLines) + && (m_deviceFeatures.core.features.largePoints + || !required.core.features.largePoints) + && (m_deviceFeatures.core.features.alphaToOne + || !required.core.features.alphaToOne) + && (m_deviceFeatures.core.features.multiViewport + || !required.core.features.multiViewport) + && (m_deviceFeatures.core.features.samplerAnisotropy + || !required.core.features.samplerAnisotropy) + && (m_deviceFeatures.core.features.textureCompressionETC2 + || !required.core.features.textureCompressionETC2) + && (m_deviceFeatures.core.features.textureCompressionASTC_LDR + || !required.core.features.textureCompressionASTC_LDR) + && (m_deviceFeatures.core.features.textureCompressionBC + || !required.core.features.textureCompressionBC) + && (m_deviceFeatures.core.features.occlusionQueryPrecise + || !required.core.features.occlusionQueryPrecise) + && (m_deviceFeatures.core.features.pipelineStatisticsQuery + || !required.core.features.pipelineStatisticsQuery) + && (m_deviceFeatures.core.features.vertexPipelineStoresAndAtomics + || !required.core.features.vertexPipelineStoresAndAtomics) + && (m_deviceFeatures.core.features.fragmentStoresAndAtomics + || !required.core.features.fragmentStoresAndAtomics) + && (m_deviceFeatures.core.features.shaderTessellationAndGeometryPointSize + || !required.core.features.shaderTessellationAndGeometryPointSize) + && (m_deviceFeatures.core.features.shaderImageGatherExtended + || !required.core.features.shaderImageGatherExtended) + && (m_deviceFeatures.core.features.shaderStorageImageExtendedFormats + || !required.core.features.shaderStorageImageExtendedFormats) + && (m_deviceFeatures.core.features.shaderStorageImageMultisample + || !required.core.features.shaderStorageImageMultisample) + && (m_deviceFeatures.core.features.shaderStorageImageReadWithoutFormat + || !required.core.features.shaderStorageImageReadWithoutFormat) + && (m_deviceFeatures.core.features.shaderStorageImageWriteWithoutFormat + || !required.core.features.shaderStorageImageWriteWithoutFormat) + && (m_deviceFeatures.core.features.shaderUniformBufferArrayDynamicIndexing + || !required.core.features.shaderUniformBufferArrayDynamicIndexing) + && (m_deviceFeatures.core.features.shaderSampledImageArrayDynamicIndexing + || !required.core.features.shaderSampledImageArrayDynamicIndexing) + && (m_deviceFeatures.core.features.shaderStorageBufferArrayDynamicIndexing + || !required.core.features.shaderStorageBufferArrayDynamicIndexing) + && (m_deviceFeatures.core.features.shaderStorageImageArrayDynamicIndexing + || !required.core.features.shaderStorageImageArrayDynamicIndexing) + && (m_deviceFeatures.core.features.shaderClipDistance + || !required.core.features.shaderClipDistance) + && (m_deviceFeatures.core.features.shaderCullDistance + || !required.core.features.shaderCullDistance) + && (m_deviceFeatures.core.features.shaderFloat64 + || !required.core.features.shaderFloat64) + && (m_deviceFeatures.core.features.shaderInt64 + || !required.core.features.shaderInt64) + && (m_deviceFeatures.core.features.shaderInt16 + || !required.core.features.shaderInt16) + && (m_deviceFeatures.core.features.shaderResourceResidency + || !required.core.features.shaderResourceResidency) + && (m_deviceFeatures.core.features.shaderResourceMinLod + || !required.core.features.shaderResourceMinLod) + && (m_deviceFeatures.core.features.sparseBinding + || !required.core.features.sparseBinding) + && (m_deviceFeatures.core.features.sparseResidencyBuffer + || !required.core.features.sparseResidencyBuffer) + && (m_deviceFeatures.core.features.sparseResidencyImage2D + || !required.core.features.sparseResidencyImage2D) + && (m_deviceFeatures.core.features.sparseResidencyImage3D + || !required.core.features.sparseResidencyImage3D) + && (m_deviceFeatures.core.features.sparseResidency2Samples + || !required.core.features.sparseResidency2Samples) + && (m_deviceFeatures.core.features.sparseResidency4Samples + || !required.core.features.sparseResidency4Samples) + && (m_deviceFeatures.core.features.sparseResidency8Samples + || !required.core.features.sparseResidency8Samples) + && (m_deviceFeatures.core.features.sparseResidency16Samples + || !required.core.features.sparseResidency16Samples) + && (m_deviceFeatures.core.features.sparseResidencyAliased + || !required.core.features.sparseResidencyAliased) + && (m_deviceFeatures.core.features.variableMultisampleRate + || !required.core.features.variableMultisampleRate) + && (m_deviceFeatures.core.features.inheritedQueries + || !required.core.features.inheritedQueries); } - Rc DxvkAdapter::createDevice(const VkPhysicalDeviceFeatures& enabledFeatures) { + Rc DxvkAdapter::createDevice(DxvkDeviceFeatures enabledFeatures) { DxvkDeviceExtensions devExtensions; std::array devExtensionList = {{ @@ -192,7 +238,7 @@ namespace dxvk { presentQueue.queueFamilyIndex = pIndex; queueInfos.push_back(presentQueue); } - + VkDeviceCreateInfo info; info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; info.pNext = nullptr; @@ -203,7 +249,7 @@ namespace dxvk { info.ppEnabledLayerNames = nullptr; info.enabledExtensionCount = extensionNameList.count(); info.ppEnabledExtensionNames = extensionNameList.names(); - info.pEnabledFeatures = &enabledFeatures; + info.pEnabledFeatures = &enabledFeatures.core.features; VkDevice device = VK_NULL_HANDLE; @@ -282,6 +328,15 @@ namespace dxvk { } + void DxvkAdapter::queryDeviceFeatures() { + m_deviceFeatures = DxvkDeviceFeatures(); + m_deviceFeatures.core.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; + m_deviceFeatures.core.pNext = nullptr; + + m_vki->vkGetPhysicalDeviceFeatures2KHR(m_handle, &m_deviceFeatures.core); + } + + void DxvkAdapter::queryDeviceQueues() { uint32_t numQueueFamilies = 0; m_vki->vkGetPhysicalDeviceQueueFamilyProperties( diff --git a/src/dxvk/dxvk_adapter.h b/src/dxvk/dxvk_adapter.h index d9418888..5d504101 100644 --- a/src/dxvk/dxvk_adapter.h +++ b/src/dxvk/dxvk_adapter.h @@ -81,6 +81,16 @@ namespace dxvk { return m_deviceInfo; } + /** + * \brief Supportred device features + * + * Queries the supported device features. + * \returns Device features + */ + const DxvkDeviceFeatures& features() const { + return m_deviceFeatures; + } + /** * \brief Memory properties * @@ -90,14 +100,6 @@ namespace dxvk { */ VkPhysicalDeviceMemoryProperties memoryProperties() const; - /** - * \brief Supportred device features - * - * Queries the supported device features. - * \returns Device features - */ - VkPhysicalDeviceFeatures features() const; - /** * \brief Queries format support * @@ -145,7 +147,7 @@ namespace dxvk { * \returns \c true if all features are supported */ bool checkFeatureSupport( - const VkPhysicalDeviceFeatures& required) const; + const DxvkDeviceFeatures& required) const; /** * \brief Creates a DXVK device @@ -155,7 +157,7 @@ namespace dxvk { * \returns Device handle */ Rc createDevice( - const VkPhysicalDeviceFeatures& enabledFeatures); + DxvkDeviceFeatures enabledFeatures); /** * \brief Creates a surface @@ -184,11 +186,13 @@ namespace dxvk { DxvkNameSet m_deviceExtensions; DxvkDeviceInfo m_deviceInfo; + DxvkDeviceFeatures m_deviceFeatures; std::vector m_queueFamilies; void queryExtensions(); void queryDeviceInfo(); + void queryDeviceFeatures(); void queryDeviceQueues(); uint32_t getAdapterIndex() const; diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp index e0cae8ce..d520fb18 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -7,7 +7,7 @@ namespace dxvk { const Rc& adapter, const Rc& vkd, const DxvkDeviceExtensions& extensions, - const VkPhysicalDeviceFeatures& features) + const DxvkDeviceFeatures& features) : m_adapter (adapter), m_vkd (vkd), m_extensions (extensions), diff --git a/src/dxvk/dxvk_device.h b/src/dxvk/dxvk_device.h index b07ab52b..89038569 100644 --- a/src/dxvk/dxvk_device.h +++ b/src/dxvk/dxvk_device.h @@ -65,7 +65,7 @@ namespace dxvk { const Rc& adapter, const Rc& vkd, const DxvkDeviceExtensions& extensions, - const VkPhysicalDeviceFeatures& features); + const DxvkDeviceFeatures& features); ~DxvkDevice(); @@ -119,7 +119,7 @@ namespace dxvk { * \brief Enabled device features * \returns Enabled features */ - const VkPhysicalDeviceFeatures& features() const { + const DxvkDeviceFeatures& features() const { return m_features; } @@ -374,7 +374,8 @@ namespace dxvk { Rc m_adapter; Rc m_vkd; DxvkDeviceExtensions m_extensions; - VkPhysicalDeviceFeatures m_features; + + DxvkDeviceFeatures m_features; VkPhysicalDeviceProperties m_properties; Rc m_memory; diff --git a/src/dxvk/dxvk_device_info.h b/src/dxvk/dxvk_device_info.h index 62d7ad0b..620fe220 100644 --- a/src/dxvk/dxvk_device_info.h +++ b/src/dxvk/dxvk_device_info.h @@ -17,4 +17,16 @@ namespace dxvk { VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT extVertexAttributeDivisor; }; + + /** + * \brief Device features + * + * Stores core features and extension-specific features. + * If the respective extensions are not available, the + * extended features will be marked as unsupported. + */ + struct DxvkDeviceFeatures { + VkPhysicalDeviceFeatures2KHR core; + }; + } \ No newline at end of file