mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-20 01:54:16 +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 {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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)));
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user