2018-01-16 13:24:36 +01:00
|
|
|
#include "dxvk_extensions.h"
|
|
|
|
|
|
|
|
namespace dxvk {
|
|
|
|
|
2018-07-23 20:07:21 +02:00
|
|
|
DxvkNameSet::DxvkNameSet() { }
|
|
|
|
DxvkNameSet::~DxvkNameSet() { }
|
|
|
|
|
|
|
|
|
|
|
|
void DxvkNameSet::add(const char* pName) {
|
2018-09-10 21:39:56 +02:00
|
|
|
m_names.insert({ pName, 1u });
|
2018-01-16 13:24:36 +01:00
|
|
|
}
|
2018-07-23 20:07:21 +02:00
|
|
|
|
|
|
|
|
|
|
|
void DxvkNameSet::merge(const DxvkNameSet& names) {
|
2018-09-10 21:39:56 +02:00
|
|
|
for (const auto& pair : names.m_names)
|
|
|
|
m_names.insert(pair);
|
2018-07-23 20:07:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-09-10 21:39:56 +02:00
|
|
|
uint32_t DxvkNameSet::supports(const char* pName) const {
|
|
|
|
auto entry = m_names.find(pName);
|
|
|
|
|
|
|
|
if (entry == m_names.end())
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return entry->second != 0
|
|
|
|
? entry->second
|
|
|
|
: 1;
|
2018-07-23 20:07:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool DxvkNameSet::enableExtensions(
|
|
|
|
uint32_t numExtensions,
|
|
|
|
DxvkExt** ppExtensions,
|
|
|
|
DxvkNameSet& nameSet) const {
|
|
|
|
bool allRequiredEnabled = true;
|
|
|
|
|
|
|
|
for (uint32_t i = 0; i < numExtensions; i++) {
|
|
|
|
DxvkExt* ext = ppExtensions[i];
|
|
|
|
|
2019-07-03 10:59:48 +02:00
|
|
|
if (ext->mode() == DxvkExtMode::Disabled)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
uint32_t revision = supports(ext->name());
|
2018-07-23 20:07:21 +02:00
|
|
|
|
2019-07-03 10:59:48 +02:00
|
|
|
if (revision) {
|
|
|
|
if (ext->mode() != DxvkExtMode::Passive)
|
2018-07-23 20:07:21 +02:00
|
|
|
nameSet.add(ext->name());
|
2019-07-03 10:59:48 +02:00
|
|
|
|
|
|
|
ext->enable(revision);
|
|
|
|
} else if (ext->mode() == DxvkExtMode::Required) {
|
|
|
|
Logger::info(str::format("Required Vulkan extension ", ext->name(), " not supported"));
|
|
|
|
allRequiredEnabled = false;
|
|
|
|
continue;
|
2018-01-16 13:24:36 +01:00
|
|
|
}
|
|
|
|
}
|
2018-07-23 20:07:21 +02:00
|
|
|
|
|
|
|
return allRequiredEnabled;
|
2018-01-16 13:24:36 +01:00
|
|
|
}
|
2018-07-23 20:07:21 +02:00
|
|
|
|
|
|
|
|
|
|
|
DxvkNameList DxvkNameSet::toNameList() const {
|
|
|
|
DxvkNameList nameList;
|
2018-09-10 21:39:56 +02:00
|
|
|
for (const auto& pair : m_names)
|
|
|
|
nameList.add(pair.first.c_str());
|
2018-07-23 20:07:21 +02:00
|
|
|
return nameList;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DxvkNameSet DxvkNameSet::enumInstanceLayers(const Rc<vk::LibraryFn>& vkl) {
|
|
|
|
uint32_t entryCount = 0;
|
|
|
|
if (vkl->vkEnumerateInstanceLayerProperties(
|
|
|
|
&entryCount, nullptr) != VK_SUCCESS)
|
|
|
|
return DxvkNameSet();
|
2018-01-16 13:24:36 +01:00
|
|
|
|
2018-07-23 20:07:21 +02:00
|
|
|
std::vector<VkLayerProperties> entries(entryCount);
|
|
|
|
if (vkl->vkEnumerateInstanceLayerProperties(
|
|
|
|
&entryCount, entries.data()) != VK_SUCCESS)
|
|
|
|
return DxvkNameSet();
|
|
|
|
|
|
|
|
DxvkNameSet set;
|
|
|
|
for (uint32_t i = 0; i < entryCount; i++)
|
2018-09-10 21:39:56 +02:00
|
|
|
set.m_names.insert({ entries[i].layerName, entries[i].specVersion });
|
2018-07-23 20:07:21 +02:00
|
|
|
return set;
|
2018-01-16 13:24:36 +01:00
|
|
|
}
|
|
|
|
|
2018-07-23 20:07:21 +02:00
|
|
|
|
|
|
|
DxvkNameSet DxvkNameSet::enumInstanceExtensions(const Rc<vk::LibraryFn>& vkl) {
|
|
|
|
uint32_t entryCount = 0;
|
|
|
|
if (vkl->vkEnumerateInstanceExtensionProperties(
|
|
|
|
nullptr, &entryCount, nullptr) != VK_SUCCESS)
|
|
|
|
return DxvkNameSet();
|
|
|
|
|
|
|
|
std::vector<VkExtensionProperties> entries(entryCount);
|
|
|
|
if (vkl->vkEnumerateInstanceExtensionProperties(
|
|
|
|
nullptr, &entryCount, entries.data()) != VK_SUCCESS)
|
|
|
|
return DxvkNameSet();
|
|
|
|
|
|
|
|
DxvkNameSet set;
|
|
|
|
for (uint32_t i = 0; i < entryCount; i++)
|
2018-09-10 21:39:56 +02:00
|
|
|
set.m_names.insert({ entries[i].extensionName, entries[i].specVersion });
|
2018-07-23 20:07:21 +02:00
|
|
|
return set;
|
2018-01-16 13:24:36 +01:00
|
|
|
}
|
2018-07-23 20:07:21 +02:00
|
|
|
|
2018-01-16 13:24:36 +01:00
|
|
|
|
2018-07-23 20:07:21 +02:00
|
|
|
DxvkNameSet DxvkNameSet::enumDeviceExtensions(
|
|
|
|
const Rc<vk::InstanceFn>& vki,
|
|
|
|
VkPhysicalDevice device) {
|
|
|
|
uint32_t entryCount = 0;
|
|
|
|
if (vki->vkEnumerateDeviceExtensionProperties(
|
|
|
|
device, nullptr, &entryCount, nullptr) != VK_SUCCESS)
|
|
|
|
return DxvkNameSet();
|
|
|
|
|
|
|
|
std::vector<VkExtensionProperties> entries(entryCount);
|
|
|
|
if (vki->vkEnumerateDeviceExtensionProperties(
|
|
|
|
device, nullptr, &entryCount, entries.data()) != VK_SUCCESS)
|
|
|
|
return DxvkNameSet();
|
|
|
|
|
|
|
|
DxvkNameSet set;
|
|
|
|
for (uint32_t i = 0; i < entryCount; i++)
|
2018-09-10 21:39:56 +02:00
|
|
|
set.m_names.insert({ entries[i].extensionName, entries[i].specVersion });
|
2018-07-23 20:07:21 +02:00
|
|
|
return set;
|
2018-01-16 13:24:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|