1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-22 07:54:15 +01:00

[dxvk] Move adapter list to the DXVK instance

This commit is contained in:
Philip Rebohle 2018-06-26 12:33:26 +02:00
parent 3572775635
commit 9cae049b53
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
4 changed files with 44 additions and 33 deletions

View File

@ -4,10 +4,9 @@
namespace dxvk { namespace dxvk {
DxgiFactory::DxgiFactory() DxgiFactory::DxgiFactory()
: m_instance(new DxvkInstance()), : m_instance(new DxvkInstance()) {
m_adapters(m_instance->enumAdapters()) { for (uint32_t i = 0; m_instance->enumAdapters(i) != nullptr; i++)
for (const auto& adapter : m_adapters) m_instance->enumAdapters(i)->logAdapterInfo();
adapter->logAdapterInfo();
} }
@ -182,11 +181,13 @@ namespace dxvk {
if (ppAdapter == nullptr) if (ppAdapter == nullptr)
return DXGI_ERROR_INVALID_CALL; return DXGI_ERROR_INVALID_CALL;
if (Adapter >= m_adapters.size()) Rc<DxvkAdapter> dxvkAdapter
= m_instance->enumAdapters(Adapter);
if (dxvkAdapter == nullptr)
return DXGI_ERROR_NOT_FOUND; return DXGI_ERROR_NOT_FOUND;
*ppAdapter = ref(new DxgiAdapter( *ppAdapter = ref(new DxgiAdapter(this, dxvkAdapter));
this, m_adapters.at(Adapter)));
return S_OK; return S_OK;
} }

View File

@ -102,8 +102,7 @@ namespace dxvk {
private: private:
Rc<DxvkInstance> m_instance; Rc<DxvkInstance> m_instance;
std::vector<Rc<DxvkAdapter>> m_adapters;
HWND m_associatedWindow = nullptr; HWND m_associatedWindow = nullptr;

View File

@ -8,7 +8,7 @@ namespace dxvk {
DxvkInstance::DxvkInstance() DxvkInstance::DxvkInstance()
: m_vkl(new vk::LibraryFn()), : m_vkl(new vk::LibraryFn()),
m_vki(new vk::InstanceFn(this->createInstance())) { m_vki(new vk::InstanceFn(this->createInstance())) {
this->createAdapters();
} }
@ -17,26 +17,10 @@ namespace dxvk {
} }
std::vector<Rc<DxvkAdapter>> DxvkInstance::enumAdapters() { Rc<DxvkAdapter> DxvkInstance::enumAdapters(uint32_t index) const {
uint32_t numAdapters = 0; return index < m_adapters.size()
if (m_vki->vkEnumeratePhysicalDevices(m_vki->instance(), &numAdapters, nullptr) != VK_SUCCESS) ? m_adapters[index]
throw DxvkError("DxvkInstance::enumAdapters: Failed to enumerate adapters"); : nullptr;
std::vector<VkPhysicalDevice> adapters(numAdapters);
if (m_vki->vkEnumeratePhysicalDevices(m_vki->instance(), &numAdapters, adapters.data()) != VK_SUCCESS)
throw DxvkError("DxvkInstance::enumAdapters: Failed to enumerate adapters");
std::vector<Rc<DxvkAdapter>> 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<DxvkAdapter>& a, const Rc<DxvkAdapter>& b) -> bool {
return a->deviceProperties().deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU
&& b->deviceProperties().deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU;
});
return result;
} }
@ -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<VkPhysicalDevice> 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<DxvkAdapter>& a, const Rc<DxvkAdapter>& 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) { void DxvkInstance::logNameList(const vk::NameList& names) {
for (uint32_t i = 0; i < names.count(); i++) for (uint32_t i = 0; i < names.count(); i++)
Logger::info(str::format(" ", names.name(i))); Logger::info(str::format(" ", names.name(i)));

View File

@ -37,10 +37,13 @@ namespace dxvk {
} }
/** /**
* \brief Retrieves a list of adapters * \brief Retrieves an adapter
* \returns List of adapter objects *
* \param [in] index Adapter index
* \returns The adapter, or \c nullptr.
*/ */
std::vector<Rc<DxvkAdapter>> enumAdapters(); Rc<DxvkAdapter> enumAdapters(
uint32_t index) const;
/** /**
* \brief Queries extra device extensions * \brief Queries extra device extensions
@ -58,8 +61,12 @@ namespace dxvk {
Rc<vk::LibraryFn> m_vkl; Rc<vk::LibraryFn> m_vkl;
Rc<vk::InstanceFn> m_vki; Rc<vk::InstanceFn> m_vki;
std::vector<Rc<DxvkAdapter>> m_adapters;
VkInstance createInstance(); VkInstance createInstance();
void createAdapters();
void logNameList(const vk::NameList& names); void logNameList(const vk::NameList& names);
}; };