1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-07 16:54:14 +01:00

[dxvk] Collect info about the supported revisions of an extension

This commit is contained in:
Philip Rebohle 2018-09-10 21:39:56 +02:00
parent 54b2001f42
commit f5270c8522
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 38 additions and 23 deletions

View File

@ -7,18 +7,25 @@ namespace dxvk {
void DxvkNameSet::add(const char* pName) { void DxvkNameSet::add(const char* pName) {
m_names.insert(pName); m_names.insert({ pName, 1u });
} }
void DxvkNameSet::merge(const DxvkNameSet& names) { void DxvkNameSet::merge(const DxvkNameSet& names) {
for (const std::string& name : names.m_names) for (const auto& pair : names.m_names)
m_names.insert(name); m_names.insert(pair);
} }
bool DxvkNameSet::supports(const char* pName) const { uint32_t DxvkNameSet::supports(const char* pName) const {
return m_names.find(pName) != m_names.end(); auto entry = m_names.find(pName);
if (entry == m_names.end())
return 0;
return entry->second != 0
? entry->second
: 1;
} }
@ -32,11 +39,11 @@ namespace dxvk {
DxvkExt* ext = ppExtensions[i]; DxvkExt* ext = ppExtensions[i];
if (ext->mode() != DxvkExtMode::Disabled) { if (ext->mode() != DxvkExtMode::Disabled) {
bool supported = supports(ext->name()); uint32_t revision = supports(ext->name());
if (supported) { if (revision != 0) {
nameSet.add(ext->name()); nameSet.add(ext->name());
ext->enable(); ext->enable(revision);
} else if (ext->mode() == DxvkExtMode::Required) { } else if (ext->mode() == DxvkExtMode::Required) {
Logger::info(str::format( Logger::info(str::format(
"Required Vulkan extension ", ext->name(), " not supported")); "Required Vulkan extension ", ext->name(), " not supported"));
@ -51,8 +58,8 @@ namespace dxvk {
DxvkNameList DxvkNameSet::toNameList() const { DxvkNameList DxvkNameSet::toNameList() const {
DxvkNameList nameList; DxvkNameList nameList;
for (const std::string& name : m_names) for (const auto& pair : m_names)
nameList.add(name.c_str()); nameList.add(pair.first.c_str());
return nameList; return nameList;
} }
@ -70,7 +77,7 @@ namespace dxvk {
DxvkNameSet set; DxvkNameSet set;
for (uint32_t i = 0; i < entryCount; i++) for (uint32_t i = 0; i < entryCount; i++)
set.m_names.insert(entries[i].layerName); set.m_names.insert({ entries[i].layerName, entries[i].specVersion });
return set; return set;
} }
@ -88,7 +95,7 @@ namespace dxvk {
DxvkNameSet set; DxvkNameSet set;
for (uint32_t i = 0; i < entryCount; i++) for (uint32_t i = 0; i < entryCount; i++)
set.m_names.insert(entries[i].extensionName); set.m_names.insert({ entries[i].extensionName, entries[i].specVersion });
return set; return set;
} }
@ -108,7 +115,7 @@ namespace dxvk {
DxvkNameSet set; DxvkNameSet set;
for (uint32_t i = 0; i < entryCount; i++) for (uint32_t i = 0; i < entryCount; i++)
set.m_names.insert(entries[i].extensionName); set.m_names.insert({ entries[i].extensionName, entries[i].specVersion });
return set; return set;
} }

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include <set> #include <map>
#include <vector> #include <vector>
#include "dxvk_include.h" #include "dxvk_include.h"
@ -60,7 +60,15 @@ namespace dxvk {
* \returns \c true if the extension is enabled * \returns \c true if the extension is enabled
*/ */
operator bool () const { operator bool () const {
return m_enabled; return m_revision != 0;
}
/**
* \brief Supported revision
* \returns Supported revision
*/
uint32_t revision() const {
return m_revision;
} }
/** /**
@ -76,15 +84,15 @@ namespace dxvk {
/** /**
* \brief Enables the extension * \brief Enables the extension
*/ */
void enable() { void enable(uint32_t revision) {
m_enabled = true; m_revision = revision;
} }
private: private:
const char* m_name = nullptr; const char* m_name = nullptr;
DxvkExtMode m_mode = DxvkExtMode::Disabled; DxvkExtMode m_mode = DxvkExtMode::Disabled;
bool m_enabled = false; uint32_t m_revision = 0;
}; };
@ -175,9 +183,9 @@ namespace dxvk {
* \brief Checks whether an extension is supported * \brief Checks whether an extension is supported
* *
* \param [in] pName Extension name * \param [in] pName Extension name
* \returns \c true if the extension is supported * \returns Supported revision, or zero
*/ */
bool supports( uint32_t supports(
const char* pName) const; const char* pName) const;
/** /**
@ -238,7 +246,7 @@ namespace dxvk {
private: private:
std::set<std::string> m_names; std::map<std::string, uint32_t> m_names;
}; };