diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index c7e78076..12775c13 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -208,6 +208,11 @@ namespace dxvk { } + void DxvkAdapter::enableExtensions(const DxvkNameSet& extensions) { + m_extraExtensions.merge(extensions); + } + + Rc DxvkAdapter::createDevice(DxvkDeviceFeatures enabledFeatures) { DxvkDeviceExtensions devExtensions; @@ -237,7 +242,7 @@ namespace dxvk { throw DxvkError("DxvkAdapter: Failed to create device"); // Enable additional extensions if necessary - extensionsEnabled.merge(g_vrInstance.getDeviceExtensions(getAdapterIndex())); + extensionsEnabled.merge(m_extraExtensions); DxvkNameList extensionNameList = extensionsEnabled.toNameList(); Logger::info("Enabled device extensions:"); @@ -460,16 +465,6 @@ namespace dxvk { m_vki->vkGetPhysicalDeviceQueueFamilyProperties( m_handle, &numQueueFamilies, m_queueFamilies.data()); } - - - uint32_t DxvkAdapter::getAdapterIndex() const { - for (uint32_t i = 0; m_instance->enumAdapters(i) != nullptr; i++) { - if (m_instance->enumAdapters(i).ptr() == this) - return i; - } - - return ~0u; - } void DxvkAdapter::logNameList(const DxvkNameList& names) { diff --git a/src/dxvk/dxvk_adapter.h b/src/dxvk/dxvk_adapter.h index ef8ab6b3..549d21d2 100644 --- a/src/dxvk/dxvk_adapter.h +++ b/src/dxvk/dxvk_adapter.h @@ -182,6 +182,17 @@ namespace dxvk { bool checkFeatureSupport( const DxvkDeviceFeatures& required) const; + /** + * \brief Enables extensions for this adapter + * + * When creating a device, all extensions that + * are added using this method will be enabled + * in addition to the ones required by DXVK. + * This is used for OpenVR support. + */ + void enableExtensions( + const DxvkNameSet& extensions); + /** * \brief Creates a DXVK device * @@ -244,6 +255,7 @@ namespace dxvk { Rc m_vki; VkPhysicalDevice m_handle; + DxvkNameSet m_extraExtensions; DxvkNameSet m_deviceExtensions; DxvkDeviceInfo m_deviceInfo; DxvkDeviceFeatures m_deviceFeatures; @@ -258,8 +270,6 @@ namespace dxvk { void queryDeviceFeatures(); void queryDeviceQueues(); - uint32_t getAdapterIndex() const; - static void logNameList(const DxvkNameList& names); }; diff --git a/src/dxvk/dxvk_instance.cpp b/src/dxvk/dxvk_instance.cpp index 8a71e0c8..69a0be5d 100644 --- a/src/dxvk/dxvk_instance.cpp +++ b/src/dxvk/dxvk_instance.cpp @@ -23,6 +23,11 @@ namespace dxvk { m_adapters = this->queryAdapters(); g_vrInstance.initDeviceExtensions(this); + for (uint32_t i = 0; i < m_adapters.size(); i++) { + m_adapters[i]->enableExtensions( + g_vrInstance.getDeviceExtensions(i)); + } + m_options = DxvkOptions(m_config); }