From a28f5eeee6fda594dfa544a005a60c96ceb72a39 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Wed, 11 Feb 2026 18:04:24 +0800 Subject: [PATCH] [Feat] (MG_Backend/DirectVulkan): refactor queue family stuff --- .../DirectVulkan/Renderer/VulkanRenderer.cpp | 20 +++++++++++-------- .../DirectVulkan/Renderer/VulkanRenderer.h | 11 ++++++++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index 4e669e9a..8d37101a 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -235,10 +235,11 @@ namespace MobileGL::MG_Backend::DirectVulkan { VK_VERSION_MAJOR(apiVersion), VK_VERSION_MINOR(apiVersion), VK_VERSION_PATCH(apiVersion), deviceTypeToStr(deviceProperties.deviceType)); // TODO: Properly check device eligibility - Int gfxQueueIndex = GetGraphicsQueueFamilyIndexOfPhysicalDevice(device); - if (m_physicalDevice == VK_NULL_HANDLE && gfxQueueIndex != -1) { + m_queueFamilies = GetQueueFamilyFromPhysicalDevice(device); + auto gfxQueueFamily = GetQueueFamilyIndex(m_queueFamilies, VK_QUEUE_GRAPHICS_BIT); + if (m_physicalDevice == VK_NULL_HANDLE && gfxQueueFamily != -1) { m_physicalDevice = device; - m_graphicsQueueFamilyIndex = gfxQueueIndex; + m_queueFamilyIndices.graphicsFamily = gfxQueueFamily; MGLOG_I("Physical device picked."); } } @@ -253,7 +254,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { void VulkanRenderer::CreateLogicalDevice() { VkDeviceQueueCreateInfo queueCreateInfo{}; queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - queueCreateInfo.queueFamilyIndex = m_graphicsQueueFamilyIndex; + queueCreateInfo.queueFamilyIndex = m_queueFamilyIndices.graphicsFamily; queueCreateInfo.queueCount = 1; Float queuePriority = 1.0f; queueCreateInfo.pQueuePriorities = &queuePriority; @@ -273,7 +274,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { deviceCreateInfo.enabledLayerCount = 0; } VK_VERIFY(vkCreateDevice(m_physicalDevice, &deviceCreateInfo, nullptr, &m_device), "vkCreateDevice"); - vkGetDeviceQueue(m_device, m_graphicsQueueFamilyIndex, 0, &m_graphicsQueue); + vkGetDeviceQueue(m_device, m_queueFamilyIndices.graphicsFamily, 0, &m_graphicsQueue); } void VulkanRenderer::CreateSurface() { @@ -298,15 +299,18 @@ namespace MobileGL::MG_Backend::DirectVulkan { #endif } - Int VulkanRenderer::GetGraphicsQueueFamilyIndexOfPhysicalDevice(VkPhysicalDevice device) { + Vector VulkanRenderer::GetQueueFamilyFromPhysicalDevice(VkPhysicalDevice device) { Uint32 queueFamilyCount = 0; vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr); Vector queueFamilies(queueFamilyCount); vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); + return queueFamilies; + } - for (Int i = 0; i < queueFamilies.size(); ++i) { - if (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { + Uint32 VulkanRenderer::GetQueueFamilyIndex(const Vector& queueFamilies, VkQueueFlagBits flag) { + for (Uint32 i = 0; i < queueFamilies.size(); i++) { + if (queueFamilies[i].queueFlags & flag) { return i; } } diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h index 356970e4..2f5a1f4f 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h @@ -44,6 +44,11 @@ namespace MobileGL::MG_Backend::DirectVulkan { void Present(); private: + struct QueueFamilyIndices { + Int32 graphicsFamily = -1; + Int32 presentFamily = -1; + }; + NativeWindowType m_window = 0; RendererConfig m_config; @@ -53,10 +58,11 @@ namespace MobileGL::MG_Backend::DirectVulkan { VkInstance m_instance = VK_NULL_HANDLE; VkDebugUtilsMessengerEXT m_debugMessenger = VK_NULL_HANDLE; VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE; - Int m_graphicsQueueFamilyIndex = -1; VkDevice m_device = VK_NULL_HANDLE; VkQueue m_graphicsQueue = VK_NULL_HANDLE; VkSurfaceKHR m_surface = VK_NULL_HANDLE; + Vector m_queueFamilies; + QueueFamilyIndices m_queueFamilyIndices; void CreateInstance(); void DestroyInstance(); @@ -67,7 +73,8 @@ namespace MobileGL::MG_Backend::DirectVulkan { void CreateLogicalDevice(); void CreateSurface(); - static Int GetGraphicsQueueFamilyIndexOfPhysicalDevice(VkPhysicalDevice device); + static Vector GetQueueFamilyFromPhysicalDevice(VkPhysicalDevice device); + static Uint32 GetQueueFamilyIndex(const Vector& queueFamilies, VkQueueFlagBits flag); static Vector EnumerateInstanceExtensions(); static constexpr const char* s_validationLayerNames[] = { "VK_LAYER_KHRONOS_validation"