From 247efdc2cbb0bd93e4a1ebf4f48260ba2335eb4d Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 8 Jul 2016 18:01:45 +0200 Subject: [PATCH] Vulkan: Add possibility to set custom layers Former-commit-id: f40bed53ba11cc449586ee5bca9bdff0db18a967 [formerly 416333d7d0f3b516c6e0d78b34ff0f060d04a7ab] Former-commit-id: 050ee60750bb94cb007a7a450bdf2852a5d4a3c5 --- src/Nazara/Vulkan/Vulkan.cpp | 80 ++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 12 deletions(-) diff --git a/src/Nazara/Vulkan/Vulkan.cpp b/src/Nazara/Vulkan/Vulkan.cpp index d73e2e21f..025e9e875 100644 --- a/src/Nazara/Vulkan/Vulkan.cpp +++ b/src/Nazara/Vulkan/Vulkan.cpp @@ -59,6 +59,7 @@ namespace Nz s_initializationParameters.GetStringParameter("VkAppInfo_OverrideApplicationName", &appName); s_initializationParameters.GetStringParameter("VkAppInfo_OverrideEngineName", &engineName); + bool bParam; int iParam; if (s_initializationParameters.GetIntegerParameter("VkAppInfo_OverrideAPIVersion", &iParam)) @@ -88,7 +89,29 @@ namespace Nz std::vector enabledLayers; std::vector enabledExtensions; - bool bParam; + if (!s_initializationParameters.GetBooleanParameter("VkInstanceInfo_OverrideEnabledLayers", &bParam) || !bParam) + { + //< Nazara default layers goes here + } + + std::vector additionalLayers; // Just to keep the String alive + if (s_initializationParameters.GetIntegerParameter("VkInstanceInfo_EnabledLayerCount", &iParam)) + { + additionalLayers.reserve(iParam); + for (int i = 0; i < iParam; ++i) + { + Nz::String parameterName = "VkInstanceInfo_EnabledLayer" + String::Number(i); + Nz::String layer; + if (s_initializationParameters.GetStringParameter(parameterName, &layer)) + { + additionalLayers.emplace_back(std::move(layer)); + enabledLayers.push_back(additionalLayers.back().GetConstBuffer()); + } + else + NazaraWarning("Parameter " + parameterName + " expected"); + } + } + if (!s_initializationParameters.GetBooleanParameter("VkInstanceInfo_OverrideEnabledExtensions", &bParam) || !bParam) { enabledExtensions.push_back("VK_KHR_surface"); @@ -121,6 +144,7 @@ namespace Nz std::vector additionalExtensions; // Just to keep the String alive if (s_initializationParameters.GetIntegerParameter("VkInstanceInfo_EnabledExtensionCount", &iParam)) { + additionalExtensions.reserve(iParam); for (int i = 0; i < iParam; ++i) { Nz::String parameterName = "VkInstanceInfo_EnabledExtension" + String::Number(i); @@ -242,21 +266,29 @@ namespace Nz } std::array usedQueueFamilies = {graphicsQueueNodeIndex, presentQueueNodeIndex, transfertQueueNodeFamily}; - float priority = 1.f; + std::array priorities = {1.f, 1.f, 1.f}; std::vector queueCreateInfos; for (UInt32 queueFamily : usedQueueFamilies) { - VkDeviceQueueCreateInfo createInfo = { - VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, - nullptr, - 0, - queueFamily, - 1, - &priority - }; + auto it = std::find_if(queueCreateInfos.begin(), queueCreateInfos.end(), [queueFamily] (const VkDeviceQueueCreateInfo& createInfo) + { + return createInfo.queueFamilyIndex == queueFamily; + }); - queueCreateInfos.emplace_back(createInfo); + if (it == queueCreateInfos.end()) + { + VkDeviceQueueCreateInfo createInfo = { + VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType; + nullptr, // const void* pNext; + 0, // VkDeviceQueueCreateFlags flags; + queueFamily, // uint32_t queueFamilyIndex; + 1, // uint32_t queueCount; + priorities.data() // const float* pQueuePriorities; + }; + + queueCreateInfos.emplace_back(createInfo); + } } @@ -264,10 +296,34 @@ namespace Nz std::vector enabledExtensions; bool bParam; + int iParam; + + if (!s_initializationParameters.GetBooleanParameter("VkDeviceInfo_OverrideEnabledLayers", &bParam) || !bParam) + { + //< Nazara default layers goes here + } + + std::vector additionalLayers; // Just to keep the String alive + if (s_initializationParameters.GetIntegerParameter("VkDeviceInfo_EnabledLayerCount", &iParam)) + { + additionalLayers.reserve(iParam); + for (int i = 0; i < iParam; ++i) + { + Nz::String parameterName = "VkDeviceInfo_EnabledLayer" + String::Number(i); + Nz::String layer; + if (s_initializationParameters.GetStringParameter(parameterName, &layer)) + { + additionalLayers.emplace_back(std::move(layer)); + enabledLayers.push_back(additionalLayers.back().GetConstBuffer()); + } + else + NazaraWarning("Parameter " + parameterName + " expected"); + } + } + if (!s_initializationParameters.GetBooleanParameter("VkDeviceInfo_OverrideEnabledExtensions", &bParam) || !bParam) enabledExtensions.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME); - int iParam; std::vector additionalExtensions; // Just to keep the String alive if (s_initializationParameters.GetIntegerParameter("VkDeviceInfo_EnabledExtensionCount", &iParam)) {