[Feat] (MG_Backend/DirectVulkan): refactor queue family stuff

This commit is contained in:
2026-02-11 18:04:24 +08:00
parent 2febb10319
commit a28f5eeee6
2 changed files with 21 additions and 10 deletions
@@ -235,10 +235,11 @@ namespace MobileGL::MG_Backend::DirectVulkan {
VK_VERSION_MAJOR(apiVersion), VK_VERSION_MINOR(apiVersion), VK_VERSION_PATCH(apiVersion), VK_VERSION_MAJOR(apiVersion), VK_VERSION_MINOR(apiVersion), VK_VERSION_PATCH(apiVersion),
deviceTypeToStr(deviceProperties.deviceType)); deviceTypeToStr(deviceProperties.deviceType));
// TODO: Properly check device eligibility // TODO: Properly check device eligibility
Int gfxQueueIndex = GetGraphicsQueueFamilyIndexOfPhysicalDevice(device); m_queueFamilies = GetQueueFamilyFromPhysicalDevice(device);
if (m_physicalDevice == VK_NULL_HANDLE && gfxQueueIndex != -1) { auto gfxQueueFamily = GetQueueFamilyIndex(m_queueFamilies, VK_QUEUE_GRAPHICS_BIT);
if (m_physicalDevice == VK_NULL_HANDLE && gfxQueueFamily != -1) {
m_physicalDevice = device; m_physicalDevice = device;
m_graphicsQueueFamilyIndex = gfxQueueIndex; m_queueFamilyIndices.graphicsFamily = gfxQueueFamily;
MGLOG_I("Physical device picked."); MGLOG_I("Physical device picked.");
} }
} }
@@ -253,7 +254,7 @@ namespace MobileGL::MG_Backend::DirectVulkan {
void VulkanRenderer::CreateLogicalDevice() { void VulkanRenderer::CreateLogicalDevice() {
VkDeviceQueueCreateInfo queueCreateInfo{}; VkDeviceQueueCreateInfo queueCreateInfo{};
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueCreateInfo.queueFamilyIndex = m_graphicsQueueFamilyIndex; queueCreateInfo.queueFamilyIndex = m_queueFamilyIndices.graphicsFamily;
queueCreateInfo.queueCount = 1; queueCreateInfo.queueCount = 1;
Float queuePriority = 1.0f; Float queuePriority = 1.0f;
queueCreateInfo.pQueuePriorities = &queuePriority; queueCreateInfo.pQueuePriorities = &queuePriority;
@@ -273,7 +274,7 @@ namespace MobileGL::MG_Backend::DirectVulkan {
deviceCreateInfo.enabledLayerCount = 0; deviceCreateInfo.enabledLayerCount = 0;
} }
VK_VERIFY(vkCreateDevice(m_physicalDevice, &deviceCreateInfo, nullptr, &m_device), "vkCreateDevice"); 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() { void VulkanRenderer::CreateSurface() {
@@ -298,15 +299,18 @@ namespace MobileGL::MG_Backend::DirectVulkan {
#endif #endif
} }
Int VulkanRenderer::GetGraphicsQueueFamilyIndexOfPhysicalDevice(VkPhysicalDevice device) { Vector<VkQueueFamilyProperties> VulkanRenderer::GetQueueFamilyFromPhysicalDevice(VkPhysicalDevice device) {
Uint32 queueFamilyCount = 0; Uint32 queueFamilyCount = 0;
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr); vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);
Vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount); Vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());
return queueFamilies;
}
for (Int i = 0; i < queueFamilies.size(); ++i) { Uint32 VulkanRenderer::GetQueueFamilyIndex(const Vector<VkQueueFamilyProperties>& queueFamilies, VkQueueFlagBits flag) {
if (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { for (Uint32 i = 0; i < queueFamilies.size(); i++) {
if (queueFamilies[i].queueFlags & flag) {
return i; return i;
} }
} }
@@ -44,6 +44,11 @@ namespace MobileGL::MG_Backend::DirectVulkan {
void Present(); void Present();
private: private:
struct QueueFamilyIndices {
Int32 graphicsFamily = -1;
Int32 presentFamily = -1;
};
NativeWindowType m_window = 0; NativeWindowType m_window = 0;
RendererConfig m_config; RendererConfig m_config;
@@ -53,10 +58,11 @@ namespace MobileGL::MG_Backend::DirectVulkan {
VkInstance m_instance = VK_NULL_HANDLE; VkInstance m_instance = VK_NULL_HANDLE;
VkDebugUtilsMessengerEXT m_debugMessenger = VK_NULL_HANDLE; VkDebugUtilsMessengerEXT m_debugMessenger = VK_NULL_HANDLE;
VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE; VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE;
Int m_graphicsQueueFamilyIndex = -1;
VkDevice m_device = VK_NULL_HANDLE; VkDevice m_device = VK_NULL_HANDLE;
VkQueue m_graphicsQueue = VK_NULL_HANDLE; VkQueue m_graphicsQueue = VK_NULL_HANDLE;
VkSurfaceKHR m_surface = VK_NULL_HANDLE; VkSurfaceKHR m_surface = VK_NULL_HANDLE;
Vector<VkQueueFamilyProperties> m_queueFamilies;
QueueFamilyIndices m_queueFamilyIndices;
void CreateInstance(); void CreateInstance();
void DestroyInstance(); void DestroyInstance();
@@ -67,7 +73,8 @@ namespace MobileGL::MG_Backend::DirectVulkan {
void CreateLogicalDevice(); void CreateLogicalDevice();
void CreateSurface(); void CreateSurface();
static Int GetGraphicsQueueFamilyIndexOfPhysicalDevice(VkPhysicalDevice device); static Vector<VkQueueFamilyProperties> GetQueueFamilyFromPhysicalDevice(VkPhysicalDevice device);
static Uint32 GetQueueFamilyIndex(const Vector<VkQueueFamilyProperties>& queueFamilies, VkQueueFlagBits flag);
static Vector<VkExtensionProperties> EnumerateInstanceExtensions(); static Vector<VkExtensionProperties> EnumerateInstanceExtensions();
static constexpr const char* s_validationLayerNames[] = { static constexpr const char* s_validationLayerNames[] = {
"VK_LAYER_KHRONOS_validation" "VK_LAYER_KHRONOS_validation"