From 178dbd33ba6412ccccbe5049f2e91d97e6b2eed1 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Thu, 12 Feb 2026 12:27:13 +0800 Subject: [PATCH] [Feat] (MG_Backend/DirectVulkan): inspect ChooseSwapchainSurfaceFormat, ChooseSwapchainPresentMode --- .../DirectVulkan/Renderer/VulkanRenderer.cpp | 57 +++++++++++++++---- .../DirectVulkan/Renderer/VulkanRenderer.h | 7 ++- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index 53520fc5..5f0349ff 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -67,16 +67,30 @@ namespace MobileGL::MG_Backend::DirectVulkan { } void VulkanRenderer::Shutdown() { - if (m_device != VK_NULL_HANDLE) + if (m_swapchain != VK_NULL_HANDLE) { + vkDestroySwapchainKHR(m_device, m_swapchain, nullptr); + m_swapchain = VK_NULL_HANDLE; + } + + if (m_device != VK_NULL_HANDLE) { vkDestroyDevice(m_device, nullptr); + m_device = VK_NULL_HANDLE; + } - if (m_surface != VK_NULL_HANDLE) + if (m_surface != VK_NULL_HANDLE) { vkDestroySurfaceKHR(m_instance, m_surface, nullptr); + m_surface = VK_NULL_HANDLE; + } - if (m_debugMessenger != VK_NULL_HANDLE) + if (m_debugMessenger != VK_NULL_HANDLE) { DestroyDebugMessenger(); + m_debugMessenger = VK_NULL_HANDLE; + } - DestroyInstance(); + if (m_instance != VK_NULL_HANDLE) { + vkDestroyInstance(m_instance, nullptr); + m_instance = VK_NULL_HANDLE; + } MGLOG_I("VulkanRenderer shut down completed"); } @@ -160,13 +174,6 @@ namespace MobileGL::MG_Backend::DirectVulkan { VK_VERIFY(SetupDebugMessenger()); } - void VulkanRenderer::DestroyInstance() { - if (m_instance != VK_NULL_HANDLE) { - vkDestroyInstance(m_instance, nullptr); - m_instance = VK_NULL_HANDLE; - } - } - VkResult VulkanRenderer::SetupDebugMessenger() { auto createInfo = PopulateDebugMessengerCreateInfo(); auto vkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(m_instance, "vkCreateDebugUtilsMessengerEXT"); @@ -314,6 +321,32 @@ namespace MobileGL::MG_Backend::DirectVulkan { return false; } + VkSurfaceFormatKHR VulkanRenderer::ChooseSwapchainSurfaceFormat( + const Vector& availableFormats) { + for (const auto& availableFormat : availableFormats) { + if (availableFormat.format == VK_FORMAT_B8G8R8A8_SRGB && availableFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) { + return availableFormat; + } + } + + // TODO: Properly rank other formats + return availableFormats[0]; + } + + VkPresentModeKHR VulkanRenderer::ChooseSwapchainPresentMode( + const Vector& availablePresentModes) { + for (const auto& presentMode : availablePresentModes) { + if (presentMode == VK_PRESENT_MODE_IMMEDIATE_KHR) { + return presentMode; + } else if (presentMode == VK_PRESENT_MODE_MAILBOX_KHR) { + return presentMode; + } + } + + // TODO: Properly rank other modes + return availablePresentModes[0]; + } + Bool VulkanRenderer::IsNecessaryDeviceExtensionSupported(VkPhysicalDevice device) { Uint32 extensionCount = 0; vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr); @@ -412,6 +445,8 @@ namespace MobileGL::MG_Backend::DirectVulkan { MGLOG_I("Queues got successfully."); } + void VulkanRenderer::CreateSwapchain() {} + 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 1ecd3a9a..8fff320c 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h @@ -84,6 +84,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE; VkDevice m_device = VK_NULL_HANDLE; VkSurfaceKHR m_surface = VK_NULL_HANDLE; + VkSwapchainKHR m_swapchain = VK_NULL_HANDLE; // Vector m_queueFamilies; // QueueFamilyIndices m_queueFamilyIndices; @@ -92,13 +93,13 @@ namespace MobileGL::MG_Backend::DirectVulkan { VkQueue m_presentQueue = VK_NULL_HANDLE; void CreateInstance(); - void DestroyInstance(); VkResult SetupDebugMessenger(); VkResult DestroyDebugMessenger(); VkDebugUtilsMessengerCreateInfoEXT PopulateDebugMessengerCreateInfo(); + void CreateSurface(); void PickPhysicalDevice(); void CreateLogicalDeviceAndQueues(); - void CreateSurface(); + void CreateSwapchain(); static Int GetPresentQueueFamilyIndex( const PhysicalDevice& physicalDevice, VkSurfaceKHR surface, @@ -109,6 +110,8 @@ namespace MobileGL::MG_Backend::DirectVulkan { static Bool IsNecessaryDeviceExtensionSupported(VkPhysicalDevice device); static SwapchainCapabilities GetSwapchainCapabilities(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface); static Bool GetMoreCapablePhysicalDevice(VkPhysicalDevice newVkDevice, VkSurfaceKHR surface, const PhysicalDevice& compareWithDevice, PhysicalDevice& outBetterDevice); + static VkSurfaceFormatKHR ChooseSwapchainSurfaceFormat(const Vector& availableFormats); + static VkPresentModeKHR ChooseSwapchainPresentMode(const Vector& availablePresentModes); static constexpr const char* s_validationLayerNames[] = { "VK_LAYER_KHRONOS_validation" };