From 8e64c69c5da7be991fc0de3502f80354d8205059 Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 22 Jan 2022 00:41:24 +0800 Subject: [PATCH] Add command creation for GEVulkanDriver --- .../include/ge_vulkan_driver.hpp | 13 +++++++ lib/graphics_engine/src/ge_vulkan_driver.cpp | 36 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/lib/graphics_engine/include/ge_vulkan_driver.hpp b/lib/graphics_engine/include/ge_vulkan_driver.hpp index 8ac3bba3e..dc1e0e4d0 100644 --- a/lib/graphics_engine/include/ge_vulkan_driver.hpp +++ b/lib/graphics_engine/include/ge_vulkan_driver.hpp @@ -314,15 +314,26 @@ namespace GE std::vector image_available_semaphores; std::vector render_finished_semaphores; std::vector in_flight_fences; + VkCommandPool command_pool; + std::vector command_buffers; VK() { instance = VK_NULL_HANDLE; surface = VK_NULL_HANDLE; device = VK_NULL_HANDLE; swap_chain = VK_NULL_HANDLE; + command_pool = VK_NULL_HANDLE; } ~VK() { + if (!command_buffers.empty()) + { + vkFreeCommandBuffers(device, command_pool, + (uint32_t)(command_buffers.size()), + &command_buffers[0]); + } + if (command_pool != VK_NULL_HANDLE) + vkDestroyCommandPool(device, command_pool, NULL); for (VkSemaphore& semaphore : image_available_semaphores) vkDestroySemaphore(device, semaphore, NULL); for (VkSemaphore& semaphore : render_finished_semaphores) @@ -370,6 +381,8 @@ namespace GE void createDevice(); void createSwapChain(); void createSyncObjects(); + void createCommandPool(); + void createCommandBuffers(); std::string getVulkanVersionString() const; std::string getDriverVersionString() const; }; diff --git a/lib/graphics_engine/src/ge_vulkan_driver.cpp b/lib/graphics_engine/src/ge_vulkan_driver.cpp index e3a57e1fb..8aa046345 100644 --- a/lib/graphics_engine/src/ge_vulkan_driver.cpp +++ b/lib/graphics_engine/src/ge_vulkan_driver.cpp @@ -486,6 +486,8 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params, vkGetPhysicalDeviceProperties(m_physical_device, &m_properties); createSwapChain(); createSyncObjects(); + createCommandPool(); + createCommandBuffers(); os::Printer::log("Vulkan version", getVulkanVersionString().c_str()); os::Printer::log("Vulkan vendor", getVendorInfo().c_str()); os::Printer::log("Vulkan renderer", m_properties.deviceName); @@ -942,6 +944,40 @@ void GEVulkanDriver::createSyncObjects() } } // createSyncObjects +// ---------------------------------------------------------------------------- +void GEVulkanDriver::createCommandPool() +{ + VkCommandPoolCreateInfo pool_info = {}; + pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + pool_info.queueFamilyIndex = m_graphics_family; + + VkResult result = vkCreateCommandPool(m_vk.device, &pool_info, NULL, + &m_vk.command_pool); + + if (result != VK_SUCCESS) + throw std::runtime_error("vkCreateCommandPool failed"); +} // createCommandPool + +// ---------------------------------------------------------------------------- +void GEVulkanDriver::createCommandBuffers() +{ + std::vector buffers(m_vk.swap_chain_images.size()); + + VkCommandBufferAllocateInfo alloc_info = {}; + alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + alloc_info.commandPool = m_vk.command_pool; + alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + alloc_info.commandBufferCount = (uint32_t)buffers.size(); + + VkResult result = vkAllocateCommandBuffers(m_vk.device, &alloc_info, + &buffers[0]); + + if (result != VK_SUCCESS) + throw std::runtime_error("vkAllocateCommandBuffers failed"); + + m_vk.command_buffers = buffers; +} // createCommandBuffers + // ---------------------------------------------------------------------------- void GEVulkanDriver::OnResize(const core::dimension2d& size) {