From 652525119f3cf7868d831fb273e6ee5daac0234c Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 20 Dec 2018 01:27:49 +0100 Subject: [PATCH] [vr] Query required device extensions during instance creation After the DXGI device refactor in c5deedef2dcc920f29061c50e097f66a32f1f05e, device extensions required for OpenVR interop would not be enabled correctly because the VR-related code is now being called from both the D3D11 and DXGI DLLs rather than just the DXGI DLL, and the D3D11 one is not in the expected state when querying required device extensions. Querying them during instance creation fixes that problem as it moves the relevant code back to the same DLL which creates the Vulkan instance. --- src/dxvk/dxvk_adapter.cpp | 17 ++++++----------- src/dxvk/dxvk_adapter.h | 14 ++++++++++++-- src/dxvk/dxvk_instance.cpp | 5 +++++ 3 files changed, 23 insertions(+), 13 deletions(-) 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); }