From 2b39c6e15b7226cc2ee4a9c0ecee33b3873f8fe7 Mon Sep 17 00:00:00 2001 From: Grayson Riffe Date: Sun, 9 Feb 2025 01:25:14 -0600 Subject: [PATCH] Create Vulkan device --- .../src/client/render/RenderEngine.cpp | 35 +++++++++++++++++++ NothinFancy/src/client/render/RenderEngine.h | 3 ++ 2 files changed, 38 insertions(+) diff --git a/NothinFancy/src/client/render/RenderEngine.cpp b/NothinFancy/src/client/render/RenderEngine.cpp index 0ad545a..6968049 100644 --- a/NothinFancy/src/client/render/RenderEngine.cpp +++ b/NothinFancy/src/client/render/RenderEngine.cpp @@ -13,6 +13,9 @@ namespace nf::cli::render { , m_physicalDevice() , m_queueFIGraphics() , m_queueFIPresent() + , m_device() + , m_queueGraphics() + , m_queuePresent() { NFLog("Initializing render engine"); m_window->setDisplay(m_display); @@ -21,6 +24,7 @@ namespace nf::cli::render { createInstance(); createSurface(m_window->getHandle()); pickPhysicalDevice(); + createDevice(); } void RenderEngine::createInstance() { @@ -125,7 +129,38 @@ namespace nf::cli::render { NFError("No Vulkan GPUs were found to be compatible"); } + void RenderEngine::createDevice() { + std::set uniqueQueueFamilyIndices = { m_queueFIGraphics, m_queueFIPresent }; + + float queuePriority = 1.0f; + std::vector queueCIs; + for (uint32_t currentQueueFamilyIndex : uniqueQueueFamilyIndices) { + VkDeviceQueueCreateInfo queueCI = { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO }; + queueCI.queueFamilyIndex = currentQueueFamilyIndex; + queueCI.queueCount = 1; + queueCI.pQueuePriorities = &queuePriority; + queueCIs.push_back(queueCI); + } + + VkPhysicalDeviceFeatures features = {}; + + VkDeviceCreateInfo deviceCI = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO }; + deviceCI.queueCreateInfoCount = queueCIs.size(); + deviceCI.pQueueCreateInfos = queueCIs.data(); + deviceCI.pEnabledFeatures = &features; + + const char* swapChainExtName = VK_KHR_SWAPCHAIN_EXTENSION_NAME; + deviceCI.enabledExtensionCount = 1; + deviceCI.ppEnabledExtensionNames = &swapChainExtName; + if (vkCreateDevice(m_physicalDevice, &deviceCI, nullptr, &m_device) != VK_SUCCESS) + NFError("Could not create Vulkan device"); + + vkGetDeviceQueue(m_device, m_queueFIGraphics, 0, &m_queueGraphics); + vkGetDeviceQueue(m_device, m_queueFIPresent, 0, &m_queuePresent); + } + RenderEngine::~RenderEngine() { + vkDestroyDevice(m_device, nullptr); vkDestroySurfaceKHR(m_instance, m_surface, nullptr); vkDestroyInstance(m_instance, nullptr); } diff --git a/NothinFancy/src/client/render/RenderEngine.h b/NothinFancy/src/client/render/RenderEngine.h index 554cd87..28222d9 100644 --- a/NothinFancy/src/client/render/RenderEngine.h +++ b/NothinFancy/src/client/render/RenderEngine.h @@ -14,6 +14,7 @@ namespace nf::cli::render { void createInstance(); void createSurface(HWND window); void pickPhysicalDevice(); + void createDevice(); std::shared_ptr m_window; DisplayConfig m_display; @@ -22,5 +23,7 @@ namespace nf::cli::render { VkSurfaceKHR m_surface; VkPhysicalDevice m_physicalDevice; uint32_t m_queueFIGraphics, m_queueFIPresent; + VkDevice m_device; + VkQueue m_queueGraphics, m_queuePresent; }; }