From a1352b88233776b32c9d6f29350e65390a62b3a0 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 28 Oct 2016 22:30:22 +0200 Subject: [PATCH] VulkanRenderer: Move all the initialization back to the Vulkan static class --- include/Nazara/VulkanRenderer/Vulkan.hpp | 5 +- .../Nazara/VulkanRenderer/VulkanRenderer.hpp | 12 +- .../Nazara/VulkanRenderer/VulkanRenderer.inl | 12 ++ src/Nazara/VulkanRenderer/Vulkan.cpp | 85 +++------ src/Nazara/VulkanRenderer/VulkanRenderer.cpp | 178 +----------------- 5 files changed, 53 insertions(+), 239 deletions(-) create mode 100644 include/Nazara/VulkanRenderer/VulkanRenderer.inl diff --git a/include/Nazara/VulkanRenderer/Vulkan.hpp b/include/Nazara/VulkanRenderer/Vulkan.hpp index 619774e0f..bd0e38560 100644 --- a/include/Nazara/VulkanRenderer/Vulkan.hpp +++ b/include/Nazara/VulkanRenderer/Vulkan.hpp @@ -33,14 +33,12 @@ namespace Nz static const std::vector& GetPhysicalDevices(); static const Vk::PhysicalDevice& GetPhysicalDeviceInfo(VkPhysicalDevice physDevice); - static bool Initialize(); + static bool Initialize(UInt32 apiVersion, const ParameterList& parameters); static bool IsInitialized(); static Vk::DeviceHandle SelectDevice(VkPhysicalDevice gpu, const Vk::Surface& surface, UInt32* presentableFamilyQueue); - static void SetParameters(const ParameterList& parameters); - static void Uninitialize(); private: @@ -48,7 +46,6 @@ namespace Nz static std::vector s_physDevices; static Vk::Instance s_instance; static ParameterList s_initializationParameters; - static unsigned int s_moduleReferenceCounter; }; } diff --git a/include/Nazara/VulkanRenderer/VulkanRenderer.hpp b/include/Nazara/VulkanRenderer/VulkanRenderer.hpp index 8fc88ca4c..aeb3d19e6 100644 --- a/include/Nazara/VulkanRenderer/VulkanRenderer.hpp +++ b/include/Nazara/VulkanRenderer/VulkanRenderer.hpp @@ -10,8 +10,12 @@ #include #include #include +#include #include #include +#include +#include +#include namespace Nz { @@ -19,7 +23,7 @@ namespace Nz { public: VulkanRenderer() = default; - ~VulkanRenderer() = default; + ~VulkanRenderer(); std::unique_ptr CreateRenderWindowImpl() override; @@ -35,10 +39,14 @@ namespace Nz static constexpr UInt32 APIVersion = VK_API_VERSION_1_0; private: - Vk::Instance m_instance; + std::list m_devices; std::vector m_physDevices; + ParameterList m_initializationParameters; + Vk::Instance m_instance; UInt32 m_apiVersion; }; } +#include + #endif // NAZARA_VULKANRENDERER_HPP diff --git a/include/Nazara/VulkanRenderer/VulkanRenderer.inl b/include/Nazara/VulkanRenderer/VulkanRenderer.inl new file mode 100644 index 000000000..000661426 --- /dev/null +++ b/include/Nazara/VulkanRenderer/VulkanRenderer.inl @@ -0,0 +1,12 @@ +// Copyright (C) 2016 Jérôme Leclercq +// This file is part of the "Nazara Engine - Vulkan Renderer" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ +} + +#include diff --git a/src/Nazara/VulkanRenderer/Vulkan.cpp b/src/Nazara/VulkanRenderer/Vulkan.cpp index f80c3ec9a..0827bc030 100644 --- a/src/Nazara/VulkanRenderer/Vulkan.cpp +++ b/src/Nazara/VulkanRenderer/Vulkan.cpp @@ -39,24 +39,9 @@ namespace Nz return dummy; } - bool Vulkan::Initialize() + bool Vulkan::Initialize(UInt32 apiVersion, const ParameterList& parameters) { - if (s_moduleReferenceCounter > 0) - { - s_moduleReferenceCounter++; - return true; // Already initialized - } - - // Initialize module dependencies - if (!Utility::Initialize()) - { - NazaraError("Failed to initialize utility module"); - return false; - } - - s_moduleReferenceCounter++; - - CallOnExit onExit(Vulkan::Uninitialize); + NazaraAssert(!s_instance.IsValid(), "Vulkan is already initialized"); // Initialize module here if (!Vk::Loader::Initialize()) @@ -65,25 +50,27 @@ namespace Nz return false; } + CallOnExit onExit(Vulkan::Uninitialize); + String appName = "Another application made with Nazara Engine"; String engineName = "Nazara Engine - Vulkan Renderer"; - UInt32 apiVersion = VK_MAKE_VERSION(1, 0, 8); + UInt32 appVersion = VK_MAKE_VERSION(1, 0, 0); UInt32 engineVersion = VK_MAKE_VERSION(1, 0, 0); - s_initializationParameters.GetStringParameter("VkAppInfo_OverrideApplicationName", &appName); - s_initializationParameters.GetStringParameter("VkAppInfo_OverrideEngineName", &engineName); + parameters.GetStringParameter("VkAppInfo_OverrideApplicationName", &appName); + parameters.GetStringParameter("VkAppInfo_OverrideEngineName", &engineName); bool bParam; int iParam; - if (s_initializationParameters.GetIntegerParameter("VkAppInfo_OverrideAPIVersion", &iParam)) + if (parameters.GetIntegerParameter("VkAppInfo_OverrideAPIVersion", &iParam)) apiVersion = iParam; - if (s_initializationParameters.GetIntegerParameter("VkAppInfo_OverrideApplicationVersion", &iParam)) + if (parameters.GetIntegerParameter("VkAppInfo_OverrideApplicationVersion", &iParam)) appVersion = iParam; - if (s_initializationParameters.GetIntegerParameter("VkAppInfo_OverrideEngineVersion", &iParam)) + if (parameters.GetIntegerParameter("VkAppInfo_OverrideEngineVersion", &iParam)) engineVersion = iParam; VkApplicationInfo appInfo = { @@ -98,26 +85,26 @@ namespace Nz VkInstanceCreateFlags createFlags = 0; - if (s_initializationParameters.GetIntegerParameter("VkInstanceInfo_OverrideCreateFlags", &iParam)) + if (parameters.GetIntegerParameter("VkInstanceInfo_OverrideCreateFlags", &iParam)) createFlags = static_cast(iParam); std::vector enabledLayers; std::vector enabledExtensions; - if (!s_initializationParameters.GetBooleanParameter("VkInstanceInfo_OverrideEnabledLayers", &bParam) || !bParam) + if (!parameters.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)) + if (parameters.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)) + if (parameters.GetStringParameter(parameterName, &layer)) { additionalLayers.emplace_back(std::move(layer)); enabledLayers.push_back(additionalLayers.back().GetConstBuffer()); @@ -127,7 +114,7 @@ namespace Nz } } - if (!s_initializationParameters.GetBooleanParameter("VkInstanceInfo_OverrideEnabledExtensions", &bParam) || !bParam) + if (!parameters.GetBooleanParameter("VkInstanceInfo_OverrideEnabledExtensions", &bParam) || !bParam) { enabledExtensions.push_back("VK_KHR_surface"); @@ -157,14 +144,14 @@ namespace Nz } std::vector additionalExtensions; // Just to keep the String alive - if (s_initializationParameters.GetIntegerParameter("VkInstanceInfo_EnabledExtensionCount", &iParam)) + if (parameters.GetIntegerParameter("VkInstanceInfo_EnabledExtensionCount", &iParam)) { additionalExtensions.reserve(iParam); for (int i = 0; i < iParam; ++i) { Nz::String parameterName = "VkInstanceInfo_EnabledExtension" + String::Number(i); Nz::String extension; - if (s_initializationParameters.GetStringParameter(parameterName, &extension)) + if (parameters.GetStringParameter(parameterName, &extension)) { additionalExtensions.emplace_back(std::move(extension)); enabledExtensions.push_back(additionalExtensions.back().GetConstBuffer()); @@ -190,7 +177,7 @@ namespace Nz NazaraError("Failed to create instance"); return false; } - + std::vector physDevices; if (!s_instance.EnumeratePhysicalDevices(&physDevices)) { @@ -199,7 +186,6 @@ namespace Nz } s_physDevices.reserve(physDevices.size()); - for (std::size_t i = 0; i < physDevices.size(); ++i) { VkPhysicalDevice physDevice = physDevices[i]; @@ -207,15 +193,15 @@ namespace Nz Vk::PhysicalDevice deviceInfo; if (!s_instance.GetPhysicalDeviceQueueFamilyProperties(physDevice, &deviceInfo.queues)) { - NazaraWarning("Failed to query physical device queue family properties"); + NazaraWarning("Failed to query physical device queue family properties for " + String(deviceInfo.properties.deviceName) + " (0x" + String::Number(deviceInfo.properties.deviceID, 16) + ')'); continue; } deviceInfo.device = physDevice; - deviceInfo.features = s_instance.GetPhysicalDeviceFeatures(physDevice); + deviceInfo.features = s_instance.GetPhysicalDeviceFeatures(physDevice); deviceInfo.memoryProperties = s_instance.GetPhysicalDeviceMemoryProperties(physDevice); - deviceInfo.properties = s_instance.GetPhysicalDeviceProperties(physDevice); + deviceInfo.properties = s_instance.GetPhysicalDeviceProperties(physDevice); s_physDevices.emplace_back(std::move(deviceInfo)); } @@ -226,17 +212,14 @@ namespace Nz return false; } + s_initializationParameters = parameters; + onExit.Reset(); NazaraNotice("Initialized: Vulkan module"); return true; } - bool Vulkan::IsInitialized() - { - return s_moduleReferenceCounter != 0; - } - Vk::DeviceHandle Vulkan::CreateDevice(VkPhysicalDevice gpu, const Vk::Surface& surface, UInt32* presentableFamilyQueue) { Nz::ErrorFlags errFlags(ErrorFlag_ThrowException, true); @@ -412,40 +395,18 @@ namespace Nz return CreateDevice(gpu, surface, presentableFamilyQueue); } - void Vulkan::SetParameters(const ParameterList& parameters) - { - s_initializationParameters = parameters; - } - void Vulkan::Uninitialize() { - if (s_moduleReferenceCounter != 1) - { - // Either the module is not initialized, either it was initialized multiple times - if (s_moduleReferenceCounter > 1) - s_moduleReferenceCounter--; - - return; - } - - s_moduleReferenceCounter = 0; - // Uninitialize module here s_devices.clear(); s_instance.Destroy(); Vk::Loader::Uninitialize(); - - NazaraNotice("Uninitialized: Vulkan module"); - - // Free module dependencies - Utility::Uninitialize(); } std::list Vulkan::s_devices; std::vector Vulkan::s_physDevices; Vk::Instance Vulkan::s_instance; ParameterList Vulkan::s_initializationParameters; - unsigned int Vulkan::s_moduleReferenceCounter = 0; } diff --git a/src/Nazara/VulkanRenderer/VulkanRenderer.cpp b/src/Nazara/VulkanRenderer/VulkanRenderer.cpp index 2b838f189..e647645a6 100644 --- a/src/Nazara/VulkanRenderer/VulkanRenderer.cpp +++ b/src/Nazara/VulkanRenderer/VulkanRenderer.cpp @@ -3,12 +3,18 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include #include #include namespace Nz { + VulkanRenderer::~VulkanRenderer() + { + Vulkan::Uninitialize(); + } + std::unique_ptr VulkanRenderer::CreateRenderWindowImpl() { return std::make_unique(); @@ -24,177 +30,7 @@ namespace Nz bool VulkanRenderer::Prepare(const ParameterList& parameters) { - if (!Vk::Loader::Initialize()) - { - NazaraError("Failed to load Vulkan API, it may be not installed on your system"); - return false; - } - - String appName = "Another application made with Nazara Engine"; - String engineName = "Nazara Engine - Vulkan Renderer"; - - UInt32 apiVersion = APIVersion; - UInt32 appVersion = VK_MAKE_VERSION(1, 0, 0); - UInt32 engineVersion = VK_MAKE_VERSION(1, 0, 0); - - parameters.GetStringParameter("VkAppInfo_OverrideApplicationName", &appName); - parameters.GetStringParameter("VkAppInfo_OverrideEngineName", &engineName); - - bool bParam; - int iParam; - - if (parameters.GetIntegerParameter("VkAppInfo_OverrideAPIVersion", &iParam)) - apiVersion = iParam; - - if (parameters.GetIntegerParameter("VkAppInfo_OverrideApplicationVersion", &iParam)) - appVersion = iParam; - - if (parameters.GetIntegerParameter("VkAppInfo_OverrideEngineVersion", &iParam)) - engineVersion = iParam; - - VkApplicationInfo appInfo = { - VK_STRUCTURE_TYPE_APPLICATION_INFO, - nullptr, - appName.GetConstBuffer(), - appVersion, - engineName.GetConstBuffer(), - engineVersion, - apiVersion - }; - - VkInstanceCreateFlags createFlags = 0; - - if (parameters.GetIntegerParameter("VkInstanceInfo_OverrideCreateFlags", &iParam)) - createFlags = static_cast(iParam); - - std::vector enabledLayers; - std::vector enabledExtensions; - - if (!parameters.GetBooleanParameter("VkInstanceInfo_OverrideEnabledLayers", &bParam) || !bParam) - { - //< Nazara default layers goes here - } - - std::vector additionalLayers; // Just to keep the String alive - if (parameters.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 (parameters.GetStringParameter(parameterName, &layer)) - { - additionalLayers.emplace_back(std::move(layer)); - enabledLayers.push_back(additionalLayers.back().GetConstBuffer()); - } - else - NazaraWarning("Parameter " + parameterName + " expected"); - } - } - - if (!parameters.GetBooleanParameter("VkInstanceInfo_OverrideEnabledExtensions", &bParam) || !bParam) - { - enabledExtensions.push_back("VK_KHR_surface"); - - #ifdef VK_USE_PLATFORM_ANDROID_KHR - enabledExtensions.push_back("VK_KHR_android_surface"); - #endif - - #ifdef VK_USE_PLATFORM_MIR_KHR - enabledExtensions.push_back("VK_KHR_mir_surface"); - #endif - - #ifdef VK_USE_PLATFORM_XCB_KHR - enabledExtensions.push_back("VK_KHR_xcb_surface"); - #endif - - #ifdef VK_USE_PLATFORM_XLIB_KHR - enabledExtensions.push_back("VK_KHR_xlib_surface"); - #endif - - #ifdef VK_USE_PLATFORM_WAYLAND_KHR - enabledExtensions.push_back("VK_KHR_wayland_surface"); - #endif - - #ifdef VK_USE_PLATFORM_WIN32_KHR - enabledExtensions.push_back("VK_KHR_win32_surface"); - #endif - } - - std::vector additionalExtensions; // Just to keep the String alive - if (parameters.GetIntegerParameter("VkInstanceInfo_EnabledExtensionCount", &iParam)) - { - additionalExtensions.reserve(iParam); - for (int i = 0; i < iParam; ++i) - { - Nz::String parameterName = "VkInstanceInfo_EnabledExtension" + String::Number(i); - Nz::String extension; - if (parameters.GetStringParameter(parameterName, &extension)) - { - additionalExtensions.emplace_back(std::move(extension)); - enabledExtensions.push_back(additionalExtensions.back().GetConstBuffer()); - } - else - NazaraWarning("Parameter " + parameterName + " expected"); - } - } - - VkInstanceCreateInfo instanceInfo = - { - VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType; - nullptr, // const void* pNext; - createFlags, // VkInstanceCreateFlags flags; - &appInfo, // const VkApplicationInfo* pApplicationInfo; - UInt32(enabledLayers.size()), // uint32_t enabledLayerCount; - enabledLayers.data(), // const char* const* ppEnabledLayerNames; - UInt32(enabledExtensions.size()), // uint32_t enabledExtensionCount; - enabledExtensions.data() // const char* const* ppEnabledExtensionNames; - }; - - if (!m_instance.Create(instanceInfo)) - { - NazaraError("Failed to create instance"); - return false; - } - - m_apiVersion = apiVersion; - - std::vector physDevices; - if (!m_instance.EnumeratePhysicalDevices(&physDevices)) - { - NazaraError("Failed to enumerate physical devices"); - return false; - } - - m_physDevices.reserve(physDevices.size()); - for (std::size_t i = 0; i < physDevices.size(); ++i) - { - VkPhysicalDevice physDevice = physDevices[i]; - - Vk::PhysicalDevice deviceInfo; - if (!m_instance.GetPhysicalDeviceQueueFamilyProperties(physDevice, &deviceInfo.queues)) - { - NazaraWarning("Failed to query physical device queue family properties for " + String(deviceInfo.properties.deviceName) + " (0x" + String::Number(deviceInfo.properties.deviceID, 16) + ')'); - continue; - } - - deviceInfo.device = physDevice; - - deviceInfo.features = m_instance.GetPhysicalDeviceFeatures(physDevice); - deviceInfo.memoryProperties = m_instance.GetPhysicalDeviceMemoryProperties(physDevice); - deviceInfo.properties = m_instance.GetPhysicalDeviceProperties(physDevice); - - m_physDevices.emplace_back(std::move(deviceInfo)); - } - - if (m_physDevices.empty()) - { - NazaraError("No valid physical device found"); - return false; - } - - return true; + return Vulkan::Initialize(APIVersion, parameters); } RenderAPI VulkanRenderer::QueryAPI() const