diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index cefeb100..c4dee00b 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -61,10 +61,16 @@ namespace MobileGL::MG_Backend::DirectVulkan { CreateLogicalDeviceAndQueues(); CreateSwapchain(); CreateSwapchainImageViews(); + CreateCommandPool(); MGLOG_D("VulkanRenderer initialized"); } void VulkanRenderer::Shutdown() { + if (m_commandPool != VK_NULL_HANDLE) { + vkDestroyCommandPool(m_device, m_commandPool, nullptr); + m_commandPool = VK_NULL_HANDLE; + } + for (auto imageView : m_swapChainImageViews) { vkDestroyImageView(m_device, imageView, nullptr); } @@ -836,6 +842,24 @@ namespace MobileGL::MG_Backend::DirectVulkan { MGLOG_I("Swapchain image views created"); } + void VulkanRenderer::CreateCommandPool() { + VkCommandPoolCreateInfo createInfo{VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO}; + createInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + createInfo.queueFamilyIndex = m_physicalDevice.queueFamilies.graphicsFamily; + VK_VERIFY(vkCreateCommandPool(m_device, &createInfo, nullptr, &m_commandPool)); + MGLOG_I("Command pool created"); + } + + void VulkanRenderer::CreateCommandBuffer() { + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.commandPool = m_commandPool; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandBufferCount = 1; + VK_VERIFY(vkAllocateCommandBuffers(m_device, &allocInfo, &m_commandBuffer)); + MGLOG_I("Command buffer created"); + } + void VulkanRenderer::CreateSurface() { #if defined VK_USE_PLATFORM_ANDROID_KHR auto* nativeWindow = static_cast(m_window); diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h index bd7401ed..50b8b027 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h @@ -93,6 +93,9 @@ namespace MobileGL::MG_Backend::DirectVulkan { VkQueue m_graphicsQueue = VK_NULL_HANDLE; VkQueue m_presentQueue = VK_NULL_HANDLE; + VkCommandPool m_commandPool = VK_NULL_HANDLE; + VkCommandBuffer m_commandBuffer = VK_NULL_HANDLE; + void CreateInstance(); VkResult SetupDebugMessenger(); VkResult DestroyDebugMessenger(); @@ -102,6 +105,8 @@ namespace MobileGL::MG_Backend::DirectVulkan { void CreateLogicalDeviceAndQueues(); void CreateSwapchain(); void CreateSwapchainImageViews(); + void CreateCommandPool(); + void CreateCommandBuffer(); static Int GetPresentQueueFamilyIndex( const PhysicalDevice& physicalDevice, VkSurfaceKHR surface,