From 5f94f72be54508089d767c67308c3aaddd656132 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sat, 14 Feb 2026 10:21:25 +0800 Subject: [PATCH] [Fix] (MG_Backend/DirectVulkan): create command pool and command buffer --- .../DirectVulkan/Renderer/VulkanRenderer.cpp | 24 +++++++++++++++++++ .../DirectVulkan/Renderer/VulkanRenderer.h | 5 ++++ 2 files changed, 29 insertions(+) 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,