From 9754629059bfac497907fee2d8115589ea840e0b Mon Sep 17 00:00:00 2001 From: Pasha Bibko <156938226+PashaBibko@users.noreply.github.com> Date: Sat, 15 Nov 2025 20:35:35 +0000 Subject: [PATCH] Setup device and queue --- main.cpp | 16 +------- src/managers/VulkanManager.cpp | 71 +++++++++++++++++++++++++++++++++- src/managers/VulkanManager.h | 7 ++++ 3 files changed, 79 insertions(+), 15 deletions(-) diff --git a/main.cpp b/main.cpp index 9276e0d..6a36d5b 100644 --- a/main.cpp +++ b/main.cpp @@ -10,7 +10,7 @@ namespace PB::Renderer if (!GLFWManager::Cleanup()) std::exit(EXIT_FAILURE); - if (VulkanManager::Cleanup()) + if (!VulkanManager::Cleanup()) std::exit(EXIT_FAILURE); std::exit(code); @@ -30,20 +30,8 @@ int main() return -1; /* Runs Vulkan initialisation functions */ - if (const std::optional instance = VulkanManager::Init(); !instance) - { - GLFWManager::Cleanup(); - } - - if (const std::optional surface = VulkanManager::CreateSurface(window); !surface) - { + if (!VulkanManager::InitAll(window)) CleanupAllAndExit(EXIT_FAILURE); - } - - if (!VulkanManager::PickPhysicalDevice()) - { - CleanupAllAndExit(EXIT_FAILURE); - } /* Polls window events whilst it is still open */ while (!glfwWindowShouldClose(window)) diff --git a/src/managers/VulkanManager.cpp b/src/managers/VulkanManager.cpp index 38eb51f..73e9d01 100644 --- a/src/managers/VulkanManager.cpp +++ b/src/managers/VulkanManager.cpp @@ -8,6 +8,28 @@ namespace PB::Renderer VkPhysicalDevice VulkanManager::s_PhysicalDevice = VK_NULL_HANDLE; QueueFamilyIndices VulkanManager::s_QueueIndices; + VkDevice VulkanManager::s_Device = VK_NULL_HANDLE; + + VkQueue VulkanManager::s_GraphicsQueue = VK_NULL_HANDLE; + VkQueue VulkanManager::s_PresentQueue = VK_NULL_HANDLE; + + bool VulkanManager::InitAll(GLFWwindow* window) + { + if (const std::optional instance = VulkanManager::Init(); !instance) + return false; + + if (const std::optional surface = VulkanManager::CreateSurface(window); !surface) + return false; + + if (!VulkanManager::PickPhysicalDevice()) + return false; + + if (!VulkanManager::CreateLogicalDevice()) + return false; + + return true; + } + std::optional VulkanManager::Init() { /* Stops multi initialisation */ @@ -140,7 +162,7 @@ namespace PB::Renderer std::vector queueFamilies(queueFamilyCount); vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); - int index = -1; + int index = 0; for (const auto& family : queueFamilies) { if (family.queueFlags & VK_QUEUE_GRAPHICS_BIT) @@ -187,6 +209,53 @@ namespace PB::Renderer } + bool VulkanManager::CreateLogicalDevice() + { + std::set uniqueQueueFamilies = + { + s_QueueIndices.graphicsFamily.value(), + s_QueueIndices.presentFamily.value() + }; + + std::vector queueCreateInfos; + float queuePriority = 1.0f; + + for (uint32_t queueFamily : uniqueQueueFamilies) + { + VkDeviceQueueCreateInfo queueCreateInfo{}; + queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queueCreateInfo.queueFamilyIndex = queueFamily; + queueCreateInfo.queueCount = 1; + queueCreateInfo.pQueuePriorities = &queuePriority; + queueCreateInfos.push_back(queueCreateInfo); + } + + VkPhysicalDeviceFeatures deviceFeatures{}; + + const std::vector extensions = { + VK_KHR_SWAPCHAIN_EXTENSION_NAME + }; + + VkDeviceCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + createInfo.queueCreateInfoCount = static_cast(queueCreateInfos.size()); + createInfo.pQueueCreateInfos = queueCreateInfos.data(); + createInfo.pEnabledFeatures = &deviceFeatures; + createInfo.enabledExtensionCount = static_cast(extensions.size()); + createInfo.ppEnabledExtensionNames = extensions.data(); + + if (vkCreateDevice(s_PhysicalDevice, &createInfo, nullptr, &s_Device)) + { + std::cout << "Failed to create logical device" << std::endl; + return false; + } + + vkGetDeviceQueue(s_Device, s_QueueIndices.graphicsFamily.value(), 0, &s_GraphicsQueue); + vkGetDeviceQueue(s_Device, s_QueueIndices.presentFamily.value(), 0, &s_PresentQueue); + + return true; + } + bool VulkanManager::Cleanup() { if (s_Surface != std::nullopt) diff --git a/src/managers/VulkanManager.h b/src/managers/VulkanManager.h index 823d99d..0a8a2f5 100644 --- a/src/managers/VulkanManager.h +++ b/src/managers/VulkanManager.h @@ -18,11 +18,13 @@ namespace PB::Renderer class VulkanManager { public: + static bool InitAll(GLFWwindow* window); static std::optional Init(); static bool Cleanup(); static std::optional CreateSurface(GLFWwindow* window); static bool PickPhysicalDevice(); + static bool CreateLogicalDevice(); private: static bool IsDeviceSuitable(VkPhysicalDevice device, VkSurfaceKHR surface); @@ -34,5 +36,10 @@ namespace PB::Renderer static VkPhysicalDevice s_PhysicalDevice; static QueueFamilyIndices s_QueueIndices; + + static VkDevice s_Device; + + static VkQueue s_GraphicsQueue; + static VkQueue s_PresentQueue; }; }