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:
parent
3572775635
commit
9cae049b53
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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)));
|
||||||
|
@ -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);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user