[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 {
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> 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;
}

View File

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

View File

@ -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<Rc<DxvkAdapter>> 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<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;
Rc<DxvkAdapter> 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<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) {
for (uint32_t i = 0; i < names.count(); i++)
Logger::info(str::format(" ", names.name(i)));

View File

@ -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<Rc<DxvkAdapter>> enumAdapters();
Rc<DxvkAdapter> enumAdapters(
uint32_t index) const;
/**
* \brief Queries extra device extensions
@ -57,8 +60,12 @@ namespace dxvk {
Rc<vk::LibraryFn> m_vkl;
Rc<vk::InstanceFn> m_vki;
std::vector<Rc<DxvkAdapter>> m_adapters;
VkInstance createInstance();
void createAdapters();
void logNameList(const vk::NameList& names);