diff --git a/src/dxgi/dxgi_factory.cpp b/src/dxgi/dxgi_factory.cpp index dcffe6f9..4d9b60b6 100644 --- a/src/dxgi/dxgi_factory.cpp +++ b/src/dxgi/dxgi_factory.cpp @@ -4,10 +4,9 @@ namespace dxvk { DxgiFactory::DxgiFactory() - : m_instance(new DxvkInstance()), - m_adapters(m_instance->enumAdapters()) { - for (const auto& adapter : m_adapters) - adapter->logAdapterInfo(); + : m_instance(new DxvkInstance()) { + for (uint32_t i = 0; m_instance->enumAdapters(i) != nullptr; i++) + m_instance->enumAdapters(i)->logAdapterInfo(); } @@ -182,11 +181,13 @@ namespace dxvk { if (ppAdapter == nullptr) return DXGI_ERROR_INVALID_CALL; - if (Adapter >= m_adapters.size()) + Rc dxvkAdapter + = m_instance->enumAdapters(Adapter); + + if (dxvkAdapter == nullptr) return DXGI_ERROR_NOT_FOUND; - *ppAdapter = ref(new DxgiAdapter( - this, m_adapters.at(Adapter))); + *ppAdapter = ref(new DxgiAdapter(this, dxvkAdapter)); return S_OK; } diff --git a/src/dxgi/dxgi_factory.h b/src/dxgi/dxgi_factory.h index 524aacda..9217a710 100644 --- a/src/dxgi/dxgi_factory.h +++ b/src/dxgi/dxgi_factory.h @@ -102,8 +102,7 @@ namespace dxvk { private: - Rc m_instance; - std::vector> m_adapters; + Rc m_instance; HWND m_associatedWindow = nullptr; diff --git a/src/dxvk/dxvk_instance.cpp b/src/dxvk/dxvk_instance.cpp index fa97de8b..f83c2f40 100644 --- a/src/dxvk/dxvk_instance.cpp +++ b/src/dxvk/dxvk_instance.cpp @@ -8,7 +8,7 @@ namespace dxvk { DxvkInstance::DxvkInstance() : m_vkl(new vk::LibraryFn()), m_vki(new vk::InstanceFn(this->createInstance())) { - + this->createAdapters(); } @@ -17,26 +17,10 @@ namespace dxvk { } - std::vector> DxvkInstance::enumAdapters() { - uint32_t numAdapters = 0; - if (m_vki->vkEnumeratePhysicalDevices(m_vki->instance(), &numAdapters, nullptr) != VK_SUCCESS) - throw DxvkError("DxvkInstance::enumAdapters: Failed to enumerate adapters"); - - std::vector adapters(numAdapters); - if (m_vki->vkEnumeratePhysicalDevices(m_vki->instance(), &numAdapters, adapters.data()) != VK_SUCCESS) - throw DxvkError("DxvkInstance::enumAdapters: Failed to enumerate adapters"); - - std::vector> result; - for (uint32_t i = 0; i < numAdapters; i++) - result.push_back(new DxvkAdapter(this, adapters[i])); - - std::sort(result.begin(), result.end(), - [this] (const Rc& a, const Rc& b) -> bool { - return a->deviceProperties().deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU - && b->deviceProperties().deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; - }); - - return result; + Rc DxvkInstance::enumAdapters(uint32_t index) const { + return index < m_adapters.size() + ? m_adapters[index] + : nullptr; } @@ -90,6 +74,26 @@ namespace dxvk { } + void DxvkInstance::createAdapters() { + uint32_t numAdapters = 0; + if (m_vki->vkEnumeratePhysicalDevices(m_vki->instance(), &numAdapters, nullptr) != VK_SUCCESS) + throw DxvkError("DxvkInstance::enumAdapters: Failed to enumerate adapters"); + + std::vector adapters(numAdapters); + if (m_vki->vkEnumeratePhysicalDevices(m_vki->instance(), &numAdapters, adapters.data()) != VK_SUCCESS) + throw DxvkError("DxvkInstance::enumAdapters: Failed to enumerate adapters"); + + for (uint32_t i = 0; i < numAdapters; i++) + m_adapters.push_back(new DxvkAdapter(this, adapters[i])); + + std::sort(m_adapters.begin(), m_adapters.end(), + [this] (const Rc& a, const Rc& b) -> bool { + return a->deviceProperties().deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU + && b->deviceProperties().deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; + }); + } + + void DxvkInstance::logNameList(const vk::NameList& names) { for (uint32_t i = 0; i < names.count(); i++) Logger::info(str::format(" ", names.name(i))); diff --git a/src/dxvk/dxvk_instance.h b/src/dxvk/dxvk_instance.h index 5d1ee859..de176cfe 100644 --- a/src/dxvk/dxvk_instance.h +++ b/src/dxvk/dxvk_instance.h @@ -37,10 +37,13 @@ namespace dxvk { } /** - * \brief Retrieves a list of adapters - * \returns List of adapter objects + * \brief Retrieves an adapter + * + * \param [in] index Adapter index + * \returns The adapter, or \c nullptr. */ - std::vector> enumAdapters(); + Rc enumAdapters( + uint32_t index) const; /** * \brief Queries extra device extensions @@ -57,8 +60,12 @@ namespace dxvk { Rc m_vkl; Rc m_vki; + + std::vector> m_adapters; VkInstance createInstance(); + + void createAdapters(); void logNameList(const vk::NameList& names);