diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index f07043a0..af8c501c 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1324,6 +1324,9 @@ namespace dxvk { enabled.core.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; enabled.core.pNext = nullptr; + + enabled.extVertexAttributeDivisor.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT; + enabled.extVertexAttributeDivisor.pNext = nullptr; if (featureLevel >= D3D_FEATURE_LEVEL_9_1) { enabled.core.features.depthClamp = VK_TRUE; @@ -1376,6 +1379,12 @@ namespace dxvk { enabled.core.features.vertexPipelineStoresAndAtomics = VK_TRUE; } + if (supported.extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor + && supported.extVertexAttributeDivisor.vertexAttributeInstanceRateZeroDivisor) { + enabled.extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor = VK_TRUE; + enabled.extVertexAttributeDivisor.vertexAttributeInstanceRateZeroDivisor = VK_TRUE; + } + return enabled; } diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index 133cb5ff..59617048 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -182,7 +182,11 @@ namespace dxvk { && (m_deviceFeatures.core.features.variableMultisampleRate || !required.core.features.variableMultisampleRate) && (m_deviceFeatures.core.features.inheritedQueries - || !required.core.features.inheritedQueries); + || !required.core.features.inheritedQueries) + && (m_deviceFeatures.extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor + || !required.extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor) + && (m_deviceFeatures.extVertexAttributeDivisor.vertexAttributeInstanceRateZeroDivisor + || !required.extVertexAttributeDivisor.vertexAttributeInstanceRateZeroDivisor); } @@ -217,7 +221,16 @@ namespace dxvk { Logger::info("Enabled device extensions:"); this->logNameList(extensionNameList); + + // Create pNext chain for additional device features + enabledFeatures.core.pNext = nullptr; + + if (devExtensions.extVertexAttributeDivisor.revision() >= 3) { + enabledFeatures.extVertexAttributeDivisor.pNext = enabledFeatures.core.pNext; + enabledFeatures.core.pNext = &enabledFeatures.extVertexAttributeDivisor; + } + // Create one single queue for graphics and present float queuePriority = 1.0f; std::vector queueInfos; @@ -241,7 +254,7 @@ namespace dxvk { VkDeviceCreateInfo info; info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - info.pNext = nullptr; + info.pNext = enabledFeatures.core.pNext; info.flags = 0; info.queueCreateInfoCount = queueInfos.size(); info.pQueueCreateInfos = queueInfos.data();