mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxvk] Refactor the way instance extensions are enabled
This commit is contained in:
parent
d1eddbdc3f
commit
796379a551
@ -160,23 +160,27 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
Rc<DxvkDevice> DxvkAdapter::createDevice(const VkPhysicalDeviceFeatures& enabledFeatures) {
|
Rc<DxvkDevice> DxvkAdapter::createDevice(const VkPhysicalDeviceFeatures& enabledFeatures) {
|
||||||
|
// Query available extensions and enable the ones that are needed
|
||||||
|
vk::NameSet availableExtensions = vk::NameSet::enumerateDeviceExtensions(*m_vki, m_handle);
|
||||||
|
|
||||||
const Rc<DxvkDeviceExtensions> extensions = new DxvkDeviceExtensions();
|
const Rc<DxvkDeviceExtensions> extensions = new DxvkDeviceExtensions();
|
||||||
extensions->enableExtensions(vk::NameSet::enumerateDeviceExtensions(*m_vki, m_handle));
|
extensions->enableExtensions(availableExtensions);
|
||||||
|
|
||||||
if (!extensions->checkSupportStatus())
|
if (!extensions->checkSupportStatus())
|
||||||
throw DxvkError("DxvkAdapter: Failed to create device");
|
throw DxvkError("DxvkAdapter: Failed to create device");
|
||||||
|
|
||||||
const vk::NameList enabledExtensions =
|
// Generate list of extensions that we're actually going to use
|
||||||
extensions->getEnabledExtensionNames();
|
vk::NameSet enabledExtensionSet = extensions->getEnabledExtensionNames();
|
||||||
|
vk::NameList enabledExtensionList = enabledExtensionSet.getNameList();
|
||||||
|
|
||||||
Logger::info("Enabled device extensions:");
|
Logger::info("Enabled device extensions:");
|
||||||
this->logNameList(enabledExtensions);
|
this->logNameList(enabledExtensionList);
|
||||||
|
|
||||||
float queuePriority = 1.0f;
|
float queuePriority = 1.0f;
|
||||||
std::vector<VkDeviceQueueCreateInfo> queueInfos;
|
std::vector<VkDeviceQueueCreateInfo> queueInfos;
|
||||||
|
|
||||||
const uint32_t gIndex = this->graphicsQueueFamily();
|
uint32_t gIndex = this->graphicsQueueFamily();
|
||||||
const uint32_t pIndex = this->presentQueueFamily();
|
uint32_t pIndex = this->presentQueueFamily();
|
||||||
|
|
||||||
VkDeviceQueueCreateInfo graphicsQueue;
|
VkDeviceQueueCreateInfo graphicsQueue;
|
||||||
graphicsQueue.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
graphicsQueue.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
||||||
@ -201,8 +205,8 @@ namespace dxvk {
|
|||||||
info.pQueueCreateInfos = queueInfos.data();
|
info.pQueueCreateInfos = queueInfos.data();
|
||||||
info.enabledLayerCount = 0;
|
info.enabledLayerCount = 0;
|
||||||
info.ppEnabledLayerNames = nullptr;
|
info.ppEnabledLayerNames = nullptr;
|
||||||
info.enabledExtensionCount = enabledExtensions.count();
|
info.enabledExtensionCount = enabledExtensionList.count();
|
||||||
info.ppEnabledExtensionNames = enabledExtensions.names();
|
info.ppEnabledExtensionNames = enabledExtensionList.names();
|
||||||
info.pEnabledFeatures = &enabledFeatures;
|
info.pEnabledFeatures = &enabledFeatures;
|
||||||
|
|
||||||
VkDevice device = VK_NULL_HANDLE;
|
VkDevice device = VK_NULL_HANDLE;
|
||||||
|
@ -47,8 +47,8 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
vk::NameList DxvkExtensionList::getEnabledExtensionNames() const {
|
vk::NameSet DxvkExtensionList::getEnabledExtensionNames() const {
|
||||||
vk::NameList names;
|
vk::NameSet names;
|
||||||
|
|
||||||
for (auto ext : m_extensions) {
|
for (auto ext : m_extensions) {
|
||||||
if (ext->enabled())
|
if (ext->enabled())
|
||||||
|
@ -58,7 +58,7 @@ namespace dxvk {
|
|||||||
* structs for device and instance creation.
|
* structs for device and instance creation.
|
||||||
* \returns Names of enabled Vulkan extensions
|
* \returns Names of enabled Vulkan extensions
|
||||||
*/
|
*/
|
||||||
vk::NameList getEnabledExtensionNames() const;
|
vk::NameSet getEnabledExtensionNames() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -138,4 +138,15 @@ namespace dxvk {
|
|||||||
DxvkExtension khrSwapchain = { this, VK_KHR_SWAPCHAIN_EXTENSION_NAME, DxvkExtensionType::Required };
|
DxvkExtension khrSwapchain = { this, VK_KHR_SWAPCHAIN_EXTENSION_NAME, DxvkExtensionType::Required };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Instance extensions
|
||||||
|
*
|
||||||
|
* Lists all Vulkan extensions that are potentially
|
||||||
|
* used by DXVK if supported by the implementation.
|
||||||
|
*/
|
||||||
|
struct DxvkInstanceExtensions : public DxvkExtensionList {
|
||||||
|
DxvkExtension khrSurface = { this, VK_KHR_SURFACE_EXTENSION_NAME, DxvkExtensionType::Required };
|
||||||
|
DxvkExtension khrWin32Surface = { this, VK_KHR_WIN32_SURFACE_EXTENSION_NAME, DxvkExtensionType::Required };
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
@ -40,13 +40,25 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
VkInstance DxvkInstance::createInstance() {
|
VkInstance DxvkInstance::createInstance() {
|
||||||
auto enabledLayers = this->getLayers();
|
auto enabledLayers = this->getLayers();
|
||||||
auto enabledExtensions = this->getExtensions(enabledLayers);
|
|
||||||
|
// Query available extensions and enable the ones that are needed
|
||||||
|
vk::NameSet availableExtensions = vk::NameSet::enumerateInstanceExtensions(*m_vkl, enabledLayers);
|
||||||
|
|
||||||
|
DxvkInstanceExtensions extensionsToEnable;
|
||||||
|
extensionsToEnable.enableExtensions(availableExtensions);
|
||||||
|
|
||||||
|
if (!extensionsToEnable.checkSupportStatus())
|
||||||
|
throw DxvkError("DxvkInstance: Failed to create instance");
|
||||||
|
|
||||||
|
// Generate list of extensions that we're actually going to use
|
||||||
|
vk::NameSet enabledExtensionSet = extensionsToEnable.getEnabledExtensionNames();
|
||||||
|
vk::NameList enabledExtensionList = enabledExtensionSet.getNameList();
|
||||||
|
|
||||||
Logger::info("Enabled instance layers:");
|
Logger::info("Enabled instance layers:");
|
||||||
this->logNameList(enabledLayers);
|
this->logNameList(enabledLayers);
|
||||||
Logger::info("Enabled instance extensions:");
|
Logger::info("Enabled instance extensions:");
|
||||||
this->logNameList(enabledExtensions);
|
this->logNameList(enabledExtensionList);
|
||||||
|
|
||||||
VkApplicationInfo appInfo;
|
VkApplicationInfo appInfo;
|
||||||
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
|
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
|
||||||
@ -64,8 +76,8 @@ namespace dxvk {
|
|||||||
info.pApplicationInfo = &appInfo;
|
info.pApplicationInfo = &appInfo;
|
||||||
info.enabledLayerCount = enabledLayers.count();
|
info.enabledLayerCount = enabledLayers.count();
|
||||||
info.ppEnabledLayerNames = enabledLayers.names();
|
info.ppEnabledLayerNames = enabledLayers.names();
|
||||||
info.enabledExtensionCount = enabledExtensions.count();
|
info.enabledExtensionCount = enabledExtensionList.count();
|
||||||
info.ppEnabledExtensionNames = enabledExtensions.names();
|
info.ppEnabledExtensionNames = enabledExtensionList.names();
|
||||||
|
|
||||||
VkInstance result = VK_NULL_HANDLE;
|
VkInstance result = VK_NULL_HANDLE;
|
||||||
if (m_vkl->vkCreateInstance(&info, nullptr, &result) != VK_SUCCESS)
|
if (m_vkl->vkCreateInstance(&info, nullptr, &result) != VK_SUCCESS)
|
||||||
@ -95,32 +107,6 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
vk::NameList DxvkInstance::getExtensions(const vk::NameList& layers) {
|
|
||||||
std::vector<const char*> extOptional = { };
|
|
||||||
std::vector<const char*> extRequired = {
|
|
||||||
VK_KHR_SURFACE_EXTENSION_NAME,
|
|
||||||
VK_KHR_WIN32_SURFACE_EXTENSION_NAME,
|
|
||||||
};
|
|
||||||
|
|
||||||
const vk::NameSet extensionsAvailable
|
|
||||||
= vk::NameSet::enumerateInstanceExtensions(*m_vkl, layers);
|
|
||||||
vk::NameList extensionsEnabled;
|
|
||||||
|
|
||||||
for (auto e : extOptional) {
|
|
||||||
if (extensionsAvailable.contains(e))
|
|
||||||
extensionsEnabled.add(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto e : extRequired) {
|
|
||||||
if (!extensionsAvailable.contains(e))
|
|
||||||
throw DxvkError(str::format("DxvkInstance::getExtensions: Extension ", e, " not supported"));
|
|
||||||
extensionsEnabled.add(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return extensionsEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DxvkInstance::logNameList(const vk::NameList& names) {
|
void DxvkInstance::logNameList(const vk::NameList& names) {
|
||||||
for (uint32_t i = 0; i < names.count(); i++)
|
for (uint32_t i = 0; i < names.count(); i++)
|
||||||
Logger::info(str::format(" ", names.name(i)));
|
Logger::info(str::format(" ", names.name(i)));
|
||||||
|
@ -49,7 +49,6 @@ namespace dxvk {
|
|||||||
VkInstance createInstance();
|
VkInstance createInstance();
|
||||||
|
|
||||||
vk::NameList getLayers();
|
vk::NameList getLayers();
|
||||||
vk::NameList getExtensions(const vk::NameList& layers);
|
|
||||||
|
|
||||||
void logNameList(const vk::NameList& names);
|
void logNameList(const vk::NameList& names);
|
||||||
|
|
||||||
|
@ -73,4 +73,12 @@ namespace dxvk::vk {
|
|||||||
this->add(ext.extensionName);
|
this->add(ext.extensionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NameList NameSet::getNameList() const {
|
||||||
|
NameList result;
|
||||||
|
for (const std::string& name : m_names)
|
||||||
|
result.add(name.c_str());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -96,6 +96,16 @@ namespace dxvk::vk {
|
|||||||
const InstanceFn& vki,
|
const InstanceFn& vki,
|
||||||
VkPhysicalDevice device);
|
VkPhysicalDevice device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Generates a name list
|
||||||
|
*
|
||||||
|
* The pointers to the names will have the same
|
||||||
|
* lifetime as the name set, and may be invalidated
|
||||||
|
* by modifications made to the name set.
|
||||||
|
* \returns Name list
|
||||||
|
*/
|
||||||
|
NameList getNameList() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::unordered_set<std::string> m_names;
|
std::unordered_set<std::string> m_names;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user