dxvk/src/dxvk/dxvk_instance.cpp

133 lines
4.3 KiB
C++
Raw Normal View History

#include <version.h>
2017-10-10 22:32:13 +01:00
#include "dxvk_instance.h"
#include "dxvk_openvr.h"
2017-10-10 22:32:13 +01:00
#include <algorithm>
2017-10-10 22:32:13 +01:00
namespace dxvk {
DxvkInstance::DxvkInstance() {
Logger::info(str::format("Game: ", env::getExeName()));
Logger::info(str::format("DXVK: ", DXVK_VERSION));
m_config = Config::getUserConfig();
m_config.merge(Config::getAppConfig(env::getExeName()));
m_config.logOptions();
g_vrInstance.initInstanceExtensions();
m_vkl = new vk::LibraryFn();
m_vki = new vk::InstanceFn(true, this->createInstance());
m_adapters = this->queryAdapters();
g_vrInstance.initDeviceExtensions(this);
2017-10-10 22:32:13 +01:00
}
DxvkInstance::~DxvkInstance() {
2017-10-10 22:32:13 +01:00
}
Rc<DxvkAdapter> DxvkInstance::enumAdapters(uint32_t index) const {
return index < m_adapters.size()
? m_adapters[index]
: nullptr;
2017-10-10 22:32:13 +01:00
}
VkInstance DxvkInstance::createInstance() {
DxvkInstanceExtensions insExtensions;
std::array<DxvkExt*, 3> insExtensionList = {{
&insExtensions.khrGetPhysicalDeviceProperties2,
&insExtensions.khrSurface,
&insExtensions.khrWin32Surface,
}};
DxvkNameSet extensionsEnabled;
DxvkNameSet extensionsAvailable = DxvkNameSet::enumInstanceExtensions(m_vkl);
if (!extensionsAvailable.enableExtensions(
insExtensionList.size(),
insExtensionList.data(),
extensionsEnabled))
throw DxvkError("DxvkInstance: Failed to create instance");
// Enable additional extensions if necessary
extensionsEnabled.merge(g_vrInstance.getInstanceExtensions());
DxvkNameList extensionNameList = extensionsEnabled.toNameList();
2017-10-10 22:32:13 +01:00
2017-10-10 23:27:33 +01:00
Logger::info("Enabled instance extensions:");
this->logNameList(extensionNameList);
std::string appName = env::getExeName();
2017-10-10 23:27:33 +01:00
2017-10-10 22:32:13 +01:00
VkApplicationInfo appInfo;
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appInfo.pNext = nullptr;
appInfo.pApplicationName = appName.c_str();
2017-10-10 22:32:13 +01:00
appInfo.applicationVersion = 0;
appInfo.pEngineName = "DXVK";
2018-11-11 15:16:01 +00:00
appInfo.engineVersion = VK_MAKE_VERSION(0, 9, 2);
appInfo.apiVersion = 0;
2017-10-10 22:32:13 +01:00
VkInstanceCreateInfo info;
info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
info.pNext = nullptr;
info.flags = 0;
info.pApplicationInfo = &appInfo;
info.enabledLayerCount = 0;
info.ppEnabledLayerNames = nullptr;
info.enabledExtensionCount = extensionNameList.count();
info.ppEnabledExtensionNames = extensionNameList.names();
2017-10-10 22:32:13 +01:00
VkInstance result = VK_NULL_HANDLE;
if (m_vkl->vkCreateInstance(&info, nullptr, &result) != VK_SUCCESS)
throw DxvkError("DxvkInstance::createInstance: Failed to create Vulkan instance");
return result;
}
std::vector<Rc<DxvkAdapter>> DxvkInstance::queryAdapters() {
DxvkDeviceFilter filter;
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++) {
Rc<DxvkAdapter> adapter = new DxvkAdapter(this, adapters[i]);
if (filter.testAdapter(adapter))
result.push_back(adapter);
}
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;
});
if (result.size() == 0) {
Logger::warn("DXVK: No adapters found. Please check your "
"device filter settings and Vulkan setup.");
}
return result;
}
void DxvkInstance::logNameList(const DxvkNameList& names) {
2017-10-10 23:27:33 +01:00
for (uint32_t i = 0; i < names.count(); i++)
Logger::info(str::format(" ", names.name(i)));
}
2017-10-10 22:32:13 +01:00
}