2018-01-16 13:24:36 +01:00
|
|
|
#include "dxvk_extensions.h"
|
|
|
|
|
|
|
|
namespace dxvk {
|
|
|
|
|
|
|
|
DxvkExtensionList:: DxvkExtensionList() { }
|
|
|
|
DxvkExtensionList::~DxvkExtensionList() { }
|
|
|
|
|
|
|
|
|
|
|
|
void DxvkExtensionList::enableExtensions(const vk::NameSet& extensions) {
|
|
|
|
for (auto ext : m_extensions) {
|
2018-05-16 20:52:24 +02:00
|
|
|
if (extensions.contains(ext->name()))
|
2018-01-16 13:24:36 +01:00
|
|
|
ext->setEnabled(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool DxvkExtensionList::checkSupportStatus() {
|
|
|
|
bool requiredExtensionsEnabled = true;
|
|
|
|
|
|
|
|
for (auto ext : m_extensions) {
|
|
|
|
if (!ext->enabled()) {
|
|
|
|
switch (ext->type()) {
|
|
|
|
case DxvkExtensionType::Optional:
|
|
|
|
// An optional extension should not have any impact on
|
|
|
|
// the functionality of an application, so inform the
|
|
|
|
// user only if verbose debug messages are enabled
|
|
|
|
Logger::debug(str::format("Optional Vulkan extension ", ext->name(), " not supported"));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DxvkExtensionType::Desired:
|
|
|
|
// If a desired extension is not supported, applications
|
|
|
|
// should keep working but may exhibit unexpected behaviour,
|
|
|
|
// so we'll inform the user anyway
|
|
|
|
Logger::warn(str::format("Vulkan extension ", ext->name(), " not supported"));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DxvkExtensionType::Required:
|
|
|
|
// Do not exit early so we can catch all unsupported extensions.
|
|
|
|
requiredExtensionsEnabled = false;
|
|
|
|
Logger::err(str::format("Required Vulkan extension ", ext->name(), " not supported"));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return requiredExtensionsEnabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-05-16 21:38:11 +02:00
|
|
|
vk::NameSet DxvkExtensionList::getEnabledExtensionNames() const {
|
|
|
|
vk::NameSet names;
|
2018-01-16 13:24:36 +01:00
|
|
|
|
|
|
|
for (auto ext : m_extensions) {
|
|
|
|
if (ext->enabled())
|
|
|
|
names.add(ext->name());
|
|
|
|
}
|
|
|
|
|
|
|
|
return names;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DxvkExtensionList::registerExtension(DxvkExtension* extension) {
|
|
|
|
m_extensions.push_back(extension);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DxvkExtension::DxvkExtension(
|
|
|
|
DxvkExtensionList* parent,
|
|
|
|
const char* name,
|
|
|
|
DxvkExtensionType type)
|
|
|
|
: m_name(name), m_type(type), m_enabled(false) {
|
|
|
|
parent->registerExtension(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|